<?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>Orm</name>
	<version>0.0.1</version>
  <mincmsversion>1.11.0</mincmsversion>
	<help><![CDATA[PGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+DQo8cD5tb3JlIGluZm9ybWF0aW9ucyBvbiA6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tcyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tczwvYT48L3A+DQo8aDM+UGFyYW1ldGVyczwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtJmVncmF2ZTt0cmUgdXRpbGlzJmVhY3V0ZTsgcG91ciBzcCZlYWN1dGU7Y2lmaWVyIGRhbnMgcXVlbGxlIGxhbmd1ZSBhZmZpY2hlciBsZSBtb2R1bGUgZGFucyBsYSBwYXJ0aWUgcHVibGlxdWUuIENlIHBhcmFtJmVncmF2ZTt0cmUgbiYjMDM5O2VzdCBwYXMgc3VwcG9ydCZlYWN1dGU7IG91IHV0aWxlIHBvdXIgdG91cyBsZXMgbW9kdWxlcy48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBLZXZpbiBEYW5lemlzIChha2EgQmVzcykgJmx0O2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4wLjE8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz5zZWUgY2hhbmdlbG9nIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjxiciAvPg==]]></about>
	<description><![CDATA[This module implements a small ORM layer for other modules]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKLyoqCiAqIEEgU2ltcGxlIGR1bW15IGZpbGUgZm9yIGFuIGFkbWluIGludGVyZmFjZQogKiovClRyYWNlOjp3YXJuKCJpdCBzaG91bGQgd29yayA6KSIpOwoKPz4=]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiRsYW5nWydmcmllbmRseW5hbWUnXSA9ICdTaW1wbGUgT3JtJzsNCiRsYW5nWydwb3N0aW5zdGFsbCddID0gJyc7DQokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ01vZHVsZSB1bmluc3RhbGxlZCwgYnllICEiJzsNCiRsYW5nWydyZWFsbHlfdW5pbnN0YWxsJ10gPSAnUmVhbGx5PyBBcmUgeW91IHN1cmUgeW91IHdhbnQgdG8gdW5pbnN0YWxsIHRoaXMgZmluZSBtb2R1bGU/JzsNCiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOw0KJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsZSB2ZXJzaW9uICVzIGluc3RhbGxlZC4nOw0KJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnVGhpcyBtb2R1bGUgaW1wbGVtZW50cyBhIHNtYWxsIE9STSBsYXllciBmb3Igb3RoZXIgbW9kdWxlcyc7DQokbGFuZ1snY2hhbmdlbG9nJ10gPSAnc2VlIGNoYW5nZWxvZyA6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tcyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHBzOi8vZ2l0aHViLmNvbS9iZXNzdGlvbGxlL29ybS1tczwvYT4nOw0KJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4NCjxwPm1vcmUgaW5mb3JtYXRpb25zIG9uIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zIiB0YXJnZXQ9Il9ibGFuayI+aHR0cHM6Ly9naXRodWIuY29tL2Jlc3N0aW9sbGUvb3JtLW1zPC9hPjwvcD4NCic7DQo/Pg0K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lib/class.cache.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIHdpY2ggcHJvdmlkZSBhIG1pbmkgY2FjaGluZyBzeXN0ZW0gb2YgT3JtIHRvIGF2b2lkIG11bHRpcGxlcyBzcWwgcmVxdWVzdHMNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCg0KLyoqDQogKg0KICogIFN0YXRpYyBjbGFzc2UgdXNlZCB0byBwcm92aWRlIGEgdmVyeSBzaW1wbGUgY2FjaGluZyBzeXN0ZW0uIFlvdSBjYW4gcHVzaCB0aGUgcmVzdWx0IG9mIGEgcmVxdWVzdCBpbnRvIGl0IGFuZCBhc2tpbmcgbGF0ZXINCiAqCXRvIGNvbGxlY3QgdGhlIHJlc3VsdC4NCiAqDQogKiAgRXhhbXBsZSA6IA0KICogIDxjb2RlPg0KICogIAkvL0NhbGwgdG8gY21zbXMgdG8gZ2V0IHRoZSBkYXRhYmFzZSBjb25uZWN0b3INCiAqICAJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCiAqICAJDQogKiAgCS8vRGVmaW5lcyBhIG5ldyBDdXN0b21lciBlbnRpdHkNCiAqICAJJGVudGl0eSA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCdteU1vZHVsZScsICdjdXN0b21lcicpOw0KICogIAkNCiAqICAJLy9TZWxlY3QgYWxsIEN1c3RvbWVycw0KICogIAkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0ICogRlJPTSAnLiRlbnRpdHktPmdldERibmFtZSgpOw0KICogIAkNCiAqICAJLy9JZiB0aGUgY2FjaGluZyBzeXN0ZW0gYWxyZWFkeSBrbm93IHRoZSBhbnN3ZXIgOiB3ZSByZXR1cm4gdGhlIHJlc3VsdCBpbW1lZGlhdGVseQ0KICogIAlpZihDYWNoZTo6aXNDYWNoZSgkcXVlcnlTZWxlY3QpKQ0KICogIAl7DQogKiAgCQlyZXR1cm4gQ2FjaGU6OmdldENhY2hlKCRxdWVyeVNlbGVjdCk7DQogKiAgCX0NCiAqICAJDQogKiAgCS8vU28gd2UgbmVlZCB0byBleGVjdXRlIHRoZSBxdWVyeQ0KICogIAkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeVNlbGVjdCk7DQogKiAgCWlmICgkcmVzdWx0ID09PSBmYWxzZSl7ZGllKCJEYXRhYmFzZSBlcnJvciEiKTt9DQogKiAgCQ0KICogIAkkZW50aXR5cyA9IGFycmF5KCk7DQogKiAgCXdoaWxlICgkcm93ID0gJHJlc3VsdC0+RmV0Y2hSb3coKSkNCiAqICAJew0KICogIAkJJGVudGl0eXNbXSA9IENvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHksICRyb3cpOw0KICogIAl9DQogKiAgCQ0KICogIAkvL0Rvbid0IGZvcmdldCB0byBwdXNoIHRoZSByZXN1bHQgaW50byB0aGUgY2FjaGluZyBzeXN0ZW0gZm9yIHRoZSBuZXh0IGNhbGwNCiAqICAJQ2FjaGU6OnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOw0KIA0KICogIAlyZXR1cm4gJGVudGl0eXM7DQogKgk8L2NvZGU+DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KZmluYWwgY2xhc3MgQ2FjaGUgDQp7CQ0KCS8qKg0KCSAqIENvbnRhaW5zIGFsbCB0aGUgcmVzdWx0IGZvciB0aGUgcGFzdCByZXF1ZXRlcw0KCSAqKi8NCglwcml2YXRlIHN0YXRpYyAkY2FjaGU7DQoJCQ0KCS8qKg0KCSAqIFByaXZhdGUgY29uc3RydWN0b3INCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQ0KCQkJDQoJLyoqDQoJICoJU2V0IHRoZSBjYWNoZSBmb3IgYSBzcWwgcmVxdWVzdCwgaXRzIHBhcmFtZXRlcnMgYW5kIG9mIGNvdXJzZSB0aGUgcmVzdWx0DQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKiBAcGFyYW0gb2JqZWN0IHRoZSByZXN1bHQNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHNldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsLCAkdmFsdWUpDQoJewkJDQoJCWlmKCFpc3NldChzZWxmOjokY2FjaGUpKQ0KCQl7DQoJCQlzZWxmOjokY2FjaGUgPSBhcnJheSgpOw0KCQl9DQoJCQ0KCQlzZWxmOjokY2FjaGVbQ2FjaGU6Omhhc2goJHNxbCwkcGFyYW1zKV0gPSAkdmFsdWU7DQoJCQ0KCX0NCgkNCgkvKioNCgkgKiBRdWVyeWluZyB0aGUgY2FjaGUgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gb2JqZWN0IHRoZSByZXN1bHQNCgkgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGdldENhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKQ0KCXsNCgkJaWYoQ2FjaGU6OmlzQ2FjaGUoJHNxbCwgJHBhcmFtcykpDQoJCXsNCgkJCXJldHVybiBzZWxmOjokY2FjaGVbQ2FjaGU6Omhhc2goJHNxbCwkcGFyYW1zKV07DQoJCX0NCgkJDQoJCXJldHVybiBudWxsOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybiB0cnVlIGlmIGEgY2FjaGUgZXhpc3QgZm9yIGEgc3FsIHJlcXVlc3QgYW5kIGl0cyBwYXJhbWV0ZXJzDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIHRoZSBjYWNoZSBleGlzdHMNCgkgKi8JDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBpc0NhY2hlKCRzcWwsICRwYXJhbXMgPSBudWxsKQ0KCXsNCgkJcmV0dXJuIGlzc2V0KHNlbGY6OiRjYWNoZSkgJiYgYXJyYXlfS0VZX2V4aXN0cyhDYWNoZTo6aGFzaCgkc3FsLCRwYXJhbXMpLHNlbGY6OiRjYWNoZSk7DQoJfQ0KDQoJLyoqDQoJICogRW1wdHkgdGhlIGNhY2hlLiBWZXJ5IGltcG9ydGFudCBpZiBiZXR3ZWVuIDIgcXVlcmluZywgdGhlIHN5c3RlbSBtYXkgaW5zZXJ0L2RlbGV0ZS91cGRhdGUgc29tZSBkYXRhIGluIHRoZSBkYXRhYmFzZQ0KCSAqICBJbiB0aGUgT3JtIHN5c3RlbSwgd2UgYWx3YXlzIGRyb3AgdGhlIGNhY2hlIGluIHRoZSBpbnNlcnQvZGVsZXRlL3VwZGF0ZSBmdW5jdGlvbi4NCgkgKi8JDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBjbGVhckNhY2hlKCkNCgl7DQoJCXNlbGY6OiRjYWNoZT1udWxsOw0KCX0NCg0KCS8qKg0KCSAqIFJldHVybiBhIHVuaXF1ZSBoYXNoIGZvciBhIHNxbCByZXF1ZXN0IGFuZCBpdHMgcGFyYW1ldGVycw0KCSAqICB0aGlzIGhhc2ggaXMgdXNlZCB0byBEZWZpbmVzIGEgdW5pcXVlIGVudHJ5IGludG8gdGhlIGNhY2hlDQogICAgICogDQoJICogQHBhcmFtIHN0cmluZyB0aGUgc3FsIHF1ZXJ5DQoJICogQHBhcmFtIGFycmF5IHRoZSBwYXJhbWV0ZXJzIGludG8gYSBhcnJheS4gTWF5IGJlIG51bGwNCgkgKg0KCSAqIEByZXR1cm4gc3RyaW5nIHRoZSBoYXNoDQoJICovCQ0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaGFzaCgkc3FsLCAkcGFyYW1zID0gbnVsbCkNCgl7DQoJCWlmKCRwYXJhbXMgPT0gbnVsbCkNCgkJe3JldHVybiBtZDUoJHNxbCk7fQ0KCQkNCgkJJHAgPSBwcmludF9yKCRwYXJhbXMsIHRydWUpOw0KDQoJCXJldHVybiBtZDUoJHNxbC4kcCk7DQoJfQ0KDQoJCQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.cast.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIHdpdGggYWxsIHRoZSBkaWZmZXJlbnQgdHlwZSBmb3IgdGhlIGZpZWxkIGludG8gZGF0YWJhc2UNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCg0KLyoqDQogKiBDbGFzcyBEZWZpbmVzIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCwgaW4gZW50aXR5IGJ1dCBhbHNvIGluIGRhdGFiYXNlDQogKiANCiAqICBDQVNUOjokU1RSSU5HIGEgc2ltcGxlIHN0cmluZw0KICogIENBU1Q6OiRJTlRFR0VSIGFuIGludGVnZXINCiAqICBDQVNUOjokREFURSBhIGZpZWxkIGRhdGUNCiAqICBDQVNUOjokVElNRSBhIGZpZWxkIHRpbWUNCiAqICBDQVNUOjokVFMgYSBmaWVsZCB0aW1lc3RhbXANCiAqICBDQVNUOjokQlVGRkVSIGEgZmllbGQgd2l0aCBubyBsaW1pdCBvZiBzaXplIChleGNlcHQgdGhlIG15c3FsIG5hdHVyYWwgbGltaXQpDQogKiAgQ0FTVDo6JE5VTUVSSUMgYSBmaWVsZCBmb3IgYSByZWFsIG51bWJlciAoZWcgOiB3aXRoIGNvbWEpDQogKiAgQ0FTVDo6JE5PTkUgYSBUcmFuc2lhbnQgZmllbGQgOiB3b24ndCBiZSBwZXJzaXN0IGludG8gZGF0YWJhc2UNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgQ0FTVA0Kew0KCXB1YmxpYyBzdGF0aWMgJFNUUklORyA9IDA7DQoJcHVibGljIHN0YXRpYyAkSU5URUdFUiA9IDE7DQoJcHVibGljIHN0YXRpYyAkREFURSA9IDI7DQoJcHVibGljIHN0YXRpYyAkQlVGRkVSID0gMzsNCglwdWJsaWMgc3RhdGljICROVU1FUklDID0gNDsNCglwdWJsaWMgc3RhdGljICRUSU1FID0gNTsNCglwdWJsaWMgc3RhdGljICRUUyA9IDY7DQoJcHVibGljIHN0YXRpYyAkTk9ORSA9IDk7DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.core.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIENvcmUgQ2xhc3MNCiAqIA0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KIA0KIA0KLyoqDQogKiBNYWluIHBhcnQgb2YgdGhlIGludGVyZmFjZSBiZXR3ZWVuIENtc21hZGVzaW1wbGUgbmF0aXZlcyBmdW5jdGlvbiBhbmQgdGhlIG5lY2Vzc2l0eSBmb3IgdGhlIE9ybSBmdW5jdGlvbnMNCiAqICAgDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgQ29yZSANCnsgIA0KICAgIC8qKg0KICAgICogUHJvdGVjdGVkIGNvbnN0cnVjdG9yDQogICAgKiAgICAgDQogICAgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7fQ0KICAgICAgDQogICAgLyoqDQogICAgKiB0cmFuc2Zvcm1zIHRoZSBlbnRpdHkncyBzdHJ1Y3R1cmUgaW50byBhZG9kYiBpbmZvcm1hdGlvbnMgDQogICAgKiAgICAgICAgIA0KICAgICogQHBhcmFtIEVudGl0eSB0aGUgZW50aXR5DQogICAgKiBAcmV0dXJuIHRoZSBhZG9kYiBpbmZvcm1hdGlvbnMNCiAgICAqLw0KCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0RmllbGRzVG9IcWwoRW50aXR5ICYkZW50aXR5KQ0KCXsgICAgDQoJCSRocWwgPSAnJzsNCg0KCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHktPmdldEZpZWxkcygpOw0KDQoJCS8vUG91ciBjaGFxdWUgY2hhbXBzIGNvbnRlbnUgZGFucyBsJ2VudGl0w6kNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsNCgkJCS8vT24gbmUgY3JlZSBwYXMgbGVzIGNoYW1wcyBxdWkgc29udCBkZXMgbGlhaXNvbnMgZXh0ZXJuZXMgc3VyIGRlcyB0YWJsZXMgYXNzb2NpYXRpdmVzDQoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpIHsNCgkJCQljb250aW51ZTsNCgkJCX0JDQoNCgkJCWlmKCFlbXB0eSgkaHFsKSkgew0KCQkJCSRocWwgLj0gJyAsICc7DQoJCQl9DQoNCgkJCSRocWwgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsNCg0KCQkJc3dpdGNoKCRmaWVsZC0+Z2V0VHlwZSgpKSB7DQoJCQkJY2FzZSBDQVNUOjokU1RSSU5HIDogDQoJCQkJCSRocWwgLj0gJ0MnOyANCgkJCQkJaWYoJGZpZWxkLT5nZXRTaXplKCkgIT0gIiIgKSB7JGhxbC49ICIgKCIuJGZpZWxkLT5nZXRTaXplKCkuIikgIjt9IA0KCQkJCQlicmVhazsNCg0KCQkJCWNhc2UgQ0FTVDo6JElOVEVHRVIgOiANCgkJCQkJJGhxbCAuPSAnSSc7IA0KCQkJCQlpZigkZmllbGQtPmdldFNpemUoKSAhPSAiIiApIHskaHFsLj0gIiAoIi4kZmllbGQtPmdldFNpemUoKS4iKSAiO30gDQoJCQkJCWJyZWFrOw0KDQoJCQkJY2FzZSBDQVNUOjokTlVNRVJJQyA6IA0KCQkJCQkkaHFsIC49ICdOJzsgDQoJCQkJCWlmKCRmaWVsZC0+Z2V0U2l6ZSgpICE9ICIiICkNCgkJCQkJeyRocWwuPSAiICgiLiRmaWVsZC0+Z2V0U2l6ZSgpLiIpICI7fSANCgkJCQkJYnJlYWs7DQoNCgkJCQljYXNlIENBU1Q6OiRCVUZGRVIgOiAkaHFsIC49ICdYJzsgYnJlYWs7DQoNCgkJCQljYXNlIENBU1Q6OiREQVRFIDogJGhxbCAuPSAnRCc7IGJyZWFrOw0KDQoJCQkJY2FzZSBDQVNUOjokVElNRSA6ICRocWwgLj0gJ1QnOyBicmVhazsgICANCg0KCQkJCWNhc2UgQ0FTVDo6JFRTIDogJGhxbCAuPSAnSSAoMTApICc7IGJyZWFrOyAvL3dvcmthcm91bmQgZm9yIHRoZSByZWFsIHRpbWVzdGFtcCBtaXNzaW5nIGluIEFET0RCTElURQ0KCQkJfQ0KDQoJCQlpZigkZmllbGQtPmlzUHJpbWFyeUtFWSgpKQ0KCQkJew0KCQkJCSRocWwgLj0gJyBLRVkgJzsNCgkJCX0NCgkJCQkNCgkJfQ0KDQoJCVRyYWNlOjppbmZvKCRocWwpOw0KDQoJCXJldHVybiAkaHFsOw0KCX0NCg0KICAgIC8qKg0KICAgICogQ3JlYXRlIGEgdGFibGUgaW50byBEYXRhYmFzZSBmcm9tIHRoZSBzdHJ1Y3R1cmUgb2YgYW4gRW50aXR5DQogICAgKiAgV2lsbCBhbHNvIGNyZWF0ZSB0aGUgc2VxdWVuY2UgaWYgaXQncyBuZWVkZWQNCiAgICAqICANCiAgICAqICAgZXhhbXBsZSB3aXRoIGEgQ3VzdG9tZXIgZW50aXR5IDogDQogICAgKiA8Y29kZT4NCiAgICAqIA0KICAgICogY2xhc3MgQ3VzdG9tZXIgZXh0ZW5kcyBFbnRpdHkNCiAgICAqIHsNCiAgICAqICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgKiAgICB7DQogICAgKiAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAqICAgICAgICANCiAgICAqICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnY3VzdG9tZXJfaWQnICANCgkqCQkJLCBDQVNUOjokSU5URUdFUg0KCSoJCQksIG51bGwNCgkqCQkJLCBudWxsDQoJKgkJCSwgS0VZOjokUEsgDQoJKgkJCSkpOw0KICAgICogDQogICAgKiAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ25hbWUnDQogICAgKiAgICAgICAgCSwgQ0FTVDo6JFNUUklORyANCiAgICAqICAgICAgICAJLCAzMg0KICAgICogICAgICAgIAkpKTsNCiAgICAqIA0KICAgICogICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdsYXN0bmFtZScNCiAgICAqICAgICAgICAJLCBDQVNUOjokU1RSSU5HDQogICAgKiAgICAgICAgCSwgMzINCgkqCQkJLCB0cnVlICAvLyBJcyBudWxsYWJsZQ0KICAgICogICAgICAgIAkpKTsNCiAgICAqICAgIH0NCiAgICAqIH0NCiAgICAqIDwvY29kZT4NCiAgICAqIA0KICAgICogIFRoZSBiZXN0IHdheSB0byBjcmVhdGUgaXRzIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlIDogDQogICAgKiANCiAgICAqIDxjb2RlPg0KICAgICogICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAqICAgQ29yZTo6Y3JlYXRlVGFibGUoJGN1c3RvbWVyKTsNCiAgICAqIDwvY29kZT4NCiAgICAqIA0KICAgICogIFRoZSBmdW5jdGlvbiB3aWxsIGFsc28gdHJ5IHRvIHBvcHVsYXRlIHRoZSB0YWJsZSB3aXRoIGEgY2FsbCB0byB0aGUgZnVuY3Rpb24gaW5pdFRhYmxlKCkgaWYgaXQncyBkZWZpbmUgaW50byB0aGUgZW50aXR5IGNsYXNzLg0KICAgICogDQoJKiBAcGFyYW0gT3JtIHRoZSBtb2R1bGUgd2hpY2ggZXh0ZW5kcyB0aGUgT3JtIG1vZHVsZQ0KICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGNyZWF0ZVRhYmxlKEVudGl0eSAmJGVudGl0eVBhcmFtKQ0KCXsNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJHRhYm9wdGFycmF5ID0gYXJyYXkoICdteXNxbCcgPT4gJ0VOR0lORSBNeUlTQU0gQ0hBUkFDVEVSIFNFVCB1dGY4IENPTExBVEUgdXRmOF9nZW5lcmFsX2NpJyk7DQoJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOw0KCQkkaHFsID0gQ29yZTo6Z2V0RmllbGRzVG9IcWwoJGVudGl0eVBhcmFtKTsNCg0KCQkvL0FwcGVsIGF1eCBtw6l0aG9kZXMgZGUgbCdBUEkgZGUgYWRvZGIgcG91ciBjcsOpZXIgZWZmZWN0aXZlbWVudCBsYSB0YWJsZS4NCgkJJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKCRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCksIA0KCQkJCQkJCQkJCQkJJGhxbCwNCgkJCQkJCQkJCQkJCSR0YWJvcHRhcnJheSk7DQoJCQkJCQkJCQkJCQkNCgkJJHJlc3VsdCA9ICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCg0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2UpDQoJCXsNCgkJCVRyYWNlOjplcnJvcigkaHFsLic8YnIvPicpOw0KCQkJVHJhY2U6OmVycm9yKCJEYXRhYmFzZSBlcnJvciBkdXJhbnQgZHVyYW50IGxhIGNyZWF0aW9uIGRlIGxhIHRhYmxlIHBvdXIgbCdlbnRpdMOpICIgLiAkZW50aXR5UGFyYW0tPmdldE5hbWUoKS4kZGItPkVycm9yTXNnKCkpOw0KCQkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGR1cmFudCBsYSBjcmVhdGlvbiBkZSBsYSB0YWJsZSBwb3VyIGwnZW50aXTDqSAiIC4gJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJGRiLT5FcnJvck1zZygpKTsNCgkJfQ0KCQkgICANCgkJVHJhY2U6OmRlYnVnKCJjcmVhdGVUYWJsZSA6ICIucHJpbnRfcigkc3FsYXJyYXksIHRydWUpLic8YnIvPicpOw0KDQoJCS8vT3B0aW9ubmVsIDogY3LDqWVyYSB1bmUgc8OpcXVlbmNlIGFzc29jaWVlDQoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpeyRkYi0+Q3JlYXRlU2VxdWVuY2UoJGVudGl0eVBhcmFtLT5nZXRTZXFuYW1lKCkpO30NCg0KCQkvL09uIGluaXRpYWxpc2UgbGEgdGFibGUuDQoJCSRlbnRpdHlQYXJhbS0+aW5pdFRhYmxlKCk7DQoJfQ0KICAgIA0KICAgIC8qKg0KICAgICogRHJvcCB0aGUgdGFibGUgZm9yIHRoZSBFbnRpdHkgaW4gcGFyYW1ldGVycw0KICAgICogIFdpbGwgYWxzbyBkcm9wIHRoZSBzZXF1ZW5jZSBpZiBpdCdzIG5lZWRlZA0KICAgICogDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZHJvcFRhYmxlKEVudGl0eSAmJGVudGl0eVBhcmFtKQ0KCXsNCg0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOw0KDQoJCSRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOw0KDQoJCSRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKSk7DQoJCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsNCg0KCQkvL09wdGlvbm5lbCA6IHN1cHByaW1lcmEgdW5lIHNlcXVlbmNlIGFzc29jaWVlDQoJCWlmKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpICE9IG51bGwpeyRkYi0+RHJvcFNlcXVlbmNlKCRlbnRpdHlQYXJhbS0+Z2V0U2VxbmFtZSgpKTt9DQoJfSAgDQogIA0KICAgIC8qKg0KICAgICogV2lsbCBtb2RpZmllIHRoZSB0YWJsZSBvZiB0aGUgRW50aXR5IGluIHBhcmFtZXRlcnMgd2l0aCB0aGUgU1FMIHF1ZXJ5IGluIHBhcmFtZXRlcnMNCiAgICAqIA0KICAgICogICBleGFtcGxlIDogaWYgeW91IG5lZWQgdG8gZG8gDQogICAgKiANCiAgICAqIDxjb2RlPiAgICAgICAgDQogICAgKiAgIEFMVEVSIFRBQkxFIGAgdGFibGUgb2YgdGhlIEN1c3RvbWVyIGVudGl0eSBgIEFERCBgbmV3Q29sdW1uYCBJTlQgTk9UIE5VTEwgDQogICAgKiAgIEFMVEVSIFRBQkxFIGAgdGFibGUgb2YgdGhlIEN1c3RvbWVyIGVudGl0eSBgIERST1AgYG9sZENvbHVtbmAgDQogICAgKiA8L2NvZGU+DQogICAgKiANCiAgICAqICB0aGUgY29kZSBtdXN0IGJlIDoNCiAgICAqIA0KICAgICogPGNvZGU+DQogICAgKiAgICAgICAkY3VzdG9tZXIgPSBNeUF1dG9sb2FkOjpnZXRJbnN0YW5jZSgkdGhpcy0+R2V0TmFtZSgpLCAnY3VzdG9tZXInKTsNCiAgICAqICAgICAgIENvcmU6OmFsdGVyVGFibGUoJGN1c3RvbWVyLCAiQUREIGBuZXdDb2x1bW5gIElOVCBOT1QgTlVMTCIpOw0KICAgICogICAgICAgQ29yZTo6YWx0ZXJUYWJsZSgkY3VzdG9tZXIsICJEUk9QIGBvbGRDb2x1bW5gIik7DQogICAgKiA8L2NvZGU+DQogICAgKiAgIA0KICAgICogDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIFNRTCBxdWVyeQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBhbHRlclRhYmxlKEVudGl0eSAmJGVudGl0eVBhcmFtLCAkc3FsKQ0KCXsNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJCQ0KCQkkcXVlcnlBbHRlciA9ICJBTFRFUiBUQUJMRSAiLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuIiAiLiRzcWw7ICAgIA0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeUFsdGVyKTsNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsJ2FsdGVyIGRlIGxhIHRhYmxlICRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkhIik7fQ0KCX0NCiAgICANCiAgICAvKioNCiAgICAgKiBJbnNlcnQgZGF0YSBpbnRvIGRhdGFiYXNlLg0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgZm9yIGEgbmV3IEN1c3RvbWVyIDogY3VzdG9tZXJfaWQsIG5hbWUsIGxhc3ROYW1lIChvcHRpb25uYWwpIA0KICAgICAqICAgDQogICAgICogPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogICAgICAgDQogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ25hbWUnLCdEdXJhbnQnKTsNCiAgICAgKiAgICAgICAkY3VzdG9tZXItPnNldCgnbGFzdE5hbWUnPT4nSm9obicpOw0KICAgICAqIA0KICAgICAqICAgICAgIENvcmU6Omluc2VydEVudGl0eSgkY3VzdG9tZXIpOw0KICAgICAqIDwvY29kZT4NCgkgKg0KCSAqIFlvdSBjb3VsZCBhbHNvIGNvZGUgZm9yIHRoZSBsYXN0IGxpbmUgOiAkY3VzdG9tZXItPnNhdmUoKTsgIGl0IHdpbGwgYXV0b21hdGljYWxseSANCiAgICAgKiANCiAgICAgKiBJbXBvcnRhbnQgOiB5b3UgbXVzdCBub3Qgc2V0IHRoZSBwcmltYXJ5S2V5IHZhbHVlLiBJdCB3aWxsIGJlIGNhbGN1bGF0ZSBieSB0aGUgc3lzdGVtIGl0LXNlbGYNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQoJICoNCiAgICAgKiBAcmV0dXJuIHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IG5ldyBJZCAoY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkNCiAgICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIGluc2VydEVudGl0eShFbnRpdHkgJiRlbnRpdHlQYXJhbSkNCgl7DQoNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOw0KCQkkbGlzdGVWYWx1ZXMgPSAkZW50aXR5UGFyYW0tPmdldFZhbHVlcygpOw0KDQoJCSRxdWVyeUluc2VydCA9ICdJTlNFUlQgSU5UTyAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyAoJXMpIHZhbHVlcyAoJXMpJzsNCg0KCQkkc3RyMSA9ICIiOw0KCQkkc3RyMiA9ICIiOw0KDQoJCSRwYXJhbXMgPSBhcnJheSgpOw0KCQkJICAgDQoJCS8vT24gdmVyaWZpZSBxdWUgdG91dGVzIGxlcyB2YWxldXJzIG5lY2Vzc2FpcmVzIHNvbnQgdHJhbnNtaXNlcw0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkJaWYoJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKSB7DQoJCQkJY29udGludWU7DQoJCQl9DQoNCgkJCWlmKCFlbXB0eSgkc3RyMSkpIHsNCgkJCQkkc3RyMSAuPSAnLCc7DQoJCQkJJHN0cjIgLj0gJywnOw0KCQkJfQ0KCQkJJHN0cjEgLj0gJyAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgJzsNCgkJCSRzdHIyIC49ICc/JzsNCgkJCQ0KCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgew0KCQkJCWlmKCFlbXB0eSgkbGlzdGVWYWx1ZXNbJGZpZWxkLT5nZXROYW1lKCldKSkgew0KCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCdQcmltYXJ5IEtleSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgY2FuXCd0IGJlIHNldHRlZCBkdXJpbmcgaW5zZXJ0IG9wZXJhdGlvbiBmb3IgRW50aXR5Jy4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCQkJfSBlbHNlIHsNCgkJCQkJJG5ld0lkID0gJGRiLT5HZW5JRCgkZW50aXR5UGFyYW0tPmdldFNlcW5hbWUoKSk7DQoJCQkJCSRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0gPSAkbmV3SWQ7DQoJCQkJCSRlbnRpdHlQYXJhbS0+c2V0KCRmaWVsZC0+Z2V0TmFtZSgpLCAkbmV3SWQpOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy9FbXB0eSBGaWVsZCB0aGF0IHNob3VsZG4ndCBiZSAhDQoJCQlpZighJGZpZWxkLT5pc051bGxhYmxlKCkgJiYgIWlzc2V0KCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7DQoJCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigndGhlIGZpZWxkICcuJGZpZWxkLT5nZXROYW1lKCkuJyBvZiBFbnRpdHkgICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuJyBjYW5cJ3QgYmUgbnVsbCcpOw0KCQkJfQ0KCQkJDQoJCQkkdmFsID0gbnVsbDsNCgkJCWlmKGlzc2V0KCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKQ0KCQkJew0KCQkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRsaXN0ZVZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsNCgkJCX0gZWxzZSB7DQoJCQkJJHBhcmFtc1tdID0gbnVsbDsNCgkJCX0NCgkJfQ0KCQkgIAkJICANCgkJLy9FeGVjdXRpb24NCgkJJGRiLT5kZWJ1ZyA9IHRydWU7DQoNCgkJVHJhY2U6OmRlYnVnKCJpbnNlcnRFbnRpdHkgOiAiLnNwcmludGYoJHF1ZXJ5SW5zZXJ0LCAkc3RyMSwgJHN0cjIpKTsNCg0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKHNwcmludGYoJHF1ZXJ5SW5zZXJ0LCAkc3RyMSwgJHN0cjIpLCAkcGFyYW1zKTsNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKSB7DQoJCQlUcmFjZTo6ZXJyb3IocHJpbnRfcigkcGFyYW1zLCB0cnVlKS4nPGJyLz4nKTsNCgkJCVRyYWNlOjplcnJvcihzcHJpbnRmKCRxdWVyeUluc2VydCwgJHN0cjEsICRzdHIyKS4nPGJyLz4nKTsNCgkJCVRyYWNlOjplcnJvcigiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGwnaW5zZXJ0ISIuJGRiLT5FcnJvck1zZygpKTsNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsJ2luc2VydCEiLiRkYi0+RXJyb3JNc2coKSk7DQoJCX0NCg0KCQlpZigkZW50aXR5UGFyYW0tPmlzSW5kZXhhYmxlKCkpIHsgIA0KCQkJSW5kZXhpbmc6OkFkZFdvcmRzKCRlbnRpdHlQYXJhbS0+Z2V0TW9kdWxlTmFtZSgpLCBDb3JlOjpmaW5kQnlJZCgkZW50aXR5UGFyYW0sJGFycmF5S0VZWzBdKSk7DQoJCX0NCgkJDQoJCS8vZW1wdHkgY2FjaGUNCgkJQ2FjaGU6OmNsZWFyQ2FjaGUoKTsNCgkJDQoJCXJldHVybiAkZW50aXR5UGFyYW07DQoNCgl9DQoJDQogICAgLyoqDQogICAgICogIFVwZGF0ZSBkYXRhIGludG8gZGF0YWJhc2UuIFRoZSB0aGlyZCBwYXJhbWV0ZXIgbXVzdCBmb2xsb3cgdGhpcyBzY2hlbWUNCiAgICAgKiANCiAgICAgKiBFeGFtcGxlIGZvciBhIG5ldyBDdXN0b21lciA6IA0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgICAgICRteUFycmF5ID0gYXJyYXkoKTsNCiAgICAgKiAgICAgICAkbXlBcnJheVtdID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MSwgJ2xhc3ROYW1lJz0+bnVsbCwgJ25hbWUnPT4nRHVwb250Jyk7ICAgIDwtLSB1cGRhdGUgTmFtZSB2YWx1ZSwgZXJhc2UgbGFzdE5hbWUgdmFsdWUgaW4gZGF0YWJhc2UNCiAgICAgKiAgICAgICAkbXlBcnJheVtdID0gYXJyYXkoJ2N1c3RvbWVyX2lkJz0+MiwgJ25hbWUnPT4nRHVyYW50Jyk7ICAgICAgICAgICAgICAgICAgICAgIDwtLSB1cGRhdGUgTmFtZSB2YWx1ZQ0KICAgICAqICAgICAgICRteUFycmF5W10gPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4zLCAnbGFzdE5hbWUnPT4nSm9obicsICduYW1lJz0+J0RvZScpOyAgICAgPC0tIHVwZGF0ZSBOYW1lIHZhbHVlIGFuZCBsYXN0TmFtZSB2YWx1ZQ0KICAgICAqIA0KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICAqICAgICAgIA0KICAgICAqICAgICAgICRjdXN0b21lciA9IENvcmU6OmZpbmRCeUlkKCRjdXN0b21lciwgMSk7DQogICAgICogICAgICAgJGN1c3RvbWVyLT5zZXQoJ2xhc3ROYW1lJz0+J05ld0xhc3ROYW1lJyk7DQogICAgICogDQogICAgICogICAgICAgQ29yZTo6dXBkYXRlRW50aXR5KCRjdXN0b21lcik7DQogICAgICogPC9jb2RlPg0KICAgICAqIAkgDQogICAgICogWW91IGNvdWxkIGFsc28gY29kZSBmb3IgdGhlIGxhc3QgbGluZSA6ICRjdXN0b21lci0+c2F2ZSgpOyAgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IA0KCSAqDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQoJICoNCgkgKiBAcmV0dXJuIHRoZSBlbnRpdHkgc2F2ZWQgd2l0aCBpdHMgbmV3IElkIChjdXN0b21lcl9pZCBpbiBteSBleGFtcGxlKQ0KICAgICAqLwkNCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHVwZGF0ZUVudGl0eShFbnRpdHkgJiRlbnRpdHlQYXJhbSkNCgl7DQoNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOw0KCQkkdmFsdWVzID0gJGVudGl0eVBhcmFtLT5nZXRWYWx1ZXMoKTsNCg0KCQkkc3RyID0gIiI7DQoJCSR3aGVyZSA9ICcnOw0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJJGhhc0tleSA9IGZhbHNlOw0KCQkgIA0KCQkvL09uIHZlcmlmaWUgcXVlIHRvdXRlcyBsZXMgdmFsZXVycyBuZWNlc3NhaXJlcyBzb250IHRyYW5zbWlzZXMNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpIHsNCgkJDQoJCQkvL0lmIGl0J3Mgbm90IHNldA0KCQkJaWYoZW1wdHkoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0pKSB7DQoJCQkNCgkJCQkvL0lmIGl0J3MgYSBwcmltYXJ5S2V5IHdlIHRocm93IGEgZXhjZXB0aW9uDQoJCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgew0KCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgcHJpbWFyeUtleSAnLiRmaWVsZC0+Z2V0TmFtZSgpLicgaXMgbWlzc2luZyBmb3IgdGhlIGVudGl0eSA6ICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpOw0KCQkJCX0NCgkJCQkNCgkJCQkvL2FuIGVtcHR5IGFzc29jaWF0aWYgZmllbGQgOiBubyBwcm9ibGVtLCB3ZSBjYW4gcGFzcw0KCQkJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLRVkoKSkNCgkJCQl7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0NCgkJCQkNCgkJCQkvL0lmIGl0J3MgYSBubyBudWxsYWJsZSBmaWVsZCB3ZSB0aHJvdyBhIGV4Y2VwdGlvbg0KCQkJCWlmKCEkZmllbGQtPmlzTnVsbGFibGUoKSkgew0KCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCd0aGUgZmllbGQgJy4kZmllbGQtPmdldE5hbWUoKS4nIGlzIG5vdCBudWxsYWJsZSBmb3IgdGhlIGVudGl0eSA6ICcuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpOw0KCQkJCX0NCgkJCX0NCgkJCQ0KCQkJLy9JZiBpdCdzIGEgcHJpbWFyeUtleQ0KCQkJaWYoJGZpZWxkLT5pc1ByaW1hcnlLRVkoKSkgew0KCQkJCSR3aGVyZSA9ICcgV0hFUkUgJy4kZmllbGQtPmdldE5hbWUoKS4nID0gPyc7DQoJCQkJJGhhc0tleSA9IHRydWU7DQoJCQkJJGtleVZhbHVlID0gJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV07DQoJCQl9DQoNCgkJCWlmKCFlbXB0eSgkc3RyKSkgew0KCQkJICAkc3RyIC49ICcsJzsNCgkJCX0NCg0KCQkJJHN0ciAuPSAnICcuJGZpZWxkLT5nZXROYW1lKCkuJyA9ID8gJzsNCg0KCQkJJHBhcmFtc1tdID0gQ29yZTo6RmllbGRUb0RCVmFsdWUoJHZhbHVlc1skZmllbGQtPmdldE5hbWUoKV0sICRmaWVsZC0+Z2V0VHlwZSgpKTsNCg0KCQl9DQoNCgkJaWYoJGhhc0tleSkgew0KCQkJJHBhcmFtc1tdID0gJGtleVZhbHVlOw0KCQl9DQoNCgkJJHF1ZXJ5VXBkYXRlID0gJ1VQREFURSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBTRVQgJy4kc3RyLiR3aGVyZTsNCg0KCQkvL0V4Y2VjdXRpb24NCgkJJHJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcXVlcnlVcGRhdGUsICRwYXJhbXMpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGwndXBkYXRlISIpO30NCgkJaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKSB7ICANCgkJCUluZGV4aW5nOjpVcGRhdGVXb3JkcygkZW50aXR5UGFyYW0tPmdldE1vZHVsZU5hbWUoKSwgJGVudGl0eVBhcmFtKTsNCgkJfQ0KCQkNCgkJLy9lbXB0eSBjYWNoZQ0KCQlDYWNoZTo6Y2xlYXJDYWNoZSgpOw0KCQkNCgkJcmV0dXJuICRlbnRpdHlQYXJhbTsNCgl9DQogIA0KICAgIC8qKg0KICAgICogRGVsZXRlIGluZm9ybWF0aW9uIGludG8gZGF0YWJhc2UNCiAgICAqICAgDQogICAgKiBFeGFtcGxlIGZvciBhIHNpbmdsZSBkZWxldGlvbiA6IA0KICAgICogDQogICAgKiA8Y29kZT4NCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICogDQogICAgKiAgICAgICBDb3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsIGFycmF5KDEpOw0KICAgICogPC9jb2RlPg0KICAgICogDQogICAgKiAgRXhhbXBsZSBmb3IgbXVsdGlwbGUgZGVsZXRpb24gOiANCiAgICAqIA0KICAgICogPGNvZGU+DQogICAgKiAgICAgICAkbXlBcnJheSA9IGFycmF5KCk7DQogICAgKiAgICAgICAkbXlBcnJheVtdID0gMTsNCiAgICAqICAgICAgICRteUFycmF5W10gPSAyOw0KICAgICogICAgICAgJG15QXJyYXlbXSA9IDM7DQogICAgKiANCiAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICogDQogICAgKiAgICAgICBDb3JlOjpkZWxldGVCeUlkcygkY3VzdG9tZXIsICRteUFycmF5KTsNCiAgICAqIDwvY29kZT4NCiAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgICAgDQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSBpZHMgdG8gZGVsZXRlICgkY3VzdG9tZXJfaWQgaW4gbXkgZXhhbXBsZSkNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZGVsZXRlQnlJZHMoRW50aXR5ICYkZW50aXR5UGFyYW0sICRpZHMpDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkgIGlmKCEkZmllbGQtPmlzUHJpbWFyeUtFWSgpKQ0KCQkgIHsgDQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgJHR5cGUgPSAkZmllbGQtPmdldFR5cGUoKTsNCgkJICAkbmFtZSA9ICRmaWVsZC0+Z2V0TmFtZSgpOw0KCQl9ICANCg0KCQkkd2hlcmUgPSAnJzsNCgkJZm9yZWFjaCgkaWRzIGFzICRzaWQpDQoJCXsNCgkJICBpZighZW1wdHkoJHdoZXJlKSkNCgkJICB7DQoJCQkkd2hlcmUgLj0gJyBPUiAnOw0KCQkgIH0NCgkJICANCgkJICAkd2hlcmUgLj0gJG5hbWUuJyA9ID8nOw0KCQkgICRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRzaWQsICR0eXBlKTsgIA0KCQl9DQoNCg0KCQkkcXVlcnlEZWxldGUgPSAnREVMRVRFIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpLicgV0hFUkUgJy4kd2hlcmU7DQoNCgkJLy9FeGNlY3V0aW9uDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5RGVsZXRlLCAkcGFyYW1zKTsNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsYSBzdXBwcmVzc2lvbiEiKTt9DQoNCgkJaWYoJGVudGl0eVBhcmFtLT5pc0luZGV4YWJsZSgpKQ0KCQl7ICANCgkJICAvLyAkbW9kb3BzID0gY21zbXMoKS0+R2V0TW9kdWxlT3BlcmF0aW9ucygpOw0KCQkgIC8vIGlmKG1ldGhvZF9leGlzdHMoJG1vZG9wcywiR2V0U2VhcmNoTW9kdWxlIikpDQoJCSAgLy8gew0KCQkJLy8gSW5kZXhpbmc6OnNldFNlYXJjaCgkbW9kb3BzLT5HZXRTZWFyY2hNb2R1bGUoKSk7DQoJCSAgLy8gfSBlbHNlDQoJCSAgLy8gew0KCQkJLy8gZGllKCJrbyIpOw0KCQkgIC8vIH0NCgkJICBmb3JlYWNoKCRpZHMgYXMgJHNpZCkNCgkJICB7DQoJCQlJbmRleGluZzo6RGVsZXRlV29yZHMoJGVudGl0eVBhcmFtLT5nZXRNb2R1bGVOYW1lKCksICRlbnRpdHlQYXJhbSwgJHNpZCk7DQoJCSAgfQ0KCQkgIA0KCQl9DQoJCQ0KCQkvL2VtcHR5IGNhY2hlDQoJCUNhY2hlOjpjbGVhckNhY2hlKCk7DQoJfQ0KICAgDQogICAgLyoqDQogICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMgZnJvbSB0aGUgdGFibGUgb2YgdGhlIGVudGl0eSBpbiBQYXJhbWV0ZXJzDQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgICANCgkqIA0KICAgICogQHJldHVybiBpbnQgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSAgIA0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBjb3VudEFsbChFbnRpdHkgJiRlbnRpdHlQYXJhbSkNCgl7DQoNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCg0KCQkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0IGNvdW50KCopIEZST00gJy4kZW50aXR5UGFyYW0tPmdldERibmFtZSgpOw0KDQoJCVRyYWNlOjpkZWJ1ZygiY291bnRBbGwgOiAiLiRxdWVyeVNlbGVjdCk7DQoJCSAgDQoJCSRjb21wdGV1cj0gJGRiLT5nZXRPbmUoJHF1ZXJ5U2VsZWN0KTsNCgkJaWYgKCRjb21wdGV1ciA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHJlcXVldGUgY291bnQoKikhIik7fQ0KDQoJCXJldHVybiAkY29tcHRldXI7DQoJfQ0KICANCiAgICAvKioNCiAgICAqIFJldHVybnMgYWxsIHRoZSBvY2N1cnJlbmNlcyBmcm9tIHRoZSB0YWJsZSBvZiB0aGUgZW50aXR5IGluIFBhcmFtZXRlcnMNCiAgICAqIA0KICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5ICANCgkqDQogICAgKiBAcmV0dXJuIGFycmF5PEVudGl0eT4gbGlzdCBvZiBFbnRpdGllcyBmb3VuZA0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBmaW5kQWxsKEVudGl0eSAmJGVudGl0eVBhcmFtKQ0KCXsNCg0KCQkkZGIgPSBjbXNtcygpLT5HZXREYigpOw0KDQoJCSRxdWVyeVNlbGVjdCA9ICdTZWxlY3QgKiBGUk9NICcuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKTsNCg0KCQkJLy9TaSBkw6lqw6AgcHLDqXNlbnQgZW4gY2FjaGUsIG9uIGxlIHJldG91cm5lIA0KCQlpZihDYWNoZTo6aXNDYWNoZSgkcXVlcnlTZWxlY3QpKQ0KCQl7DQoJCSAgcmV0dXJuIENhY2hlOjpnZXRDYWNoZSgkcXVlcnlTZWxlY3QpOw0KCQl9DQoJCSAgDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5U2VsZWN0KTsNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsYSByZXF1ZXRlIHBhciBJZHMhIik7fQ0KDQoJCSRlbnRpdHlzID0gYXJyYXkoKTsNCgkJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKQ0KCQl7DQoJCSAgJGVudGl0eXNbXSA9IENvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHlQYXJhbSwgJHJvdyk7DQoJCX0NCg0KCQkJLy9PbiByZXBvdXNzZSBkYW5zIGxlIGNhY2hlIGxlIHLDqXN1bHRhdCBhdmFudCBkZSBsZSByZXRvdXJuZXIgICANCgkJQ2FjaGU6OnNldENhY2hlKCRxdWVyeVNlbGVjdCwgbnVsbCwgJGVudGl0eXMpOw0KDQoJCXJldHVybiAkZW50aXR5czsNCgl9DQogIA0KICAgIC8qKg0KICAgICogUmV0dXJuIGEgRW50aXR5IGZyb20gaXRzIElkDQogICAgKiANCiAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAgDQogICAgKiBAcGFyYW0gaW50IHRoZSBJZCB0byBmaW5kDQogICAgKiBAcmV0dXJuIEVudGl0eSB0aGUgRW50aXR5IGZvdW5kIG9yIE5VTEwNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5SWQoRW50aXR5ICYkZW50aXR5UGFyYW0sJGlkKQ0KCXsNCgkJJGxpc3RlID0gQ29yZTo6ZmluZEJ5SWRzKCRlbnRpdHlQYXJhbSwgYXJyYXkoJGlkKSk7DQoJCQkNCgkJCWlmKCFpc3NldCgkbGlzdGVbMF0pKQ0KCQkJCXJldHVybiBudWxsOw0KCQkJDQoJCXJldHVybiAkbGlzdGVbMF07DQoJfQ0KICANCiAgICAvKioNCiAgICAqIFJldHVybiBFbnRpdGllcyBmcm9tIHRoZWlyIElkcw0KICAgICogDQogICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkgIA0KICAgICogQHBhcmFtIGFycmF5IGxpc3Qgb2YgdGhlIElkcyB0byBmaW5kDQoJKg0KICAgICogQHJldHVybiBhcnJheTxFbnRpdHk+IGxpc3Qgb2YgRW50aXRpZXMgZm91bmQNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5SWRzKEVudGl0eSAmJGVudGl0eVBhcmFtLCAkaWRzKQ0KCXsNCgkJaWYoY291bnQoJGlkcykgPT0gMCkNCgkJICByZXR1cm4gYXJyYXkoKTsNCgkJCQ0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQkkd2hlcmUgPSAiIjsNCgkJCQ0KCQlmb3JlYWNoKCRsaXN0ZUZpZWxkIGFzICRmaWVsZCkNCgkJew0KDQoJCSAgaWYoISRmaWVsZC0+aXNQcmltYXJ5S0VZKCkpDQoJCSAgeyANCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJICANCgkJICBmb3JlYWNoKCRpZHMgYXMgJGlkKQ0KCQkgIHsNCgkJICANCgkJCWlmKCFlbXB0eSgkd2hlcmUpKQ0KCQkJew0KCQkJICAkd2hlcmUgLj0gJyBPUiAnOw0KCQkJfQ0KCQkJCSAgDQoJCQkkd2hlcmUgLj0gJGZpZWxkLT5nZXROYW1lKCkuJyA9ID8nOw0KCQkJDQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkaWQsICRmaWVsZC0+Z2V0VHlwZSgpKTsNCgkJICB9DQoJCX0NCg0KCQkkcXVlcnlTZWxlY3QgPSAnU2VsZWN0ICogRlJPTSAnLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCkuJyBXSEVSRSAnLiR3aGVyZTsNCg0KCQkJLy9TaSBkw6lqw6AgcHLDqXNlbnQgZW4gY2FjaGUsIG9uIGxlIHJldG91cm5lDQoJCWlmKENhY2hlOjppc0NhY2hlKCRxdWVyeVNlbGVjdCwkcGFyYW1zKSkNCgkJew0KCQkgIHJldHVybiBDYWNoZTo6Z2V0Q2FjaGUoJHF1ZXJ5U2VsZWN0LCRwYXJhbXMpOw0KCQl9DQoNCgkJLy9FeGNlY3V0aW9uDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5U2VsZWN0LCAkcGFyYW1zKTsNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoIkRhdGFiYXNlIGVycm9yIGR1cmFudCBsYSByZXF1ZXRlIHBhciBJZHMhIik7fQ0KDQoJCSRlbnRpdHlzID0gYXJyYXkoKTsNCgkJd2hpbGUgKCRyb3cgPSAkcmVzdWx0LT5GZXRjaFJvdygpKQ0KCQl7DQoJCSAgJGVudGl0eXNbXSA9IENvcmU6OnJvd1RvRW50aXR5KCRlbnRpdHlQYXJhbSwgJHJvdyk7DQoJCX0NCgkJCQ0KCQkJLy9PbiByZXBvdXNzZSBkYW5zIGxlIGNhY2hlIGxlIHLDqXN1bHRhdCBhdmFudCBkZSBsZSByZXRvdXJuZXINCgkJQ2FjaGU6OnNldENhY2hlKCRxdWVyeVNlbGVjdCwkcGFyYW1zLCAkZW50aXR5cyk7DQoJCQkNCgkJcmV0dXJuICRlbnRpdHlzOw0KDQoJfQ0KICANCiAgICAvKioNCiAgICAgKiBBbGxvdyBzZWFyY2ggYSBsaXN0IG9mIEVudGl0eSBmcm9tIGEgbGlzdCBvZiBDcml0ZXJpYQ0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOiBmaW5kIHRoZSBjdXN0b21lcnMgd2l0aCBsYXN0TmFtZSAnUm9nZXInIChubyBjYXNzZSBzZW5zaXRpdmUpDQogICAgICogDQogICAgICogIDxjb2RlPg0KICAgICAqICAgICAgICRjdXN0b21lciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdjdXN0b21lcicpOw0KICAgICAqIA0KICAgICAqICAgICAgICRleGFtcGxlID0gbmV3IEV4YW1wbGUoKTsNCiAgICAgKiAgICAgICAkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJ2xhc3ROYW1lJywgVHlwZUNyaXRlcmlhOjokRVEsIGFycmF5KCdyb2dlcicpLCB0cnVlKTsNCiAgICAgKiANCiAgICAgKiAgICAgICBDb3JlOjpmaW5kQnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiAgRXhhbXBsZSA6IGZpbmQgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgRXhhbXBsZSgpOw0KICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBUeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7DQogICAgICogDQogICAgICogICAgICAgQ29yZTo6ZmluZEJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsNCiAgICAgKiA8L2NvZGU+DQogICAgICogDQogICAgICogTk9URSA6IEVRID0+IDxiPkVRPC9iPnVhbHMsIEdURSA9PiA8Yj5HPC9iPnJlYXRlciA8Yj5UPC9iPmhhbiBvciA8Yj5FPC9iPnF1YWxzDQogICAgICogDQogICAgICogTk9URSAyIDogeW91IGNhbiBhZGQgYXMgbWFueSBDcml0ZXJpYXMgYXMgeW91IHdhbnQgaW4gYW4gRXhhbXBsZSBPYmplY3QNCiAgICAgKiANCiAgICAgKiBAcGFyYW0gRW50aXR5IGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCiAgICAgKiBAcGFyYW0gRXhhbXBsZSB0aGUgT2JqZWN0IEV4YW1wbGUgd2l0aCBzb21lIENyaXRlcmlhcyBpbnNpZGUNCiAgICAgKiANCiAgICAgKiBAc2VlIEV4YW1wbGUNCiAgICAgKiBAc2VlIFR5cGVDcml0ZXJpYQ0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZmluZEJ5RXhhbXBsZShFbnRpdHkgJiRlbnRpdHlQYXJhbSwgRXhhbXBsZSAkZXhhbXBsZSkNCgl7DQoNCgkJJGRiID0gY21zbXMoKS0+R2V0RGIoKTsNCgkJJGxpc3RlRmllbGQgPSAkZW50aXR5UGFyYW0tPmdldEZpZWxkcygpOw0KDQoJCSRjcml0ZXJpYXMgPSAkZXhhbXBsZS0+Z2V0Q3JpdGVyaWFzKCk7DQoJCSRzZWxlY3QgPSAic2VsZWN0ICogZnJvbSAiLiRlbnRpdHlQYXJhbS0+Z2V0RGJuYW1lKCk7DQoJCSRocWwgPSAiIjsNCgkJJHBhcmFtcyA9IGFycmF5KCk7DQoJCS8vICBkaWUoInNwcCwiLmNvdW50KCRjcml0ZXJpYXMpKTsNCgkJZm9yZWFjaCgkY3JpdGVyaWFzIGFzICRjcml0ZXJpYSkNCgkJew0KCQkgIGlmKCFlbXB0eSgkaHFsKSkNCgkJICB7DQoJCQkkaHFsIC49ICcgQU5EICc7DQoJCSAgfQ0KCQkgIA0KCQkgIGlmKGVtcHR5KCRocWwpKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyBXSEVSRSAnOw0KCQkgIH0NCg0KCQkgICRmaWx0ZXJUeXBlID0gICRsaXN0ZUZpZWxkWyRjcml0ZXJpYS0+ZmllbGRuYW1lXS0+Z2V0VHlwZSgpOw0KCQkgIA0KCQkJCS8vQ3JpdMOpcmVzIGF2ZWMgMSBzZXVsIHBhcmFtw6h0cmUNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRORVEgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQUZURVINCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTkxJS0UpDQoJCSAgeyAgDQoJCQkkdmFsID0gJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXTsNCgkJCQ0KCQkJaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTElLRSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROTElLRSkNCgkJCXsNCgkJCSAgJHZhbC49ICclJzsNCgkJCX0NCgkJCQ0KCQkJJHBhcmFtc1tdID0gQ29yZTo6RmllbGRUb0RCVmFsdWUoJHZhbCwgJGZpbHRlclR5cGUpOyANCgkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEuJyA/ICc7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgDQoJCQkJLy9TYW5zIHBhcmFtw6h0cmVzDQoJCSAgaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTlVMTCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROTlVMTCkNCgkJICB7ICANCgkJCSRocWwgLj0gJGNyaXRlcmlhLT5maWVsZG5hbWUuJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWE7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCSAgDQoJCQkJLy9kZXV4IHBhcmFtw6h0cmVzDQoJCSAgaWYoJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQkVUV0VFTikNCgkJICB7ICANCgkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMF0sICRmaWx0ZXJUeXBlKTsgDQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzFdLCAkZmlsdGVyVHlwZSk7IA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYS4nID8gQU5EID8nOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIA0KCQkJCS8vIE4gcGFyYW3DqHRyZXMNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRJTiB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROSU4pDQoJCSAgew0KCQkJJGhxbCAuPSAnICggJzsNCgkJCSRzZWNvbmQgPSBmYWxzZTsgDQoJCQlmb3JlYWNoKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWEgYXMgJHBhcmFtKQ0KCQkJew0KCQkJICBpZigkc2Vjb25kKQ0KCQkJICB7DQoJCQkJJGhxbCAuPSAnIE9SICc7DQoJCQkgIH0NCgkJCSAgDQoJCQkgICRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRwYXJhbSwgJGZpbHRlclR5cGUpOyANCgkJCSAgJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS5UeXBlQ3JpdGVyaWE6OiRFUS4nID8gJzsNCgkJCSAgDQoJCQkgICRzZWNvbmQgPSB0cnVlOw0KCQkJfQ0KCQkJJGhxbCAuPSAnICknOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIA0KCQkgIC8vVHJhaXRlbWVudCBzcMOpY2lmaXF1ZQ0KCQkgIGlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JEVNUFRZKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyAoICcuJGNyaXRlcmlhLT5maWVsZG5hbWUgLicgaXMgbnVsbCB8fCAnIC4gJGNyaXRlcmlhLT5maWVsZG5hbWUgLiAiPSAnJykiOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkgIGlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5FTVBUWSkNCgkJICB7DQoJCQkkaHFsIC49ICcgKCAnLiRjcml0ZXJpYS0+ZmllbGRuYW1lIC4nIGlzIG5vdCBudWxsICYmICcgLiAkY3JpdGVyaWEtPmZpZWxkbmFtZSAuICIhPSAnJykiOw0KCQkJY29udGludWU7DQoJCSAgfQ0KCQkJCQkJIA0KCQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkxlIENyaXRlcmlhICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhIG4nZXN0IHBhcyBlbmNvcmUgcHJpcyBlbiBjaGFyZ2UiKTsNCgkJfQ0KCQkkcXVlcnlFeGFtcGxlID0gJHNlbGVjdC4kaHFsOw0KDQoJCVRyYWNlOjppbmZvKCJmaW5kQnlFeGFtcGxlIDogIi4kcXVlcnlFeGFtcGxlLiIgICAiLnByaW50X3IoJHBhcmFtcywgdHJ1ZSkpOw0KDQoJCSRyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHF1ZXJ5RXhhbXBsZSwgJHBhcmFtcyk7DQoNCgkJaWYgKCRyZXN1bHQgPT09IGZhbHNlKXtkaWUoJGRiLT5FcnJvck1zZygpLlRyYWNlOjplcnJvcigiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHJlcXVldGUgcGFyIEV4YW1wbGUhIikpO30NCg0KCQlUcmFjZTo6aW5mbygiZmluZEJ5RXhhbXBsZSA6ICIuJHJlc3VsdC0+UmVjb3JkQ291bnQoKS4iIHJlc3VsdGF0KHMpIik7DQoNCgkJJGVudGl0eXMgPSBhcnJheSgpOw0KCQl3aGlsZSAoJHJvdyA9ICRyZXN1bHQtPkZldGNoUm93KCkpDQoJCXsNCgkJICAkZW50aXR5c1tdID0gQ29yZTo6cm93VG9FbnRpdHkoJGVudGl0eVBhcmFtLCAkcm93KTsNCgkJfQ0KDQoJCXJldHVybiAkZW50aXR5czsNCg0KCX0NCiAgICAvKioNCiAgICAgKiBBbGxvdyBkZWxldGUgYSBsaXN0IG9mIEVudGl0eSBmcm9tIGEgbGlzdCBvZiBDcml0ZXJpYQ0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIGxhc3ROYW1lICdSb2dlcicgKG5vIGNhc3NlIHNlbnNpdGl2ZSkNCiAgICAgKiANCiAgICAgKiAgPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgRXhhbXBsZSgpOw0KICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnbGFzdE5hbWUnLCBUeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJ3JvZ2VyJyksIHRydWUpOw0KICAgICAqIA0KICAgICAqICAgICAgIENvcmU6OmRlbGV0ZUJ5RXhhbXBsZSgkY3VzdG9tZXIsICRleGFtcGxlKTsNCiAgICAgKiA8L2NvZGU+DQogICAgICogDQogICAgICogIEV4YW1wbGUgOiBkZWxldGUgdGhlIGN1c3RvbWVycyB3aXRoIElkID49IDkwDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGV4YW1wbGUgPSBuZXcgRXhhbXBsZSgpOw0KICAgICAqICAgICAgICRleGFtcGxlLT5hZGRDcml0ZXJpYSgnY3VzdG9tZXJfaWQnLCBUeXBlQ3JpdGVyaWE6OiRHVEUsIGFycmF5KDkwKSk7DQogICAgICogDQogICAgICogICAgICAgQ29yZTo6ZGVsZXRlQnlFeGFtcGxlKCRjdXN0b21lciwgJGV4YW1wbGUpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiBOT1RFIDogRVEgPT4gPGI+RVE8L2I+dWFscywgR1RFID0+IDxiPkc8L2I+cmVhdGVyIDxiPlQ8L2I+aGFuIG9yIDxiPkU8L2I+cXVhbHMNCiAgICAgKiANCiAgICAgKiBOT1RFIDIgOiB5b3UgY2FuIGFkZCBhcyBtYW55IENyaXRlcmlhcyBhcyB5b3Ugd2FudCBpbiBhbiBFeGFtcGxlIE9iamVjdA0KICAgICAqIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICAqIEBwYXJhbSBFeGFtcGxlIHRoZSBPYmplY3QgRXhhbXBsZSB3aXRoIHNvbWUgQ3JpdGVyaWFzIGluc2lkZQ0KICAgICAqIA0KICAgICAqIEBzZWUgRXhhbXBsZQ0KICAgICAqIEBzZWUgVHlwZUNyaXRlcmlhDQogICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkZWxldGVCeUV4YW1wbGUoRW50aXR5ICYkZW50aXR5UGFyYW0sIEV4YW1wbGUgJEV4YW1wbGUpDQoJew0KDQoJCSRkYiA9IGNtc21zKCktPkdldERiKCk7DQoJCSRsaXN0ZUZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZHMoKTsNCg0KCQkkY3JpdGVyaWFzID0gJEV4YW1wbGUtPmdldENyaXRlcmlhcygpOw0KCQkkZGVsZXRlID0gImRlbGV0ZSBmcm9tICIuJGVudGl0eVBhcmFtLT5nZXREYm5hbWUoKTsNCgkJJGhxbCA9ICIiOw0KCQkkcGFyYW1zID0gYXJyYXkoKTsNCgkJZm9yZWFjaCgkY3JpdGVyaWFzIGFzICRjcml0ZXJpYSkNCgkJew0KCQkgIGlmKCFlbXB0eSgkaHFsKSkNCgkJICB7DQoJCQkkaHFsIC49ICcgQU5EICc7DQoJCSAgfQ0KCQkgIA0KCQkgIGlmKGVtcHR5KCRocWwpKQ0KCQkgIHsNCgkJCSRocWwgLj0gJyBXSEVSRSAnOw0KCQkgIH0NCg0KCQkgICRmaWx0ZXJUeXBlID0gJGxpc3RlRmllbGRbJGNyaXRlcmlhLT5maWVsZG5hbWVdLT5nZXRUeXBlKCk7DQoJCSAgDQoJCQkJLy8gMSBwYXJhbcOodHJlICANCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRFUSB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRORVEgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRHVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVCB8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRMVEUgDQoJCQl8fCAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRUZPUkUgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokQUZURVINCgkJCXx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JExJS0UgfHwgJGNyaXRlcmlhLT50eXBlQ3JpdGVyaWEgPT0gVHlwZUNyaXRlcmlhOjokTkxJS0UpDQoJCSAgeyAgDQoJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkY3JpdGVyaWEtPnBhcmFtc0NyaXRlcmlhWzBdLCAkZmlsdGVyVHlwZSk7IA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYS4nID8gJzsNCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJICANCgkJCQkvLyAwIHBhcmFtw6h0cmUNCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiROVUxMIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5OVUxMKQ0KCQkgIHsgIA0KCQkJJGhxbCAuPSAkY3JpdGVyaWEtPmZpZWxkbmFtZS4kY3JpdGVyaWEtPnR5cGVDcml0ZXJpYTsNCgkJCWNvbnRpbnVlOw0KCQkgIH0NCgkJICANCgkJCQkvLyAyIHBhcmFtw6h0cmVzICANCgkJICBpZigkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSA9PSBUeXBlQ3JpdGVyaWE6OiRCRVRXRUVOKQ0KCQkgIHsgIA0KCQkJJHBhcmFtc1tdID0gQ29yZTo6RmllbGRUb0RCVmFsdWUoJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYVswXSwgJGZpbHRlclR5cGUpOyANCgkJCSRwYXJhbXNbXSA9IENvcmU6OkZpZWxkVG9EQlZhbHVlKCRjcml0ZXJpYS0+cGFyYW1zQ3JpdGVyaWFbMV0sICRmaWx0ZXJUeXBlKTsgDQoJCQkkaHFsIC49ICRjcml0ZXJpYS0+ZmllbGRuYW1lLiRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhLicgPyBBTkQgPyc7DQoJCQljb250aW51ZTsNCgkJICB9DQoJCQkJDQoJCQkJLy8gTiBwYXJhbcOodHJlcw0KCQkJCWlmKCRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JElOIHx8ICRjcml0ZXJpYS0+dHlwZUNyaXRlcmlhID09IFR5cGVDcml0ZXJpYTo6JE5JTikNCgkJCQl7DQoJCQkJCSRocWwgLj0gJyAoICc7DQoJCQkJCSRzZWNvbmQgPSBmYWxzZTsgDQoJCQkJCWZvcmVhY2goJGNyaXRlcmlhLT5wYXJhbXNDcml0ZXJpYSBhcyAkcGFyYW0pDQoJCQkJCXsNCgkJCQkJCWlmKCRzZWNvbmQpDQoJCQkJCQl7DQoJCQkJCQkJJGhxbCAuPSAnIE9SICc7DQoJCQkJCQl9DQoJCQkJCQkkcGFyYW1zW10gPSBDb3JlOjpGaWVsZFRvREJWYWx1ZSgkcGFyYW0sICRmaWx0ZXJUeXBlKTsgDQoJCQkJCQkkaHFsIC49ICRjcml0ZXJpYS0+ZmllbGRuYW1lLlR5cGVDcml0ZXJpYTo6JEVRLicgPyAnOw0KCQkJCQkJDQoJCQkJCQkkc2Vjb25kID0gdHJ1ZTsNCgkJCQkJfQ0KCQkJCQkkaHFsIC49ICcgKSc7DQoJCQkJCWNvbnRpbnVlOw0KCQkJCX0gICAgICAgICAgICAgICAgICAgICAgICANCgkJICANCgkJICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBDcml0ZXJpYSAkY3JpdGVyaWEtPnR5cGVDcml0ZXJpYSBuJ2VzdCBwYXMgZW5jb3JlIHByaXMgZW4gY2hhcmdlIik7DQoJCX0NCgkJJHF1ZXJ5RXhhbXBsZSA9ICRkZWxldGUuJGhxbDsNCgkJCQkJCQkJCQkNCg0KCQkkcmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxdWVyeUV4YW1wbGUsICRwYXJhbXMpOw0KCQlpZiAoJHJlc3VsdCA9PT0gZmFsc2Upe2RpZSgiRGF0YWJhc2UgZXJyb3IgZHVyYW50IGxhIHJlcXVldGUgcGFyIEV4YW1wbGUhIik7fQ0KCX0NCiAgICAgIA0KICAgIC8qKg0KICAgICAqIFRyYW5zZm9ybXMgYW4gYXJyYXkgb2YgdmFsdWUgaW50byBhIGVudGlyZSBFbnRpdHkuIFRoZSBhcnJheSBtdXN0IGZhbGxvdyB0aGlzIHNjaGVtZQ0KICAgICAqIA0KICAgICAqIEV4YW1wbGUgOg0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgICAgICRteUFycmF5MSA9IGFycmF5KCdjdXN0b21lcl9pZCc9PjEsICduYW1lJz0+J0R1cG9udCcpOyAgICAgICANCiAgICAgKiAgICAgICAkbXlBcnJheTIgPSBhcnJheSgnY3VzdG9tZXJfaWQnPT4yLCAnbmFtZSc9PidEdXJhbmQnLCAnbGFzdE5hbWUnPT4nSm9lJyk7ICAgICAgIA0KICAgICAqICAgDQogICAgICogICAgICAgJGN1c3RvbWVyID0gTXlBdXRvbG9hZDo6Z2V0SW5zdGFuY2UoJHRoaXMtPkdldE5hbWUoKSwgJ2N1c3RvbWVyJyk7DQogICAgICogDQogICAgICogICAgICAgJGN1c3RvbWVyMSA9IENvcmU6OnJvd1RvRW50aXR5KCRjdXN0b21lciwgJG15QXJyYXkxKTsNCiAgICAgKiAgICAgICAkY3VzdG9tZXIyID0gQ29yZTo6cm93VG9FbnRpdHkoJGN1c3RvbWVyLCAkbXlBcnJheTIpOw0KICAgICAqIA0KICAgICAqICAgICAgIGVjaG8gJGN1c3RvbWVyMS0+Z2V0KCdsYXN0TmFtZScpOyAvL3JldHVybiBudWxsDQogICAgICogICAgICAgZWNobyAkY3VzdG9tZXIyLT5nZXQoJ2xhc3ROYW1lJyk7IC8vcmV0dXJuIEpvZQ0KICAgICAqIA0KICAgICAqIDwvY29kZT4NCiAgICAgKiAgICAgICAgIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KICAgICAqIEBwYXJhbSBhcnJheSB0aGUgbGlzdCB3aXRoIHRoZSBkYXRhDQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZpbmFsIGZ1bmN0aW9uIHJvd1RvRW50aXR5IChFbnRpdHkgJiRlbnRpdHlQYXJhbSwgJHJvdykNCgl7DQoNCgkJVHJhY2U6OmRlYnVnKCJyb3dUb0VudGl0eSA6ICIucHJpbnRfcigkcm93LHRydWUpLiI8YnIvPiIpOw0KCQkkbGlzdGVGaWVsZCA9ICRlbnRpdHlQYXJhbS0+Z2V0RmllbGRzKCk7DQoNCgkJJG5ld0VudGl0eSA9IGNsb25lICRlbnRpdHlQYXJhbTsNCgkJZm9yZWFjaCgkbGlzdGVGaWVsZCBhcyAkZmllbGQpDQoJCXsNCgkJICBpZighJGZpZWxkLT5pc0Fzc29jaWF0ZUtFWSgpKQ0KCQkgIHsNCgkJCSRuZXdFbnRpdHktPnNldCgkZmllbGQtPmdldE5hbWUoKSxDb3JlOjpkYlZhbHVlVG9GaWVsZCgkcm93WyRmaWVsZC0+Z2V0TmFtZSgpXSwgJGZpZWxkLT5nZXRUeXBlKCkpKTsNCgkJICB9IA0KCQl9DQoJCXJldHVybiAkbmV3RW50aXR5OyAgDQoJfQ0KICANCiAgICAvKioNCiAgICAgKiBUcmFuc2Zvcm0gYSBQSFAgdmFsdWUgaW50byBhIFNRTCB2YWx1ZQ0KICAgICAqIA0KICAgICAqIEBwYXJhbSBtaXhlZCB0aGUgUEhQIHZhbHVlDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBDQVNUIHZhbHVlDQogICAgICogDQogICAgICogQHNlZSBDQVNUDQogICAgICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBGaWVsZFRvREJWYWx1ZSgkZGF0YSwgJHR5cGUpDQoJew0KCQlpZigkZGF0YSA9PSBudWxsKXsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoJCQ0KCQlzd2l0Y2goJHR5cGUpDQoJCXsNCgkJICBjYXNlIENBU1Q6OiRTVFJJTkcgOiByZXR1cm4gJGRhdGE7DQoJCSAgDQoJCSAgY2FzZSBDQVNUOjokSU5URUdFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JEJVRkZFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiREQVRFIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCRGF0ZSgkZGF0YSkpOyAgICAgICANCgkJICANCgkJICBjYXNlIENBU1Q6OiRUSU1FIDogcmV0dXJuIHN0cl9yZXBsYWNlKCInIiwgIiIsIGNtc21zKCktPkdldERiKCktPkRCVGltZVN0YW1wKCRkYXRhKSk7ICAgICANCg0KCQkgIGNhc2UgQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOyAgDQoJCX0NCgl9DQogIA0KICAgIC8qKg0KICAgICAqIFRyYW5zZm9ybSBhIFNRTCB2YWx1ZSBpbnRvIGEgUEhQIHZhbHVlDQogICAgICogDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBTUUwgdmFsdWUgDQogICAgICogQHBhcmFtIG1peGVkIHRoZSBDQVNUIHZhbHVlDQogICAgICogDQogICAgICogQHNlZSBDQVNUDQogICAgICovDQoJcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBkYlZhbHVlVG9GaWVsZCgkZGF0YSwgJHR5cGUpDQoJew0KCQlzd2l0Y2goJHR5cGUpDQoJCXsNCgkJICBjYXNlIENBU1Q6OiRTVFJJTkcgOiByZXR1cm4gJGRhdGE7DQoJCSAgDQoJCSAgY2FzZSBDQVNUOjokSU5URUdFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiROVU1FUklDIDogcmV0dXJuICRkYXRhOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JEJVRkZFUiA6IHJldHVybiAkZGF0YTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiREQVRFIDogcmV0dXJuIGNtc21zKCktPkdldERiKCktPlVuaXhEYXRlKCRkYXRhKTsNCgkJICANCgkJICBjYXNlIENBU1Q6OiRUSU1FIDogcmV0dXJuICRkYXRhOy8vcmV0dXJuIGNtc21zKCktPkdldERiKCktPlVuaXhUaW1lU3RhbXAoJGRhdGEpOw0KCQkgIA0KCQkgIGNhc2UgQ0FTVDo6JFRTIDogcmV0dXJuICRkYXRhOw0KDQoJCX0NCgl9DQogICAgDQogICAgLyoqDQogICAgICogUmV0dXJuIHRoZSBlbnRpdGllcyAnQicgd2hpY2ggY291bGQgYmUgYXNzb2NpYXRlIHRvIGFuIEVudGl0eSAnQScgKGJ1dCBjdXJyZW50bHkgYXJlIG5vdCBhc3NvY2lhdGUpDQogICAgICogDQogICAgICogRXhhbXBsZSA6IFdoaWNoIFRhZyBjYW4gaSBhc3NvY2lhdGUgdG8gbXkgQmxvZyB0aGF0IGFyZSBub3QgYWxyZWFkeSBsaW5rZWQgPw0KICAgICAqIA0KICAgICAqIEZvciBtZW1vcnksIGFuIGNvcnJlY3QgQXNzb2NpYXRlS2V5IHN5c3RlbSBpbiBPcm0gaXMgMyBFbnRpdGllcyBsaWtlIHRoYXQgOiANCiAJICogIDEgYmxvZyBjYW4gYmUgbGlua2VkIHRvIDAvbiBUYWcNCiAJICogIDEgdGFnIGNhbiBiZW4gbGlua2VkIHRvIDAvbiBCbG9nIA0KCSAqICBTbyB3ZSd2ZSBnb3QgOiBCbG9nIChFbnRpdHkpIDwtPiBCbG9nMlRhZyAoRW50aXR5QXNzb2NpYXRpb24pIDwtPiBUYWcgKEVudGl0eSkgDQogICAgICogDQogICAgICogPGNvZGU+DQogICAgICogICAgY2xhc3MgQmxvZyBleHRlbmRzIEVudGl0eQ0KICAgICAqICAgIHsNCiAgICAgKiAgICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCdibG9nJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnYmxvZ19pZCcgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbCANCiAgICAgKiAJCQkJCQksIEtFWTo6JFBLDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgndGFncycgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nMlRhZy50YWdfaWQnIAk8LS0gbGluayB0byB0aGUgYXNzb2NpYXRlIEVudGl0eSA6ICdCbG9nMlRhZycgIHdpdGggaXRzIHByb3BlcnR5ICd0YWdfaWQnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgfQ0KICAgICAqICAgIH0NCiAgICAgKiANCiAgICAgKiAgICBjbGFzcyBUYWcgZXh0ZW5kcyBFbnRpdHkNCiAgICAgKiAgICB7DQogICAgICogICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCd0YWcnKTsNCiAgICAgKiAgICAgICAgICAgIA0KICAgICAqICAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwgDQogICAgICogCQkJCQkJLCBLRVk6OiRQSw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ2Jsb2dzJyANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEFLICAgIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCAnQmxvZzJUYWcuYmxvZ19pZCcgPC0tIGxpbmsgdG8gdGhlIGFzc29jaWF0ZSBFbnRpdHkgOiAnQmxvZzJUYWcnICB3aXRoIGl0cyBwcm9wZXJ0eSAnYmxvZ19pZCcNCgkgKgkJCQkJCSkpOw0KICAgICAqICAgICAgICB9DQogICAgICogICAgICAgIA0KICAgICAqDQogICAgICogICAgfQ0KICAgICAqIA0KICAgICAqICAgY2xhc3MgQmxvZzJUYWcgZXh0ZW5kcyBFbnRpdHlBc3NvY2lhdGlvbg0KICAgICAqICAgew0KICAgICAqICAgICAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQ0KICAgICAqICAgICAgICB7DQogICAgICogICAgICAgICAgICBwYXJlbnQ6Ol9fY29uc3RydWN0KCdteU1vZHVsZScsJ2Jsb2cydGFnJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdibG9nX2lkJw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRGSw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsICdCbG9nLnRhZ3MnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCd0YWdfaWQnICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgQ0FTVDo6JElOVEVHRVINCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIEtFWTo6JEZLDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsICdUYWcuYXJ0aWNsZXMnIA0KCSAqCQkJCQkJKSk7DQogICAgICoNCiAgICAgKiAgICAgICAgfSAgICANCiAgICAgKiAgICB9DQogICAgICogPC9jb2RlPg0KCSAqDQoJICogQW5kIG5vdyB0aGUgY29kZSB0byBmaW5kIHRoZSBwb3RlbnRpYWxzIFRhZyBmb3IgbXkgQmxvZyA6IA0KCSAqDQoJICogPGNvZGU+DQoJICogICAkYmxvZyA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdibG9nJyk7DQoJICogICAkdGFncyA9IENvcmU6OmdldEVudGl0eXNBc3NvY2lhYmxlKCRibG9nLCd0YWdzJyk7DQoJICogPC9jb2RlPg0KICAgICAqIA0KICAgICAqIEBwYXJhbSBFbnRpdHkgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSANCiAgICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBmaWVsZCdzIG5hbWUgb2YgdGhlIEVudGl0eSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc3RhcnQgdGhlIHJlc2VhcmNoDQoJICoNCiAgICAgKiBAcmV0dXJuIGFycmF5PEVudGl0eT4gYSBsaXN0IG9mIHRoZSBFbnRpdGllcyBsaW5rZWQgdG8gdGhlIGVudGl0eSBpbiB0aGUgcGFyYW1ldGVycyBieSB0aGUgZmllbGROYW1lIGluIHRoZSBQYXJhbWV0ZXJzDQogICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRFbnRpdHlzQXNzb2NpYWJsZShFbnRpdHkgJiRlbnRpdHlQYXJhbSwkZmllbGRuYW1lKQ0KCXsNCgkJJGZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRuYW1lKTsNCgkJaWYoJGZpZWxkLT5nZXRLRVlOYW1lKCkgPT0gJycpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBjaGFtcHMgJGZpZWxkbmFtZSBuZSBwb3NzZWRlIGF1Y3VuZSBjbGUgZXRyYW5nZXJlIGFzc29jaWVlIHBvdXIgbGEgY2xhc3MgIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCQkNCgkJJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KDQoJCWV2YWwoJyRlbnRpdHkgPSBuZXcgJy4kY2xlWzBdLicoKTsnKTsNCgkJCQkJCQkJCQkgICANCg0KCQkkbGlzdEZpZWxkID0gJGVudGl0eS0+Z2V0RmllbGRzKCk7DQoJCWZvcmVhY2goJGxpc3RGaWVsZCBhcyAkZmllbGQpDQoJCXsNCgkJICBpZigkZmllbGQtPmdldEtFWU5hbWUoKSA9PSAnJykNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkxlIGNoYW1wcyAkZmllbGRuYW1lIG5lIHBvc3NlZGUgYXVjdW5lIGNsZSBldHJhbmdlcmUgYXNzb2NpZWUgcG91ciBsYSBjbGFzcyAiLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsNCgkJCQkNCgkJICAkY2xlID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7DQoJCSAgDQoJCSAgaWYoc3RydG9sb3dlcigkY2xlWzBdKSA9PSAkZW50aXR5UGFyYW0tPmdldE5hbWUoKSkNCgkJCWNvbnRpbnVlOw0KCQkJICANCgkJICANCgkJICAvL0V2YWx1YXRpb24gZGUgbGEgZWNsYXNzIGVuIGNvdXJzDQoJCSAgZXZhbCgnJGVudGl0eSA9IG5ldyAnLiRjbGVbMF0uJygpOycpOw0KCQkgIA0KCQkgICRsaXN0ZSA9IENvcmU6OmZpbmRBbGwoJGVudGl0eSk7DQoJCSAgDQoJCSAgcmV0dXJuICRsaXN0ZTsNCgkJfSANCgl9DQoNCiAgICAvKioNCiAgICAgKiBSZXR1cm4gdGhlIGVudGl0aWVzICdCJyB3aGljaCBhcmUgYWxyZWFkeSBhc3NvY2lhdGUgdG8gYW4gRW50aXR5ICdBJyANCiAgICAgKiANCiAgICAgKiBFeGFtcGxlIDogV2hpY2ggVGFnIGFyZSBhbHJlYWR5IGFzc29jaWF0ZSB0byBteSBCbG9nID8NCiAgICAgKiANCiAgICAgKiBGb3IgbWVtb3J5LCBhbiBjb3JyZWN0IEFzc29jaWF0ZUtleSBzeXN0ZW0gaW4gT3JtIGlzIDMgRW50aXRpZXMgbGlrZSB0aGF0IDogDQogCSAqICAxIGJsb2cgY2FuIGJlIGxpbmtlZCB0byAwL24gVGFnDQogCSAqICAxIHRhZyBjYW4gYmVuIGxpbmtlZCB0byAwL24gQmxvZyANCgkgKiAgU28gd2UndmUgZ290IDogQmxvZyAoRW50aXR5KSA8LT4gQmxvZzJUYWcgKEVudGl0eUFzc29jaWF0aW9uKSA8LT4gVGFnIChFbnRpdHkpIA0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAgIGNsYXNzIEJsb2cgZXh0ZW5kcyBFbnRpdHkNCiAgICAgKiAgICB7DQogICAgICogICAgICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgICogICAgICAgIHsNCiAgICAgKiAgICAgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJ215TW9kdWxlJywnYmxvZycpOw0KICAgICAqICAgICAgICAgICAgDQogICAgICogICAgICAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ2Jsb2dfaWQnIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwgDQogICAgICogCQkJCQkJLCBLRVk6OiRQSw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgICAgICAgJHRoaXMtPmFkZChuZXcgRmllbGQoJ3RhZ3MnIA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRBSyAgICANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCAnQmxvZzJUYWcudGFnX2lkJyAJPC0tIGxpbmsgdG8gdGhlIGFzc29jaWF0ZSBFbnRpdHkgOiAnQmxvZzJUYWcnICB3aXRoIGl0cyBwcm9wZXJ0eSAndGFnX2lkJw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgIH0NCiAgICAgKiAgICB9DQogICAgICogDQogICAgICogICAgY2xhc3MgVGFnIGV4dGVuZHMgRW50aXR5DQogICAgICogICAgew0KICAgICAqICAgICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgICogICAgICAgIHsNCiAgICAgKiAgICAgICAgICAgIHBhcmVudDo6X19jb25zdHJ1Y3QoJ215TW9kdWxlJywndGFnJyk7DQogICAgICogICAgICAgICAgICANCiAgICAgKiAgICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgndGFnX2lkJyANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBDQVNUOjokSU5URUdFUg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsIA0KICAgICAqIAkJCQkJCSwgS0VZOjokUEsNCgkgKgkJCQkJCSkpOw0KICAgICAqICAgICAgICAgICAgICR0aGlzLT5hZGQobmV3IEZpZWxkKCdibG9ncycgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRBSyAgICANCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgJ0Jsb2cyVGFnLmJsb2dfaWQnIDwtLSBsaW5rIHRvIHRoZSBhc3NvY2lhdGUgRW50aXR5IDogJ0Jsb2cyVGFnJyAgd2l0aCBpdHMgcHJvcGVydHkgJ2Jsb2dfaWQnDQoJICoJCQkJCQkpKTsNCiAgICAgKiAgICAgICAgfQ0KICAgICAqICAgICAgICANCiAgICAgKg0KICAgICAqICAgIH0NCiAgICAgKiANCiAgICAgKiAgIGNsYXNzIEJsb2cyVGFnIGV4dGVuZHMgRW50aXR5QXNzb2NpYXRpb24NCiAgICAgKiAgIHsNCiAgICAgKiAgICAgICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCkNCiAgICAgKiAgICAgICAgew0KICAgICAqICAgICAgICAgICAgcGFyZW50OjpfX2NvbnN0cnVjdCgnbXlNb2R1bGUnLCdibG9nMnRhZycpOw0KICAgICAqICAgICAgICAgICAgDQogICAgICogICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgnYmxvZ19pZCcNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBDQVNUOjokSU5URUdFUg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCBudWxsDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICwgS0VZOjokRksNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgLCAnQmxvZy50YWdzJw0KCSAqCQkJCQkJKSk7DQogICAgICogICAgICAgICAgICAkdGhpcy0+YWRkKG5ldyBGaWVsZCgndGFnX2lkJyAgICAgICAgDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIENBU1Q6OiRJTlRFR0VSDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAsIG51bGwNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICwgbnVsbA0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCBLRVk6OiRGSw0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgLCAnVGFnLmFydGljbGVzJyANCgkgKgkJCQkJCSkpOw0KICAgICAqDQogICAgICogICAgICAgIH0gICAgDQogICAgICogICAgfQ0KICAgICAqIDwvY29kZT4NCgkgKg0KCSAqIEFuZCBub3cgdGhlIGNvZGUgdG8gZmluZCB0aGUgVGFnIGFscmVhZHkgbGlua2VkIHdpdGggbXkgQmxvZyAjNDU6IA0KCSAqDQoJICogPGNvZGU+DQoJICogICAkYmxvZyA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdibG9nJyk7DQoJICogICAkdGFncyA9IENvcmU6OmdldEVudGl0eXNBc3NvY2llZXNMaWVlcygkYmxvZywndGFncycsIDQ1KTsNCgkgKiA8L2NvZGU+DQogICAgICogDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5IA0KICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIGZpZWxkJ3MgbmFtZSBvZiB0aGUgRW50aXR5IHdoaWNoIHdpbGwgYmUgdXNlZCB0byBzdGFydCB0aGUgcmVzZWFyY2gNCgkgKiBAcGFyYW0gbWl4ZWQgZW50aXR5SWQgdGhlIGlkIG9mIHRoZSBCbG9nIHRvIHN0YXJ0IHRoZSByZXNlYXJjaA0KCSAqDQogICAgICogQHJldHVybiBhcnJheTxFbnRpdHk+IGEgbGlzdCBvZiB0aGUgRW50aXRpZXMgbGlua2VkIHRvIHRoZSBlbnRpdHkgaW4gdGhlIHBhcmFtZXRlcnMgYnkgdGhlIGZpZWxkTmFtZSBpbiB0aGUgUGFyYW1ldGVycw0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gZ2V0RW50aXR5c0Fzc29jaWVlc0xpZWVzKEVudGl0eSAmJGVudGl0eVBhcmFtLCAkZmllbGRuYW1lLCAkZW50aXR5SWQpDQoJew0KCQlUcmFjZTo6ZGVidWcoImdldEVudGl0eXNBc3NvY2llZXNMaWVlcyA6ICIuJGVudGl0eVBhcmFtLT5nZXROYW1lKCkuIiAiLiRmaWVsZG5hbWUuIiAiLiRlbnRpdHlJZCk7DQoNCgkJJGZpZWxkID0gJGVudGl0eVBhcmFtLT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRuYW1lKTsNCg0KCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSA9PSAnJykNCgkJCXRocm93IG5ldyBFeGNlcHRpb24oIkxlIGNoYW1wcyAkZmllbGRuYW1lIG5lIHBvc3NlZGUgYXVjdW5lIGNsZSBldHJhbmdlcmUgYXNzb2NpZWUgcG91ciBsYSBjbGFzcyAiLiRlbnRpdHlQYXJhbS0+Z2V0TmFtZSgpKTsNCgkJICANCgkJJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KDQoJCWV2YWwoJyRlbnRpdHkgPSBuZXcgJy4kY2xlWzBdLicoKTsnKTsNCgkJCQkJCQkJCQkJCQkJCQkgIA0KCQkkZXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7ICAgIA0KCQkkZXhhbXBsZS0+YWRkQ3JpdGVyaWEoJGNsZVsxXSxUeXBlQ3JpdGVyaWE6OiRFUSxhcnJheSgkZW50aXR5SWQpKTsNCgkJJGFzc29jcyA9IENvcmU6OmZpbmRCeUV4YW1wbGUoJGVudGl0eSwgJGV4YW1wbGUpOw0KDQoJCSRsaXN0RmllbGQgPSAkZW50aXR5LT5nZXRGaWVsZHMoKTsNCgkJZm9yZWFjaCgkbGlzdEZpZWxkIGFzICRmaWVsZCkNCgkJew0KCQkgIGlmKCRmaWVsZC0+Z2V0S0VZTmFtZSgpID09IG51bGwgfHwgJGZpZWxkLT5nZXRLRVlOYW1lKCkgPT0gJycpDQoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJMZSBjaGFtcHMgJGZpZWxkbmFtZSBuZSBwb3NzZWRlIGF1Y3VuZSBjbGUgZXRyYW5nZXJlIGFzc29jaWVlIHBvdXIgbGEgY2xhc3MgIi4kZW50aXR5UGFyYW0tPmdldE5hbWUoKSk7DQoJCSAgDQoJCSAgJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkgIA0KCQkgIGlmKHN0cnRvbG93ZXIoJGNsZVswXSkgPT0gJGVudGl0eVBhcmFtLT5nZXROYW1lKCkpDQoJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCgkJCQkJDQoJCSAgJGlkcyA9IGFycmF5KCk7DQoJCSAgZm9yZWFjaCgkYXNzb2NzIGFzICRhc3NvYykNCgkJICB7DQoJCQkkaWRzW10gPSAkYXNzb2MtPmdldCgkZmllbGQtPmdldE5hbWUoKSk7DQoJCSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQoJCSAgDQoJCSAgJGNsZSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkJCQ0KCQkgIC8vRXZhbHVhdGlvbiBkZSBsYSBlY2xhc3MgZW4gY291cnMNCgkJICBldmFsKCckZW50aXR5ID0gbmV3ICcuJGNsZVswXS4nKCk7Jyk7DQoJCSAgDQoJCSAgJGxpc3RlID0gQ29yZTo6ZmluZEJ5SWRzKCRlbnRpdHksICRpZHMpOw0KCQkgIA0KCQkgIFRyYWNlOjpkZWJ1ZygiZ2V0RW50aXR5c0Fzc29jaWVlc0xpZWVzIDogIi4icmVzdWx0YXQgOiAiLmNvdW50KCRsaXN0ZSkpOw0KCQkgIA0KCQkgIHJldHVybiAkbGlzdGU7DQoJCX0gICAgDQoJfQ0KICANCiAgICAvKioNCiAgICAgKiBWZXJpZnkgaW4gYWxsIHR5cGUgb2YgZW50aXRpZXMgaWYgYW55b25lIHN0aWxsIGhhcyBhIGxpbmsgd2l0aCB0aGUgRW50aXR5IHBhc3NlZCBpbiBwYXJhbWV0ZXJzIChGb3JlaWduS0V5IGFuZCBBc3NvY2lhdGVLZXkpDQogICAgICogDQogICAgICogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSB0aGUgZGVsZXRlKiBmdW5jdGlvbnMgdG8gYXZvaWQgb3JwaGVsaW5zIGRhdGEgaW4gZGF0YWJhc2UNCiAgICAgKiANCgkgKiBAcGFyYW0gT3JtIHRoZSBtb2R1bGUgd2hpY2ggZXh0ZW5kcyB0aGUgT3JtIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICogQHBhcmFtIEVudGl0eSBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQogICAgICogQHBhcmFtIG1peGVkIHRoZSBpZCBvZiB0aGUgRW50aXR5IHRvIHZlcmlmeQ0KCSAqDQoJICogQHJldHVybiBhIG1lc3NhZ2UgaWYgYSBsaW5rIGlzIHN0aWxsIHByZXNlbnQuIG5vdGhpbmcgaWYgdGhlIGludGVncml0eSBpcyBvaw0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gdmVyaWZJbnRlZ3JpdHkoRW50aXR5ICYkZW50aXR5LCAkc2lkKQ0KCXsNCgkJJGxpc3RlRW50aXR5cyA9IE15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcygkZW50aXR5LT5nZXRNb2R1bGVOYW1lKCkpOw0KDQoJCWZvcmVhY2goJGxpc3RlRW50aXR5cyBhcyAka2V5PT4kYW5FbnRpdHkpDQoJCXsNCgkJICBpZigkYW5FbnRpdHkgaW5zdGFuY2VPZiBFbnRpdHlBc3NvY2lhdGlvbikNCgkJCWNvbnRpbnVlOw0KCQkJDQoJCSAgZm9yZWFjaCgkYW5FbnRpdHktPmdldEZpZWxkcygpIGFzICRmaWVsZCkNCgkJICB7DQoJCQlpZigkZmllbGQtPmlzQXNzb2NpYXRlS0VZKCkpDQoJCQl7DQoJCQkgIGNvbnRpbnVlOw0KCQkJfQ0KCQkJDQoJCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSAhPSBudWxsKQ0KCQkJew0KCQkJICAkdmFscyA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkJICANCgkJCSAgaWYoc3RydG9sb3dlciAoJHZhbHNbMF0pID09IHN0cnRvbG93ZXIgKCRlbnRpdHktPmdldE5hbWUoKSkpDQoJCQkgIHsNCgkJCQkkRXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7DQoJCQkJJEV4YW1wbGUtPmFkZENyaXRlcmlhKCRmaWVsZC0+Z2V0TmFtZSgpLCBUeXBlQ3JpdGVyaWE6OiRFUSwgYXJyYXkoJHNpZCkpOw0KCQkJCSRlbnRpdHlzID0gQ29yZTo6ZmluZEJ5RXhhbXBsZSgkYW5FbnRpdHksICRFeGFtcGxlKTsNCgkJCQlpZihjb3VudCgkZW50aXR5cykgPiAwKQ0KCQkJCXsNCgkJCQkgIHJldHVybiAiTGEgbGlnbmUgJmFncmF2ZTsgc3VwcHJpbWVyIGVzdCBlbmNvcmUgdXRpbGlzJmVhY3V0ZTtlIHBhciAmbGFxdW87ICIuJGFuRW50aXR5LT5nZXROYW1lKCkuIiAmcmFxdW87IjsNCgkJCQl9DQoJCQkgIH0NCgkJCX0NCgkJICB9DQoJCX0NCg0KCQlyZXR1cm47DQoNCgl9DQoNCiAgICAvKioNCiAgICAgKiBBbGxvdyByZWFsaXNlIGRlZXAgc2VhcmNoIG9uIGRpZmZlcmVudCB0eXBlIG9mIEVudGl0eSBsaW5rZWQgdG9nZXRoZXINCiAgICAgKiANCiAgICAgKiBFeGFtcGxlIDogDQogICAgICogICBBbiBPcmRlciBoYXMgYSBsaW5rIHRvIGEgQ3VzdG9tZXIgKE9yZGVyLmN1c3RvbWVyX2lkKQ0KICAgICAqICAgQSBDdXN0b21lciBoYXMgYSBsaW5rIHRvIGFuIEFkcmVzcyAoQ3VzdG9tZXIuYWRyZXNzZV9pZCkNCiAgICAgKiAgIEFuIEFkcmVzcyBoYXMgYSBsaW5rIHRvIGEgY2l0eSAoQWRyZXNzLmNpdHlfaWQpDQoJICogICBBIGNpdHkgaGFzIGEgWmlwQ29kZSAobWF5YmUgc2hhcmVkIGJ5IGRpZmZlcmVudHMgY2l0aWVzKQ0KICAgICAqIA0KICAgICAqICBJZiBpIHdhbnQgdGhlIE9yZGVycyBmb3IgQ3VzdG9tZXJzIGZyb20gdGhlIGNpdHkgd2l0aCB6aXBjb2RlIGVxdWFscyB0byAiMDEyMzQiIG9yICI0NTY3IiBJIGNvdWxkIHdyaXRlIHNvbWUgc2hpdHR5IGNvZGUgIQ0KICAgICAqIA0KICAgICAqIDxjb2RlPg0KICAgICAqICAkY2l0aWVzID0gLy9GaW5kIG15IGNpdGllcyB3aXRoIFppcENvZGUgIjAxMjM0IiBvciAiNDU2NyINCiAgICAgKiAgZm9yZWFjaCgkY2l0aWVzIGFzICRjaXR5KQ0KICAgICAqICB7DQogICAgICogICAgICAgJGFkcmVzc2VzID0gLy9GaW5kIHRoZSBhZHJlc3MgZm9yIHRoZSBjaXR5ICRjaXR5DQogICAgICogICAgICAgZm9yZWFjaCgkYWRyZXNzZXMgYXMgJGFkcmVzcykNCiAgICAgKiAgICAgICB7DQogICAgICogICAgICAgICAgICRjdXN0b21lcnMgPSAvL0ZpbmQgdGhlIEN1c3RvbWVycyBmb3IgdGhlIGFkcmVzcyAkYWRyZXNzDQogICAgICogICAgICAgICAgIGZvcmVhY2goJGN1c3RvbWVycyBhcyAkY3VzdG9tZXIpDQogICAgICogICAgICAgICAgIHsNCiAgICAgKiAgICAgICAgICAgICAgICRjb21tYW5kZXMgPSAgLy9GaW5kIFRyYWl0ZW1lbnQgZGUgcmVjaGVyY2hlIGQndW5lIGNvbW1hbmRlIHBvc3PDqGRhbnQgbGUgbnVtZXJvY2xpZW50ID0gJGN1c3RvbWVyLT5nZXQoJ251bWVyb2NsaWVudCcpICAgDQogICAgICogICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgDQogICAgICogICAgICAgfSAgICAgICAgICAgICAgICAgIA0KICAgICAqICB9DQogICAgICogDQogICAgICogIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiAgSSBjb3VsZCBhbHNvIHdyaXRlIGEgYmV0dGVyIGNvZGUgOiANCiAgICAgKiANCiAgICAgKiA8Y29kZT4NCgkgKiAgICRvcmRlciA9IE15QXV0b2xvYWQ6OmdldEluc3RhbmNlKCR0aGlzLT5HZXROYW1lKCksICdvcmRlcicpOw0KICAgICAqICAgJG9yZGVycyA9IENvcmU6Om1ha2VEZWVwU2VhcmNoKG9yZGVyLCAnT3JkZXIuY3VzdG9tZXJfaWQuYWRyZXNzX2lkLmNpdHlfaWQuemlwY29kZScsIGFycmF5KCcwMTIzNCcsICc0NTY3JykpOw0KICAgICAqIDwvY29kZT4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gRW50aXR5IFRoZSBlbnRpdHkgaSB3YW50IHRvIGhhdmUgYXQgdGhlIGVuZA0KICAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIHBhdGggdG8gZmFsbG93LiBNdXN0IGJlIGVuZGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIEZpZWxkIHRvIG1ha2UgdGhlIGNvbXBhcmFpc29uDQogICAgICogQHBhcmFtIGFycmF5IHRoZSBhcnJheSBvZiB2YWx1ZSB0byBtYWtlIHRoZSBjb21wYXJhaXNvbg0KICAgICAqIA0KICAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwgZnVuY3Rpb24gbWFrZURlZXBTZWFyY2goRW50aXR5ICRwcmV2aW91c0VudGl0eSwgJGNsZSwgJHZhbHVlcykNCgl7ICAgIA0KCQlUUkFDRTo6aW5mbygiIyA6ICIuIlN0YXJ0IG1ha2VEZWVwU2VhcmNoKCkgIi4kcHJldmlvdXNFbnRpdHktPmdldE5hbWUoKS4iLT4iLiRjbGUpOw0KDQoJCWlmKCRwcmV2aW91c0VudGl0eSA9PSBudWxsKQ0KCQl7DQoJCSAgDQoJCSAgJG5ld0NsZSA9IGV4cGxvZGUoJy4nLCRjbGUsMik7DQoJCSAgJHByZXZpb3VzRW50aXR5ID0gJG5ld0NsZVswXTsNCgkJICAkY2xlID0gJG5ld0NsZVsxXTsNCgkJICBldmFsKCckcHJldmlvdXNFbnRpdHkgPSBuZXcgJy4kcHJldmlvdXNFbnRpdHkuJygpOycpOw0KCQl9DQoNCgkJJG5ld0NsZSA9IGV4cGxvZGUoJy4nLCRjbGUsMik7DQoJCSRmaWVsZG5hbWUgPSAkbmV3Q2xlWzBdOw0KDQoJCS8vVGVzdCBkZSBzb3J0aWUgOiBvbiBhIHVuIHNldWwgcsOpc3VsdGF0IGRhbnMgJG5ld0NsZSA6IGxlIGNoYW1wcyBmaW5hbA0KCQlpZihjb3VudCgkbmV3Q2xlKSA9PSAxKQ0KCQl7DQoJCSAgVFJBQ0U6OmluZm8oIiMgOiAiLiIgY291bnQoXCRuZXdDbGUpID09IDEgLCBkb25jIHNvcnRpZSAiKTsNCgkJICAkRXhhbXBsZSA9IG5ldyBFeGFtcGxlOw0KCQkgICRFeGFtcGxlLT5hZGRDcml0ZXJpYSgkZmllbGRuYW1lLCBUeXBlQ3JpdGVyaWE6OiRJTiwgJHZhbHVlcyk7DQoJCSAgJGVudGl0eXMgPSBDb3JlOjpmaW5kQnlFeGFtcGxlKCRwcmV2aW91c0VudGl0eSwgJEV4YW1wbGUpOw0KCQkgIFRSQUNFOjppbmZvKCIjIDogIi5jb3VudCgkZW50aXR5cykuIiBSJmVhY3V0ZTtzdWx0YXQocykgcmV0b3VybiZlYWN1dGU7cyIpOw0KCQkgIHJldHVybiAkZW50aXR5czsNCgkJfSBlbHNlDQoJCXsNCgkJICBUUkFDRTo6aW5mbygiIyA6ICIuIiBwb3Vyc3VpdGUgIik7DQoJCX0NCg0KCQkvL1LDqWN1cMOpcmF0aW9uIGRlIGxhIGNsw6kgZGlzdGFuY2UgcG91ciB1bmUgRksNCgkJJGZpZWxkID0gJHByZXZpb3VzRW50aXR5LT5nZXRGaWVsZEJ5TmFtZSgkZmllbGRuYW1lKTsNCgkJaWYoJGZpZWxkLT5pc0ZvcmVpZ25LRVkoKSB8fCAkZmllbGQtPmlzQXNzb2NpYXRlS2V5KCkpDQoJCXsNCgkJICAkZm9yZWlnbktFWSA9IGV4cGxvZGUoJy4nLCRmaWVsZC0+Z2V0S0VZTmFtZSgpLDIpOw0KCQkgIGV2YWwoJyRuZXh0RW50aXR5ID0gbmV3ICcuJGZvcmVpZ25LRVlbMF0uJygpOycpOw0KCQl9IA0KDQoJCWlmKCRmaWVsZC0+aXNBc3NvY2lhdGVLZXkoKSkNCgkJew0KCQkgICRjbGUgPSBleHBsb2RlKCcuJywkbmV3Q2xlWzFdLDIpOw0KCQkgICRjbGUgPSAkY2xlWzFdOw0KCQl9IGVsc2UNCgkJew0KCQkgICRjbGUgPSAkbmV3Q2xlWzFdOw0KCQl9IA0KCQkNCgkJVFJBQ0U6OmluZm8oIiMgOiAiLiIgbWFrZSBuZXcgcmVjaGVyY2hlIDogIi4kbmV4dEVudGl0eS0+Z2V0TmFtZSgpIC4iICwgIi4gJGNsZSk7DQoNCgkJJGVudGl0eXMgPSBDb3JlOjptYWtlRGVlcFNlYXJjaCgkbmV4dEVudGl0eSwgJGNsZSwgJHZhbHVlcyk7DQoNCgkJaWYoY291bnQoJGVudGl0eXMpID09IDApDQoJCXsNCgkJICByZXR1cm4gYXJyYXkoKTsNCgkJfQ0KDQoJCWlmKCRuZXh0RW50aXR5IGluc3RhbmNlb2YgRW50aXR5QXNzb2NpYXRpb24pDQoJCXsgIA0KCQkgICRmaWVsZHMgPSAkbmV4dEVudGl0eS0+Z2V0RmllbGRzKCk7DQoJCSAgJG5vbUZpZWxkU3Vpdml0ID0gZXhwbG9kZSgnLicsJGNsZSwyKTsNCgkJICAkbm9tRmllbGRTdWl2aXQgPSAkbm9tRmllbGRTdWl2aXRbMF07DQoJCSAgJG5vbUZpZWxkUmV0b3VyID0gIk4vQSI7DQoJCSAgZm9yZWFjaCgkZmllbGRzIGFzICRhZmllbGQpDQoJCSAgew0KCQkJaWYoJGFmaWVsZC0+Z2V0TmFtZSgpID09ICRub21GaWVsZFN1aXZpdCkNCgkJCXsNCgkJCSAgY29udGludWU7DQoJCQl9DQoJCQkkbm9tRmllbGRSZXRvdXIgPSAkYWZpZWxkOw0KCQkgIH0NCgkJICANCgkJfQ0KDQoJCSRpZHMgPSBhcnJheSgpOw0KCQlmb3JlYWNoKCRlbnRpdHlzIGFzICRhbkVudGl0eSkNCgkJew0KCQkgIFRSQUNFOjppbmZvKCI8YnIvPk9uIGEgdHJvdXYmZWFjdXRlOyAgOiAiLiRhbkVudGl0eS0+Z2V0TmFtZSgpLiIiKTsNCgkJICBpZigkYW5FbnRpdHkgaW5zdGFuY2VvZiBFbnRpdHlBc3NvY2lhdGlvbikNCgkJICB7DQoJCQkkdmFsdWUgPSAkYW5FbnRpdHktPmdldCgkbm9tRmllbGRSZXRvdXItPmdldE5hbWUoKSk7DQoJCQkkaWRzW10gPSAkdmFsdWU7DQoJCQlUUkFDRTo6aW5mbygiIHZhbGV1ciBhc3NvYyA6ICIuJHZhbHVlLiIgcG91ciBsZSBjaGFtcHMgIi4kbm9tRmllbGRSZXRvdXItPmdldE5hbWUoKSk7DQoJCSAgfSBlbHNlDQoJCSAgew0KCQkJJHZhbHVlID0gJGFuRW50aXR5LT5nZXQoJG5leHRFbnRpdHktPmdldFBrKCktPmdldE5hbWUoKSk7DQoJCQkkaWRzW10gPSAkdmFsdWU7DQoJCQlUUkFDRTo6aW5mbygiIHZhbGV1ciBpZCA6ICIuJHZhbHVlKTsNCgkJICB9DQoJCSAgDQoJCX0NCg0KDQoJCSRFeGFtcGxlID0gbmV3IEV4YW1wbGU7DQoJCWlmKCRuZXh0RW50aXR5IGluc3RhbmNlb2YgRW50aXR5QXNzb2NpYXRpb24pDQoJCXsNCgkJICAkRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJHByZXZpb3VzRW50aXR5LT5nZXRQaygpLT5nZXROYW1lKCksIFR5cGVDcml0ZXJpYTo6JElOLCAkaWRzKTsNCgkJfSBlbHNlDQoJCXsNCgkJICAkRXhhbXBsZS0+YWRkQ3JpdGVyaWEoJGZpZWxkbmFtZSwgVHlwZUNyaXRlcmlhOjokSU4sICRpZHMpOw0KCQl9DQoJCSRlbnRpdHlzID0gQ29yZTo6ZmluZEJ5RXhhbXBsZSgkcHJldmlvdXNFbnRpdHksICRFeGFtcGxlKTsNCg0KCQlyZXR1cm4gJGVudGl0eXM7DQoJfQ0KICANCn0NCg0KPz4K]]></data>
	</file>
	<file>
	  <filename>/lib/class.criteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIENyaXRlcmUgY2xhc3MKICogCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KIAogCgovKioKICogQmFja2JvbmUgZm9yIENyaXRlcmlhIGludG8gdGhlIE9ybSBzeXN0ZW0KICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpmaW5hbCBjbGFzcyBDcml0ZXJlCnsKCS8qKgoJICogTmFtZSBvZiB0aGUgZmllbGQgCgkgKi8KCXB1YmxpYyAkZmllbGRuYW1lOwoJCgkvKioKCSAqIFR5cGUgb2YgQ3JpdGVyaWEKCSAqLwoJcHVibGljICR0eXBlQ3JpdGVyZTsKCQoJLyoqCgkgKiBQYXJhbWV0ZXJzIGZvciB0aGUgdHlwZSBvZiBDcml0ZXJpYQoJICovCglwdWJsaWMgJHBhcmFtc0NyaXRlcmU7CgkKCS8qKgoJICogQm9vbGVhbiBpZiB3ZSBtdXN0IGlnbm9yZSBjYXNlCgkgKi8KCXB1YmxpYyAkaWdub3JlQ2FzZTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyBOYW1lIG9mIHRoZSBmaWVsZCAKICAgICogQHBhcmFtIFR5cGVDcml0ZXJlIFR5cGUgb2YgQ3JpdGVyaWEKICAgICogQHBhcmFtIGFycmF5IGFsbCB0aGUgcGFyYW1ldGVycyB1c2VkIGZvciB0aGUgcGFyYW1ldGVyICR0eXBlQ3JpdGVyZQogICAgKiBAcGFyYW0gYm9vbGVhbiBbT3B0aW9ubmFsXSBpZiB3ZSBtdXN0IGlnbm9yZSB0aGUgY2FzZSAoYXplIGVxdWFscyBBWkUpIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZSBpcyAiZmFsc2UiCiAgICAqCgkqIEByZXR1cm4gQ3JpdGVyZSBhIENyaXRlcmlhCgkqCgkqIEBzZWUgVHlwZUNyaXRlcmUKICAgICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpZWxkbmFtZSwgJHR5cGVDcml0ZXJlLCAkcGFyYW1zQ3JpdGVyZSwgJGlnbm9yZUNhc2UgPSBmYWxzZSkKCXsKCQkkdGhpcy0+ZmllbGRuYW1lID0gJGZpZWxkbmFtZTsKCQkkdGhpcy0+dHlwZUNyaXRlcmUgPSAkdHlwZUNyaXRlcmU7CgkJJHRoaXMtPnBhcmFtc0NyaXRlcmUgPSAkcGFyYW1zQ3JpdGVyZTsKCQkkdGhpcy0+aWdub3JlQ2FzZSA9ICRpZ25vcmVDYXNlOwoJfQoJCn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.entity.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIEVudGl0eQ0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCi8qKg0KICogQWJzdHJhY3QgQ2xhc3NlcyBkZXNjcmliaW5nIHRoZSBmcmFtZSBvZiBhbiBFbnRpdHkgaW50byBPcm0NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQphYnN0cmFjdCBjbGFzcyBFbnRpdHkgDQp7DQoJLyoqDQoJICogU3RyaW5nIDogTmFtZSBvZiB0aGUgbW9kdWxlIHRoYXQgY3VycmVudGx5IHVzZSB0aGlzIGVudGl0eQ0KCSAqICovDQoJcHJpdmF0ZSAkbW9kdWxlTmFtZTsNCgkNCgkvKioNCgkgKiBTdHJpbmcgOiB0aGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgZW50aXR5DQoJICogKi8NCglwcm90ZWN0ZWQgJG5hbWU7DQoNCgkvKioNCgkgKiBTdHJpbmcgOiB0aGUgbmFtZSBvZiB0aGUgdGFibGUgaW4gZGF0YWJhc2UNCgkgKiAqLw0KCXByaXZhdGUgJGRibmFtZTsNCgkNCgkvKioNCgkgKiBTdHJpbmcgOiBuYW1lIG9mIHRoZSBzZXF1ZW5jZSBsaW5rZWQgdG8gdGhlIHRhYmxlIGluIHRoZSBkYXRhYmFzZS4gTWF5IGJlIE51bGwNCgkgKiAqLw0KCXByaXZhdGUgJHNlcW5hbWU7DQoJDQoJLyoqDQoJICogbGlzdCA6IGZpZWxkcyBtYWtpbmcgdXAgdGhlIGVudGl0eQ0KCSAqICovDQoJcHJpdmF0ZSAkZmllbGRzID0gYXJyYXkoKTsNCgkNCgkvKioNCgkgKiBsaXN0IDogdmFsdWVzIG9mIGVhY2ggZmllbGRzDQoJICogKi8NCglwcml2YXRlICR2YWx1ZXMgPSBhcnJheSgpOw0KCQ0KCS8qKg0KCSAqIFN0cmluZyA6IE5hbWUgb2YgdGhlIGZpZWxkIHdpY2ggd2lsbCBiZSB1c2VkIGFzIGEgcHJpbWFyeUtleQ0KCSAqICovDQoJcHJpdmF0ZSAkcGs7DQoJDQoJLyoqDQoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCBmb3IgdGhlIHNlcXVlbmNlIG5hbWUgaW50byB0aGUgZGF0YWJhc2UNCgkgKiAqLw0KCXB1YmxpYyBzdGF0aWMgJF9DT05TVF9TRVEgPSAnX3NlcSc7DQoJLyoqDQoJICogU3RyaW5nIDogY29uc3RhbnQsIHN1ZmZpeCB1c2VkIHRvIG5hbW1lZCB0aGUgdGFibGUgaW50byBkYXRhYmFzZSBmb3IgYSBtb2R1bGUNCgkgKiAqLw0KCXB1YmxpYyBzdGF0aWMgJF9DT05TVF9NT0QgPSAnbW9kdWxlJzsNCgkNCgkNCgkNCiAgICAvKioNCiAgICAgKiBjb25zdHJ1Y3RvciBwcm90ZWN0ZWQgdG8gYXZvaWQgYSBkaXJlY3QgaW5zdGFuY2lhdGlvbiBsaWtlICJuZXcgRW50aXR5KCkiDQogICAgICogRWFjaCB0aW1lIGEgZW50aXR5IGlzIGNvbnN0cnVjdGVkLCB3ZSBwbGFjZSBhIGNvcHkgaW50byB0aGUgYXV0b2xvYWRlci4NCiAgICAgKiANCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgd2hvIGNhbGxpbmcgdGhpcyBtZXRob2QgKHNvIG5vdCAiT3JtIikNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gUHJlZml4IHRvIHVzZSBpbnRvIGRhdGFiYXNlIGZvciB0YWJsZS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBtb2R1bGUNCiAgICAgKiBAcGFyYW0gc3RyaW5nIFtvcHRpb25hbF0gVGhlIG5hbWUgb2YgdGFibGUgZm9yIHRoaXMgZW50aXR5LiBJZiBub3Qgc2V0dGVkLCBpdCB3aWxsIHVzZSB0aGUgbmFtZSBvZiB5b3VyIGVudGl0eQ0KICAgICAqDQogICAgICogQHJldHVybiBFbnRpdHkgdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQ0KICAgICAqIA0KICAgICAqIEBzZWUgTXlBdXRvbG9hZA0KICAgICAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsICRwcmVmaXhlID0gbnVsbCwgJGRiTmFtZSA9IG51bGwpDQoJew0KCQkkdGhpcy0+bW9kdWxlTmFtZSA9IHN0cnRvbG93ZXIoJG1vZHVsZU5hbWUpOw0KCQkkdGhpcy0+bmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOw0KCQkNCgkJJHRoaXMtPmRibmFtZSA9ICR0aGlzLT5uYW1lOw0KCQlpZighZW1wdHkoJGRiTmFtZSkpDQoJCXsNCgkJCSR0aGlzLT5kYm5hbWUgPSBzdHJ0b2xvd2VyKCRkYk5hbWUpOw0KCQl9DQoJCQ0KCQlpZihlbXB0eSgkcHJlZml4ZSkpDQoJCXsNCgkJCSRwcmVmaXhlID0gJHRoaXMtPm1vZHVsZU5hbWU7DQoJCX0gZWxzZSB7DQoJCQkkcHJlZml4ZSA9IHN0cnRvbG93ZXIoJHByZWZpeGUpOw0KCQl9DQoJCQ0KCQkkdGhpcy0+ZGJuYW1lID0gY21zX2RiX3ByZWZpeCgpLkVudGl0eTo6JF9DT05TVF9NT0QuJ18nLiRwcmVmaXhlLidfJy4kdGhpcy0+ZGJuYW1lOw0KCQkNCgkJLy9PbiBham91dGUgdW5lIGluc3RhbmNlIGRlIHNvaXQgZGFucyBsJ2F1dG9sb2FkDQoJCW15QXV0b2xvYWQ6OmFkZEluc3RhbmNlKCR0aGlzLT5tb2R1bGVOYW1lLCR0aGlzKTsNCgl9DQoJDQogICAgLyoqDQogICAgKiAgQ2FuIGJlIG92ZXJyaWRlLiBMZXQgeW91IHNwZWNpZnkgaG93IHlvdXIgdGFibGUgbXVzdCBiZSBwb3B1bGF0ZWQgDQogICAgKiBhZnRlciB5b3UgYXNrZWQgdG8gY3JlYXRlIHRoZSB0YWJsZSBvZiB5b3VyIEVudGl0eQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGluaXRUYWJsZSgpe30NCiAgICAJDQogICAgLyoqDQogICAgKiBBZGQgYSBuZXcgRmllbGQgaW50byB0aGUgbGlzdCBvZiBGaWVsZHMNCiAgICAqIA0KICAgICogQHBhcmFtIEZpZWxkIHRoZSBvYmplY3QgRmllbGQgdG8gYWRkDQoJKiANCgkqIEBleGNlcHRpb24gSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gYSBzaW5nbGUgUHJpbWFyeUtleSBpbiB0aGUgZW50aXR5DQogICAgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkKEZpZWxkICRuZXdGaWVsZCkNCgl7DQoJCSR0aGlzLT5maWVsZHNbJG5ld0ZpZWxkLT5nZXROYW1lKCldID0gJG5ld0ZpZWxkOw0KDQoJCS8vQWpvdXQgZCd1bmUgc2VxdWVuY2Ugc3VyIGxlcyBjbGUNCgkJaWYoJG5ld0ZpZWxkLT5pc1ByaW1hcnlLRVkoKSkNCgkJew0KCQkJaWYoJHRoaXMtPnBrICE9IG51bGwpDQoJCQkJdGhyb3cgbmV3IElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCJPcm0gZG9lc24ndCBzdXBwb3J0IG11bHRpLVByaW1hcnktS2V5IGludG8gdGhlIEVudGl0eSAiLiR0aGlzLT5uYW1lKTsNCgkJCQkNCgkJCSR0aGlzLT5wayA9ICRuZXdGaWVsZC0+Z2V0TmFtZSgpOw0KCQkJJHRoaXMtPnNlcW5hbWUgPSAkdGhpcy0+ZGJuYW1lLkVudGl0eTo6JF9DT05TVF9TRVE7DQoJCX0NCgl9DQoJDQogICAgLyoqDQogICAgKiBSZXR1cm4gdGhlIFByaW1hcnlLZXkgRmllbGQNCiAgICAqIA0KICAgICogQHJldHVybiBGaWVsZCB0aGUgUHJpbWFyeUtleSBGaWVsZA0KICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gUHJpbWFyeUtleSBGaWVsZA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFBrKCkNCgl7DQoJCWlmKCR0aGlzLT5wayA9PSBudWxsKQ0KCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBkb2Vzbid0IGhhdmUgYW55IFByaW1hcnktS2V5Iik7DQoJCQ0KCQlyZXR1cm4gJHRoaXMtPmZpZWxkc1skdGhpcy0+cGtdOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgbGlzdCBvZiBGaWVsZHMNCiAgICAqIA0KICAgICogQHJldHVybiBhcnJheTxGaWVsZD4gYW4gYXJyYXkgd2l0aCBhbGwgdGhlIEZpZWxkcw0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0RmllbGRzKCkNCgl7DQoJCXJldHVybiAkdGhpcy0+ZmllbGRzOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIHJldG91cm4gYSBGaWVsZCBieSBuYW1lDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG5hbWUNCiAgICAqIEByZXR1cm4gRmllbGQgdGhlIEZpZWxkDQogICAgKiANCiAgICAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIEZpZWxkIGV4aXN0IGZvciB0aGUgbmFtZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldEZpZWxkQnlOYW1lKCRuYW1lKQ0KCXsNCgkJaWYoaXNzZXQoJHRoaXMtPmZpZWxkc1skbmFtZV0pKQ0KCQkJcmV0dXJuICR0aGlzLT5maWVsZHNbJG5hbWVdOw0KCQkNCgkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIGZpZWxkICRuYW1lIGRvZXNuJ3QgZXhpc3QgaW50byB0aGUgZW50aXR5ICIuJHRoaXMtPmdldE5hbWUoKSk7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogUmV0dXJuIHRydWUgaWYgYSBGaWVsZCBleGlzdHMgZm9yIHRoZSBuYW1lDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG5hbWUNCiAgICAqIEByZXR1cm4gQm9vbGVhbiBpZiBleGlzdHMNCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBpc0ZpZWxkQnlOYW1lRXhpc3RzKCRuYW1lKQ0KCXsNCgkJcmV0dXJuIGlzc2V0KCR0aGlzLT5maWVsZHNbJG5hbWVdKTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHRhYmxlIGludG8gdGhlIGRhdGFiYXNlDQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSB0YWJsZSBpbnRvIHRoZSBkYXRhYmFzZQ0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0RGJuYW1lKCkNCgl7DQoJCXJldHVybiAkdGhpcy0+ZGJuYW1lOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZW50aXR5DQogICAgKiANCiAgICAqIEByZXR1cm4gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkNCiAgICAqIA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQ0KCXsNCgkJcmV0dXJuICR0aGlzLT5uYW1lOw0KCX0NCgkNCgkvKioNCgkgKiAgUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IG1vZHVsZQ0KCSAqICANCgkgKiAgQHJldHVybiBzdHJpbmcgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbW9kdWxlLg0KCSAqKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0TW9kdWxlTmFtZSgpDQoJew0KCQlyZXR1cm4gJHRoaXMtPm1vZHVsZU5hbWU7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXF1ZW5jZSAoaWYgZXhpc3RzKQ0KICAgICogDQogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgc2VxdWVuY2Ugb3IgTlVMTA0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0U2VxbmFtZSgpDQoJew0KCQlpZihlbXB0eSgkdGhpcy0+c2VxbmFtZSkpDQoJCQlyZXR1cm4gbnVsbDsNCgkJDQoJCXJldHVybiAkdGhpcy0+c2VxbmFtZTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBSZXR1cm4gdGhlIHZhbHVlIGZvciBhIEZpZWxkIGJ5IHRoZSBuYW1lIA0KICAgICogCQ0KICAgICogQHBhcmFtIHN0cmluZyB0aGUgbmFtZSBvZiB0aGUgRmllbGQNCiAgICAqIEByZXR1cm4gbWl4ZWQgdGhlIHZhbHVlIGZvciB0aGUgZmllbGQNCiAgICAqIA0KICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldCgkZmllbGROYW1lKQ0KCXsNCgkJJGZpZWxkbmFtZVNpZCA9IGV4cGxvZGUoIl9zaWQiLCAkZmllbGROYW1lKTsNCgkJJGZpZWxkbmFtZVNpZCA9ICRmaWVsZG5hbWVTaWRbMF07DQoJCWlmKCFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZE5hbWUsJHRoaXMtPmZpZWxkcykgJiYgIWFycmF5X0tFWV9leGlzdHMoJGZpZWxkbmFtZVNpZCwkdGhpcy0+ZmllbGRzKSkNCgkJew0KCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZm9uY3Rpb24gR2V0IDogRmllbGQgJGZpZWxkTmFtZSBub3QgZm91bmQgZm9yIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkpOw0KCQl9DQoJCQ0KCQlpZighaXNzZXQoJHRoaXMtPnZhbHVlc1skZmllbGROYW1lXSkpDQoJCXsNCgkJCXJldHVybiBudWxsOw0KCQl9DQoJCQ0KCQlyZXR1cm4gJHRoaXMtPnZhbHVlc1skZmllbGROYW1lXTsNCgl9DQoJDQogICAvKioNCiAgICAqIFNldCBhIHZhbHVlIHRvIGEgRmllbGQNCiAgICAqICAgICANCiAgICAqIEBwYXJhbSBzdHJpbmcgVGhlIG5hbWUgb2YgdGhlIEZpZWxkDQogICAgKiBAcGFyYW0gbWl4ZWQgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgRmllbGQNCiAgICAqIA0KICAgICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8gRmllbGQgZXhpc3RzIGZvciB0aGUgbmFtZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIHNldCgkZmllbGROYW1lLCR2YWx1ZSkNCgl7DQoJCSRmaWVsZG5hbWVTaWQgPSBleHBsb2RlKCJfc2lkIiwgJGZpZWxkTmFtZSk7DQoJCSRmaWVsZG5hbWVTaWQgPSAkZmllbGRuYW1lU2lkWzBdOw0KCQlpZighYXJyYXlfS0VZX2V4aXN0cygkZmllbGROYW1lLCR0aGlzLT5maWVsZHMpICYmICFhcnJheV9LRVlfZXhpc3RzKCRmaWVsZG5hbWVTaWQsJHRoaXMtPmZpZWxkcykpDQoJCXt0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCdmb25jdGlvbiBTZXQgOiBjbGUgJy4kZmllbGROYW1lLicgbm9uIHRyb3V2ZWUgZGFucyBsXCdlbnRpdGUnKTt9DQoJCQ0KCQkkdGhpcy0+dmFsdWVzWyRmaWVsZE5hbWVdID0gJHZhbHVlOw0KCX0NCgkNCiAgICAvKioNCiAgICAqIFJldHVybiB0aGUgdmFsdWVzIGZvciBhbGwgdGhlIEZpZWxkcyBpbnRvIGFuIGFzc29jaWF0aXZlIGFycmF5IHdpdGggDQogICAgKiAgKiBrZXkgPSBuYW1lIG9mIHRoZSBGaWVsZCwgYW5kIA0KICAgICogICogdmFsdWUgPSBpdHMgdmFsdWUNCiAgICAqIA0KICAgICogQHJldHVybiBhcnJheSBhbiBhc3NvY2lhdGl2ZSBhcnJheQ0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0VmFsdWVzKCkNCgl7DQoJCXJldHVybiAkdGhpcy0+dmFsdWVzOw0KCX0NCgkNCgkNCglwdWJsaWMgZnVuY3Rpb24gaW5pdEZvcmVpZ25LRVkoJGZpZWxkTmFtZSwgJHNpZCA9IG51bGwpDQoJewkJCQ0KCQkkZmllbGQgPSAkdGhpcy0+Z2V0RmllbGRCeU5hbWUoJGZpZWxkTmFtZSk7DQoJCQ0KCQlpZigkZmllbGQtPmdldEtFWU5hbWUoKSA9PSAnJykNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkxlIGNoYW1wcyAkZmllbGROYW1lIG5lIHBvc3NlZGUgYXVjdW5lIGNsZSBldHJhbmdlcmUgYXNzb2NpZWUiKTsNCgkJCQ0KCQkkY2xlID0gZXhwbG9kZSgnLicsJGZpZWxkLT5nZXRLRVlOYW1lKCksMik7DQoJCS8vRXZhbHVhdGlvbiBkZSBsYSBlY2xhc3MgZW4gY291cnMNCgkJZXZhbCgnJGVudGl0eSA9IG5ldyAnLiRjbGVbMF0uJygpOycpOw0KCQkNCgkJaWYoJHNpZCA9PSBudWxsKQ0KCQl7DQoJCQkkbGlzdGUgPSBDb3JlOjpmaW5kQWxsKCRlbnRpdHkpOw0KCQl9IGVsc2UNCgkJew0KCQkJJGxpc3RlID0gQ29yZTo6ZmluZEJ5SWRzKCRlbnRpdHksIGFycmF5KCRzaWQpKTsNCgkJfQ0KCQkNCgkJcmV0dXJuIGFycmF5KCRlbnRpdHksJGxpc3RlKTsNCgkNCgl9DQoJDQoJLyoqDQoJICogU2hvdGN1dCB0byBzYXZlIHRoZSBlbnRpdHkuIGlmIHRoZSBwcmltYXJ5S2V5IGlzIHNldHRlZCwgaXQgd2lsbCBiZSBhbiB1cGRhdGUgb3BlcmF0aW9uLCBlbHNlIGFuIGluc2VydC4NCgkgKg0KCSAqIEByZXR1cm4gdGhlIGVudGl0eSBzYXZlZCB3aXRoIGl0cyBuZXcgbmV3IElkIChjdXN0b21lcl9pZCBpbiBteSBleGFtcGxlKSBpZiBpdCdzIGFuIGluc2VydGlvbg0KCSAqKi8NCglwdWJsaWMgZnVuY3Rpb24gc2F2ZSgpew0KCQlpZigkdGhpcy0+cGsgPT0gbnVsbCkgew0KCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigieW91IGNhbid0IHNhdmUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgUHJpbWFyeS1LZXkiKTsNCgkJfQ0KCQ0KCQlpZigkdGhpcy0+Z2V0KCR0aGlzLT5waykgPT0gbnVsbCkgew0KCQkJcmV0dXJuIENvcmU6Omluc2VydEVudGl0eSgkdGhpcyk7DQoJCX0gZWxzZSB7DQoJCQlyZXR1cm4gQ29yZTo6dXBkYXRlRW50aXR5KCR0aGlzKTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBTaG90Y3V0IHRvIGRlbGV0ZSB0aGUgZW50aXR5DQoJICoqLw0KCXB1YmxpYyBmdW5jdGlvbiBkZWxldGUoKXsNCgkJaWYoJHRoaXMtPnBrID09IG51bGwpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnkgUHJpbWFyeS1LZXkiKTsNCgkJfQ0KCQkNCgkJaWYoJHRoaXMtPmdldCgkdGhpcy0+cGspID09IG51bGwpIHsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInlvdSBjYW4ndCBkZWxldGUgdGhlIGVudGl0eSAiLiR0aGlzLT5nZXROYW1lKCkuIiBiZWNhdXNlIGl0cyBQcmltYXJ5LUtleSBkb2Vzbid0IGhhdmUgYW55IHZhbHVlIik7DQoJCX0NCgkJDQoJCUNvcmU6OmRlbGV0ZUJ5SWRzKCR0aGlzLCBhcnJheSgkdGhpcy0+Z2V0KCR0aGlzLT5waykpKTsNCgl9DQoJDQogICAgLyoqDQogICAgKiBDYW4gYmUgb3ZlcnJpZGVuIExldCB5b3UgbW9kaWZ5IHNvbWUgZGF0YSBqdXN0IGJlZm9yZSBzYXZpbmcgdGhlIGRhdGEgaW50byB0aGUgZGF0YXRhYmxlLg0KICAgICogDQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSB2YWx1ZXMgdG8gcHJvY2VlDQogICAgKiBAcGFyYW0gYXJyYXkgbW9yZSBwYXJhbWV0ZXJzIGlmIHlvdSBuZWVkLCBpZiB5b3Ugd2FudA0KICAgICogDQogICAgKiBAcmV0dXJuIG1peGVkIHRvIGRlZmluZQ0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIHByb2Nlc3NWYWx1ZUZvclNhdmUoJHJvd3MsICRhcmdzID0gbnVsbCl7DQoJDQoJCXJldHVybiAkcm93czsNCgl9DQoJDQoJLyoqDQoJICogQ2FsbCB0aGUgY29tcGFyZVRvIGZ1bmN0aW9uIGludG8geW91ciBFbnRpdHkgdG8gc29ydCB0aGUgRW50aXRpZXMuDQoJICogVG8gYWN0aXZhdGUgdGhpcyBmb25jdGlvbm5hbGl0eSwgVGhlIEVudGl0eSBtdXN0IGltcGxlbWVudCBJU29ydGFibGUgSW50ZXJmYWNlLg0KCSAqDQoJICogRXhhbXBsZSBvZiBmdW5jdGlvbiBjb21wYXJlVG8oKSBpbiBhIEN1c3RvbWVyIEVudGl0eQ0KCSAqICA8Y29kZT4NCgkgKiAgICAgICANCgkgKglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhFbnRpdHkgJGVudGl0eTEsIEVudGl0eSAkZW50aXR5MikNCgkgKgl7DQoJICoJCSRjb21wYXJlID0gc3RyY21wKCRlbnRpdHkxLT5nZXQoJ25hbWUnKSwgJGVudGl0eTItPmdldCgnbmFtZScpKTsNCgkgKiAgICAgIAlyZXR1cm4gJGNvbXBhcmU7DQoJICoJfQ0KCSAqIA0KCSAqICA8L2NvZGU+DQoJICoNCgkgKiBAcGFyYW0gYXJyYXk8RW50aXR5PiB0aGUgbGlzdCBvZiBFbnRpdHkgdG8gc29ydA0KCSAqDQoJICogQHJldHVybiBhcnJheTxFbnRpdHk+IHRoZSBsaXN0IG9mIGVudGl0eSBncmFjZWZ1bGx5IHNvcnRlZA0KCSAqLw0KCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gc29ydChhcnJheSAkYXJyYXkpDQoJew0KCQkvL2h0dHA6Ly9waHAubmV0L21hbnVhbC9mci9mdW5jdGlvbi5nZXQtY2FsbGVkLWNsYXNzLnBocA0KCQkvL1BIUCA1LjMuMCBvbmx5DQoJCXVzb3J0KCRhcnJheSwgYXJyYXkoZ2V0X2NhbGxlZF9jbGFzcygpLCAiY29tcGFyZVRvIikpOw0KCQ0KCQlyZXR1cm4gJGFycmF5Ow0KCX0NCgkNCgkvKioNCgkgKiBNYXkgYmUgb3ZlcnJpZGUgaW4geW91ciBFbnRpdHkncyBkZWZpbml0aW9uIHRvIGFsbG93IFNlYXJjaCBtb2R1bGUgaW5kZXhpbmcgeW91ciBlbnRpdGllcydzIGRhdGENCgkgKiANCgkgKiBFeGFtcGxlIG9mIGZ1bmN0aW9uIGlzSW5kZXhhYmxlKCkgaW4gYSBDdXN0b21lciBFbnRpdHkNCgkgKiAgDQoJICogIDxjb2RlPg0KCSAqICAgICAgIA0KCSAqCXB1YmxpYyBzdGF0aWMgZnVuY3Rpb24gaXNJbmRleGFibGUoKQ0KCSAqCXsNCgkgKgkJcmV0dXJuIHRoaXMtPmdldFsnaXNBY3RpdmF0ZWQnXTsNCgkgKgl9DQoJICogDQoJICogIDwvY29kZT4NCgkgKiovDQoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBpc0luZGV4YWJsZSgpew0KCQlyZXR1cm4gZmFsc2U7DQoJfQ0KCQ0KfQ0KDQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lib/class.entityassociation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgRW50aXR5QXNzb2NpYXRpb24gQ2xhc3Mgd2hpY2ggZXh0ZW5kcyBFbnRpdHkgY2xhc3MNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQovKioNCiAqIEFic3RyYWN0IENsYXNzIHdoaWNoIGRlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBmb3IgYW4gQXNzb2NpYXRpdmUgRW50aXR5DQogKiAgICANCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQphYnN0cmFjdCBjbGFzcyBFbnRpdHlBc3NvY2lhdGlvbiBleHRlbmRzIEVudGl0eSANCnsNCglwcml2YXRlICRuYkZpZWxkID0gMDsNCg0KICAgIC8qKg0KICAgICAqIGNvbnN0cnVjdG9yIHByb3RlY3RlZCB0byBhdm9pZCBhIGRpcmVjdCBpbnN0YW5jaWF0aW9uIGxpa2UgIm5ldyBFbnRpdHlBc3NvY2lhdGlvbigpIg0KICAgICAqIEVhY2ggdGltZSBhIGVudGl0eSBpcyBjb25zdHJ1Y3RlZCwgd2UgcGxhY2UgYSBjb3B5IGludG8gdGhlIGF1dG9sb2FkZXIuDQogICAgICogDQogICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlIHdobyBjYWxsaW5nIHRoaXMgbWV0aG9kIChzbyBub3QgIk9ybSIpDQogICAgICogQHBhcmFtIHN0cmluZyBUaGUgbmFtZSBvZiB0aGUgZW50aXR5DQogICAgICogQHBhcmFtIHN0cmluZyBbb3B0aW9uYWxdIFByZWZpeCB0byB1c2UgaW50byBkYXRhYmFzZSBmb3IgdGFibGUuIElmIG5vdCBzZXR0ZWQsIGl0IHdpbGwgdXNlIHRoZSBuYW1lIG9mIHlvdXIgbW9kdWxlDQogICAgICogQHBhcmFtIHN0cmluZyBbb3B0aW9uYWxdIFRoZSBuYW1lIG9mIHRhYmxlIGZvciB0aGlzIGVudGl0eS4gSWYgbm90IHNldHRlZCwgaXQgd2lsbCB1c2UgdGhlIG5hbWUgb2YgeW91ciBlbnRpdHkNCiAgICAgKg0KICAgICAqIEByZXR1cm4gRW50aXR5QXNzb2NpYXRpb24gdGhlIGVudGl0eSBhcyBhIG5ldyBpbnN0YW5jZQ0KICAgICAqIA0KICAgICAqIEBzZWUgTXlBdXRvbG9hZA0KICAgICAqLw0KCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgkbW9kdWxlTmFtZSwgJG5hbWUsJHByZWZpeGUgPSBudWxsLCAkZGJOYW1lID0gbnVsbCkNCgl7DQoJCXBhcmVudDo6X19jb25zdHJ1Y3QoJG1vZHVsZU5hbWUsICRuYW1lLCAkcHJlZml4ZSwgJGRiTmFtZSk7DQoJfQ0KCQ0KICAgIC8qKg0KICAgICogQWRkIGEgbmV3IEZpZWxkDQogICAgKiANCiAgICAqIEN1cnJlbnRseSwgdGhlIE9ybSBTeXN0ZW0gZG9lbid0IGFsbG93IG1vcmUgdGhhbiB0d28gRmllbGQgZm9yIGFuIEVudGl0eUFzc29jaWF0aW9uDQogICAgKiANCiAgICAqIEBwYXJhbSBGaWVsZCB0aGUgRmllbGQgdG8gYWRkLg0KCSoNCgkqIEBleGNlcHRpb24gSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBlbnRpdHkNCgkqIEBleGNlcHRpb24gSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24gaWYgd2UgdHJ5IHRvIHVzZSBtb3JlIHRoYW4gYSBzaW5nbGUgUHJpbWFyeUtleSBpbiB0aGUgZW50aXR5DQogICAgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gYWRkKEZpZWxkICRuZXdGaWVsZCkNCgl7DQoJCSR0aGlzLT5uYkZpZWxkICsrOw0KCQkNCgkJaWYoJHRoaXMtPm5iRmllbGQgPiAyKQ0KCQkJdGhyb3cgbmV3IElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uICgiSXQncyBpbXBvc3NpYmxlIHRvIHVzZSBtb3JlIHRoYW4gdHdvIEZpZWxkIGluIHRoZSBFbnRpdHlBc3NvY2lhdGlvbiAiLiAkdGhpcy0+Z2V0TmFtZSgpKTsNCgkJCQkNCgkJcGFyZW50OjphZGQoJG5ld0ZpZWxkKTsNCgl9DQoNCn0=]]></data>
	</file>
	<file>
	  <filename>/lib/class.example.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIEV4YW1wbGUgQ2xhc3MKICoKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCiAKLyoqCiAqIFJlcHJlc2VudHMgYSBncm91cCBvZiBkaWZmZXJlbnRzIENyaXRlcmlhIChDcml0ZXJpYXMpIHRvIHByb2Nlc3MgYSBzZWFyY2ggIkJ5IEV4YW1wbGUiIG9uIGEgRW50aXR5IGluIERhdGFiYXNlCiAqCiAqIEBzaW5jZSAwLjAuMQogKiBAYXV0aG9yIEJlc3MKICogQHBhY2thZ2UgT3JtCiAqKi8KZmluYWwgY2xhc3MgRXhhbXBsZSAKewoJcHJpdmF0ZSAkQ3JpdGVyaWFzID0gYXJyYXkoKTsKCQogICAgLyoqCiAgICAqIFB1YmxpYyBDb25zdHJ1Y3RvcgogICAgKiAKICAgICovCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKQoJewoJfQoJCiAgICAKICAgIC8qKgogICAgKiBBZGQgYSBuZXcgQ3JpdGVyaWEgb24gdGhlIGV4aXN0aW5nIGxpc3QKICAgICogCiAgICAqIEBwYXJhbSBzdHJpbmcgTmFtZSBvZiB0aGUgZmllbGQgCiAgICAqIEBwYXJhbSBUeXBlQ3JpdGVyaWEgVHlwZSBvZiBDcml0ZXJpYQogICAgKiBAcGFyYW0gYXJyYXkgYWxsIHRoZSBwYXJhbWV0ZXJzIHVzZWQgZm9yIHRoZSBwYXJhbWV0ZXIgJHR5cGVDcml0ZXJpYQogICAgKiBAcGFyYW0gYm9vbGVhbiBbT3B0aW9ubmFsXSBpZiB3ZSBtdXN0IGlnbm9yZSB0aGUgY2FzZSAoYXplIGVxdWFscyBBWkUpIG9yIG5vdC4gRGVmYXVsdCB2YWx1ZSBpcyAiZmFsc2UiCiAgICAqIAogICAgKiBAc2VlIFR5cGVDcml0ZXJpYQogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBhZGRDcml0ZXJpYSgkZmllbGRuYW1lLCAkdHlwZUNyaXRlcmlhLCAkcGFyYW1zQ3JpdGVyaWEsICRpZ25vcmVDYXNlID0gZmFsc2UpCgl7CgkJaWYoIWlzX2FycmF5KCRwYXJhbXNDcml0ZXJpYSkpCgkJewoJCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJ0aGUgcGFyYW1ldGVyIFwkcGFyYW1zQ3JpdGVyaWEgZm9yIHRoZSBDcml0ZXJpYSBvZiB0aGUgRmllbGQgWyIuJGZpZWxkbmFtZS4iXSBtdXN0IGJlIGFuIGFycmF5Iik7CgkJfQoJCQoJCSR0aGlzLT5Dcml0ZXJpYXNbXSA9IG5ldyBDcml0ZXJpYSgkZmllbGRuYW1lLCAkdHlwZUNyaXRlcmlhLCAkcGFyYW1zQ3JpdGVyaWEsICRpZ25vcmVDYXNlKTsKCX0KCiAgICAvKioKICAgICogUmV0dXJuIGFsbCB0aGUgQ3JpdGVyaWFzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBFeGFtcGxlIE9iamVjdAogICAgKiAKICAgICogQHJldHVybiBhcnJheTxDcml0ZXJpYT4gdGhlIGxpc3Qgb2YgQ3JpdGVyaWFzIGNvbnRhaW5lZCBpbiB0aGUgY3VycmVudCBFeGFtcGxlIE9iamVjdAogICAgKi8KCXB1YmxpYyBmdW5jdGlvbiBnZXRDcml0ZXJpYXMoKXsKCQlyZXR1cm4gJHRoaXMtPkNyaXRlcmlhczsKCX0KfQoKPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.field.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIEZpZWxkIENsYXNzZQ0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCi8qKg0KICogICBSZXByZXNlbnQgYSBFbnRpdHkncyBmaWVsZCB3aXRoIGFsbCBpdHMgcHJvcGVydGllcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCmNsYXNzIEZpZWxkIA0Kew0KCS8qKg0KCSAqIFRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZA0KCSAqLw0KCXByaXZhdGUgJG5hbWU7DQoJDQoJLyoqDQoJICogVGhlIENBU1QgdmFsdWUgb2YgdGhlIGZpZWxkDQoJICovDQoJcHJpdmF0ZSAkdHlwZTsNCgkNCgkvKioNCgkgKiBUaGUgbWF4IHNpemUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBpZiAkdHlwZSBpcyBEYXRlLCBUaW1lLCBCdWZmZXIsIE5vbmUgLi4uDQoJICovDQoJcHJpdmF0ZSAkc2l6ZTsNCgkNCgkvKioNCgkgKiBCb29sZWFuIDogdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwNCgkgKi8NCglwcml2YXRlICRudWxsYWJsZTsNCgkNCgkvKioNCgkgKiB0aGUgS0VZIHZhbHVlIG9mIHRoZSBmaWVsZC4gTWF5IGJlIG51bGwNCgkgKi8NCglwcml2YXRlICRLRVk7DQoJDQoJLyoqDQoJICogdGhlIG5hbWUgb2YgdGhlIGtleS4gT25seSB1c2VkIGZvciBGb3JlaWduS2V5IGFuZCBBc3NvY2lhdGVLZXkNCgkgKi8NCglwcml2YXRlICRLRVlOYW1lOw0KCQ0KICAgIC8qKg0KICAgICogcHVibGljIGNvbnN0cnVjdG9yDQogICAgKiAJDQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSAodW5pcXVlKSBuYW1lIG9mIHRoZSBmaWVsZA0KICAgICogQHBhcmFtIENBU1QgVGhlIENBU1QgdmFsdWUgb2YgdGhlIGZpZWxkIGV4YW1wbGUgOiBDQVNUOjokSU5URUdFUg0KICAgICogQHBhcmFtIGludCBUaGUgbWF4IHNpemUgb2YgdGhlIGZpZWxkLiBNYXkgYmUgbnVsbCBpZiAkdHlwZSBpcyBEYXRlLCBUaW1lLCBCdWZmZXIsIE5vbmUgLi4uDQogICAgKiBAcGFyYW0gdHJ1ZSBpZiB0aGUgdmFsdWUgbWF5IGJlIE5VTEwuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UNCiAgICAqIEBwYXJhbSBLRVkgdGhlIEtFWSB2YWx1ZSBvZiB0aGUgZmllbGQuIE1heSBiZSBudWxsIGV4YW1wbGU6IEtFWTo6JFBLIGZvciBhIHByaW1hcnkga2V5DQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBuYW1lIG9mIHRoZSBrZXkuIE9ubHkgdXNlZCBmb3IgRm9yZWlnbktleSBhbmQgQXNzb2NpYXRlS2V5IGV4YW1wbGUgOiAiQ3VzdG9tZXIuY3VzdG9tZXJfaWQiIGluIHRoZSBmaWVsZCAiY3VzdG9tZXIiIG9mIGFuIGVudGl0eSAiT3JkZXIiLg0KICAgICogDQogICAgKiBAcmV0dXJuIEZpZWxkIHRoZSBGaWVsZCBPYmplY3QNCiAgICAqIA0KICAgICogDQogICAgKiBAc2VlIENBU1QNCiAgICAqIEBzZWUgS0VZDQoJKiBAc2VlIEVudGl0eQ0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJGZpZWxkbmFtZSwgJGNhc3QsICRzaXplID0gbnVsbCwgJG51bGxhYmxlID0gZmFsc2UsICRLRVkgPSBudWxsLCAkS0VZTmFtZT1udWxsKQ0KCXsNCgkJaWYoZW1wdHkoJEtFWSkgJiYgIWVtcHR5KCRLRVlOYW1lKSkNCgkJew0KCQkJdGhyb3cgbmV3IElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uKCdJbXBvc3NpYmxlIHRvIHNwZWNpZnkgYSBrZXlOYW1lIHBhcmFtZXRlciBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIGlmIHRoZSBrZXkgaXMgbm90ICRGSyBvciAkQUsnKTsNCgkJfQ0KCQlpZigkS0VZID09IEtFWTo6JFBLICYmICFlbXB0eSgkS0VZTmFtZSkpDQoJCXsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQ29uZmlndXJhdGlvbkV4Y2VwdGlvbignSW1wb3NzaWJsZSB0byBzcGVjaWZ5IGEga2V5TmFtZSBwYXJhbWV0ZXIgZm9yIHRoZSBmaWVsZCAnLiRmaWVsZG5hbWUuJyBpZiB0aGUga2V5IGlzIG5vdCAkRksgb3IgJEFLJyk7DQoJCX0NCgkJaWYoKCRLRVkgPT0gS0VZOjokRksgfHwgJEtFWSA9PSBLRVk6OiRBSykgJiYgZW1wdHkoJEtFWU5hbWUpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24oJyRGSyBrZXkgb3IgJEFLIGtleSBmb3IgdGhlIGZpZWxkICcuJGZpZWxkbmFtZS4nIG5lZWQgYSBrZXlOYW1lJyk7DQoJCX0NCgkJDQoJCWlmKCgkY2FzdCA9PSBDQVNUOjokREFURSB8fCAkY2FzdCA9PSBDQVNUOjokQlVGRkVSKSAmJiAhZW1wdHkoJHNpemUpKQ0KCQl7DQoJCQl0aHJvdyBuZXcgSWxsZWdhbENvbmZpZ3VyYXRpb25FeGNlcHRpb24oJ1RoZSBDQVNUOjpEQVRFIG9yIHRoZSBDQVNUOjpCVUZGRVIgb2YgZmllbGQgJy4kZmllbGRuYW1lLicgbXVzblwndCBoYXZlIHNpemUgdmFsdWUnKTsNCgkJfQ0KCQkNCg0KCQlpZigkbnVsbGFibGUgPT0gbnVsbCkNCgkJCSRudWxsYWJsZSA9IGZhbHNlOw0KCQkJDQoJCSR0aGlzLT5uYW1lIAk9ICRmaWVsZG5hbWU7DQoJCSR0aGlzLT50eXBlIAk9ICRjYXN0Ow0KCQkkdGhpcy0+c2l6ZSAJPSAkc2l6ZTsNCgkJJHRoaXMtPm51bGxhYmxlID0gJG51bGxhYmxlOw0KCQkkdGhpcy0+S0VZIAkJPSAkS0VZOw0KCQkkdGhpcy0+S0VZTmFtZSAJPSAkS0VZTmFtZTsNCgl9DQoJDQoNCiAgICAvKioNCiAgICAqIGdldHRlciBmb3IgbmFtZQ0KICAgICogDQogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUgKHVuaXF1ZSkgbmFtZSBvZiBGaWVsZA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldE5hbWUoKQ0KCXtyZXR1cm4gJHRoaXMtPm5hbWU7fQ0KDQogICAgLyoqDQogICAgKiBnZXR0ZXIgZm9yIHR5cGUNCiAgICAqIA0KICAgICogQHJldHVybiBzdHJpbmcgdGhlIENBU1QgdmFsdWUgb2YgRmllbGQNCiAgICAqIA0KICAgICogQHNlZSBDQVNUDQogICAgKiANCiAgICAqLwkNCglwdWJsaWMgZnVuY3Rpb24gZ2V0VHlwZSgpDQoJe3JldHVybiAkdGhpcy0+dHlwZTt9DQoJDQogICAvKioNCiAgICAqIGdldHRlciBmb3Igc2l6ZQ0KICAgICogDQogICAgKiBAcmV0dXJuIGludCB0aGUgc2l6ZSBvZiBGaWVsZA0KICAgICovDQoJcHVibGljIGZ1bmN0aW9uIGdldFNpemUoKQ0KCXtyZXR1cm4gJHRoaXMtPnNpemU7fQ0KDQogICAvKioNCiAgICAqIHJldHVybiB0cnVlIGlmIEZpZWxkIGhhcyBhICRQSw0KICAgICogDQogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkUEsNCiAgICAqLwkNCglwdWJsaWMgZnVuY3Rpb24gaXNQcmltYXJ5S0VZKCkNCgl7cmV0dXJuICR0aGlzLT5LRVkgPT0gS0VZOjokUEs7fQ0KDQogICAvKioNCiAgICAqIHJldHVybiB0cnVlIGlmIEZpZWxkIGhhcyBhICRGSw0KICAgICogDQogICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkRksNCiAgICAqLyAgICAJDQoJcHVibGljIGZ1bmN0aW9uIGlzRm9yZWlnbktFWSgpDQoJe3JldHVybiAkdGhpcy0+S0VZID09IEtFWTo6JEZLO30NCg0KICAgLyoqDQogICAgKiByZXR1cm4gdHJ1ZSBpZiBGaWVsZCBoYXMgYSAkQUsNCiAgICAqIA0KICAgICogQHJldHVybiBib29sZWFuIHRydWUgaWYgRmllbGQgaGFzIGEgJEFLDQogICAgKi8gICAgCQ0KCXB1YmxpYyBmdW5jdGlvbiBpc0Fzc29jaWF0ZUtFWSgpDQoJe3JldHVybiAkdGhpcy0+S0VZID09IEtFWTo6JEFLO30NCgkNCiAgICAvKioNCiAgICAqIGdldHRlciBmb3Iga2V5TmFtZQ0KICAgICogDQogICAgKiBAcmV0dXJuIHN0cmluZyB0aGUga2V5TmFtZSBvZiBGaWVsZA0KICAgICogDQogICAgKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0S0VZTmFtZSgpDQoJe3JldHVybiAkdGhpcy0+S0VZTmFtZTt9DQoJDQogICAgLyoqDQogICAgKiBnZXR0ZXIgZm9yIG51bGxhYmxlIA0KICAgICogDQogICAgKiBAcmV0dXJuIHRydWUgaWYgRmllbGQgaXMgb3B0aW9uYWwgaW4gZGF0YWJhc2UNCiAgICAqLw0KCXB1YmxpYyBmdW5jdGlvbiBpc051bGxhYmxlKCkNCgl7cmV0dXJuICR0aGlzLT5udWxsYWJsZTt9DQoJDQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.illegalargumentexception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiAvKioNCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQoNCi8qKg0KICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIHBhcmFtZXRlcnMgaXMgbm90IHRoZSBvbmUgZXhwZWN0ZWQNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQoqLw0KY2xhc3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsNCiAgICANCiAgICBwdWJsaWMgZnVuY3Rpb24gX19jb25zdHJ1Y3QoJG1zZz1OVUxMLCAkY29kZT0wKQ0KICAgIHtwYXJlbnQ6Ol9fY29uc3RydWN0KCRtc2csICRjb2RlKTt9DQp9DQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/lib/class.illegalconfigurationexception.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCiAvKioNCiAqIENvbnRhaW5zIHRoZSBjbGFzcyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24NCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQoNCi8qKg0KICogQ2xhc3NlIGV4dGVuZHMgRXhjZXB0aW9uLCB1c2VkIHdoZW4gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBvZiBFbnRpdGllcyBpc24ndCBjb3JyZWN0DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KKi8NCmNsYXNzIElsbGVnYWxDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uICB7DQogICAgDQogICAgcHVibGljIGZ1bmN0aW9uIF9fY29uc3RydWN0KCRtc2c9TlVMTCwgJGNvZGU9MCkNCiAgICB7cGFyZW50OjpfX2NvbnN0cnVjdCgkbXNnLCAkY29kZSk7fQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.indexing.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIGFsbCB0aGUgQ21zTWFkZVNpbXBsZSdzIGluZGV4aW5nIHN5c3RlbQogKgogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovCgovKioKICogICBBbGxvdyBhIHF1aWNrIGFuZCBzaW1wbGUgaW5kZXhpbmcgc3lzdGVtIHdpdGggbW9kdWxlcyBsaWtlIFNlYXJjaAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogKiAgIFRoZSBtb3N0IG9mIHRoZSB3b3JrIHdhcyBtYWRlIGZyb20gRHVrZXRvd24ncyB3b3JrIC0gdGhhbmsgdG8gaGltCiAqICAgaHR0cDovL2ZvcnVtLmNtc21hZGVzaW1wbGUub3JnL3ZpZXd0b3BpYy5waHA/cD0yNjE1MDgjcDI2MTUwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICogICAgCiAqIAogKiBAc2luY2UgMC4wLjEKICogQGF1dGhvciBCZXNzCiAqIEBwYWNrYWdlIE9ybQogKiovICAgCmZpbmFsIGNsYXNzIEluZGV4aW5nCnsJCgkKCXByb3RlY3RlZCBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsKCX0KCQoJcHVibGljIHN0YXRpYyBmaW5hbCBmdW5jdGlvbiBnZXRTZWFyY2goKQoJewoJCSRtb2RvcHMgPSBjbXNtcygpLT5HZXRNb2R1bGVPcGVyYXRpb25zKCk7CgkJcmV0dXJuICRtb2RvcHMtPkdldFNlYXJjaE1vZHVsZSgpOwoJfQoKCS8qKgogICAgKiB2aWRlIGwnaW5kZXhhZ2UgCiAgICAqIAogICAgKiBAcGFyYW0gc3RyaW5nIGxlIG5vbSBkdSBtb2R1bGUuCiAgICAqLwoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBEZWxldGVBbGxXb3JkcyhFbnRpdHkgJGVudGl0eSkKCXsJCgkJJHNlYXJjaG1vZHVsZSA9IEluZGV4aW5nOjpnZXRTZWFyY2goKTsKCQkkc2VhcmNobW9kdWxlLT5EZWxldGVXb3JkcygkZW50aXR5LT5nZXRNb2R1bGVOYW1lKCksIG51bGwsICRlbnRpdHktPmdldE5hbWUoKSk7Cgl9CgogICAvKioKICAgICogdmlkZSBsJ2luZGV4YWdlIGQndW4g6WxlbWVudCBlbiBwYXJ0aWN1bGllcgogICAgKiAKICAgICogQHBhcmFtIHN0cmluZyBsZSBub20gZHUgbW9kdWxlLgogICAgKi8KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gRGVsZXRlV29yZHMoRW50aXR5ICRlbnRpdHksICRzaWQgPSBudWxsKQoJewkKCQlpZigkc2lkID09IG51bGwpCgkJCSRzaWQgPSAkZW50aXR5LT5nZXQoJGVudGl0eS0+Z2V0UGsoKS0+Z2V0TmFtZSgpKTsKCQkKCQkkc2VhcmNobW9kdWxlID0gSW5kZXhpbmc6OmdldFNlYXJjaCgpOwoJCSRzZWFyY2htb2R1bGUtPkRlbGV0ZVdvcmRzKCRlbnRpdHktPmdldE1vZHVsZU5hbWUoKSwgJHNpZCwgJGVudGl0eS0+Z2V0TmFtZSgpKTsKCX0KCQoJCglwdWJsaWMgc3RhdGljIGZpbmFsCWZ1bmN0aW9uIEFkZFdvcmRzKCRlbnRpdHkpCiAgICB7CgkJJHNlYXJjaG1vZHVsZSA9IEluZGV4aW5nOjpnZXRTZWFyY2goKTsKCQkkZmllbGRzID0gJGVudGl0eS0+Z2V0RmllbGRzKCk7CgkJCgkJJGNvbnRlbnQgPSAnJzsKCQlmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkKQoJCXsKCQkJJGNvbnRlbnQuPSAnICcuJGVudGl0eS0+Z2V0KCRmaWVsZC0+Z2V0TmFtZSgpKTsKCQl9CgkJCgkJJHNpZCA9ICRlbnRpdHktPmdldCgkZW50aXR5LT5nZXRQaygpLT5nZXROYW1lKCkpOwoJCQoJCS8vZWNobyAkc2lkLicgJy4kZW50aXR5LT5nZXROYW1lKCkuJyAnLiRjb250ZW50Lic8YnIvPic7CgkJJHNlYXJjaG1vZHVsZS0+QWRkV29yZHMoJGVudGl0eS0+Z2V0TW9kdWxlTmFtZSgpLCAkc2lkLCRlbnRpdHktPmdldE5hbWUoKSwkY29udGVudCk7CiAgICB9CgkKCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gVXBkYXRlV29yZHMoJGVudGl0eSkgewoJCUluZGV4aW5nOjpEZWxldGVXb3JkcygkZW50aXR5KTsKCQlJbmRleGluZzo6QWRkV29yZHMoJGVudGl0eSk7Cgl9CgoJcHVibGljIHN0YXRpYyBmdW5jdGlvbiBTZWFyY2hSZWluZGV4KCRtb2R1bGVOYW1lKSB7CgkJJGVudGl0eXMgPSBNeUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMoJG1vZHVsZU5hbWUpOwoJCWZvcmVhY2ggKCRlbnRpdHlzIGFzICRlbnRpdHkpIHsKCQkKCQkJaWYoJGVudGl0eS0+aXNJbmRleGFibGUoKSkgewoJCQkKCQkJCUluZGV4aW5nOjpEZWxldGVBbGxXb3JkcygkZW50aXR5KTsKCQkJCQoJCQkJJGxpc3RlID0gYXJyYXkoKTsKCQkJCWlmKCEkZW50aXR5LT5pc0ZpZWxkQnlOYW1lRXhpc3RzKEZpZWxkX0FjdGl2ZTo6JG5hbWUpKSB7CgkJCQkJJGxpc3RlID0gQ29yZTo6c2VsZWN0QWxsKCRlbnRpdHkpOwoJCQkJfSBlbHNlIHsKCQkJCQkkZXhhbXBsZSA9IG5ldyBFeGFtcGxlKCk7CgkJCQkJJGV4YW1wbGUtPmFkZENyaXRlcmlhKEZpZWxkX0FjdGl2ZTo6JG5hbWUsIFR5cGVDcml0ZXJpYTo6JEVRLCBhcnJheSgxKSk7CgkJCQkJJGxpc3RlID0gQ29yZTo6c2VsZWN0QnlFeGFtcGxlKCRlbnRpdHksICRleGFtcGxlKTsKCQkJCX0KCQkJCQoJCQkJZm9yZWFjaCgkbGlzdGUgYXMgJHNpbmdsZUVudGl0eSkgewoJCQkJCUluZGV4aW5nOjpBZGRXb3Jkcygkc2luZ2xlRW50aXR5KTsKCQkJCX0KCQkJfQoJCX0KCX0KCgkvKioKCSAqIENhbGxlZCBieSBtb2R1bGUgU2VhcmNoIHRvIGRpc3BsYXkgYSByZXN1bHQKCSAqLwoJZnVuY3Rpb24gU2VhcmNoUmVzdWx0KCYkbW9kdWxlLCAkaWQsICRyZXR1cm5pZCwgJGVudGl0eUlkLCAkYXR0ciA9ICcnKQogICAgewkKCQkkcmVzdWx0ID0gYXJyYXkoKTsKCQkKCQkvKiRtbGUgPSBNbGVGb3JNbW1mczo6Z2V0Um9vdFVybCgpOwoJCWlmKCRtbGUgPT0gbnVsbCkKCQl7CgkJCSRtbGU9J2ZyJzsKCQl9Ki8KCQkKCQkKCQkkZW50aXR5cyA9IG15QXV0b2xvYWQ6OmdldEFsbEluc3RhbmNlcygkbW9kdWxlLT5nZXROYW1lKCkpOwoJCWZvcmVhY2ggKCRlbnRpdHlzIGFzICRlbnRpdHkpCgkJewoJCQlpZigkZW50aXR5LT5pc0luZGV4YWJsZSgpKQoJCQl7CQkKCgkJCQlpZiAoJGF0dHIgPT0gJGVudGl0eS0+Z2V0TmFtZSgpKQoJCQkJewoJCQkJCSRteUVudGl0eSA9IENvcmU6OnNlbGVjdEJ5SWQoJGVudGl0eSwgJGVudGl0eUlkKTsKCQkJCQkKCQkJCQkvLyRjdXJyZW50TGFuZ0lTTyA9ICgkbWxlID09ICdmcic/J2ZyX0ZSJzonZW5fVVMnKTsgLy9UT0RPIDogc2UgZOltZXJkZXIgcG91ciBy6WN1cOlyZXIgbGEgbGFuZ3VlIGxp6WUgYXUgJHJldHVybklkOwoJCQkJCQoJCQkJCSRwcmV0dHlVcmwgPSAnJzsKCQkJCQkkbGluayA9ICRtb2R1bGUtPkNyZWF0ZUxpbmsoJGlkLCAnZmljaGUnLCAkcmV0dXJuaWQsIAoJCQkJCQkJCQknJywgCgkJCQkJCQkJCWFycmF5KCJlY2xhc3MiPT4kbXlFbnRpdHktPmdldE5hbWUoKSwgImVjbGFzc0lkIj0+JGVudGl0eUlkKSwnJyx0cnVlLG51bGwsbnVsbCxudWxsLCRwcmV0dHlVcmwpOwoJCQkJIAkJCQkgICAgCgkJCQkJJHJlc3VsdFswXSA9ICRteUVudGl0eS0+Z2V0TmFtZSgpOwoJCQkJCSRyZXN1bHRbMV0gPSBodG1sX2VudGl0eV9kZWNvZGUoJG15RW50aXR5LT5nZXROYW1lKCkuJyAjJy4kZW50aXR5SWQsIEVOVF9RVU9URVMsICdVVEYtOCcpOwoJCQkJCSRyZXN1bHRbMV0gPSBodG1sX2VudGl0eV9kZWNvZGUoJHJlc3VsdFsxXSwgRU5UX1FVT1RFUywgJ1VURi04Jyk7CgkJCQkJCgkJCQkJCgkJCQkJJHJlc3VsdFsyXSA9ICRsaW5rOwoJCQkJfQoJCQl9CgkJfQoJCQoJCXJldHVybiAkcmVzdWx0OwogICAgfQoKCQp9Cj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.isortable.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGludGVyZmFjZSBJU29ydGFibGUgd2hpY2ggYWxsb3cgdG8gc29ydCByZXN1bHRzIGZvciBhbiBlbnRpdHkNCiAqDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQogDQovKioNCiAqIEludGVyZmFjZSB3aWNoIGFsbG93IHRvIHNvcnQgcmVzdWx0cyBmb3IgYW4gZW50aXR5DQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KaW50ZXJmYWNlIElTb3J0YWJsZQ0Kew0KCQ0KICAgIC8qKg0KICAgICogRnVuY3Rpb24gd2hpY2ggY29tcGFyZSB0d28gZW50aXRpZXMgaW4gcGFyYW1ldGVycw0KICAgICogDQogICAgKiANCiAgICAqIEBwYXJhbSBFbnRpdHkgdGhlIGZpcnN0IGVudGl0eSB3aXRoIGFsbCB2YWx1ZXMgc2V0dGVkDQogICAgKiBAcGFyYW0gRW50aXR5IHRoZSBzZWNvbmQgZW50aXR5IHdpdGggYWxsIHZhbHVlcyBzZXR0ZWQNCgkqDQogICAgKiBAcmV0dXJuIEludGVnZXIgOiAwIGlmIGVxdWFscywgMSBpZiB0aGUgZmlyc3QgZW50aXR5IGlzIHN1cGVyaW9yLCBlbHNlIC0xDQogICAgKiANCiAgICAqIEBzZWUgRW50aXR5DQogICAgKi8NCglwdWJsaWMgc3RhdGljIGZ1bmN0aW9uIGNvbXBhcmVUbyhFbnRpdHkgJGVudGl0eTEsIEVudGl0eSAkZW50aXR5Mik7DQp9DQoNCg0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.key.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGNsYXNzIGZvciB0aGUgZGlmZmVyZW50IGRhdGFiYXNlIGtleQ0KICogDQogKiBAc2luY2UgMC4wLjENCiAqIEBhdXRob3IgQmVzcw0KICogQHBhY2thZ2UgT3JtDQogKiovDQoNCi8qKg0KICogQ2xhc3MgZGVmaW5lcyB0aGUgZGlmZmVyZW50cyBrZXlzIHVzZWQgaW4gdGhlIE9ybSBzeXN0ZW0NCiAqIA0KICogIEtFWTo6JFBLIGRlZmluZXMgYSBwcmltYXJ5IGtleQ0KICogIEtFWTo6JEZLIGRlZmluZXMgYSBmb3JlaWduIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgMCwxLT5uIA0KICogIEtFWTo6JEFLIGRlZmluZXMgYW4gYXNzb2NpYXRlIGtleSA6IGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgdGhhdCBuZWVkaW5nIGEgdGhpcmQgdGFibGUNCiAqIA0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KKi8NCmNsYXNzIEtFWQ0Kew0KCXB1YmxpYyBzdGF0aWMgJFBLID0gMHg5OTAxOyAvLyBQcmltYXJ5IEtFWQ0KCXB1YmxpYyBzdGF0aWMgJEZLID0gMHg5OTAyOyAvLyBGb3JlaWduIEtFWSBhIGxpbmsgYmV0d2VlbiAyIGVudGl0aWVzIDAsMS0+bg0KCXB1YmxpYyBzdGF0aWMgJEFLID0gMHg5OTAzOyAvLyBBc3NvY2lhdGUgS0VZIGEgbGluayBiZXR3ZWVuIDIgZW50aXRpZXMgbi0+biB0aGF0IG5lZWRpbmcgYSB0aGlyZCB0YWJsZQ0KfQ0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lib/class.myautoload.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgdGhlIGF1dG9sb2FkIHN5c3RlbSB0aGF0IHdpbGwgbWVtb3JpemUgYWxsIHRoZSBlbnRpdGllcyB1c2VkIGJ5IGFsbCB0aGUgbW9kdWxlcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCiANCiAvKioNCiAqIFN0YXRpYyBDbGFzcyBtYW5hZ2luZyBlbnRpdGllcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbg0KICoJVGhlIG1haW4gdXNlIGlzIHRvIG5vdCByZWRlY2xhcmF0ZSBYIGluc3RhbmNlcyBvZiBzYW1lIGNsYXNzZXMgaWYgaXQncyBub3QgbmVjZXNzYXJ5Lg0KICogQWxsIG1vZHVsZXMgaGF2ZSB0aGVpciBvd24gbmFtZXNwYWNlIHRvIGF2b2lkIHNoYXJpbmcgZW50aXRpZXMgYmV0d2VlbiB0d28gbW9kdWxlcw0KICoNCiAqIEBzaW5jZSAwLjAuMQ0KICogQGF1dGhvciBCZXNzDQogKiBAcGFja2FnZSBPcm0NCiAqKi8NCmZpbmFsIGNsYXNzIE15QXV0b2xvYWQNCnsNCglwcml2YXRlIHN0YXRpYyAkaW5zdGFuY2VzOw0KCQ0KCS8qKg0KCSAqIFByaXZhdGUgY29uc3RydWN0b3INCgkgKi8NCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKXt9CQ0KCQ0KCS8qKg0KCSAqIEZ1bmN0aW9uIGNhbGxlZCBieSB0aGUgZW50aXRpZXMgdGhlbXNlbGYgZHVyaW5nIHRoZWlyIF9jb25zdHJ1Y3QoKSBmdW5jdGlvbg0KCSAqIGl0IHdpbGwgc3RvY2sgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eSAoaWYgbm90IGFscmVhZHkgZXhpc3RpbmcpIGluIGhpcyBtZW1vcnkNCiAgICAgKiANCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlDQoJICogQHBhcmFtIHN0cmluZyBhbiBpbnN0YW5jZSBvZiB0aGUgZW50aXR5DQoJICovDQoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBhZGRJbnN0YW5jZSgkbmFtZXNwYWNlLCBFbnRpdHkgJGluc3RhbmNlKQ0KCXsJDQoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOw0KCQkkbmFtZSA9ICRpbnN0YW5jZS0+Z2V0TmFtZSgpOw0KCQkkbmFtZSA9IHN0cnRvbG93ZXIoJG5hbWUpOw0KCQkJCQ0KCQlpZihpc3NldChzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRuYW1lXSkpDQoJCXsNCgkJCVRyYWNlOjpkZWJ1ZygiSW5zdGFuY2UgIi4kbmFtZS4iIGFscmVhZHkgaW4gbWVtb3J5LiIpOw0KCQkJcmV0dXJuOw0KCQl9DQoJCVRyYWNlOjpkZWJ1ZygiQWRkaW5nIHRoZSBpbnN0YW5jZSAiLiRuYW1lLiIgaW50byB0aGUgbmFtZXNwYWNlICIuJG5hbWVzcGFjZSk7DQoJCXNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV1bJG5hbWVdID0gJGluc3RhbmNlOw0KCX0NCgkNCgkvKioNCgkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgZW50aXR5IGZyb20gdGhlIG1lbW9yeS4gRWFjaCBpbnN0YW5jZSBpcyBhIGNsb25lIHRvIGF2b2lkIHVzaW5nDQoJICogdGhlIHNhbWUgb2JqZWN0IA0KICAgICAqIA0KCSAqIEBwYXJhbSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUNCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCgkgKg0KCSAqIEByZXR1cm4gRW50aXR5IGFuIGluc3RhbmNlIG9mIGVudGl0eQ0KCSAqLw0KCXB1YmxpYyBmaW5hbCBzdGF0aWMgZnVuY3Rpb24gZ2V0SW5zdGFuY2UoJG5hbWVzcGFjZSwgJGluc3RhbmNlTmFtZSkNCgl7DQoJCSRuYW1lc3BhY2UgPSBzdHJ0b2xvd2VyKCRuYW1lc3BhY2UpOw0KCQkkaW5zdGFuY2VOYW1lID0gc3RydG9sb3dlcigkaW5zdGFuY2VOYW1lKTsNCgkJbXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSk7DQoJCQ0KCQlUcmFjZTo6ZGVidWcoIkFza2luZyBhbiBpbnN0YW5jZSBvZiAiLiRpbnN0YW5jZU5hbWUuICIgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOw0KCQlpZihteUF1dG9sb2FkOjpoYXNJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKSkNCgkJew0KCQkJVHJhY2U6OmRlYnVnKCJJbnN0YW5jZSAiLiRpbnN0YW5jZU5hbWUuIiByZXR1cm5lZC4iKTsNCgkJCXJldHVybiBjbG9uZSBzZWxmOjokaW5zdGFuY2VzWyRuYW1lc3BhY2VdWyRpbnN0YW5jZU5hbWVdOw0KCQl9DQoJCQ0KCQlUcmFjZTo6ZXJyb3IoIk5vIGluc3RhbmNlICRpbnN0YW5jZU5hbWUgZm91bmQgaW4gbWVtb3J5IGZvciBuYW1lc3BhY2UgIi4kbmFtZXNwYWNlKTsNCgkJdGhyb3cgbmV3IEV4Y2VwdGlvbigiTm8gaW5zdGFuY2UgJGluc3RhbmNlTmFtZSBmb3VuZCBpbiBtZW1vcnkgZm9yIG5hbWVzcGFjZSAiLiRuYW1lc3BhY2UpOw0KCX0NCgkNCgkvKioNCgkgKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzIGluIHRoZSBtZW1vcnkgZm9yIHRoZSBzYW1lIG5hbWVzcGFjZQ0KICAgICAqIA0KCSAqIEBwYXJhbSBuYW1lc3BhY2UgbmFtZXNwYWNlIG9mIHRoZSBlbnRpdHkncyBtb2R1bGUNCgkgKiBAcGFyYW0gc3RyaW5nIGFuIGluc3RhbmNlIG9mIHRoZSBlbnRpdHkNCgkgKg0KCSAqIEByZXR1cm4gQm9vbGVhbiBpZiB0aGUgaW5zdGFuY2UgZXhpc3RzDQoJICovDQoJcHVibGljIGZpbmFsIHN0YXRpYyBmdW5jdGlvbiBoYXNJbnN0YW5jZSgkbmFtZXNwYWNlLCAkaW5zdGFuY2VOYW1lKXsNCgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7DQoJCSRpbnN0YW5jZU5hbWUgPSBzdHJ0b2xvd2VyKCRpbnN0YW5jZU5hbWUpOw0KCQkNCgkJbXlBdXRvbG9hZDo6aXNWYWxpZGVOYW1lc3BhY2UoJG5hbWVzcGFjZSk7DQoJCQ0KCQlyZXR1cm4gaXNzZXQoc2VsZjo6JGluc3RhbmNlc1skbmFtZXNwYWNlXVskaW5zdGFuY2VOYW1lXSk7DQoJfQ0KCQ0KCS8qKg0KCSAqIFJldHVybiBhbGwgdGhlIGluc3RhbmNlcyBvZiBhbGwgdGhlIGVudGl0aWVzIGZyb20gYSBzaW5nbGUgbmFtZXNwYWNlDQogICAgICogDQoJICogQHBhcmFtIG5hbWVzcGFjZSBuYW1lc3BhY2Ugb2YgdGhlIGVudGl0eSdzIG1vZHVsZQ0KCSAqIEBwYXJhbSBzdHJpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIGVudGl0eQ0KCSAqDQoJICogQHJldHVybiBhcnJheTxFbnRpdHk+IGFuIGFycmF5IG9mIGFsbCB0aGUgZW50aXRpZXMNCgkgKi8NCglwdWJsaWMgZmluYWwgc3RhdGljIGZ1bmN0aW9uIGdldEFsbEluc3RhbmNlcygkbmFtZXNwYWNlKQ0KCXsNCgkJJG5hbWVzcGFjZSA9IHN0cnRvbG93ZXIoJG5hbWVzcGFjZSk7DQoJCW15QXV0b2xvYWQ6OmlzVmFsaWRlTmFtZXNwYWNlKCRuYW1lc3BhY2UpOw0KCQkNCgkJcmV0dXJuIHNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV07DQoJfQ0KCQ0KCS8qKg0KCSAqIFJldG91cm5lIHRydWUgaWYgdGhlIG5hbWVzcGFjZSBpcyBrbm93biBpbiBtZW1vcnkNCiAgICAgKiANCgkgKiBAcGFyYW0gbmFtZXNwYWNlIG5hbWVzcGFjZSBvZiB0aGUgZW50aXR5J3MgbW9kdWxlDQoJICoNCgkgKiBAcmV0dXJuIEJvb2xlYW4gaWYgdGhlIG5hbWVzcGFjZSBleGlzdHMNCgkgKi8NCglwcml2YXRlIHN0YXRpYyBmdW5jdGlvbiBpc1ZhbGlkZU5hbWVzcGFjZSgkbmFtZXNwYWNlKQ0KCXsNCgkJaWYoIWlzc2V0KHNlbGY6OiRpbnN0YW5jZXNbJG5hbWVzcGFjZV0pKQ0KCQl7DQoJCQlUcmFjZTo6ZXJyb3IoIlRoZSBuYW1lc3BhY2UgJyRuYW1lc3BhY2UnIGRvZXNuJ3QgZXhpc3RlIGludG8gdGhlIE9ybSBTeXN0ZW0iKTsNCgkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBuYW1lc3BhY2UgJyRuYW1lc3BhY2UnIGRvZXNuJ3QgZXhpc3RlIGludG8gdGhlIE9ybSBTeXN0ZW0iKTsNCgkJfQ0KCX0NCn0NCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.trace.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCi8qKg0KICogQ29udGFpbnMgYWxsIHRoZSBkZWJ1ZyBzeXN0ZW0uDQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLw0KDQovKioNCiAqICBBbGxvdyBkaXNwbGF5IHN0YWNrdHJhY2UgYW5kIG90aGVyIGluZm9ybWF0aW9ucyBpbiBhIGNvbnNvbGUgb3Igb24gdGhlIHBhZ2UNCiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICogIGV4YW1wbGUNCiAqICA8Y29kZT4NCiAqICAgICAgICAgIFRyYWNlOjpkZWJ1ZygnaSBhbSBoZXJlICEnKTsNCiAqICAgICAgICAgIFRyYWNlOjppbmZvKCdwcm9jZXNzIGZpbmlzaGVkJyk7DQogKiAgICAgICAgICBUcmFjZTo6d2FybignQmUgY2FyZnVsbCA6IHRvbyBtdWNoIHJlc3VsdHMgd2lsbCBiZSBkaXNwbGF5ZWQnKTsNCiAqICAgICAgICAgIFRyYWNlOjplcnJvcignb3VwcyBob3VzdG9uLCB3ZSBoYXZlIGdvdCBhIHByb2JsZW0uLi4gOiggJyk7DQogKiAgPC9jb2RlPg0KICogDQogKiB0aGUgcHJvcGVydHkgJGxldmVsIG9mIHRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgbGV2ZWwgb2YgdGhlIG1lc3NhZ2VzIHRvIGRpc3BsYXlpbmcNCiAqICBTbyBhIGxldmVsIG9mICJXQVJOIiB3aWxsIG9ubHkgZGlzcGxheSB3YXJuaW5nIGFuZCBlcnJvciBtZXNzYWdlcw0KICogIEJ5IGRlZmF1bHQgdGhlIGxldmVsIGlzIHNldHRlZCB0byBXQVJODQogKg0KICogQHNpbmNlIDAuMC4xDQogKiBAYXV0aG9yIEJlc3MNCiAqIEBwYWNrYWdlIE9ybQ0KICoqLyAgIA0KIA0KZmluYWwgY2xhc3MgVHJhY2UNCnsNCglwdWJsaWMgc3RhdGljICRERUJVRyA9IDA7DQoJcHVibGljIHN0YXRpYyAkSU5GTyA9IDE7DQoJcHVibGljIHN0YXRpYyAkV0FSTiA9IDI7DQoJcHVibGljIHN0YXRpYyAkRVJST1IgPSAzOw0KCQ0KCS8vQ2hhbmdlIHRoaXMgdmFsdWUgZnJvbSAwIHRvIDMgdG8gY2hhbmdlIHRoZSBsZXZlbCBvZiBtZXNzYWdlIGRpc3BsYXllZA0KCXB1YmxpYyBzdGF0aWMgJGxldmVsID0gMjsNCgkNCglwcm90ZWN0ZWQgZnVuY3Rpb24gX19jb25zdHJ1Y3QoKSB7DQoJfQ0KDQoJLyoqDQogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIERFQlVHIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBkZWJ1ZygkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokREVCVUcsICdkZWJ1ZycsICRtc2cpOw0KCX0NCg0KICAgIC8qKg0KICAgICogRGlzcGxheSBhIG1lc3NhZ2Ugd2l0aCBJTkZPIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBpbmZvKCRtc2cpDQoJewkNCgkJc2VsZjo6aW5uZXJXcml0ZXIoVHJhY2U6OiRJTkZPLCAnaW5mbycsICRtc2cpOw0KCX0gDQoNCiAgICAvKioNCiAgICAqIERpc3BsYXkgYSBtZXNzYWdlIHdpdGggV0FSTiBsZXZlbA0KICAgICogDQogICAgKiBAcGFyYW0gc3RyaW5nIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXkNCiAgICAqLw0KCXB1YmxpYyBzdGF0aWMgZmluYWwJZnVuY3Rpb24gd2FybigkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokV0FSTiwgJ3dhcm4nLCAkbXNnKTsNCgl9IA0KDQogICAgLyoqDQogICAgKiBEaXNwbGF5IGEgbWVzc2FnZSB3aXRoIEVSUk9SIGxldmVsDQogICAgKiANCiAgICAqIEBwYXJhbSBzdHJpbmcgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheQ0KICAgICovDQoJcHVibGljIHN0YXRpYyBmaW5hbAlmdW5jdGlvbiBlcnJvcigkbXNnKQ0KCXsJDQoJCXNlbGY6OmlubmVyV3JpdGVyKFRyYWNlOjokRVJST1IsICdlcnJvcicsICRtc2cpOw0KCX0NCgkNCgkvKioNCgkgKiBEbyBhbGwgdGhlIHN1ZmYgYmVoaW5kDQoJICoNCgkgKiBAcGFyYW0gc3RyaW5nIHRoZSBsZXZlbCBvZiBtZXNzYWdlLg0KCSAqIEBwYXJhbSBzdHJpbmcgdGhlIGNzcyBjbGFzcyB0byBkaXNwbGF5IHRoZSAiaW5saW5lIiBtZXNzYWdlDQoJICogQHBhcmFtIHN0cmluZyB0aGUgbWVzc2FnZSB0byBkaXNwbGF5DQoJICovDQoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZnVuY3Rpb24gaW5uZXJXcml0ZXIoJGxldmVsLCAkY3NzQ2xhc3MsICRtc2cpew0KCQlpZihzZWxmOjokbGV2ZWwgPiAkbGV2ZWwpIHtyZXR1cm47fQ0KCQkNCgkJLy9JbiB3aW5kb3dzDQoJCWVjaG8gIjxkaXYgY2xhc3M9JyRjc3NDbGFzcycgPiRtc2c8L2Rpdj4iOw0KCQkNCgkJLy9JbiBwaHAgbG9nDQoJCWVycm9yX2xvZygkbXNnKTsNCgl9DQp9DQoNCj8+]]></data>
	</file>
	<file>
	  <filename>/lib/class.typecriteria.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyoqCiAqIENvbnRhaW5zIHRoZSBUeXBlQ3JpdGVyZSBjbGFzcwogKiAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwogCgovKioKICogRW51bSBmb3IgdGhlIGRpZmZlcmVudHMgdHlwZXMgb2YgVHlwZUNyaXRlcmlhCiAqIAogKiAKICogQHNpbmNlIDAuMC4xCiAqIEBhdXRob3IgQmVzcwogKiBAcGFja2FnZSBPcm0KICoqLwpjbGFzcyBUeXBlQ3JpdGVyZQp7CiAgICAvKioKICAgICogSXMgZXF1YWxzIHRvCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVRID0gJyA9ICc7CiAgICAKICAgIC8qKgogICAgKiBJcyBkaWZm6XJlbnQgT2YKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTkVRID0gJyAhPSAnOwogICAgCiAgICAvKioKICAgICogaXMgc3RyaWN0bHkgZ3JldHRlciB0aGFuCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEdUID0gJyA+ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBncmV0dGVyIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRHVEUgPSAnID49ICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBzdHJpY3RseSBsZXNzZXIgdGhhbgogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVCA9ICcgPCAnOwogICAgCiAgICAvKioKICAgICogaXMgbGVzc2VyIG9yIGVxdWFscyB0bwogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRMVEUgPSAnIDw9ICc7CgkKCS8qKgogICAgKiBpcyBOVUxMIG9yIGlzIEVtcHR5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEVNUFRZID0gJ2lzIGVtcHR5KCknOwoJCiAgICAvKioKICAgICogaXMgTm90IE5VTEwgYW5kIGlzIE5vdCBFbXB0eQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRORU1QVFkgPSAnaXMgbm90IGVtcHR5KCknOwogICAgCiAgICAvKioKICAgICogaXMgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROVUxMID0gJyBpcyBudWxsICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBOb3QgTlVMTAogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICROTlVMTCA9ICcgaXMgbm90IG51bGwnOwogICAgCiAgICAvKioKICAgICogaXMgYmVmb3JlIChhIERhdGUpCiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJEJFRk9SRSA9ICcgYmVmb3JlICc7CiAgICAKICAgIC8qKgogICAgKiBpcyBhZnRlciAoYSBEYXRlKQogICAgKiAKICAgICogQHZhciBzdHJpbmcKICAgICovCglwdWJsaWMgc3RhdGljICRBRlRFUiA9ICcgYWZ0ZXIgJzsKICAgIAogICAgLyoqCiAgICAqIGlzIGJldHdlZW4gKGEgRGF0ZSkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkQkVUV0VFTiA9ICcgYWZ0ZXIgJzsKICAgICAKICAgIC8qKgogICAgKiBpcyBjb250YWluZWQgaW50byB0aGUgYXJyYXkKICAgICogCiAgICAqIC8hXCBuZWVkIGF0IGxhc3QgMiB2YWx1ZXMgaW4gdGhlIGFycmF5CiAgICAqIAogICAgKiBAdmFyIHN0cmluZwogICAgKi8KCXB1YmxpYyBzdGF0aWMgJElOID0gJ2luICglYSknOwogICAgCiAgICAvKioKICAgICogaXMgbm90IGNvbnRhaW5lZCBpbnRvIHRoZSBhcnJheQogICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICogLyFcIG5lZWQgYXQgbGFzdCAyIHZhbHVlcyBpbiB0aGUgYXJyYXkKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTklOID0gJ25vdCBpbiAoJWEpJzsKICAgIAogICAgLyoqCiAgICAqIGNvbnRhaW5zIHRoZSBzdHJpbmcKICAgICogCiAgICAqIC8hXCBkb24ndCBmb3JnZXQgdG8gYWRkIHRoZSB3aWxkY2FyZCAnJScKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTElLRSA9ICcgbGlrZSAnOwogICAgCiAgICAvKioKICAgICogZG9lc24ndCBjb250YWluIHRoZSBzdHJpbmcKICAgICogCiAgICAqIC8hXCBkb24ndCBmb3JnZXQgdG8gYWRkIHRoZSB3aWxkY2FyZCAnJScKICAgICogCiAgICAqIEB2YXIgc3RyaW5nCiAgICAqLwoJcHVibGljIHN0YXRpYyAkTkxJS0UgPSAnIG5vdCBsaWtlICc7Cn0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KJHRoaXMtPkF1ZGl0KCAwLCANCgkgICAgICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksIA0KCSAgICAgICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSApOw0KPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nDQokdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgJHRoaXMtPkxhbmcoJ3VuaW5zdGFsbGVkJykpOw0KDQo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCg0KaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7DQoNCg0KLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nDQokdGhpcy0+QXVkaXQoIDAsICAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICAkdGhpcy0+TGFuZygndXBncmFkZWQnLCAkdGhpcy0+R2V0VmVyc2lvbigpKSk7DQoNCg0KPz4=]]></data>
	</file>
	<file>
	  <filename>/Orm.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHANCgkvKioNCgkqIENsYXNzZSBvZiBjbXNtYWRlc2ltcGxlJ3MgQVBJLiBVc2VkIHRvIG1ha2UgYSBsaW5rIGJldHdlZW4gdGhlIEFQSSBvZiBDbXNNYWRlU2ltcGxlIGFuZCBvdGhlciBtb2R1bGVzJw0KCSoNCgkqIEBzaW5jZSAwLjAuMQ0KCSogQGF1dGhvciBCZXNzDQoJKiBAcGFja2FnZSBPcm0NCgkqKi8NCg0KCS8vVW5pcXVlIGltcG9ydCwgdG8gdXNlIHRoZSBUcmFjZSBpbnRvIHRoaXMgY2xhc3NlDQoJaW5jbHVkZV9vbmNlKGNtc19qb2luX3BhdGgoZGlybmFtZShfX0ZJTEVfXyksImxpYiIsImNsYXNzLnRyYWNlLnBocCIpKTsNCg0KCS8vVW5jb21tZW50IHRoZSBsaW5lIGJlbG93IHRvIGFjdGl2YXRlIHRoZSBkZWJ1ZyBtb2RlDQoJI1RyYWNlOjokbGV2ZWwgPSBUcmFjZTo6JERFQlVHOw0KCS8vT3RoZXIgdmFsdWUgOiAkREVCVUd8JElORk98JFdBUk58JEVSUk9SDQoNCgkvKioNCgkqIFRoZSBDbGFzcyBPcm0gZGVmaW5lIHRoZSBtb2R1bGUgT3JtIGFuZCBhbGxvdyBoYXZpbmcgYWxsIHRoZSBvcm0gZnVuY3Rpb25uYWxpdGllcyBpbnRvIGFub3RoZXIgbW9kdWxlDQoJKg0KCSogQHNpbmNlIDAuMC4xDQoJKiBAYXV0aG9yIEJlc3MNCgkqIEBwYWNrYWdlIGNtc21zDQoJKi8NCmNsYXNzIE9ybSBleHRlbmRzIENNU01vZHVsZSB7DQoNCglmdW5jdGlvbiBfX2NvbnN0cnVjdCgpIHsNCgkJcGFyZW50OjpfX2NvbnN0cnVjdCgpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldE5hbWUoKSB7DQoJCXJldHVybiAnT3JtJzsNCgl9DQoNCglmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7DQoJfQ0KDQoJZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsNCgkJcmV0dXJuICcwLjAuMSc7DQoJfQ0KICANCglmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQ0KIAl7DQogICAgCXJldHVybiBhcnJheSgpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEhlbHAoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygnaGVscCcpOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsNCgkJcmV0dXJuICdLZXZpbiBEYW5lemlzIChha2EgQmVzcyknOw0KCX0NCg0KCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkgew0KCQlyZXR1cm4gJ2NvbnRhY3QgYXQgZnVyaWUgcG9pbnQgYmUnOw0KCX0NCg0KCWZ1bmN0aW9uIEdldENoYW5nZUxvZygpIHsNCgkJcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsNCgl9DQoNCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7DQoJfQ0KDQoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7DQoJCXJldHVybiAiMS4xMS4wIjsNCgl9DQoNCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZ1bmN0aW9uIEhhc0FkbWluKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24oKSB7DQoJCXJldHVybiAnZXh0ZW5zaW9ucyc7DQoJfQ0KDQoJZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyKCkgew0KCQlyZXR1cm4gdHJ1ZTsNCgl9DQoNCglmdW5jdGlvbiBJbml0aWFsaXplRnJvbnRlbmQoKSB7DQoJfQ0KDQoJZnVuY3Rpb24gSW5pdGlhbGl6ZUFkbWluKCkgew0KCX0NCg0KCWZ1bmN0aW9uIEFsbG93U21hcnR5Q2FjaGluZygpIHsNCgkJcmV0dXJuIGZhbHNlOw0KCX0NCg0KCWZ1bmN0aW9uIExhenlMb2FkRnJvbnRlbmQoKSB7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoNCglmdW5jdGlvbiBMYXp5TG9hZEFkbWluKCkgew0KCSAgcmV0dXJuIGZhbHNlOw0KCX0NCgkNCglmdW5jdGlvbiBTZXRQYXJhbWV0ZXJzKCkgeyAgDQoJfQ0KDQoJZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlKCkgew0KCQlyZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7DQoJfQ0KDQoJZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOw0KCX0NCg0KCWZ1bmN0aW9uIFVuaW5zdGFsbFByZU1lc3NhZ2UoKSB7DQoJCXJldHVybiAkdGhpcy0+TGFuZygncmVhbGx5X3VuaW5zdGFsbCcpOw0KCX0gIA0KCQ0KCWZ1bmN0aW9uIERpc3BsYXlFcnJvclBhZ2UoJG1zZykgew0KCQllY2hvICI8aDM+Ii4kbXNnLiI8L2gzPiI7DQoJfSANCgkJIA0KCXByaXZhdGUgZnVuY3Rpb24gR2V0TXlNb2R1bGVQYXRoKCkgew0KCQkvKiRjb25maWcgPSBjbXNtcygpLT5nZXRDb25maWcoKTsNCgkJaWYoc3RycG9zKHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpLCAkY29uZmlnWydyb290X3BhdGgnXSkgIT09IEZBTFNFKQ0KCQl7Ki8JcmV0dXJuIHBhcmVudDo6R2V0TW9kdWxlUGF0aCgpOy8qfQ0KCQllbHNlDQoJCXsJcmV0dXJuIGNtc19qb2luX3BhdGgoJGNvbmZpZ1sncm9vdF9wYXRoJ10sICdtb2R1bGVzJywgJHRoaXMtPmdldE5hbWUoKSk7fSovDQoJfQ0KDQoJcHJvdGVjdGVkIGZ1bmN0aW9uIF9fYXV0b2xvYWQoKSB7CQ0KCQlzcGxfYXV0b2xvYWRfcmVnaXN0ZXIoYXJyYXkoJHRoaXMsICdhdXRvbG9hZF9jbGFzc2VzJykpOw0KCQkvL3NwbF9hdXRvbG9hZF9yZWdpc3RlcihhcnJheSgkdGhpcywgJ2F1dG9sb2FkX2NsYXNzZXNfYWRkb24nKSk7DQoJCQ0KCQkvL09uIGxpc3RlIGxlcyBjbGFzc2VzIGTpY2xhcullcyBkYW5zIGxlIHLpcGVydG9pcmUgZHUgbW9kdWxlIGVuZmFudA0KCQkkcmVwZXJ0b2lyZSA9IGNtc19qb2luX3BhdGgoJHRoaXMtPkdldE15TW9kdWxlUGF0aCgpLCdsaWInKTsNCgkJJGRpciA9IG9wZW5kaXIoJHJlcGVydG9pcmUpOyANCgkJJGxpc3RlWydlbnRpdGllcyddID0gYXJyYXkoKTsNCgkJJGxpc3RlWydhc3NvY2lhdGUnXSA9IGFycmF5KCk7DQoJCS8vJGxpc3RlWycnXSA9IGFycmF5KCk7DQoJCQ0KCQl3aGlsZSgkZmlsZSA9IHJlYWRkaXIoJGRpcikpIHsNCgkJCWlmKHN0cmlwb3MoJGZpbGUsICdjbGFzcy5lbnRpdHkuJykgIT09IEZBTFNFKXsNCgkJCQkkbmFtZSA9IHN1YnN0cigkZmlsZSAsIDEzICxzdHJsZW4oJGZpbGUpIC0gNCAtIDEzKTsNCgkJCQkkbGlzdGVbJ2VudGl0aWVzJ11bXSA9IGFycmF5KCdmaWxlJz0+JGZpbGUsICduYW1lJz0+JG5hbWUpOw0KCQkJfSBlbHNlaWYoc3RyaXBvcygkZmlsZSwgJ2NsYXNzLmFzc29jLicpICE9PSBGQUxTRSkgew0KCQkJCSRuYW1lID0gc3Vic3RyKCRmaWxlICwgMTIgLHN0cmxlbigkZmlsZSkgLSA0IC0gMTIpOw0KCQkJCSRsaXN0ZVsnYXNzb2NpYXRlJ11bXSA9IGFycmF5KCdmaWxlJz0+JGZpbGUsICduYW1lJz0+JG5hbWUpOw0KCQkJfSBlbHNlIHsNCgkJCX0NCgkJfQ0KCQljbG9zZWRpcigkZGlyKTsNCgkJDQoJCWZvcmVhY2goJGxpc3RlWydlbnRpdGllcyddIGFzICRlbGVtZW50KQ0KCQl7DQoJCQkkZW50aXR5RmlsZSA9IGNtc19qb2luX3BhdGgoJHJlcGVydG9pcmUsJGVsZW1lbnRbJ2ZpbGUnXSk7DQoJCQlUcmFjZTo6ZGVidWcoImltcG9ydCBlbnRpdGUgIi4kZW50aXR5RmlsZS4iIGRhbnMgbGUgbW9kdWxlICIuJHRoaXMtPmdldE5hbWUoKS4iPGJyLz4iKTsNCgkJCXJlcXVpcmVfb25jZSgkZW50aXR5RmlsZSk7DQoJCQlldmFsKCckZW50aXR5ID0gbmV3ICcuJGVsZW1lbnRbJ25hbWUnXS4nKCk7Jyk7DQoJCX0NCgkJZm9yZWFjaCgkbGlzdGVbJ2Fzc29jaWF0ZSddIGFzICRlbGVtZW50KQ0KCQl7DQoJCQkkZW50aXR5RmlsZSA9IGNtc19qb2luX3BhdGgoJHJlcGVydG9pcmUsJGVsZW1lbnRbJ2ZpbGUnXSk7DQoJCQlUcmFjZTo6ZGVidWcoImltcG9ydCBhc3NvY2lhdGUgZW50aXRlICIuJGVudGl0eUZpbGUuIiBkYW5zIGxlIG1vZHVsZSAiLiR0aGlzLT5nZXROYW1lKCkuIjxici8+Iik7DQoJCQlyZXF1aXJlX29uY2UoJGVudGl0eUZpbGUpOw0KCQkJZXZhbCgnJGVudGl0eSA9IG5ldyAnLiRlbGVtZW50WyduYW1lJ10uJygpOycpOw0KCQl9DQoJfQ0KCQ0KCXB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZF9jbGFzc2VzKCRjbGFzc25hbWUpew0KCQlUcmFjZTo6ZGVidWcoIiZuYnNwOyZuYnNwOyZuYnNwOyBOZWVkICRjbGFzc25hbWU8YnIvPiIpOw0KCQkkT3JtID0gbmV3IE9ybSgpOw0KCQkkcGF0aCA9ICRPcm0tPkdldE15TW9kdWxlUGF0aCgpOw0KCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJsaWIiLCJjbGFzcy4iLnN0cnRvbG93ZXIoJGNsYXNzbmFtZSkuIi5waHAiKTsNCg0KDQoJCVRyYWNlOjpkZWJ1ZygiaW1wb3J0IGNsYXNzIGR1IGZyYW1ld29yayB2aWEgIi4kdGhpcy0+Z2V0TmFtZSgpLiI6ICRmbjxici8+Iik7DQoNCgkJaWYoZmlsZV9leGlzdHMoJGZuKSl7DQoJCQlyZXF1aXJlX29uY2UoJGZuKTsNCgkJCVRyYWNlOjpkZWJ1ZygiaW1wb3J0ICRmbiBvazxici8+Iik7DQoJCX0gZWxzZSB7DQoJCQlUcmFjZTo6ZGVidWcoImZpY2hpZXIgJGZuIGludHJvdXZhYmxlLCBvbiBwYXNzZTxici8+Iik7DQoJCX0NCgl9DQoJDQoJLyoqDQoJICogU2hvcnRjdXQgdG8gY2FsbCBhbGwgdGhlIGluc3RhbmNlcyBmb3IgYSBzaW5nbGUgbW9kdWxlDQoJICoNCgkgKiBAcmV0dXJuIExpc3Q8RW50aXR5PiB0aGUgZW50aXRpZXMgZm9yIHRoZSBjdXJyZW50IHBhcmVudCdzIG5hbWVzcGFjZQ0KCSAqKi8NCglwdWJsaWMgZnVuY3Rpb24gZ2V0QWxsSW5zdGFuY2VzKCl7DQoJCXJldHVybiBNeUF1dG9sb2FkOjpnZXRBbGxJbnN0YW5jZXMocGFyZW50OjpHZXROYW1lKCkpOw0KCX0NCgkvKg0KCXB1YmxpYyBmdW5jdGlvbiBhdXRvbG9hZF9jbGFzc2VzX2FkZG9uKCRjbGFzc25hbWUpew0KCQlUcmFjZTo6ZGVidWcoIiZuYnNwOyZuYnNwOyZuYnNwOyRjbGFzc25hbWU8YnIvPiIpOw0KCQkNCgkJJHBhdGggPSAkdGhpcy0+R2V0TXlNb2R1bGVQYXRoKCk7DQoJCQ0KCQkkZm4gPSBudWxsOw0KCSAgIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkhUTUxfRklFTEQiKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmllbGRodG1sLnBocCIpOw0KCSAgIH0gZWxzZSBpZihzdHJpcG9zKCRjbGFzc25hbWUsICJTRUFSQ0hfRklFTEQiKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuc2VhcmNoZmllbGQucGhwIik7DQoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJRUxEXyIpICE9PSBGQUxTRSkNCgkgICB7DQoJCQkkZm4gPSBjbXNfam9pbl9wYXRoKCRwYXRoLCJjbGFzcyIsImNsYXNzLmFkZC5maWVsZHNzeXN0ZW0ucGhwIik7DQoJICAgfSBlbHNlIGlmKHN0cmlwb3MoJGNsYXNzbmFtZSwgIkZJTFRSRV8iKSAhPT0gRkFMU0UpDQoJICAgew0KCQkJJGZuID0gY21zX2pvaW5fcGF0aCgkcGF0aCwiY2xhc3MiLCJjbGFzcy5hZGQuZmlsdHJlLnBocCIpOw0KCSAgIH0NCgkgICANCgkgICBpZigkZm4gIT0gbnVsbCkNCgkgICB7DQoJCQlUcmFjZTo6ZGVidWcoICJpbXBvcnQgZCd1biBhZGRvbiBkdSBwcm9qZXQgIi4kdGhpcy0+Z2V0TmFtZSgpLiI6ICRmbjxici8+Iik7DQoJICAgDQoJCQlpZihmaWxlX2V4aXN0cygkZm4pKXsNCgkJCQlyZXF1aXJlX29uY2UoJGZuKTsNCgkJCX0NCgkJfQ0KCX0qLw0KCS8qDQoJZnVuY3Rpb24gU2VhcmNoUmVpbmRleCgmJG1vZHVsZSA9IG51bGwpIHsNCgkJLy9PbiDpdml0ZSBkZSBzJ2F1dG8taW5kZXhlci4NCgkJaWYoJHRoaXMtPmdldE5hbWUoKSA9PSAnTW1tZnMnKQ0KCQkJcmV0dXJuOwkJDQoJCQkNCgkJLy8gSW5kZXhpbmc6OnNldFNlYXJjaCgkbW9kdWxlKTsNCgkJSW5kZXhpbmc6OlNlYXJjaFJlaW5kZXgoJHRoaXMtPmdldE5hbWUoKSk7DQoJfSovDQoNCgkvKioNCgkgKiBBcHBlbOllIHBhciBTZWFyY2ggcG91ciBhZmZpY2hlciB1biBy6XN1bHRhdA0KCSAqLy8qDQoJZnVuY3Rpb24gU2VhcmNoUmVzdWx0KCRyZXR1cm5pZCwgJGVudGl0eUlkLCAkYXR0ciA9ICcnKSB7CQ0KCQkvL09uIG5lIHJldG91cm5lIHJpZW4gZGUgTW1tZnMgZGUgdG91dGUgbWFuaehyZQ0KCQlpZigkdGhpcy0+Z2V0TmFtZSgpID09ICdNbW1mcycpDQoJCQlyZXR1cm47CQ0KCQkNCgkJcmV0dXJuIEluZGV4aW5nOjpTZWFyY2hSZXN1bHQoJHRoaXMsICRpZCwgJHJldHVybmlkLCAkZW50aXR5SWQsICRhdHRyKTsNCgl9Ki8NCg0KfSANCj8+DQo=]]></data>
	</file>
</module>
