<?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>NeoModule</name>
	<version>0.2.0</version>
  <mincmsversion>1.6</mincmsversion>
	<help>PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCgovKgogKgogKiBGb3JtLWdlbmVyYXRpb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRm9ybVN0YXJ0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvRm9ybUVuZCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0VGV4dCgkcGFyYW1zPWFycmF5KCkKZnVuY3Rpb24gTmVvVGV4dGFyZWEoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRTdWJtaXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFJlc2V0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRJbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkKCi8qIGZ1bmN0aW9uIGJlbG93IGluY2x1ZGUgc21hcnR5YXNzaWdubWVudCwgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nICovCmZ1bmN0aW9uIFNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRuYW1lLCR0ZXh0LCRjb25maXJtdGV4dD0iIikKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJG5hbWUsJHZhbHVlKQpmdW5jdGlvbiBTbWFydHlJbnB1dE11bHRpSGlkZGVuKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkKCi8qCiAqCiAqIE5lb0RhdGFTdG9yYWdlIHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gQWRkRW50aXR5KCR0YWJsZSwgJHByb3BzPWFycmF5KCkpCmZ1bmN0aW9uIERlbGV0ZUVudGl0eSgkaWQpCmZ1bmN0aW9uIEdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLyoKICoKICogU21hcnR5IHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRyZXQgYW5naXZlciBodmlsa2V0IHNwcm9nIGRlciBza2FsIGJydWdlcyB0aWwgdmlzbmluZyBmb3IgYmVzJm9zbGFzaDtnZW5kZS4gSWtrZSBhbGxlIG1vZHVsZXIgdW5kZXJzdCZvc2xhc2g7dHRlciBlbGxlciBiZWgmb3NsYXNoO3ZlciBkZXR0ZS48L2xpPjwvdWw+</help>
	<about>PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4yLjA8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CiAgPGxpPnZlcnNpb24gMC4yLjA8YnIvPgotIGdlbmVyYWwgYnVnZml4aW5nPGJyLz4KLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgotIEZpeGVkIG5hbWUgZXJyb3Igb24gTmVvSW5wdXREcm9wZG93bjxici8+Ci0gYWRkZWQgc3VwcG9ydCBmb3IgM3JkIHBhcmFtZXRlciB0byBTbGFzaC1mdW5jdGlvbjxici8+Ci0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+Ci0gYWRkZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0PGJyLz4KLSBhZGRlZCBTbWFydHlJbnB1dE11bHRpSGlkZGVuPGJyLz4KCiAgPC9saT4KICA8bGk+dmVyc2lvbiAwLjEuMDxici8+CiAgIC0gaW5pdGlhbCByZWxlYXNlPC9saT4KPC91bD48YnIgLz4=</about>
	<description>An extended module-class, mainly for the Neo-series modules, but also for others to use</description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDkgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygiaXNfYXNzb2MiKSkgewogIGZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkgewogICAgcmV0dXJuIChpc19hcnJheSgkYXJyYXkpICYmIDAgIT09IGNvdW50KGFycmF5X2RpZmZfa2V5KCRhcnJheSwgYXJyYXlfa2V5cyhhcnJheV9rZXlzKCRhcnJheSkpKSkpOwogIH0KfQoKY2xhc3MgTmVvTW9kdWxlIGV4dGVuZHMgQ01TTW9kdWxlIHsKICAvKgogICAqCiAgICogQSBjb3VwbGUgb2YgdmFyaWFibGVzIGFuZCBtZXRob2RzIGZvciBpbnRlcm5hbCBtb2R1bGUgdXNhZ2UKICAgKgogICAqLwogIHZhciAkX2RhdGFzdG9yYWdlPWZhbHNlOwogIHZhciAkX2lkPWZhbHNlOwogIHZhciAkX3JldHVybmlkPWZhbHNlOwogIHZhciAkX2Vycm9ycz0iIjsKICB2YXIgJF90aGVtZW9iamVjdD1mYWxzZTsKICBmdW5jdGlvbiBfZ2V0ZHMoKSB7CiAgICBpZiAoJHRoaXMtPl9kYXRhc3RvcmFnZSE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl9kYXRhc3RvcmFnZTsKICAgICR0aGlzLT5fZGF0YXN0b3JhZ2U9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCJOZW9EYXRhU3RvcmFnZSIpOwogICAgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgfQogIGZ1bmN0aW9uIF9nZXR0aGVtZW9iaigpIHsKICAgIGdsb2JhbCAkZ0NtczsKICAgIGlmICgkdGhpcy0+X3RoZW1lb2JqZWN0IT09ZmFsc2UpIHJldHVybiAkdGhpcy0+X3RoZW1lb2JqZWN0OwogICAgJHRoaXMtPl90aGVtZW9iamVjdD0kdGhlbWVPYmplY3QgPSAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ107CiAgICByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICB9CgogIC8qCiAgICoKICAgKiBTdGFuZGFyZCBtb2R1bGUtQVBJLW1ldGhvZHMgYmVoYXZpbmcgaW4gYSBzdGFuZGFyZCB3YXkKICAgKgogICAqLwoKCWZ1bmN0aW9uIEdldE5hbWUoKSB7CgkJcmV0dXJuICdOZW9Nb2R1bGUnOwoJfQoKICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkgewogICAgcmV0dXJuICIwLjIuMCI7CiAgfQoKICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKSB7CgkJcmV0dXJuICJOZW8gTW9kdWxlIGJhc2UtY2xhc3MiOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKCQlyZXR1cm4gJzEuNic7Cgl9CgoJZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpIHsKCQlyZXR1cm4gIkFuIGV4dGVuZGVkIG1vZHVsZS1jbGFzcywgbWFpbmx5IGZvciB0aGUgTmVvLXNlcmllcyBtb2R1bGVzLCBidXQgYWxzbyBmb3Igb3RoZXJzIHRvIHVzZSI7Cgl9CgoJZnVuY3Rpb24gSGFzQWRtaW4oKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsKCQlyZXR1cm4gJ01vcnRlbiBQb3Vsc2VuJzsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCXsKCQlyZXR1cm4gJ21vcnRlbkBwb3Vsc2VuLm9yZyc7Cgl9CgogIC8qZnVuY3Rpb24gRWNob05hbWUoKSB7CiAgICBlY2hvICR0aGlzLT5HZXROYW1lKCk7CiAgfSovICAKCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKSB7CiAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaGVscC50cGwnKTsKIAl9CgogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCXsKCQlyZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiY2hhbmdlbG9nLnRwbCIpOwoJfQoKICAvKgogICAqCiAgICogU2V0dXAgZnVuY3Rpb25zCiAgICoKICAgKi8gIAogIGZ1bmN0aW9uIE5lb1NldElkKCRpZCkgewogICAgJHRoaXMtPl9pZD0kaWQ7CiAgfSAgCiAgZnVuY3Rpb24gTmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKSB7CiAgICAkdGhpcy0+X3JldHVybmlkPSRyZXR1cm5pZDsKICB9CiAgZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIikgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5TbWFydHlBc3NpZ25DTVMoJG1vZHVsZSk7CiAgfQoKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5HZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkZGVmYXVsdCk7CiAgfQoKICBmdW5jdGlvbiBOZW9DbXNMaW5rKCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkY29udGVudHM9JycsICRwYXJhbXM9YXJyYXkoKSwgJHdhcm5fbWVzc2FnZT0nJywgJG9ubHlocmVmPWZhbHNlLCAkaW5saW5lPWZhbHNlLCAkYWRkdHRleHQ9JycsICR0YXJnZXRjb250ZW50b25seT1mYWxzZSwgJHByZXR0eXVybD0nJykKICAgIHJldHVybiR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb250ZW50IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIndhcm5tZXNzYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zVXJsKCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkY29udGVudHM9JycsICRwYXJhbXM9YXJyYXkoKSwgJHdhcm5fbWVzc2FnZT0nJywgJG9ubHlocmVmPWZhbHNlLCAkaW5saW5lPWZhbHNlLCAkYWRkdHRleHQ9JycsICR0YXJnZXRjb250ZW50b25seT1mYWxzZSwgJHByZXR0eXVybD0nJykKICAgIHJldHVybiR0aGlzLT5DcmVhdGVMaW5rKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICIiLAogICAgICB0cnVlICwKICAgICAgZmFsc2UsCiAgICAgICIiLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICAvKgogICAqCiAgICogRm9ybS1nZW5lcmF0aW9uIGZ1bmN0aW9ucywgaW5jbHVkaW5nIHNtYXJ0eSBhc3NpZ25tZW50cwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlRm9ybVN0YXJ0KCRpZCwgJGFjdGlvbj0nZGVmYXVsdCcsICRyZXR1cm5pZD0nJywgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaW5saW5lPWZhbHNlLCAkaWRzdWZmaXg9JycsICRwYXJhbXMgPSBhcnJheSgpLCAkZXh0cmE9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWN0aW9uIiwkcGFyYW1zLCJkZWZhdWx0IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1ldGhvZCIsJHBhcmFtcywicG9zdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgiZW5jdHlwZSIsImVuY29kaW5nIiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWRzdWZmaXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicGFyYW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZXh0cmEiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtU3RhcnQoJHBhcmFtcykpOwogIH0KICBmdW5jdGlvbiBTbWFydHlVcGxvYWRGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkcGFyYW1zWyJtZXRob2QiXT0icG9zdCI7CiAgICAkcGFyYW1zWyJlbmN0eXBlIl09Im11bHRpcGFydC9mb3JtLWRhdGEiOwogICAgJHRoaXMtPlNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Zvcm1FbmQoKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybUVuZCgpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJG5hbWUsJHRleHQsJGNvbmZpcm10ZXh0PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dFN1Ym1pdChhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR0ZXh0LCJjb25maXJtdGV4dCI9PiRjb25maXJtdGV4dCkpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJG5hbWUsJHZhbHVlPSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW5NdWx0aSgkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICRvdXRwdXQ9IlxuIjsKICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkbmFtZT0+JHZhbHVlKSB7CiAgICAgICRvdXRwdXQuPSR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpLiJcbiI7CiAgICB9CiAgICAkb3V0cHV0Lj0iXG4iOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkb3V0cHV0KTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0RmlsZSgkcGFyYW1zKSB7CiAgLy9wdWJsaWMgZnVuY3Rpb24gQ3JlYXRlSW5wdXRGaWxlKCRpZCwgJG5hbWUsICRhY2NlcHQ9JycsICRzaXplPScxMCcsJGFkZHR0ZXh0PScnKQogICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0RmlsZSgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY2NlcHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywiMTAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywiMTAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1heGxlbmd0aCIsJHBhcmFtcywiMjU1IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgeyAgICAKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmFibGV3eXNpd3lnIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLCAgICAgIAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgidmFsdWUiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNsYXNzbmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfSAgCgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgCiAgZnVuY3Rpb24gTmVvSW5wdXREcm9wZG93bigkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZGluZGV4IiwkcGFyYW1zLC0xKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICAvKioKICAgKgogICAqIExpc3QgaGVscGVyIGZ1bmN0aW9ucwogICAqCiAgICovCiAgIGZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICR0aGVtZW9iaj0kdGhpcy0+X2dldHRoZW1lb2JqKCk7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwKCQkJJHRoaXMtPk5lb1N5c3RlbUljb24oImRlbGV0ZS5naWYiLCR0ZXh0KSwKCQkJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0NvcHlJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkdGhlbWVvYmo9JHRoaXMtPl9nZXR0aGVtZW9iaigpOwogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCgkJCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJjb3B5LmdpZiIsJHRleHQpLAoJCQkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICR0aGVtZW9iaj0kdGhpcy0+X2dldHRoZW1lb2JqKCk7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwKCQkJJHRoaXMtPk5lb1N5c3RlbUljb24oImVkaXQuZ2lmIiwkdGV4dCksCgkJCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgcmV0dXJuICRpY29uOwogICB9CiAgIAogICBmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKSB7CiAgICAgJHRoZW1lb2JqPSR0aGlzLT5fZ2V0dGhlbWVvYmooKTsKICAgICByZXR1cm4gJHRoZW1lb2JqLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS8nLiRpY29uLCAkdGV4dCwnJywnJywnc3lzdGVtaWNvbicpOwogICB9CiAgIAkJCQoKICAvKioKICAgKgogICAqIE5lb0RhdGFTdG9yYWdlIHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gQWRkRW50aXR5KCR0YWJsZSwgJHByb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+QWRkRW50aXR5KCR0aGlzLT5HZXROYW1lKCksJHRhYmxlLCRwcm9wcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBBZGRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0eSgkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpLCAkZmlsbGZpZWxkcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzLCAkZmlsbGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0gICAgCiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXRpZXNGdWxsKCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlPSJ1bmRlZmluZWQiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3AoJGlkLCRwcm9wbmFtZSwkcHJvcHZhbHVlLCRwcm9wdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyPXRydWUqLykgewogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wcygkaWQsICRwcm9wcy8qLCAkY2xlYXIqLyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KICAKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUpIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHNGcm9tQXJyYXkoJGlkLCAkcHJvcHMsICR2YWx1ZXMsICRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCgoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGUsICRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWE6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHMoJGlkLCAkbmV3cHJvcHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5SZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3ApOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gUmVzZXRFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXMoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlJlbW92ZU1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gUmVtb3ZlTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzKCRpZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eVByb3BzKCRpZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfSAgICAKICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPkNvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXg6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+U29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTb3J0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXRpZXNDb3VudCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBFbnRpdGllc0NvdW50OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllcygpIHsgICAgCiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7ICAgICAgCiAgICAgIHJldHVybiAkZHMtPkNsZWFyTW9kdWxlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgLyoKICAgKgogICAqIENvbm5lY3Rpb24gZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0gICAgCiAgfQoKCgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsJGlkMiwkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMj0tMSwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUsJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBBZGRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEZpZWxkU2V0KCRuYW1lKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdHlTZXRVbnNldFByb3BzKCR0aGlzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpKSwkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCgogIGZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2hvd0RTRXJyb3JzKCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2hvd0RTRXJyb3JzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEU0luRXJyb3IoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkluRXJyb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERTSW5FcnJvcjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkgewoJCSRyZXN1bHQ9c3RyX3JlcGxhY2UoIlxcIiwiLyIsJHVybCk7CgoJCS8vJHJlc3VsdD1zdHJfcmVwbGFjZSgiLyIsRElSRUNUT1JZX1NFUEFSQVRPUiwkdXJsKTsKCQkvL3JldHVybiBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHJlc3VsdCk7CgkJcmV0dXJuICRyZXN1bHQ7Cgl9CgoJZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikgewoJCWlmICgkc3RyPT0iIikgcmV0dXJuICRzdHIyOwoJCWlmICgkc3RyMj09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsKCQkvL1RocmVlIHN0cmluZ3Mgbm90IHN1cHBvcnRlZCB5ZXQuLi4KCQlyZXR1cm4gIkVycm9yIGluIFNsYXNoLWZ1bmN0aW9uLiBQbGVhc2UgcmVwb3J0IjsKCX0KCiAgZnVuY3Rpb24gU2xhc2hlcygkdXJsKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb1NsYXNoZXMoJHVybCk7CiAgfQoKICBmdW5jdGlvbiBOZW9EaXJMaXN0KCRyb290LCRyZXR1cm49ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCksJG1heHJlY3Vyc2lvbj0tMSkgewogICAgJGRpcmxpc3Q9YXJyYXkoKTsKICAgICRjb25maWc9JHRoaXMtPkdldENvbmZpZygpOwogICAgJG1vZGU9IiI7CiAgICBzd2l0Y2goJHJldHVybikgewogICAgICBjYXNlICJmaWxlcyI6ICRtb2RlPSJGSUxFUyI7YnJlYWs7CiAgICAgIGNhc2UgImRpcnMiOiAkbW9kZT0iRElSUyI7YnJlYWs7CiAgICAgIGNhc2UgImJvdGgiOiAkbW9kZT0iRlVMTCI7YnJlYWs7CiAgICB9CiAgICAkZnVsbHJvb3Q9JHRoaXMtPlNsYXNoKCRjb25maWdbInJvb3RfcGF0aCJdLCRyb290KTsKICAgICRmaWxlcmVjPSBnZXRfcmVjdXJzaXZlX2ZpbGVfbGlzdCAoJGZ1bGxyb290LCAkZXhjbHVkZXMgLCRtYXhyZWN1cnNpb24gLCRtb2RlKTsgLy9ObyBtYXhkZXB0aCBpbiByZWN1cnNpb24KICAgIGlmICghZW1wdHkoJGludHJvZHVjdGlvbikpIHsKICAgICAgJGRpcmxpc3Q9JGludHJvZHVjdGlvbjsKICAgIH0gICAgCiAgICBmb3JlYWNoKCRmaWxlcmVjIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICAkdmFsdWUxPSR0aGlzLT5TbGFzaGVzKHN0cl9yZXBsYWNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLCcnLCR2YWx1ZSkpOwogICAgICAvL3ByZXZlbnQgY3VycmVudCBkaXIgZnJvbSBzaG93aW5nIHVwCiAgICAgIC8vaWYgKCR2YWx1ZTE9PSgkcHJvZmlsZVsicGF0aCJdLiIvIikpIGNvbnRpbnVlOwogICAgICAvL0NoZWNrIGZvciBoaWRkZW4gZmlsZXMKICAgICAgJGRpcnM9ZXhwbG9kZSgiLyIsJHZhbHVlMSk7CiAgICAgICRoaWRkZW49ZmFsc2U7CiAgICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgIGlmIChzdWJzdHIoJGRpciwwLDEpPT0iLiIpIHskaGlkZGVuPXRydWU7IGJyZWFrO30KICAgICAgfQogICAgICBpZiAoJGhpZGRlbikgY29udGludWU7CgogICAgICAvL25vdCBoaWRkZW4sIGFkZCB0byBsaXN0CiAgICAgICRkaXJsaXN0WyR2YWx1ZTFdPSR2YWx1ZTE7CiAgICB9CiAgICByZXR1cm4gJGRpcmxpc3Q7CiAgfQoKICAvKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAgICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKICAqLwogIGZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcywkZGVmYXVsdD0iIikgewogICAgaWYgKCFpc19hcnJheSgkbmFtZSkpIHsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJG5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJG5hbWVdOyAgICAgIAogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoICgkbmFtZSBhcyAkc2luZ2xlbmFtZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRzaW5nbGVuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRzaW5nbGVuYW1lXTsKICAgICAgfQogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9CiAgfQoKICAvL1Nob3J0Y3V0IGZvciB0aGUgYWJvdmUKICBmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXMpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgkbmFtZSwgJHBhcmFtcyk7CiAgfQoKICBGdW5jdGlvbiBOZW9BcHBseVBhcmFtVmFsdWVzKCR0aGlzYXJyYXksICRwYXJhbXMsICRpbmRleGVzLCAkYWx3YXlzZmlsbD1mYWxzZSkgewogICAgaWYgKGVtcHR5KCRwYXJhbXMpIHx8IGVtcHR5KCRpbmRleGVzKSkgcmV0dXJuICR0aGlzYXJyYXk7CiAgICBpZiAoaXNfYXNzb2MoJGluZGV4ZXMpKSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4PT4kZGVmYXVsdHZhbHVlKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kZGVmYXVsdHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpIHsgICAgICAgIAogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoJGFsd2F5c2ZpbGwpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpc2FycmF5WyRpbmRleF0pKSAkdGhpc2FycmF5WyRpbmRleF09IiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvL3ByaW50X3IoJHRoaXNhcnJheSk7CiAgICByZXR1cm4gJHRoaXNhcnJheTsKICB9CgogIGZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VTaW1wbGVBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gTWFrZUFzc29jQXJyYXkoJHRhYmxlLCRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+TWFrZUFzc29jQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tGaWxlRXh0ZW5zaW9uKCRmaWxlbmFtZSwgJGFsbG93ZWRleHRlbnNpb25zPWFycmF5KCkpIHsKCQkkZXhwbG9kZWRmaWxlPWV4cGxvZGUoIi4iLCRmaWxlbmFtZSk7CgkJJGV4dD1zdHJ0b2xvd2VyKGFycmF5X3BvcCgkZXhwbG9kZWRmaWxlKSk7CgkJaWYgKGluX2FycmF5KCRleHQsJGFsbG93ZWRleHRlbnNpb25zKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIiAmJiAkc21hcnR5Y29udGVudCE9IiIpIHsKICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoJHNtYXJ0eWluZm89PSIiKSB7CiAgICAgICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTbWFydHlBc3NpZ246IHNtYXJ0eS12YXJuYW1lIG5vdCBzZXQiLGZhbHNlLGFycmF5KCJzbWFydHlpbmZvIj0+JHNtYXJ0eWluZm8sInNtYXJ0eWNvbnRlbnQiPT4kc21hcnR5Y29udGVudCkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIC8vT2sgaXQncyBhbiBhcnJheQogICAgaWYgKGlzX2Fzc29jKCRzbWFydHlpbmZvKSkgewogICAgICAvL0l0J3MgYW4gYXNzb2NfYXJyYXksIHNvIHdlIGFzc2lnbiBldmVyeSBzaW5nbGUgcGFpciBvZiBpbmZvCiAgICAgIGZvcmVhY2goJHNtYXJ0eWluZm8gYXMgJHNtYXJ0eW5hbWU9PiRzbWFydHljb250ZW50KSB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRzbWFydHljb250ZW50KSkgewogICAgICAgICAgLy9pdCdzIGEgbmVzdGVkIGFycmF5CiAgICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5bmFtZSwgJHNtYXJ0eWNvbnRlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy9JdCdzIG5vdCBhbiBhc3NvY19hcnJheSwgc28gd2Ugc2ltcGx5IHJlZi1hc3NpZ24gaXQuCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICAgIH0KCiAgICAvL3JldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogQ2Fubm90IHNtYXJ0eS1hc3NpZ24gYW4gYXJyYXkgd2hpY2ggaXMgbm90IGFzc29jaWF0aXZlIik7CiAgfQoKICBmdW5jdGlvbiBOZW9TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkc21hcnR5bmFtZT0ibW9kdWxlIikgewogICAgaWYgKGlzX29iamVjdCgkbW9kdWxlKSkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgkbW9kdWxlKSk7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogRGVidWdnaW5nIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpIHsKICAgICRmaXJlcGhwbW9kdWxlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRmlyZVBIUERlYnVnJyk7CiAgICBpZiAoJGZpcmVwaHBtb2R1bGUpIHsKICAgICAgLy9Nb2R1bGUgZm91bmQKICAgICAgJGZpcmVwaHBtb2R1bGUtPlNldE1vZHVsZU5hbWUoJHRoaXMtPkdldE5hbWUoKSk7CiAgICAgICRmaXJlcGhwbW9kdWxlLT5Db21tYW5kKCRjb21tYW5kLCAkbWVzc2FnZSwgJHZhcmlhYmxlcyk7CiAgICB9IC8vZWxzZSBNb2R1bGUgbm90IGZvdW5kfQogIH0KCgogIC8qCiAgICoKICAgKiBFcnJvciBoYW5kbGluZwogICAqCiAgICovCiAgZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X2Vycm9ycy49JHRleHQ7CiAgICBpZiAoIWVtcHR5KCRwYXJhbXMpICYmIGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzLj0iICgiOwogICAgICAkZmlyc3Q9dHJ1ZTsgLy9IYW5kbGluZyB0aGUgY29tbWEKICAgICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAkcGFyYW09PiR2YWx1ZSkgewogICAgICAgIGlmICgkZmlyc3QpICRmaXJzdD1mYWxzZTsgZWxzZSAkdGhpcy0+X2Vycm9ycy49IiwiOwogICAgICAgICR0aGlzLT5fZXJyb3JzLj0kcGFyYW0uIj0+Ii4kdmFsdWU7CiAgICAgIH0KICAgICAgJHRoaXMtPl9lcnJvcnMuPSIpIjsKICAgIH0KICAgICR0aGlzLT5fZXJyb3JzLj0iXG4iOwogICAgcmV0dXJuICRyZXR1cm52YWx1ZTsKICB9CgogIGZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgICRlcnJvcnM9JHRoaXMtPl9lcnJvcnM7CiAgICBpZiAoJG5sMmJyKSB7CiAgICAgICRlcnJvcnM9bmwyYnIoJGVycm9ycyk7CiAgICB9CiAgICBpZiAoJGluY2x1ZGVkcykgewogICAgICBpZiAoJHRoaXMtPkRTSW5FcnJvcigpKSB7CiAgICAgICAgJGVycm9ycy49JHRoaXMtPkdldERTRXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoJGNsZWFyKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzPSIiOwogICAgfQogICAgcmV0dXJuICRlcnJvcnM7CiAgfQoKICBmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKSB7CiAgICBlY2hvICJcblxuPGRpdiBzdHlsZT0nYm9yZGVyOjNweCBzb2xpZCByZWQ+XG4iOwogICAgZWNobyAkdGhpcy0+R2V0RXJyb3JzKHRydWUsJGNsZWFyLCRpbmNsdWRlZHMpOwogICAgZWNobyAiXG48L2Rpdj5cblxuIjsKICB9CgogIGZ1bmN0aW9uIEluRXJyb3IoKSB7CiAgICByZXR1cm4gKCR0aGlzLT5fZXJyb3JzIT0iIik7CiAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+Ci0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgotIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgotIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgotIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+Ci0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCgoKICAvKgogICAqCiAgICogR2VuZXJhbCBzaG9ydGN1dCBmdW5jdGlvbnMKICAgKgogICAqLwpmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCgovKgogKgogKiBGb3JtLWdlbmVyYXRpb24gZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gTmVvRm9ybVN0YXJ0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvRm9ybUVuZCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0VGV4dCgkcGFyYW1zPWFycmF5KCkKZnVuY3Rpb24gTmVvVGV4dGFyZWEoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRTdWJtaXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFJlc2V0KCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRJbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkKCi8qIGZ1bmN0aW9uIGJlbG93IGluY2x1ZGUgc21hcnR5YXNzaWdubWVudCwgZG9lcyBub3QgcmV0dXJuIGFueXRoaW5nICovCmZ1bmN0aW9uIFNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRuYW1lLCR0ZXh0LCRjb25maXJtdGV4dD0iIikKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJG5hbWUsJHZhbHVlKQpmdW5jdGlvbiBTbWFydHlJbnB1dE11bHRpSGlkZGVuKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkKCi8qCiAqCiAqIE5lb0RhdGFTdG9yYWdlIHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gQWRkRW50aXR5KCR0YWJsZSwgJHByb3BzPWFycmF5KCkpCmZ1bmN0aW9uIERlbGV0ZUVudGl0eSgkaWQpCmZ1bmN0aW9uIEdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzPWFycmF5KCkpCmZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpCmZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpCmZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBVdGlsaXR5IGZ1bmN0aW9ucwogKgogKi8KZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKQpmdW5jdGlvbiBTbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkKZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkd2hhdD0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLyoKICoKICogU21hcnR5IHNob3J0Y3V0cwogKgogKi8KZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
