<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#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>
  <name>SelfRegistration</name>
  <version>0.1.2</version>
  <description></description>
  <requires>
    <requiredname>CMSMailer</requiredname>
    <requiredversion>1.73.3</requiredversion>
  </requires>
  <requires>
    <requiredname>FrontEndUsers</requiredname>
    <requiredversion>0.1.4</requiredversion>
  </requires>
  <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[PD9waHAKJGxhbmdbJ3Byb21wdF9udW1yZXNldHJlY29yZCddID0gJ0EgbnVtYmVyIG9mIHVzZXJzIGFyZSBpbiB0aGUgbWlkZGxlIG9mIHJlc2V0dGluZyBsb3N0IHBhc3N3b3Jkcy4gIEN1cnJlbnRseSB0aGlzIGNvdW50IGlzIGF0Oic7CiRsYW5nWydyZW1vdmUxd2VlayddID0gJ1JlbW92ZSBhbGwgZW50cmllcyBtb3JlIHRoYW4gYSB3ZWVrIG9sZCc7CiRsYW5nWydyZW1vdmUxbW9udGgnXSA9ICdSZW1vdmUgYWxsIGVudHJpZXMgbW9yZSB0aGFuIGEgbW9udGggb2xkJzsKJGxhbmdbJ3JlbW92ZWFsbCddID0gJ1JlbW92ZSBhbGwgZW50cmllcyc7CiRsYW5nWydhcmV5b3VzdXJlJ10gPSAnQXJlIHlvdSBzdXJlPyc7IAokbGFuZ1sncmVnaXN0cmF0aW9uX2NvbmZpcm1hdGlvbiddID0gJ1JlZ2lzdHJhdGlvbiBDb25maXJtYXRpb24nOwokbGFuZ1sndXNlcl9yZWdpc3RyYXRpb24nXSA9ICdSZWdpc3Rlcic7CiRsYW5nWydmaW5hbG1lc3NhZ2VfdGVtcGxhdGUnXSA9ICdGaW5hbCBNZXNzYWdlIFRlbXBsYXRlJzsKJGxhbmdbJ3RpdGxlX3ZlcmlmeXJlZ2lzdHJhdGlvbiddID0gJ1ZlcmlmeSBSZWdpc3RyYXRpb24nOwokbGFuZ1snY29kZSddID0gJ0NvZGUgZnJvbSBFTWFpbCc7CiRsYW5nWydkZWZhdWx0J10gPSAnU2V0IFRvIERlZmF1bHRzJzsKJGxhbmdbJ2Vycm9yX2VtYWlsaW52YWxpZCddID0gJ0ludmFsaWQgZW1haWwgYWRkcmVzcyc7CiRsYW5nWydlcnJvcl9ub2VtYWlsYWRkcmVzcyddID0gJ05vIHZhbGlkIGVtYWlsIGFkZHJlc3MgZmllbGQgZm91bmQnOwokbGFuZ1snZXJyb3JfcmVxdWlyZWRmaWVsZCddID0gJ0ZpZWxkICVzIG11c3QgYmUgZmlsbGVkIGluJzsKJGxhbmdbJ3JlZ2lzdHJhdGlvbjFfdGVtcGxhdGUnXSA9ICdSZWdpc3RyYXRpb24gVGVtcGxhdGUgMSc7CiRsYW5nWydyZWdpc3RyYXRpb24yX3RlbXBsYXRlJ10gPSAnUmVnaXN0cmF0aW9uIFRlbXBsYXRlIDInOwokbGFuZ1snZW1haWxjb25maXJtX3RlbXBsYXRlJ10gPSAnQ29uZmlybWF0aW9uIEVtYWlsIFRlbXBsYXRlJzsKJGxhbmdbJ3ByZWZlcmVuY2VzJ10gPSAnUHJlZmVyZW5jZXMnOwokbGFuZ1snZXJyb3JfaW52YWxpZHVzZXJuYW1lJ10gPSAnVXNlcm5hbWUgaXMgaW52YWxpZCAodG9vIGxvbmc/IG9yIHRvbyBzaG9ydD8pJzsKJGxhbmdbJ2Vycm9yX3VzZXJuYW1ldGFrZW4nXSA9ICdUaGF0IHVzZXJuYW1lIGlzIGN1cnJlbnRseSBpbiB1c2UnOwokbGFuZ1snZXJyb3JfcGFzc3dvcmRzZG9udG1hdGNoJ10gPSAnUGFzc3dvcmRzIGRvbnQgbWF0Y2gnOwokbGFuZ1snZXJyb3JfaW52YWxpZHBhc3N3b3JkJ10gPSAnUGFzc3dvcmQgaXMgaW52YWxpZCAodG9vIGxvbmc/IG9yIHRvbyBzaG9ydD8pJzsKJGxhbmdbJ2Vycm9yX2VtcHR5dXNlcm5hbWUnXSA9ICdVc2VybmFtZSBjYW5ub3QgYmUgZW1wdHknOwokbGFuZ1sncmVwZWF0cGFzc3dvcmQnXSA9ICdQYXNzd29yZCAoYWdhaW4pJzsKJGxhbmdbJ3Bhc3N3b3JkJ10gPSAnUGFzc3dvcmQnOwokbGFuZ1sndXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWydlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnXSA9ICdJbnN1ZmZpY2llbnQgbnVtYmVyIChvciBpbmNvcnJlY3QpIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gbW9kdWxlJzsKJGxhbmdbJ2Vycm9yX25vZmV1c2Vyc21vZHVsZSddID0gJ0NvdWxkIG5vdCBnZXQgaW5zdGFuY2Ugb2YgRnJvbnRFbmRVc2VycyBtb2R1bGUnOwokbGFuZ1snZXJyb3Jfbm9zdWNoZ3JvdXAnXSA9ICdHcm91cCBuYW1lIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdCc7CiRsYW5nWydzZW5kX2VtYWlsc190byddID0gJ1JlZ2lzdHJhdGlvbiBlbWFpbHMgc2hvdWxkIGJlIHNlbnQgdG8nOwokbGFuZ1sncmVxdWlyZV9lbWFpbF9jb25maXJtYXRpb24nXSA9ICdSZXF1aXJlIHRoZSB1c2VyIHRvIGNvbmZpcm0gcmVnaXN0cmF0aW9uIHZpYSBlbWFpbCc7CiRsYW5nWydub3RpZnlfb25fcmVnaXN0cmF0aW9uJ10gPSAnU2VuZCBhbiBlbWFpbCBub3RpZmljYXRpb24gd2hlbiBzb21lb25lIHJlZ2lzdGVycyc7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snc3VibWl0J10gPSAnU3VibWl0JzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1NlbGYgUmVnaXN0cmF0aW9uIE1vZHVsZSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0luc3RhbGxhdGlvbiBzdWNjZXNzZnVsbCwgcGxlYXNlIHJlbWVtYmVyIHRvIHNldCB0aGUgJnF1b3Q7TW9kaWZ5IFNlbGZSZWdpc3RyYXRpb24gU2V0dGluZ3MmcXVvdDsgcGVybWlzc2lvbi4nOwokbGFuZ1sncG9zdHVuaW5zdGFsbCddID0gJ1Bvc3QgVW5pbnN0YWxsIE1lc3NhZ2UsIGUuZy4sICJDdXJzZXMhIEZvaWxlZCBBZ2FpbiEiJzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWydpbnN0YWxsZWQnXSA9ICdNb2R1bGUgdmVyc2lvbiAlcyBpbnN0YWxsZWQuJzsKJGxhbmdbJ3ByZWZzdXBkYXRlZCddID0gJ01vZHVsZSBwcmVmZXJlbmNlcyB1cGRhdGVkLic7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgRGVuaWVkLiBQbGVhc2UgY2hlY2sgeW91ciBwZXJtaXNzaW9ucy4nOwokbGFuZ1snZXJyb3InXSA9ICdFcnJvciEnOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOwokbGFuZ1sndGl0bGVfbW9kX3ByZWZzJ10gPSAnTW9kdWxlIFByZWZlcmVuY2VzJzsKJGxhbmdbJ3RpdGxlX21vZF9hZG1pbiddID0gJ01vZHVsZSBBZG1pbiBQYW5lbCc7CiRsYW5nWyd0aXRsZV9hZG1pbl9wYW5lbCddID0gJ1NlbGYgUmVnaXN0cmF0aW9uIE1vZHVsZSc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0EgbW9kdWxlIHRoYXQgYWxsb3dzIGZyb250IGVuZCB1c2VycyB0byByZWdpc3RlciB0aGVtc2VsdmVzLic7CiRsYW5nWyd3ZWxjb21lX3RleHQnXSA9ICc8cD5XZWxjb21lIHRvIHRoZSBzZWxmIHJlZ2lzdHJhdGlvbiBtb2R1bGUuPC9wPic7CiRsYW5nWydjaGFuZ2Vsb2cnXSA9ICc8dWw+CjxsaT5WZXJzaW9uIDAuMC4xLiBPY3QgMjAwNS4gSW5pdGlhbCBOUlBUIChOb3QgUmVhZHkgZm9yIFByaW1lIFRpbWUpIHJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMC4xLjAuIE9jdCAyMDA1LiBJbml0aWFsIHJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMC4xLjEuIE9jdCAyMDA1LiBTZXQgdGhlIEhUTUwgbWFpbCBmbGFnLjwvbGk+CjxsaT5WZXJzaW9uIDAuMS4yLiBPY3QgMjAwNS4gTW92ZWQgUmFuZG9tIHN0dWZmIGludG8gZmV1c2VycywgYW5kIGFkZGVkIHRoZSBhYmlsaXR5IHRvIGRlbGV0ZSBvbGQgZW50cmllcyBmcm9tIHRoZSByZWdpc3RyYXRpb24gdGVtcG9yYXJ5IHRhYmxlczwvbGk+CjwvdWw+JzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2hhdCBEb2VzIFRoaXMgRG8/PC9oMz4KPHA+VGhpcyBtb2R1bGUgaXMgZGVzaWduZWQgdG8gYWxsb3cgZnJvbnQgZW5kIHVzZXJzIHRvIHJlZ2lzdGVyIHRoZW1zZWx2ZXMgYW5kIGZpbGwgaW4gdGhlIHJlcXVpcmVkIGluZm9ybWF0aW9uLiAgSXQgdGhlbiBzZW5kcyBhIGNvbmZpcm1hdGlvbiBlbWFpbCwgd2l0aCBhIGxpbmsgdG8gYSBzZWNvbmQgcGFnZSB0aGF0IG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSB0aGUgcmVnaXN0cmF0aW9uIGlzIGNvbXBsZXRlLiAgT25jZSByZWdpc3RyYXRpb24gaXMgY29tcGxldGUsIGEgdXNlciBhY2NvdW50IGlzIGNyZWF0ZWQgaW4gdGhlIGZyb250IGVuZCB1c2VycyBtb2R1bGUuPC9wPgo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+WW91IHBsYWNlIHRoZSBmb2xsb3duZyB0YWcgaW50byB5b3VyIHBhZ2Uge2Ntc19tb2R1bGUgbW9kdWxlPVNlbGZSZWdpc3RyYXRpb24gZ3JvdXA9dXNlcmdyb3VwfTwvcD4KPHA+WW91IG11c3QgaGF2ZSBwcmV2aW91c2x5IGNyZWF0ZWQgcHJvcGVydGllcyBhbmQgdXNlciBncm91cHMgaW4gdGhlIEZyb250RW5kVXNlcnMgbW9kdWxlIGluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuPC9wPgo8aDM+U3VwcG9ydDwvaDM+CjxwPlRoaXMgbW9kdWxlIGRvZXMgbm90IGluY2x1ZGUgY29tbWVyY2lhbCBzdXBwb3J0LiBIb3dldmVyLCB0aGVyZSBhcmUgYSBudW1iZXIgb2YgcmVzb3VyY2VzIGF2YWlsYWJsZSB0byBoZWxwIHlvdSB3aXRoIGl0OjwvcD4KPHVsPgo8bGk+Rm9yIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGlzIG1vZHVsZSwgRkFRcywgb3IgdG8gZmlsZSBhIEJ1ZyBSZXBvcnQgb3IgYnV5IGNvbW1lcmNpYWwgc3VwcG9ydCwgcGxlYXNlIHZpc2l0IGNhbGd1eVwncwptb2R1bGUgaG9tZXBhZ2UgYXQgPGEgaHJlZj0iaHR0cDovL3RlY2hjb20uZHluZG5zLm9yZyI+dGVjaGNvbS5keW5kbnMub3JnPC9hPi48L2xpPgo8bGk+QWRkaXRpb25hbCBkaXNjdXNzaW9uIG9mIHRoaXMgbW9kdWxlIG1heSBhbHNvIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwOi8vZm9ydW0uY21zbWFkZXNpbXBsZS5vcmciPkNNUyBNYWRlIFNpbXBsZSBGb3J1bXM8L2E+LjwvbGk+CjxsaT5UaGUgYXV0aG9yLCBjYWxndXkxMDAwLCBjYW4gb2Z0ZW4gYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9ImlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI2NtcyI+Q01TIElSQyBDaGFubmVsPC9hPi48L2xpPgo8bGk+TGFzdGx5LCB5b3UgbWF5IGhhdmUgc29tZSBzdWNjZXNzIGVtYWlsaW5nIHRoZSBhdXRob3IgZGlyZWN0bHkuPC9saT4gIAo8L3VsPgo8cD5BcyBwZXIgdGhlIEdQTCwgdGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBhcy1pcy4gUGxlYXNlIHJlYWQgdGhlIHRleHQKb2YgdGhlIGxpY2Vuc2UgZm9yIHRoZSBmdWxsIGRpc2NsYWltZXIuPC9wPgoKPGgzPkNvcHlyaWdodCBhbmQgTGljZW5zZTwvaDM+CjxwPkNvcHlyaWdodCAmY29weTsgMjAwNSwgUm9iZXJ0IENhbXBiZWwgPGEgaHJlZj0ibWFpbHRvOmNhbGd1eTEwMDBAaG90bWFpbC5jb20iPiZsdDtjYWxndXkxMDAwQGhvdG1haWwuY29tJmd0OzwvYT4uIEFsbCBSaWdodHMgQXJlIFJlc2VydmVkLjwvcD4KPHA+VGhpcyBtb2R1bGUgaGFzIGJlZW4gcmVsZWFzZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlcy5odG1sI0dQTCI+R05VIFB1YmxpYyBMaWNlbnNlPC9hPi4gWW91IG11c3QgYWdyZWUgdG8gdGhpcyBsaWNlbnNlIGJlZm9yZSB1c2luZyB0aGUgbW9kdWxlLjwvcD4KJzsKPz4K]]></data>
  </file>
  <file>
    <filename>SelfRegistration.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IFNlbGZSZWdpc3RyYXRpb24gLSBhIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBwaHBtYWlsZXIKIyBWZXJzaW9uOiAwLjEuMiBDYWxndXkxMDAwCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvbGljZW5zZXMuaHRtbCNHUEwKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KY2xhc3MgU2VsZlJlZ2lzdHJhdGlvbiBleHRlbmRzIENNU01vZHVsZQp7CiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVGhlIGRlZmF1bHQgdGVtcGxhdGUgdXNlZCBmb3IgdGhlIGZpcnN0IHJlZ2lzdHJhdGlvbiBmb3JtCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgdmFyICRkZmx0X3JlZ2lzdHJhdGlvbjFfdGVtcGxhdGUgPSAnCjwhLS0gUmVnaXN0cmF0aW9uIDEgdGVtcGxhdGUgLS0+CnskdGl0bGV9CntpZiAkbWVzc2FnZSAhPSBcJ1wnfQogIHtpZiAkZXJyb3IgIT0gXCdcJ30KICAgIDxwPjxmb250IGNvbG9yPSJyZWQiPnskbWVzc2FnZX08L2ZvbnQ+PC9wPgogIHtlbHNlfQogICAgPHA+eyRtZXNzYWdlfTwvcD4KICB7L2lmfQp7L2lmfQp7JHN0YXJ0Zm9ybX0Ke2lmICRjb250cm9sY291bnQgPiAwfQogIDxjZW50ZXI+CiAgPHRhYmxlIHdpZHRoPSI3NSUiPgp7Zm9yZWFjaCBmcm9tPSRjb250cm9scyBpdGVtPWNvbnRyb2x9CiAgPHRyPgogICAgPHRkPnskY29udHJvbC0+aGlkZGVufQogICAgPGZvbnQgY29sb3I9InskY29udHJvbC0+Y29sb3J9Ij57JGNvbnRyb2wtPnByb21wdH17JGNvbnRyb2wtPm1hcmtlcn08L2ZvbnQ+CiAgICA8L3RkPgogICAgPHRkPnskY29udHJvbC0+Y29udHJvbH08L3RkPgogIDwvdHI+CnsvZm9yZWFjaH0KICA8L3RhYmxlPgogIDwvY2VudGVyPgo8YnIvPgp7L2lmfQogeyRoaWRkZW59eyRoaWRkZW4yfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19CjwhLS0gUmVnaXN0cmF0aW9uIDEgdGVtcGxhdGUgLS0+CiAnOwoKICB2YXIgJGRmbHRfcG9zdHJlZzFfdGVtcGxhdGUgPSAnCjwhLS0gUG9zdCBSZWdpc3RyYXRpb24gMSB0ZW1wbGF0ZSAtLT4KeyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9IFwnXCd9CiAge2lmICRlcnJvciAhPSBcJ1wnfQogICAgPHA+PGZvbnQgY29sb3I9InJlZCI+eyRtZXNzYWdlfTwvZm9udD48L3A+CiAge2Vsc2V9CiAgICA8cD57JG1lc3NhZ2V9PC9wPgogIHsvaWZ9CnsvaWZ9CjxwPlRoYW5rIHlvdSB7JHVzZXJuYW1lfSBmb3IgcmVnaXN0ZXJpbmcgd2l0aCB7JHNpdGVuYW1lfS4gIEFuIGVtYWlsIGhhcyBiZWVuIHNlbnQgdG8geyRlbWFpbH0gd2l0aCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIGNvbnRpbnVlIHRoZSByZWdpc3RyYXRpb24gcHJvY2VzczwvcD4KPCEtLSBQb3N0IFJlZ2lzdHJhdGlvbiAxIHRlbXBsYXRlIC0tPgonOwoKICB2YXIgJGRmbHRfcmVnaXN0cmF0aW9uMl90ZW1wbGF0ZSA9ICcKPCEtLSBSZWdpc3RyYXRpb24gMSB0ZW1wbGF0ZSAtLT4KeyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9IFwnXCd9CiAge2lmICRlcnJvciAhPSBcJ1wnfQogICAgPHA+PGZvbnQgY29sb3I9InJlZCI+eyRtZXNzYWdlfTwvZm9udD48L3A+CiAge2Vsc2V9CiAgICA8cD57JG1lc3NhZ2V9PC9wPgogIHsvaWZ9CnsvaWZ9Cnskc3RhcnRmb3JtfQogIDxjZW50ZXI+CiAgPHRhYmxlIHdpZHRoPSI3NSUiPgogIDx0cj4KICAgIDx0ZD57JHByb21wdF91c2VybmFtZX08L2ZvbnQ+CiAgICA8L3RkPgogICAgPHRkPnskaW5wdXRfdXNlcm5hbWV9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD57JHByb21wdF9wYXNzd29yZH08L2ZvbnQ+CiAgICA8L3RkPgogICAgPHRkPnskaW5wdXRfcGFzc3dvcmR9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD57JHByb21wdF9jb2RlfTwvZm9udD4KICAgIDwvdGQ+CiAgICA8dGQ+eyRpbnB1dF9jb2RlfTwvdGQ+CiAgPC90cj4KICA8L3RhYmxlPgogIDwvY2VudGVyPgo8YnIvPgogeyRoaWRkZW59eyRoaWRkZW4yfXskc3VibWl0fXskY2FuY2VsfQp7JGVuZGZvcm19CjwhLS0gUmVnaXN0cmF0aW9uIDIgdGVtcGxhdGUgLS0+CiAnOyAgCgogIHZhciAkZGZsdF9lbWFpbGNvbmZpcm1fdGVtcGxhdGUgPSAnCjwhLS0gRW1haWxDb25maXJtIHRlbXBsYXRlIC0tPgo8aHRtbD4KPGJvZHk+CjxwPkdyZWV0aW5ncyB7JG5hbWV9IHdlbGNvbWUgdG8gdGhlIHNpdGUuICBUaGlzIGVtYWlsIGlzIGJlaW5nIHNlbnQgYmVjYXVzZSBzb21lYm9keSByZWdpc3RlcmVkIGZvciBhY2Nlc3MgdG8geyRzaXRlbmFtZX0gdXNpbmcgdGhpcyBlbWFpbCBhZGRyZXNzLiBJZiB0aGlzIHdhcyB5b3UsIHBsZWFzZSBjbGljayBvbiB0aGUgZm9sbG93aW5nIGxpbmsgYW5kIGVudGVyIHlvdXIgdXNlcm5hbWUsIHBhc3N3b3JkLCBhbmQgdGhlIHVuaXF1ZSBjb2RlIGJlbG93PC9wPgogICA8cD5mb2xsb3cgdGhpcyBsaW5rOiB7JGxpbmt9PC9wPgogICA8cD57JGNvZGV9PC9wPgo8L2JvZHk+CjwvaHRtbD4KPCEtLSBFbWFpbENvbmZpcm0gdGVtcGxhdGUgLS0+Cic7CgogIHZhciAkZGZsdF9maW5hbG1lc3NhZ2VfdGVtcGxhdGUgPSAnCjwhLS0gRmluYWxNZXNzYWdlIFRlbXBsYXRlIC0tPgo8cD5XZWxjb21lIHskdXNlcm5hbWV9IHRvIHskc2l0ZW5hbWV9LiAgWW91ciByZWdpc3RyYXRpb24gaXMgY29tcGxldGUuICBQbGVhc2UgbG9naW4gdG8gY29udGludWU8L3A+CjwhLS0gRmluYWxNZXNzYWdlIFRlbXBsYXRlIC0tPgogICc7CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAnU2VsZlJlZ2lzdHJhdGlvbic7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RnJpZW5kbHlOYW1lKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyk7CiAgfQoKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFZlcnNpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldFZlcnNpb24oKQogIHsKICAgIHJldHVybiAnMC4xLjInOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0SGVscCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0SGVscCgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdoZWxwJyk7CiAgfQogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvcigpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yKCkKICB7CiAgICByZXR1cm4gJ0NhbGd1eTEwMDAnOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yRW1haWwoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkKICB7CiAgICByZXR1cm4gJ2NhbGd1eTEwMDBAaG90bWFpbC5jb20nOwogIH0KICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRDaGFuZ2VMb2coKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdjaGFuZ2Vsb2cnKTsKICB9CiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSXNQbHVnaW5Nb2R1bGUoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkKICB7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uCiAgIHdoZXRoZXIgeW91ciBtb2R1bGUgYWRkcyBhbnl0aGluZyB0byB0aGUgQWRtaW4gYXJlYSBvZgogICB0aGUgc2l0ZS4gRm9yIHRoZSByZXN0IG9mIHRoZXNlIGNvbW1lbnRzLCBJJ2xsIGJlIGNhbGxpbmcKICAgdGhlIGFkbWluIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhlICJBZG1pbiBQYW5lbCIgZm9yCiAgIHdhbnQgb2YgYSBiZXR0ZXIgdGVybS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbigpCiAgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pblNlY3Rpb24oKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEFkbWluU2VjdGlvbigpCiAgewogICAgcmV0dXJuICdleHRlbnNpb25zJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ21vZGRlc2NyaXB0aW9uJyk7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01vZGlmeSBTaXRlIFByZWZlcmVuY2VzJyApOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RGVwZW5kZW5jaWVzKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSggJ0NNU01haWxlcicgPT4gJzEuNzMuMycsCgkJICAnRnJvbnRFbmRVc2VycycgPT4gJzAuMS40JyApOwogIH0KICAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbCgpCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CiAgICAkdGFib3B0YXJyYXkgPSBhcnJheSgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwoKICAgIC8vIHZhbGlkYXRpb25zIGluIHByb2Nlc3MKICAgICRmbGRzID0gIgogICAgICAgICAgICAgaWQgSSBLRVksCiAgICAgICAgICAgICBncm91cF9pZCBJIE5PVCBOVUxMLAogICAgICAgICAgICAgdXNlcm5hbWUgQyg4MCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBwYXNzc3dvcmQgQygzMikgTk9UIE5VTEwsCiAgICAgICAgICAgICBjb2RlIEMoMjApIE5PVCBOVUxMLAogICAgICAgICAgICAgY3JlYXRlZGF0ZSBUCiAgICAgICAgICAgICI7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ191c2VycyIsIAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSApOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAkZGItPkNyZWF0ZVNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3VzZXJzX3NlcSIgKTsKCiAgICAkZmxkcyA9ICJpZCBJIEtFWSwKICAgICAgICAgICAgIHVzZXIgSSBOT1QgTlVMTCwgCiAgICAgICAgICAgICB0aXRsZSBDKDEwMCkgTk9UIE5VTEwsCiAgICAgICAgICAgICBkYXRhIEMoMjU1KSAKICAgICAgICAgICAgIjsgCiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ19wcm9wZXJ0aWVzIiwKCQkJCSAgICAgICRmbGRzLCAkdGFib3B0YXJyYXkgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ19wcm9wZXJ0aWVzX3NlcSIgKTsKCiAKICAgIC8vIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTW9kaWZ5IFNlbGZSZWdpc3RyYXRpb24nLAoJCQkgICAgJ01vZGlmeSBTZWxmUmVnaXN0cmF0aW9uIFNldHRpbmdzJyk7CgogICAgLy8gcHJlZmVyZW5jZXMKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlX2VtYWlsX2NvbmZpcm1hdGlvbicsMSk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgnc2VuZF9lbWFpbHNfdG8nLCdyb290QGxvY2FsaG9zdC5jb20nKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCdub3RpZnlfb25fcmVnaXN0cmF0aW9uJywxKTsKCiAgICAvLyB0ZW1wbGF0ZXMKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnc2VsZnJlZ19yZWcxdGVtcGxhdGUnLCAkdGhpcy0+ZGZsdF9yZWdpc3RyYXRpb24xX3RlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnc2VsZnJlZ19wb3N0cmVnMV90ZW1wbGF0ZScsICR0aGlzLT5kZmx0X3Bvc3RyZWcxX3RlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnc2VsZnJlZ19yZWcydGVtcGxhdGUnLCAkdGhpcy0+ZGZsdF9yZWdpc3RyYXRpb24yX3RlbXBsYXRlKTsKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSgnc2VsZnJlZ19lbWFpbGNvbmZpcm1fdGVtcGxhdGUnLCAkdGhpcy0+ZGZsdF9lbWFpbGNvbmZpcm1fdGVtcGxhdGUpOwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCdzZWxmcmVnX2ZpbmFsbWVzc2FnZV90ZW1wbGF0ZScsICR0aGlzLT5kZmx0X2ZpbmFsbWVzc2FnZV90ZW1wbGF0ZSk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIC8vIHBlcm1pc3Npb25zCiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3RpbnN0YWxsJyk7CgogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ3Bvc3R1bmluc3RhbGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVcGdyYWRlKCkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVcGdyYWRlKCRvbGR2ZXJzaW9uLCAkbmV3dmVyc2lvbikKICB7CiAgICAvLyBub3RoaW5nIGhlcmUKICB9CgkKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbCgpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsKCkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ191c2VycyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NlbGZyZWdfcHJvcGVydGllcyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3VzZXJzX3NlcSIgKTsKICAgICRkYi0+RHJvcFNlcXVlbmNlKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3Byb3BlcnRpZXNfc2VxIiApOwoKICAgIC8vIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbignTW9kaWZ5IFNlbGZSZWdpc3RyYXRpb24nKTsKCiAgICAvLyBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJ3JlcXVpcmVfZW1haWxfY29uZmlybWF0aW9uJyk7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgnc2VuZF9lbWFpbHNfdG8nKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlKCdub3RpZnlfb25fcmVnaXN0cmF0aW9uJyk7CgogICAgLy8gdGVtcGxhdGVzCiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3NlbGZyZWdfcmVnMXRlbXBsYXRlJyk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3NlbGZyZWdfcG9zdHJlZzFfdGVtcGxhdGUnKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnc2VsZnJlZ19yZWcydGVtcGxhdGUnKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnc2VsZnJlZ19lbWFpbGNvbmZpcm1fdGVtcGxhdGUnKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgnc2VsZnJlZ19maW5hbG1lc3NhZ2VfdGVtcGxhdGUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRG9BY3Rpb24oJGFjdGlvbiwgJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQ9LTEpCiAgewogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CiAgICAgIGNhc2UgJ2RlZmF1bHQnOgoJewoJICAkdGhpcy0+X0Rpc3BsYXlNb2R1bGVPdXRwdXQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkZWZhdWx0YWRtaW4nOgoJewoJICAkdGhpcy0+X0Rpc3BsYXlBZG1pblBhbmVsKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KICAgICAgY2FzZSAncmVndXNlcic6Cgl7CgkgICR0aGlzLT5fUmVnaXN0ZXJVc2VyU3RlcDEoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdzZXRwcmVmcyc6Cgl7CgkgICR0aGlzLT5fU2V0QWRtaW5QcmVmZXJlbmNlcyggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ3NldF9yZWcxdGVtcGxhdGUnOgoJewoJICAkdGhpcy0+X1NldEFkbWluUmVnMVRlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KICAgICAgY2FzZSAnc2V0X3JlZzJ0ZW1wbGF0ZSc6Cgl7CgkgICR0aGlzLT5fU2V0QWRtaW5SZWcyVGVtcGxhdGUoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdzZXRfZW1haWxjb25maXJtX3RlbXBsYXRlJzoKCXsKCSAgJHRoaXMtPl9TZXRBZG1pbkVtYWlsQ29uZmlybVRlbXBsYXRlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KICAgICAgY2FzZSAnc2V0X2ZpbmFsbWVzc2FnZV90ZW1wbGF0ZSc6Cgl7CgkgICR0aGlzLT5fU2V0QWRtaW5GaW5hbE1lc3NhZ2VUZW1wbGF0ZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ3ZlcmlmeXVzZXInOgoJewoJICAkdGhpcy0+X1ZlcmlmeVVzZXIoICRpZCwgJHBhcmFtcywgJGV0dXJuaWQgKTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkYWN0aXZlX3RhYiA9IC0xOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2FjdGl2ZV90YWInXSkpCiAgICAgIHsKCSRhY3RpdmVfdGFiID0gJHBhcmFtc1snYWN0aXZlX3RhYiddOwogICAgICB9CgogICAgLy8gdGhlIHRhYnMKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycygpOwogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCdyZWcxdGVtcGxhdGUnLCAkdGhpcy0+TGFuZygncmVnaXN0cmF0aW9uMV90ZW1wbGF0ZScpLCAKCQkJICAgICAoJGFjdGl2ZV90YWIgPT0gJ3JlZzF0ZW1wbGF0ZScpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncmVnMnRlbXBsYXRlJywgJHRoaXMtPkxhbmcoJ3JlZ2lzdHJhdGlvbjJfdGVtcGxhdGUnKSwgCgkJCSAgICAgKCRhY3RpdmVfdGFiID09ICdyZWcydGVtcGxhdGUnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2VtYWlsY29uZmlybV90ZW1wbGF0ZScsICR0aGlzLT5MYW5nKCdlbWFpbGNvbmZpcm1fdGVtcGxhdGUnKSwgCgkJCSAgICAgKCRhY3RpdmVfdGFiID09ICdlbWFpbGNvbmZpcm1fdGVtcGxhdGUnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoJ2ZpbmFsbWVzc2FnZV90ZW1wbGF0ZScsIAoJCQkgICAgICR0aGlzLT5MYW5nKCdmaW5hbG1lc3NhZ2VfdGVtcGxhdGUnKSwKCQkJICAgICAoJGFjdGl2ZV90YWIgPT0gJ2ZpbmFsbWVzc2FnZV90ZW1wbGF0ZScpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigncHJlZmVyZW5jZXMnLCAkdGhpcy0+TGFuZygncHJlZmVyZW5jZXMnKSwKCQkJICAgICAoJGFjdGl2ZV90YWIgPT0gJ3ByZWZlcmVuY2VzJykpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKICAgIC8vIHRoZSBjb250ZW50IG9mIHRoZSB0YWJzCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkNvbnRlbnQoKTsKICAgIAogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ3JlZzF0ZW1wbGF0ZScpOwogICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5SZWcxVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYigncmVnMnRlbXBsYXRlJyk7CiAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblJlZzJUZW1wbGF0ZVRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdlbWFpbGNvbmZpcm1fdGVtcGxhdGUnKTsKICAgICR0aGlzLT5fRGlzcGxheUFkbWluRW1haWxDb25maXJtYXRpb25UZW1wbGF0ZVRhYiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdmaW5hbG1lc3NhZ2VfdGVtcGxhdGUnKTsKICAgICR0aGlzLT5fRGlzcGxheUFkbWluRmluYWxNZXNzYWdlVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYigncHJlZmVyZW5jZXMnKTsKICAgICR0aGlzLT5fRGlzcGxheUFkbWluUHJlZmVyZW5jZXNUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICBlY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7CiAgfQoKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUHJlZmVyZW5jZXNUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUHJlZmVyZW5jZXNUYWIoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N0YXJ0Zm9ybScsCgkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCggJGlkLCAnc2V0cHJlZnMnLCAkcmV0dXJuaWQgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2VuZGZvcm0nLAoJCQkgICR0aGlzLT5DcmVhdGVGb3JtRW5kKCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X25vdGlmeScsCgkJCSAgJHRoaXMtPkxhbmcoJ25vdGlmeV9vbl9yZWdpc3RyYXRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X25vdGlmeScsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goICRpZCwgCgkJCQkJCSAgICAgICdpbnB1dF9ub3RpZnknLCAxLAoJCQkJCQkgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnbm90aWZ5X29uX3JlZ2lzdHJhdGlvbicpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfZW1haWxfY29uZmlybWF0aW9uJywKCQkJICAkdGhpcy0+TGFuZygncmVxdWlyZV9lbWFpbF9jb25maXJtYXRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2VtYWlsX2NvbmZpcm1hdGlvbicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goICRpZCwgCgkJCQkJCSAgICAgICdpbnB1dF9lbWFpbF9jb25maXJtYXRpb24nLCAxLAoJCQkJCQkgICAgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZV9lbWFpbF9jb25maXJtYXRpb24nKSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2NvbmZpcm1tYWlsX3RvJywKCQkJICAkdGhpcy0+TGFuZygnc2VuZF9lbWFpbHNfdG8nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X2NvbmZpcm1tYWlsX3RvJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsIAoJCQkJCQkgICdpbnB1dF9jb25maXJtbWFpbF90bycsIAoJCQkJCQkgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzZW5kX2VtYWlsc190bycpLAoJCQkJCQkgIDMwLCA2MCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3VibWl0JywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdzdWJtaXQnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwoKICAgICRudW0gPSAkdGhpcy0+Q291bnRUZW1wVXNlcnMoKTsKICAgIGlmKCAkbnVtICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfbnVtcmVzZXRyZWNvcmRzJywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF9udW1yZXNldHJlY29yZCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZGF0YV9udW1yZXNldHJlY29yZHMnLCAkbnVtKTsgLy90b2RvCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlbW92ZWFsbCcsCgkJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ2lucHV0X3JlbW92ZWFsbCcsCgkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygncmVtb3ZlYWxsJyksCgkJCQkJCSAgICAgICAnb25jbGljaz0icmV0dXJuIGNvbmZpcm0oXCcnLiR0aGlzLT5MYW5nKCdhcmV5b3VzdXJlJykuJ1wnKSInKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3JlbW92ZTF3ZWVrJywKCQkJICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnaW5wdXRfcmVtb3ZlMXdlZWsnLAoJCQkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ3JlbW92ZTF3ZWVrJyksCgkJCQkJCSAgICAgICAnb25jbGljaz0icmV0dXJuIGNvbmZpcm0oXCcnLiR0aGlzLT5MYW5nKCdhcmV5b3VzdXJlJykuJ1wnKSInKSk7CiAgICAgIAoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9yZW1vdmUxbW9udGgnLAoJCQkgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdpbnB1dF9yZW1vdmUxbW9udGgnLAoJCQkJCQkgICAgICAgJHRoaXMtPkxhbmcoJ3JlbW92ZTFtb250aCcpLAoJCQkJCQkgICAgICAgJ29uY2xpY2s9InJldHVybiBjb25maXJtKFwnJy4kdGhpcy0+TGFuZygnYXJleW91c3VyZScpLidcJykiJykpOwogICAgICB9CgogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdwcmVmcy50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEaXNwbGF5QWRtaW5SZWcxVGVtcGxhdGVUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5SZWcxVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3NldF9yZWcxdGVtcGxhdGUnKTsKICAgIGVjaG8gJzxwPlJlZ2lzdHJhdGlvbiBUZW1wbGF0ZTwvcD4nOwogICAgZWNobyAnPGJyLz48cD4nLiR0aGlzLT5DcmVhdGVUZXh0QXJlYSAoZmFsc2UsICRpZCwKCQkJCQkgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdzZWxmcmVnX3JlZzF0ZW1wbGF0ZScpLAoJCQkJCSAgICdyZWcxX3RlbXBsYXRlY29udGVudCcsICcnKS4nPC9wPic7CiAgICBlY2hvICc8cD5Qb3N0IFJlZ2lzdHJhdGlvbiBUZW1wbGF0ZTwvcD4nOwogICAgZWNobyAnPGJyLz48cD4nLiR0aGlzLT5DcmVhdGVUZXh0QXJlYSAoZmFsc2UsICRpZCwKCQkJCQkgICAkdGhpcy0+R2V0VGVtcGxhdGUgKCdzZWxmcmVnX3Bvc3RyZWcxX3RlbXBsYXRlJyksCgkJCQkJICAgJ3Bvc3RyZWcxX3RlbXBsYXRlY29udGVudCcsICcnKS4nPC9wPic7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywKCQkJCSAgICR0aGlzLT5MYW5nICgnc3VibWl0JykpOwogICAgZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlZmF1bHRidXR0b24nLAoJCQkJICAgJHRoaXMtPkxhbmcgKCdkZWZhdWx0JykpOwogICAgZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEaXNwbGF5QWRtaW5SZWcyVGVtcGxhdGVUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5SZWcyVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3NldF9yZWcydGVtcGxhdGUnKTsKICAgIGVjaG8gJzxici8+PHA+Jy4kdGhpcy0+Q3JlYXRlVGV4dEFyZWEgKGZhbHNlLCAkaWQsCgkJCQkJICAgJHRoaXMtPkdldFRlbXBsYXRlICgnc2VsZnJlZ19yZWcydGVtcGxhdGUnKSwKCQkJCQkgICAndGVtcGxhdGVjb250ZW50JywgJycpLic8L3A+JzsKICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXRidXR0b24nLAoJCQkJICAgJHRoaXMtPkxhbmcgKCdzdWJtaXQnKSk7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdGJ1dHRvbicsCgkJCQkgICAkdGhpcy0+TGFuZyAoJ2RlZmF1bHQnKSk7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlBZG1pbkVtYWlsQ29uZmlybWF0aW9uVGVtcGxhdGVUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5QWRtaW5FbWFpbENvbmZpcm1hdGlvblRlbXBsYXRlVGFiKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZWNobyAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdzZXRfZW1haWxjb25maXJtX3RlbXBsYXRlJyk7CiAgICBlY2hvICc8YnIvPjxwPicuJHRoaXMtPkNyZWF0ZVRleHRBcmVhIChmYWxzZSwgJGlkLAoJCQkJCSAgICR0aGlzLT5HZXRUZW1wbGF0ZSAoJ3NlbGZyZWdfZW1haWxjb25maXJtX3RlbXBsYXRlJyksCgkJCQkJICAgJ3RlbXBsYXRlY29udGVudCcsICcnKS4nPC9wPic7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywKCQkJCSAgICR0aGlzLT5MYW5nICgnc3VibWl0JykpOwogICAgZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlZmF1bHRidXR0b24nLAoJCQkJICAgJHRoaXMtPkxhbmcgKCdkZWZhdWx0JykpOwogICAgZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEaXNwbGF5QWRtaW5FbWFpbENvbmZpcm1hdGlvblRlbXBsYXRlVGFiKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluRmluYWxNZXNzYWdlVGVtcGxhdGVUYWIoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3NldF9maW5hbG1lc3NhZ2VfdGVtcGxhdGUnKTsKICAgIGVjaG8gJzxici8+PHA+Jy4kdGhpcy0+Q3JlYXRlVGV4dEFyZWEgKGZhbHNlLCAkaWQsCgkJCQkJICAgJHRoaXMtPkdldFRlbXBsYXRlICgnc2VsZnJlZ19maW5hbG1lc3NhZ2VfdGVtcGxhdGUnKSwKCQkJCQkgICAndGVtcGxhdGVjb250ZW50JywgJycpLic8L3A+JzsKICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXRidXR0b24nLAoJCQkJICAgJHRoaXMtPkxhbmcgKCdzdWJtaXQnKSk7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZGVmYXVsdGJ1dHRvbicsCgkJCQkgICAkdGhpcy0+TGFuZyAoJ2RlZmF1bHQnKSk7CiAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUVycm9yUGFnZSgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcoJ2Vycm9yJykpOwogICAgaWYgKCRtZXNzYWdlICE9ICcnKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdtZXNzYWdlJywgJG1lc3NhZ2UpOwogICAgICB9CiAgICAKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICB9CgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERpc3BsYXlNb2R1bGVPdXRwdXQoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheU1vZHVsZU91dHB1dCgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlPScnKQogIHsKICAgICRtb2RlID0gJ3NpZ251cCc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21vZGUnXSApICkKICAgICAgewoJJG1vZGUgPSAkcGFyYW1zWydtb2RlJ107CiAgICAgIH0KCiAgICBzd2l0Y2goICRtb2RlICkKICAgICAgewogICAgICBjYXNlICdzaWdudXAnOgoJJHRoaXMtPl9Vc2VyRGlzcGxheVJlZ2lzdHJhdGlvbkZvcm0xKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApOwoJYnJlYWs7CgogICAgICBjYXNlICd2ZXJpZnknOgoJJHRoaXMtPl9Vc2VyRGlzcGxheVZlcmlmaWNhdGlvbkZvcm0oICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglicmVhazsKCiAgICAgIGRlZmF1bHQ6CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJycsICRyZXR1cm5pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWRtb2RlJykpOwoJYnJlYWs7CiAgICAgIH0KICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVzZXJEaXNwbGF5UmVnaXN0cmF0aW9uRm9ybTEoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfVXNlckRpc3BsYXlSZWdpc3RyYXRpb25Gb3JtMSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydncm91cCddICkgKQogICAgICB7CgkvLyB0aGlzIGlzIHVnbHkgZm9yIHRoZSB1c2VyIHRvIHNlZQoJLy8gYnV0IGF0IGxlYXN0IHRoZSBhZG1pbiB3aWxsIGJlIGFibGUgdG8gZmlndXJlIGl0IG91dAoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgICRmZXVzZXJzID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGcm9udEVuZFVzZXJzJyk7CiAgICBpZiggISRmZXVzZXJzICkKICAgICAgewoJLy8gdGhpcyBpcyB1Z2x5IGZvciB0aGUgdXNlciB0byBzZWUKCS8vIGJ1dCBhdCBsZWFzdCB0aGUgYWRtaW4gd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBpdCBvdXQKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9ub2ZldXNlcnNtb2R1bGUnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAkY21zbWFpbGVyID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdDTVNNYWlsZXInKTsKICAgIGlmKCAhJGNtc21haWxlciApCiAgICAgIHsKCS8vIHRoaXMgaXMgdWdseSBmb3IgdGhlIHVzZXIgdG8gc2VlCgkvLyBidXQgYXQgbGVhc3QgdGhlIGFkbWluIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUgaXQgb3V0CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9mZXVzZXJzbW9kdWxlJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8geWVwLCBhbGwgdGhlIG1vZHVsZXMgYXJlIGhlcmUsIG5vdyB3ZSAKICAgIC8vIGhhdmUgdG8gY29udmVydCB0aGUgZ3JvdXBuYW1lIGludG8gYW4gaWQKICAgICRncnBpZCA9ICRmZXVzZXJzLT5HZXRHcm91cElEKCRwYXJhbXNbJ2dyb3VwJ10pOwogICAgaWYoICRncnBpZCA9PSBmYWxzZSApCiAgICAgIHsKCS8vIHRoaXMgaXMgdWdseSBmb3IgdGhlIHVzZXIgdG8gc2VlCgkvLyBidXQgYXQgbGVhc3QgdGhlIGFkbWluIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUgaXQgb3V0CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9zdWNoZ3JvdXAnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBub3cgd2UgaGF2ZSBhbiBpZC4uLiBoYXZlIHRvIGdldCBhIGxpc3Qgb2YgdGhlIGdyb3VwcyBwcm9wZXJ0aWVzCiAgICAkcmVsYXRpb25zID0gJGZldXNlcnMtPkdldEdyb3VwUHJvcGVydHlSZWxhdGlvbnMoICRncnBpZCApOwogICAgaWYoICRyZWxhdGlvbnNbMF0gPT0gZmFsc2UgKQogICAgICB7CgkvLyB0aGlzIGlzIHVnbHkgZm9yIHRoZSB1c2VyIHRvIHNlZQoJLy8gYnV0IGF0IGxlYXN0IHRoZSBhZG1pbiB3aWxsIGJlIGFibGUgdG8gZmlndXJlIGl0IG91dAoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICcnLCAkcmV0dXJuaWQsICRyZWxhdGlvbnNbMV0gKTsKCXJldHVybjsKICAgICAgfQogICAgdWFzb3J0KCAkcmVsYXRpb25zLCAnY29tcGFyZV9lbGVtZW50c19ieV9zb3J0b3JkZXJfa2V5JyApOwoKICAgIC8vIG5vdyB3ZSBoYXZlIHRoZSBwcm9wZXJ0aWVzLCBnb3R0YSBzaG93IHNvbWV0aGluZyB0byB0aGUgdXNlcgogICAgLy8gZGFtbWl0LgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydlcnJvciddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywgJHBhcmFtc1snZXJyb3InXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snbWVzc2FnZSddICkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkcGFyYW1zWydtZXNzYWdlJ10pOwogICAgICB9CgogICAgLy8gbm93IHdlJ3JlIHJlYWR5IHRvIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgLy8gZmlyc3Qgd2UgcHV0IGluIHN0dWZmIHRoYXQgaXMgcmVxdWlyZWQgKHVzZXJuYW1lLCBwYXNzd29yZCwgZXRjLCBldGMpCiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwoKICAgIC8vIG1ha2Ugc3VyZSB1c2VybmFtZSBpcyBpbiB0aGVyZQogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJHZhbCA9IChpc3NldCgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddKSkgPyAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddIDogJyc7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fdXNlcm5hbWUnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCd1c2VybmFtZScsMCwzMCwyKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3VzZXJuYW1lJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwgJ2lucHV0X3VzZXJuYW1lJywgJHZhbCwgMzAsIDMwKTsKICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwoKICAgIC8vIGFuZCBwYXNzd29yZAogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJHZhbCA9IChpc3NldCgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKSkgPyAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddIDogJyc7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fcGFzc3dvcmQnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCdwYXNzd29yZCcsMCwzMCwyKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3Bhc3N3b3JkJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgkaWQsICdpbnB1dF9wYXNzd29yZCcsICR2YWwsIDMwLCAzMCk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCiAgICAvLyBhbmQgbWFrZSBoaW0gcmVwZWF0IHRoZSBwYXNzd29yZAogICAgJG9uZXJvdyA9IG5ldyBTdGRDbGFzcygpOwogICAgJG9uZXJvdy0+Y29sb3IgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfY29sb3InLCdibHVlJyk7CiAgICAkb25lcm93LT5tYXJrZXIgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgJG9uZXJvdy0+cmVxdWlyZWQgPSAxOwogICAgJHZhbCA9IChpc3NldCgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKSkgPyAkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddIDogJyc7CiAgICAkb25lcm93LT5oaWRkZW4gPSBteUNyZWF0ZUlucHV0SGlkZGVuKCAkaWQsICdoaWRkZW5fcmVwZWF0cGFzc3dvcmQnLAoJCQkJCSAgIGltcGxvZGUoIjsiLGFycmF5KCdyZXBlYXRwYXNzd29yZCcsMCwzMCwyKSkpOwogICAgJG9uZXJvdy0+cHJvbXB0ID0gJHRoaXMtPkxhbmcoJ3JlcGVhdHBhc3N3b3JkJyk7CiAgICAkb25lcm93LT5jb250cm9sID0kdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgkaWQsICdpbnB1dF9yZXBlYXRwYXNzd29yZCcsICR2YWwsIDMwLCAzMCk7CiAgICBhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKICAgIAogICAgCiAgICBmb3JlYWNoKCAkcmVsYXRpb25zIGFzICRyZWxuICkKICAgIHsKICAgICAgLy8gZG9uJ3QgcHJvY2VzcyBoaWRkZW4gZmllbGRzIGhlcmUKICAgICAgaWYoICRyZWxuWydyZXF1aXJlZCddID09IDMgKSBjb250aW51ZTsKCiAgICAgIC8vIGdldCB0aGUgcHJvcGVydHkgZGVmaW5pdGlvbgogICAgICAkZGVmbiA9ICRmZXVzZXJzLT5HZXRQcm9wZXJ0eURlZm4oICRyZWxuWyduYW1lJ10gKTsKICAgICAgCiAgICAgICRvbmVyb3cgPSBuZXcgU3RkQ2xhc3MoKTsKCiAgICAgICRjb2xvciA9ICcnOwogICAgICBpZiggJHJlbG5bJ3JlcXVpcmVkJ10gPT0gMiApICRjb2xvciA9ICRmZXVzZXJzLT5HZXRQcmVmZXJlbmNlKCdyZXF1aXJlZF9maWVsZF9jb2xvcicsJ2JsdWUnKTsKICAgICAgJG1hcmtlciA9ICcnOwogICAgICBpZiggJHJlbG5bJ3JlcXVpcmVkJ10gPT0gMiApICRtYXJrZXIgPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgncmVxdWlyZWRfZmllbGRfbWFya2VyJywnKicpOwogICAgICAkb25lcm93LT5yZXF1aXJlZCA9ICgkcmVsblsncmVxdWlyZWQnXSA9PSAyKTsKICAgICAgJG9uZXJvdy0+Y29sb3IgICAgPSAkY29sb3I7CiAgICAgICRvbmVyb3ctPm1hcmtlciAgID0gJG1hcmtlcjsKICAgICAgJG9uZXJvdy0+aGlkZGVuID0gbXlDcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnaGlkZGVuXycuJHJlbG5bJ25hbWUnXSwKCQkJCQkgICAgIGltcGxvZGUoIjsiLGFycmF5KCRyZWxuWyduYW1lJ10sJGRlZm5bJ3R5cGUnXSwKCQkJCQkJCSAgICAgICAkZGVmblsnbGVuZ3RoJ10sJHJlbG5bJ3JlcXVpcmVkJ10pKSk7CgogICAgICAkdmFsID0gaXNzZXQoJHBhcmFtc1snaW5wdXRfJy4kcmVsblsnbmFtZSddXSkgPyAkcGFyYW1zWydpbnB1dF8nLiRyZWxuWyduYW1lJ11dIDogJyc7CiAgICAgICRvbmVyb3ctPnByb21wdCA9ICRkZWZuWydwcm9tcHQnXTsKICAgICAgc3dpdGNoKCAkZGVmblsndHlwZSddICkKCXsKCWNhc2UgMDogLy8gdGV4dAoJICAkb25lcm93LT5jb250cm9sID0gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfJy4kcmVsblsnbmFtZSddLAoJCQkJCQkgICAgICR2YWwsICRkZWZuWydsZW5ndGgnXSwgJGRlZm5bJ2xlbmd0aCddICk7CgkgIGJyZWFrOwoKCWNhc2UgMTogLy8gY2hlY2tib3gKCSAgJG9uZXJvdy0+Y29udHJvbCA9IG15Q3JlYXRlSW5wdXRDaGVja2JveCggJGlkLCAnaW5wdXRfJy4kcmVsblsnbmFtZSddLCAxLCAkdmFsICk7CgkgIGJyZWFrOwoKCWNhc2UgMjogLy8gZW1haWwKCSAgJG9uZXJvdy0+Y29udHJvbCA9ICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoICRpZCwgJ2lucHV0XycuJHJlbG5bJ25hbWUnXSwKCQkJCQkJICAgICAkdmFsLCAkZGVmblsnbGVuZ3RoJ10sICRkZWZuWydsZW5ndGgnXSApOwoJICBicmVhazsKCX0KCiAgICAgIGFycmF5X3B1c2goICRyb3dhcnJheSwgJG9uZXJvdyApOwogICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdyZWd1c2VyJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGUnLCR0aGlzLT5MYW5nKCd1c2VyX3JlZ2lzdHJhdGlvbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCAnZ3JvdXBfaWQnLCAkZ3JwaWQgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NvbnRyb2xzJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY29udHJvbGNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3N1Ym1pdCcsJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignY2FuY2VsJywkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCdjYW5jZWwnLAoJCQkJCQkJICAgICR0aGlzLT5MYW5nKCdjYW5jZWwnKSkpOwoKICAgIC8vIHRvZG8sIHB1dCB0aGlzIGludG8gdGhlIGRhdGFiYXNlIGFuZCBsZXQgdGhlIGFkbWluIHBsYXkgd2l0aCBpdC4KICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnc2VsZnJlZ19yZWcxdGVtcGxhdGUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVc2VyRGlzcGxheVZlcmlmaWNhdGlvbkZvcm0oJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfVXNlckRpc3BsYXlWZXJpZmljYXRpb25Gb3JtKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snZXJyb3InXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlcnJvcicsICRwYXJhbXNbJ2Vycm9yJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ21lc3NhZ2UnXSApICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdtZXNzYWdlJywgJHBhcmFtc1snbWVzc2FnZSddKTsKICAgICAgfQoKICAgICR1c2VybmFtZSA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF91c2VybmFtZSddICkgKQogICAgICB7CgkkdXNlcm5hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10pOwogICAgICB9CiAgICAkcGFzc3dvcmQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcGFzc3dvcmQnXSApICkKICAgICAgewoJJHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddKTsKICAgICAgfQogICAgJGNvZGUgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfY29kZSddICkgKQogICAgICB7CgkkY29kZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfY29kZSddKTsKICAgICAgfQogICAgJGdyb3VwX2lkID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2dyb3VwX2lkJ10gKSApCiAgICAgIHsKCSRncm91cF9pZCA9IHRyaW0oJHBhcmFtc1snaW5wdXRfZ3JvdXBfaWQnXSk7CiAgICAgIH0KCiAgICAvLyBwcm9jZXNzIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0aXRsZScsCgkJCSAgJHRoaXMtPkxhbmcoJ3RpdGxlX3ZlcmlmeXJlZ2lzdHJhdGlvbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VzZXJuYW1lJywKCQkJICAkdGhpcy0+TGFuZygndXNlcm5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VzZXJuYW1lJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfdXNlcm5hbWUnLAoJCQkJCQkgJHVzZXJuYW1lLCAzMCwgMzAgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkxhbmcoJ3Bhc3N3b3JkJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9wYXNzd29yZCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoJGlkLCdpbnB1dF9wYXNzd29yZCcsCgkJCQkJCSAkcGFzc3dvcmQsIDMwLCAzMCApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2NvZGUnLAoJCQkgICR0aGlzLT5MYW5nKCdjb2RlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF9jb2RlJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCRpZCwnaW5wdXRfY29kZScsCgkJCQkJCSAkY29kZSwgMzAsIDMwICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgkaWQsJ3N1Ym1pdCcsJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2NhbmNlbCcsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCRpZCwnY2FuY2VsJywkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0KCRpZCwgJ3ZlcmlmeXVzZXInLCAkcmV0dXJuaWQgKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwgJ2lucHV0X2dyb3VwX2lkJywgJGdyb3VwX2lkICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywKCQkJICAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpKTsKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnc2VsZnJlZ19yZWcydGVtcGxhdGUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBSZWdpc3RlclVzZXJTdGVwMSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9SZWdpc3RlclVzZXJTdGVwMSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBnbG9iYWwgJGdDbXM7CgogICAgJGZldXNlcnMgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0Zyb250RW5kVXNlcnMnKTsKICAgIGlmKCAhJGZldXNlcnMgKQogICAgICB7CgkvLyB0aGlzIGlzIHVnbHkgZm9yIHRoZSB1c2VyIHRvIHNlZQoJLy8gYnV0IGF0IGxlYXN0IHRoZSBhZG1pbiB3aWxsIGJlIGFibGUgdG8gZmlndXJlIGl0IG91dAoJLy8gdGhpcyBzaG91bGRuJ3QgaGFwcGVuIG9uY2UgdGhlIHVzZXIgaGFzIHNlZW4gdGhlIGZvcm0uCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJycsICRyZXR1cm5pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vZmV1c2Vyc21vZHVsZScpKTsKCXJldHVybjsKICAgICAgfQoKICAgICRjbXNtYWlsZXIgPSAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0NNU01haWxlcicpOwogICAgaWYoICEkY21zbWFpbGVyICkKICAgICAgewoJLy8gdGhpcyBpcyB1Z2x5IGZvciB0aGUgdXNlciB0byBzZWUKCS8vIGJ1dCBhdCBsZWFzdCB0aGUgYWRtaW4gd2lsbCBiZSBhYmxlIHRvIGZpZ3VyZSBpdCBvdXQKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAnJywgJHJldHVybmlkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9mZXVzZXJzbW9kdWxlJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIHBhcmFtZXRlcnMKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2dyb3VwX2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBDaGVjayB0byBlbnN1cmUgYWxsIHJlcXVpcmVkIGZpZWxkcyBoYXZlIHNvbWUgY29udGVudAogICAgLy8gYW5kIHZhbGlkYXRlIGVtYWlsIGZpZWxkcwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaGlkZGVuXy8nLCAka2V5ICkgKQoJewoJICAkcHJvcG5hbWUgPSBzdWJzdHIoJGtleSxzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRhcnIgPSBzcGxpdCgiOyIsJHBhcmFtc1ska2V5XSk7CgkgICRyZXF1aXJlZCA9ICRhcnJbM107CgkgIGlmKCAkcmVxdWlyZWQgPT0gMiAmJiAKCSAgICAgICghaXNzZXQoJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdKSB8fCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0gPT0gJycgKSApCgkgICAgewoJICAgICAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkgICAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfcmVxdWlyZWRmaWVsZCcsJHByb3BuYW1lKTsKCSAgICAgICR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJICAgIH0KCgkgIGlmKCAkYXJyWzFdID09ICcyJyApCgkgICAgewoJICAgICAgJHJlc3VsdCA9ICRmZXVzZXJzLT5Jc1ZhbGlkRW1haWxBZGRyZXNzKCAkcGFyYW1zWydpbnB1dF8nLiRwcm9wbmFtZV0sCgkJCQkJCSAgICAgICAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgnZG9fc210cF92YWxpZGF0ZV9lbWFpbCcpICk7CgkgICAgICBpZiggJHJlc3VsdFswXSA9PSBmYWxzZSApCgkJewoJCSAgJHBhcmFtc1snZXJyb3InXSA9IDE7CgkJICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkcmVzdWx0WzFdOwoJCSAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CgkJfQoJICAgIH0KCX0KICAgIH0KCiAgICAvLyBnZXQgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZAogICAgJHVzZXJuYW1lID0gJyc7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSR1c2VybmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSk7CiAgICAgIH0KICAgICRwYXNzd29yZCA9ICcnOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgKQogICAgICB7CgkkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgICB9CiAgICAkcmVwZWF0cGFzc3dvcmQgPSAnJzsKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmVwZWF0cGFzc3dvcmQnXSApICkKICAgICAgewoJJHJlcGVhdHBhc3N3b3JkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddKTsKICAgICAgfQoKICAgIC8vIGNoZWNrIGlmIHRoZSB1c2VybmFtZSBpcyB2YWxpZCBvciB0YWtlbgogICAgaWYoICR1c2VybmFtZSA9PSAnJyApCiAgICAgIHsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2VtcHR5dXNlcm5hbWUnKTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICAkbWludW5sZW4gPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgnbWluX3VzZXJuYW1lbGVuZ3RoJyk7CiAgICAkbWF4dW5sZW4gPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgnbWF4X3VzZXJuYW1lbGVuZ3RoJyk7CiAgICBpZiggc3RybGVuKCR1c2VybmFtZSkgPCAkbWludW5sZW4gfHwgc3RybGVuKCR1c2VybmFtZSkgPiAkbWF4dW5sZW4gKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkdXNlcm5hbWUnKTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICAkdWlkID0gJHRoaXMtPkdldFRlbXBVc2VySUQoJHVzZXJuYW1lKTsKICAgIGlmKCAkdWlkICE9IGZhbHNlICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5hbWV0YWtlbicpOwoJJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGlmKCAkZmV1c2Vycy0+R2V0VXNlcklEKCR1c2VybmFtZSkgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl91c2VybmFtZXRha2VuJyk7CgkkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGNoZWNrIGlmIHRoZSBwYXNzd29yZHMgbWF0Y2ggb3IgaWYgdGhleSdyZSB2YWxpZAogICAgaWYoICRwYXNzd29yZCAhPSAkcmVwZWF0cGFzc3dvcmQgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9wYXNzd29yZHNkb250bWF0Y2gnKTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CiAgICAkbWlucHdsZW4gPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgnbWluX3Bhc3N3b3JkbGVuZ3RoJyk7CiAgICAkbWF4cHdsZW4gPSAkZmV1c2Vycy0+R2V0UHJlZmVyZW5jZSgnbWF4X3Bhc3N3b3JkbGVuZ3RoJyk7CiAgICBpZiggc3RybGVuKCRwYXNzd29yZCkgPCAkbWlucHdsZW4gfHwgc3RybGVuKCRwYXNzd29yZCkgPiAkbWF4cHdsZW4gKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkcGFzc3dvcmQnKTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZmluZCBhbiBlbWFpbCBmaWVsZC4uLiBzb21ldGhpbmcgdGhhdCdzIG5hbWUgaGFzIGVtYWlsIGluIGl0CiAgICAvLyBvciBpcyBvZiB0eXBlIDIKICAgICRlbWFpbF9maWVsZCA9ICcnOwogICAgZm9yZWFjaCggJHBhcmFtcyBhcyAka2V5ID0+ICR2YWwgKQogICAgewogICAgICBpZiggcHJlZ19tYXRjaCggJy9eaGlkZGVuXy8nLCAka2V5ICkgKQoJewoJICAkcHJvcG5hbWUgPSBzdWJzdHIoJGtleSxzdHJsZW4oJ2hpZGRlbl8nKSk7CgkgICRhcnIgPSBzcGxpdCgiOyIsJHBhcmFtc1ska2V5XSk7CgoJICBpZiggcHJlZ19tYXRjaCgnL2VtYWlsL2knLCRhcnJbMF0pIHx8ICRhcnJbMV0gPT0gMiApCgkgICAgewoJICAgICAgLy8gZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gZW1haWwgZmllbGQKCSAgICAgICRlbWFpbF9maWVsZCA9ICdpbnB1dF8nLiRwcm9wbmFtZTsKCSAgICAgIGJyZWFrOwoJICAgIH0KCX0KICAgIH0gICAgCiAgICBpZiggJGVtYWlsX2ZpZWxkID09ICcnICkKICAgICAgewoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3Jfbm9lbWFpbGFkZHJlc3MnKTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZ2VuZXJhdGUgYSB1bmlxdWUgY29kZSB0aGF0IHRoZSB1c2VyIGNhbiBlbnRlciB0byBkb3VibGUgY29uZmlybQogICAgLy8gaGlzIGxvZ2luLgogICAgJGNvZGUgPSAkZmV1c2Vycy0+R2VuZXJhdGVSYW5kb21QcmludGFibGVTdHJpbmcoKTsKCiAgICAvLyBoYXZlIHRvIGFkZCB0aGUgcmVjb3JkIHRvIHRoZSBkYXRhYmFzZSBzbyB0aGF0IHdlIGtub3cgd2hvIHRoaXMgZ3V5IGlzCiAgICAvLyB3aGVuIGhlIGNvbWVzIGJhY2sKICAgICRyZXR1cm4gPSAkdGhpcy0+Q3JlYXRlVGVtcFVzZXIoICRwYXJhbXNbJ2dyb3VwX2lkJ10sICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkY29kZSApOwogICAgaWYoICRyZXR1cm5bMF0gPT0gZmFsc2UgKQogICAgICB7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXR1cm5bMV07CgkkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGFuZCBhZGQgaGlzIHByb3BlcnRpZXMgdG9vCiAgICAvLyBidXQgZmlyc3Qgd2UgcmVtb3ZlIHRoZSBvbmVzIHdlJ3ZlIGhhbmRsZWQgYWxyZWFkeQogICAgJHRtcHVpZCA9ICRyZXR1cm5bMV07CiAgICB1bnNldCgkcGFyYW1zWydpbnB1dF91c2VybmFtZSddICk7CiAgICB1bnNldCgkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICk7CiAgICB1bnNldCgkcGFyYW1zWydpbnB1dF9yZXBlYXRwYXNzd29yZCddICk7CiAgICB1bnNldCgkcGFyYW1zWydoaWRkZW5fdXNlcm5hbWUnXSApOwogICAgdW5zZXQoJHBhcmFtc1snaGlkZGVuX3Bhc3N3b3JkJ10gKTsKICAgIHVuc2V0KCRwYXJhbXNbJ2hpZGRlbl9yZXBlYXRwYXNzd29yZCddICk7CiAgICBmb3JlYWNoKCAkcGFyYW1zIGFzICRrZXkgPT4gJHZhbCApCiAgICB7CiAgICAgIGlmKCBwcmVnX21hdGNoKCAnL15oaWRkZW5fLycsICRrZXkgKSApCgl7CgkgICRwcm9wbmFtZSA9IHN1YnN0cigka2V5LHN0cmxlbignaGlkZGVuXycpKTsKCSAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdICkgKSAKCSAgICB7CgkgICAgICBjb250aW51ZTsKCSAgICB9CgkgICRyZXR1cm4gPSAkdGhpcy0+QWRkVGVtcFVzZXJQcm9wZXJ0eSggJHRtcHVpZCwgJHByb3BuYW1lLCAKCQkJCQkJJHBhcmFtc1snaW5wdXRfJy4kcHJvcG5hbWVdICk7CgkgIGlmKCAkcmV0dXJuWzBdID09IGZhbHNlICkKCSAgICB7CgkgICAgICAvLyBub3cgd2UgaGF2ZSBhbiBpc3N1ZSB0byBmaWd1cmUgb3V0CgkgICAgICAkcGFyYW1zWydlcnJvciddID0gMTsKCSAgICAgICRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXR1cm5bMV07CgkgICAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKCSAgICAgIHJldHVybjsKCSAgICB9Cgl9CiAgICB9CiAgICAKICAgIC8vIG9rYXksIHdlJ3JlIG5vdyByZWFkeSB0byBzZW5kIHRoZSBlbWFpbCwgeWFob28sIHlhaG9vLCB5YWhvbwogICAgLy8gbm93IHdlIGhhdmUgdG8gZGVjaWRlIHdoYXQgZ29lcyBpbiBpdC4KICAgICRjbXNtYWlsZXItPkFkZEFkZHJlc3MoICRwYXJhbXNbJGVtYWlsX2ZpZWxkXSApOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1lJywkdXNlcm5hbWUpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjb2RlJywkY29kZSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NpdGVuYW1lJywgJGdDbXMtPmNvbmZpZ1sncm9vdF91cmwnXSk7CiAgICAkcGFybXMgPSBhcnJheSggJ21vZGUnID0+ICd2ZXJpZnknLAoJCSAgICAnaW5wdXRfdXNlcm5hbWUnID0+ICR1c2VybmFtZSwKCQkgICAgJ2lucHV0X2dyb3VwX2lkJyA9PiAkcGFyYW1zWydncm91cF9pZCddLAoJCSAgICAnaW5wdXRfY29kZScgPT4gJGNvZGUgKTsKICAgICRsaW5rID0gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCdkZWZhdWx0JywkcmV0dXJuaWQsJycsJHBhcm1zLCcnLHRydWUpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdsaW5rJywkdGhpcy0+Q3JlYXRlTGluaygkaWQsJ2RlZmF1bHQnLCRyZXR1cm5pZCwkbGluaywkcGFybXMsJycpKTsKICAgICRib2R5ID0gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhYmFzZSgnc2VsZnJlZ19lbWFpbGNvbmZpcm1fdGVtcGxhdGUnKTsKICAgICRjbXNtYWlsZXItPlNldEJvZHkoICRib2R5ICk7CiAgICAkY21zbWFpbGVyLT5Jc0hUTUwodHJ1ZSk7ICAvLyB3ZSdyZSBzZW5kaW5nIGFuIGh0bWwgbWFpbAogICAgJGNtc21haWxlci0+U2V0U3ViamVjdCgkdGhpcy0+TGFuZygncmVnaXN0cmF0aW9uX2NvbmZpcm1hdGlvbicpKTsKICAgICRjbXNtYWlsZXItPlNlbmQoKTsKCiAgICAvLyB3ZSdyZSBub3QgcmVkaXJlY3RpbmcgYW55d2hlcmUgd2UgbmVlZCB0byBkaXNwbGF5IHNvbWUgbmljZSBtZXNzYWdlCiAgICAvLyBhYm91dCB3ZSBqdXN0IHNwYW1tZWQgeW91ciBpbmJveCwgZXRjLCBldGMuCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZXJuYW1lJywkdXNlcm5hbWUpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbWFpbCcsICRwYXJhbXNbJGVtYWlsX2ZpZWxkXSApOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlKCdzZWxmcmVnX3Bvc3RyZWcxX3RlbXBsYXRlJyk7CiAgfQoKCiAgZnVuY3Rpb24gbXlHZXRQYWdlTmFtZSggJGFsaWFzb3JpZCApCiAgewogICAgJG9iaiA9IENvbnRlbnRNYW5hZ2VyOjpMb2FkUGFnZUZyb21BbGlhcyggJGFsaWFzb3JpZCApOwogICAgcmV0dXJuICRvYmotPk5hbWUoKTsKICB9CgogIGZ1bmN0aW9uIG15UmVkaXJlY3RUb1RhYiggJGlkLCAkdGFiLCAkcGFyYW1zID0gJycgKQogIHsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggaXNfYXJyYXkoICRwYXJhbXMgKSApCiAgICAgIHsKCSRwYXJtcyA9ICRwYXJhbXM7CiAgICAgIH0KICAgICRwYXJtc1snYWN0aXZlX3RhYiddID0gJHRhYjsKICAgICR0aGlzLT5teVJlZGlyZWN0KCAkaWQsICdkZWZhdWx0YWRtaW4nLCAkcGFybXMgKTsKICB9CgoKICBmdW5jdGlvbiBteVJlZGlyZWN0KCAkaWQsICRhY3Rpb24sICRwYXJhbXMgPSAnJyApCiAgewogICAgdW5zZXQoICRwYXJhbXNbJ2FjdGlvbiddICk7CiAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJycsICRwYXJhbXMgKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZXRBZG1pblByZWZlcmVuY2VzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX1NldEFkbWluUHJlZmVyZW5jZXMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmVhbGwnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZU9sZFRlbXBVc2VycygnLTUgeWVhcnMnKTsKCXJldHVybjsKICAgICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfcmVtb3ZlMXdlZWsnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZU9sZFRlbXBVc2VycygnLTEgd2VlaycpOwoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdwcmVmcycpOwogICAgICB9CgogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9yZW1vdmUxbW9udGgnXSApICkKICAgICAgewoJJHRoaXMtPkV4cGlyZU9sZFRlbXBVc2VycygnLTEgbW9udGgnKTsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAncHJlZnMnKTsKICAgICAgfQoKICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfbm90aWZ5J10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdub3RpZnlfb25fcmVnaXN0cmF0aW9uJywKCQkJICAgICAkcGFyYW1zWydpbnB1dF9ub3RpZnknXSk7CiAgICAgIH0KICAgIGlmKCBpc3NldCggJHBhcmFtc1snaW5wdXRfZW1haWxfY29uZmlybWF0aW9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdyZXF1aXJlX2VtYWlsX2NvbmZpcm1hdGlvbicsCgkJCSAgICAgJHBhcmFtc1snaW5wdXRfZW1haWxfY29uZmlybWF0aW9uJ10pOwogICAgICB9CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2NvbmZpcm1tYWlsX3RvJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRQcmVmZXJlbmNlKCdzZW5kX2VtYWlsc190bycsCgkJCSAgICAgJHBhcmFtc1snaW5wdXRfY29uZmlybW1haWxfdG8nXSk7CiAgICAgIH0KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ3ByZWZlcmVuY2VzJyApOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgU2V0QWRtaW5SZWcxVGVtcGxhdGUoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfU2V0QWRtaW5SZWcxVGVtcGxhdGUoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydkZWZhdWx0YnV0dG9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSggJ3NlbGZyZWdfcmVnMXRlbXBsYXRlJywKCQkJICAgICR0aGlzLT5kZmx0X3JlZ2lzdHJhdGlvbjFfdGVtcGxhdGUgKTsKCSR0aGlzLT5TZXRUZW1wbGF0ZSggJ3NlbGZyZWdfcG9zdHJlZzFfdGVtcGxhdGUnLAoJCQkgICAgJHRoaXMtPmRmbHRfcG9zdHJlZzFfdGVtcGxhdGUgKTsKICAgICAgfQogICAgZWxzZSBpZiggaXNzZXQoICRwYXJhbXNbJ3JlZzFfdGVtcGxhdGVjb250ZW50J10gKSB8fAoJICAgICBpc3NldCggJHBhcmFtc1sncG9zdHJlZzFfdGVtcGxhdGVjb250ZW50J10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSggJ3NlbGZyZWdfcmVnMXRlbXBsYXRlJywKCQkJICAgICRwYXJhbXNbJ3JlZzFfdGVtcGxhdGVjb250ZW50J10gKTsKCSR0aGlzLT5TZXRUZW1wbGF0ZSggJ3NlbGZyZWdfcG9zdHJlZzFfdGVtcGxhdGUnLAoJCQkgICAgJHBhcmFtc1sncG9zdHJlZzFfdGVtcGxhdGVjb250ZW50J10gKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAncmVnMXRlbXBsYXRlJyApOwogIH0KCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgU2V0QWRtaW5SZWcyVGVtcGxhdGUoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfU2V0QWRtaW5SZWcyVGVtcGxhdGUoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydkZWZhdWx0YnV0dG9uJ10gKSApCiAgICAgIHsKCSR0aGlzLT5TZXRUZW1wbGF0ZSggJ3NlbGZyZWdfcmVnMnRlbXBsYXRlJywKCQkJICAgICR0aGlzLT5kZmx0X3JlZ2lzdHJhdGlvbjJfdGVtcGxhdGUgKTsKICAgICAgfQogICAgZWxzZSBpZiggaXNzZXQoICRwYXJhbXNbJ3RlbXBsYXRlY29udGVudCddICkgKQogICAgICB7CgkkdGhpcy0+U2V0VGVtcGxhdGUoICdzZWxmcmVnX3JlZzJ0ZW1wbGF0ZScsCgkJCSAgICAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSApOwogICAgICB9CiAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCAkaWQsICdyZWcydGVtcGxhdGUnICk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZXRBZG1pbkVtYWlsQ29uZmlybWF0aW9uVGVtcGxhdGUoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfU2V0QWRtaW5FbWFpbENvbmZpcm1UZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRidXR0b24nXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCAnc2VsZnJlZ19lbWFpbGNvbmZpcm1fdGVtcGxhdGUnLAoJCQkgICAgJHRoaXMtPmRmbHRfZW1haWxjb25maXJtX3RlbXBsYXRlICk7CiAgICAgIH0KICAgIGVsc2UgaWYoIGlzc2V0KCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCAnc2VsZnJlZ19lbWFpbGNvbmZpcm1fdGVtcGxhdGUnLAoJCQkgICAgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50J10gKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAnZW1haWxjb25maXJtX3RlbXBsYXRlJyApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFNldEFkbWluRmluYWxNZXNzYWdlVGVtcGxhdGUoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfU2V0QWRtaW5GaW5hbE1lc3NhZ2VUZW1wbGF0ZSggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2RlZmF1bHRidXR0b24nXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCAnc2VsZnJlZ19maW5hbG1lc3NhZ2VfdGVtcGxhdGUnLAoJCQkgICAgJHRoaXMtPmRmbHRfZmluYWxtZXNzYWdlX3RlbXBsYXRlICk7CiAgICAgIH0KICAgIGVsc2UgaWYoIGlzc2V0KCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSApICkKICAgICAgewoJJHRoaXMtPlNldFRlbXBsYXRlKCAnc2VsZnJlZ19maW5hbG1lc3NhZ2VfdGVtcGxhdGUnLAoJCQkgICAgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50J10gKTsKICAgICAgfQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAnZmluYWxtZXNzYWdlX3RlbXBsYXRlJyApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9WZXJpZnlVc2VyKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX1ZlcmlmeVVzZXIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgZ2xvYmFsICRnQ21zOwoKICAgIC8vIHNldCB0aGUgbW9kZSBzbyB3ZSBnZXQgc2VudCBiYWNrIHRvIHRoZSByaWdodCBmb3JtIGlmIHdlIGhhdmUgdG8gCiAgICAvLyByZWRpcmVjdC4KICAgICRwYXJhbXNbJ21vZGUnXSA9ICd2ZXJpZnknOwoKICAgIC8vIG5vdyBhbGwgd2UgaGF2ZSB0byBkbyBpcyBnZXQgdGhlIHVzZXJuYW1lLCBjb2RlLCBhbmQgcGFzc3dvcmQKICAgIC8vIGFuZCBtYWtlIHN1cmUgaXQgYWxsIG1hdGNoZXMKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2lucHV0X3VzZXJuYW1lJ10gKSApCiAgICAgIHsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9taXNzaW5ndXNlcm5hbWUnKTsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CiAgICAgIH0KICAgICR1c2VybmFtZSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdXNlcm5hbWUnXSk7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydpbnB1dF9wYXNzd29yZCddICkgKQogICAgICB7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ3Bhc3N3b3JkJyk7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CiAgICAkcGFzc3dvcmQgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3Bhc3N3b3JkJ10pOwogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfY29kZSddICkgKQogICAgICB7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfbWlzc2luZ2NvZGUnKTsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CiAgICAgIH0KICAgICRjb2RlID0gdHJpbSgkcGFyYW1zWydpbnB1dF9jb2RlJ10pOwogICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfZ3JvdXBfaWQnXSApICkKICAgICAgewoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX21pc3Npbmdncm91cCcpOwoJJHBhcmFtc1snZXJyb3InXSA9IDE7CgkkdGhpcy0+UmVkaXJlY3QoICRpZCwgJ2RlZmF1bHQnLCAkcmV0dXJuaWQsICRwYXJhbXMgKTsKICAgICAgfQogICAgJGdyb3VwX2lkID0gdHJpbSgkcGFyYW1zWydpbnB1dF9ncm91cF9pZCddKTsKCiAgICAvLyBub3cgZ2V0IHRoZSBkZXRhaWxzIG91dCBvZiB0aGUgZGF0YWJhc2UgZm9yIHRocyB1c2VyCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3VzZXJzCiAgICAgICAgICBXSEVSRSB1c2VybmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICR1c2VybmFtZSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9kYmVycm9yJyk7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CiAgICBpZiggJGRicmVzdWx0LT5Sb3dDb3VudCgpICE9IDEgKQogICAgICB7CgkkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnZXJyb3JfdXNlcm5vdGZvdW5kJyk7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CiAgICAKICAgICR0bXB1c2VyID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoIG1kNSgkcGFzc3dvcmQpICE9ICR0bXB1c2VyWydwYXNzc3dvcmQnXSApCiAgICAgIHsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9wYXNzd29yZHNkb250bWF0Y2gnKTsKCSRwYXJhbXNbJ2Vycm9yJ10gPSAxOwoJJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CglyZXR1cm47CiAgICAgIH0KICAgIGlmKCAkY29kZSAhPSAkdG1wdXNlclsnY29kZSddICkKICAgICAgewoJJHBhcmFtc1snbWVzc2FnZSddID0gJHRoaXMtPkxhbmcoJ2Vycm9yX2NvZGVzZG9udG1hdGNoJyk7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CgogICAgLy8geWFob28sIGV2ZXJ5dGhpbmcgbWF0Y2hlcy4uLi4gbm93IHdlIGNyZWF0ZSBhIHJlYWwgdXNlciBhY2NvdW50CiAgICAvLyBhbmQgdGhlbiByZW1vdmUgaGltIGZyb20gdGhpcyBvbmUsIGFuZCBkaXNwbGF5IGEgbmVhdCBtZXNzYWdlCiAgICAkZmV1c2VycyA9ICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRnJvbnRFbmRVc2VycycpOwogICAgaWYoICEkZmV1c2VycyApCiAgICAgIHsKCS8vIHRoaXMgaXMgdWdseSBmb3IgdGhlIHVzZXIgdG8gc2VlCgkvLyBidXQgYXQgbGVhc3QgdGhlIGFkbWluIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUgaXQgb3V0CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJycsICRyZXR1cm5pZCwKCQkJCSAgJHRoaXMtPkxhbmcoJ2Vycm9yX25vZmV1c2Vyc21vZHVsZScpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHRvZG8sIGZpZ3VyZSBvdXQgd2hlbiB1c2VycyBzaG91bGQgZXhwaXJlCiAgICAkZXhwaXJlcyA9IHN0cnRvdGltZSgnKzUgeWVhcnMnKTsKICAgICRyZXN1bHQgPSAkZmV1c2Vycy0+QWRkVXNlciggJHVzZXJuYW1lLCAkcGFzc3dvcmQsICRleHBpcmVzICk7CiAgICBpZiggJHJlc3VsdFswXSA9PSBmYWxzZSApCiAgICAgIHsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICRyZXN1bHRbMV07CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwoJcmV0dXJuOwogICAgICB9CgogICAgJHVpZCA9ICRyZXN1bHRbMV07CiAgICAkZ2lkID0gJHRoaXMtPkdldFByZWZlcmVuY2UoJ2RlZmF1bHRfZ3JvdXAnLCAtMSk7CiAgICBpZiggJGdpZCAhPSAtMSApCiAgICAgIHsKCS8vIGEgZGVmYXVsdCBncm91cCBpcyByZXF1aXJlZCwKCS8vIHNvIGFkZCBoaW0gdG8gdGhhdCBncm91cAoJaWYoICEkZmV1c2Vycy0+QXNzaWduVXNlclRvR3JvdXAoICR1aWQsICRnaWQgKSApCgkgIHsKCSAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnd2FybmluZ19jb3VsZG5vdGFkZGdyb3VwJyk7CgkgICAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0KCiAgICAvLyBhbmQgYWRkIHRoZSB1c2VyIHRvIHdoYXRldmVyIGdyb3VwIHNwZWNpZmllZCBpbiB0aGUgZ3JvdXBzIHBhcmFtZXRlcgogICAgaWYoICRncm91cF9pZCApCiAgICAgIHsKCWlmKCAhJGZldXNlcnMtPkFzc2lnblVzZXJUb0dyb3VwKCAkdWlkLCAkZ3JvdXBfaWQgKSApCgkgIHsKCSAgICAkcGFyYW1zWydtZXNzYWdlJ10gPSAkdGhpcy0+TGFuZygnd2FybmluZ19jb3VsZG5vdGFkZGdyb3VwJyk7CgkgICAgJHRoaXMtPlJlZGlyZWN0KCAkaWQsICdkZWZhdWx0JywgJHJldHVybmlkLCAkcGFyYW1zICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0gICAgCgogICAgLy8gaGUncyBpbi4uLi4gaGUncyBpbi4uLiBub3cganVzdCBhZGQgaGlzIHByb3BlcnRpZXMKICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3Byb3BlcnRpZXMKICAgICAgICAgIFdIRVJFIHVzZXIgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdG1wdXNlclsnaWQnXSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCSRwYXJhbXNbJ21lc3NhZ2UnXSA9ICR0aGlzLT5MYW5nKCdlcnJvcl9kYmVycm9yJyk7CgkkcGFyYW1zWydlcnJvciddID0gMTsKCSR0aGlzLT5SZWRpcmVjdCggJGlkLCAnZGVmYXVsdCcsICRyZXR1cm5pZCwgJHBhcmFtcyApOwogICAgICB9CiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCiAgICAgIHsKCSRmZXVzZXJzLT5TZXRVc2VyUHJvcGVydHlGdWxsKCAkcm93Wyd0aXRsZSddLCAkcm93WydkYXRhJ10sICR1aWQgKTsKICAgICAgfQoKICAgIC8vIHdvb2hvb28sIHRoZSB1c2VyIGJlIGNyZWF0ZWQgKGhvcGVmdWxseSkuCiAgICAvLyBkZWxldGUgdGhlIHJlY29yZHMgZnJvbSB0aGUgU2VsZlJlZyB0YWJsZXMKICAgICR0aGlzLT5EZWxldGVUZW1wVXNlclByb3BlcnRpZXMoICR0bXB1c2VyWydpZCddICk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcFVzZXIoICR0bXB1c2VyWydpZCddICk7CgogICAgLy8gbm93IGRpc3BsYXkgYSB3YXJtIGZ1enp5IG1lc3NhZ2UsIGFuZCBub3RpZnkgdGhlIGFkbWluCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3VzZXJuYW1lJywgJHVzZXJuYW1lICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3NpdGVuYW1lJywgJGdDbXMtPmNvbmZpZ1sncm9vdF91cmwnXSk7CiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ3NlbGZyZWdfZmluYWxtZXNzYWdlX3RlbXBsYXRlJyk7CgogICAgLy8gYW5kIG5vdGlmeSB0aGUgYWRtaW5pc3RyYXRvcgogICAgLy8gaWYgdGhlIGFkbWluIHdhbnRzIG5vdGlmaWNhdGlvbnMuCiAgICAvLyBvZmYgd2UgZ28uCiAgICBpZiggISR0aGlzLT5HZXRQcmVmZXJlbmNlKCdub3RpZnlfb25fcmVnaXN0cmF0aW9uJykgKQogICAgICB7CglyZXR1cm47CiAgICAgIH0KCiAgICAkY21zbWFpbGVyID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdDTVNNYWlsZXInKTsKICAgIGlmKCAhJGNtc21haWxlciApCiAgICAgIHsKCS8vIHRoaXMgaXMgdWdseSBmb3IgdGhlIHVzZXIgdG8gc2VlCgkvLyBidXQgYXQgbGVhc3QgdGhlIGFkbWluIHdpbGwgYmUgYWJsZSB0byBmaWd1cmUgaXQgb3V0CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAkdGhpcy0+TGFuZygnZXJyb3Jfbm9mZXVzZXJzbW9kdWxlJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgJGNtc21haWxlci0+QWRkQWRkcmVzcygkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc2VuZF9lbWFpbHNfdG8nKSk7CiAgICAkY21zbWFpbGVyLT5TZXRTdWJqZWN0KCdBIG5ldyB1c2VyIGhhcyByZWdpc3RlcmVkIG9uICcuJGdDbXMtPmNvbmZpZ1sncm9vdF91cmwnXSk7CiAgICAkbXNnID0gJ0EgbmV3IHVzZXIgKCcuJHVzZXJuYW1lLicpIGhhcyBjb21wbGV0ZWQgcmVnaXN0cmF0aW9uIHRvIHlvdXIgc2l0ZS4geW91IHNob3VsZCBjaGVjayB0aGlzIHVzZXIgb3V0IGFuZCB2YWxpZGF0ZSB0aGF0IHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlZCBpcyBhcyBjb21wbGV0ZSBhbmQgdmFsaWQgYXMgcG9zc2libGUuJzsKICAgICRjbXNtYWlsZXItPlNldEJvZHkoJG1zZyk7ICAKICAgICRjbXNtYWlsZXItPklzSFRNTChmYWxzZSk7IC8vIHdlJ3JlIHNlbmRpbmcgYW4gaHRtbCBtYWlsCiAgICAkY21zbWFpbGVyLT5TZW5kKCk7CiAgfSAKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLyBBUEkgRlVOQ1RJT05TCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gQWRkVGVtcFVzZXJQcm9wZXJ0eSggJHVpZCwgJHByb3BuYW1lLCAkcHJvcHZhbHVlICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRpZCA9ICRkYi0+R2VuSUQoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ191c2Vyc19zZXEiKTsKICAgICRxID0gIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ19wcm9wZXJ0aWVzCiAgICAgICAgICBWQUxVRVMgKD8sPyw/LD8pIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkaWQsICR1aWQsICRwcm9wbmFtZSwgJHByb3B2YWx1ZSApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSk7CiAgfQoKCiAgZnVuY3Rpb24gQ291bnRUZW1wVXNlcnMoKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHEgPSAiU0VMRUNUIGNvdW50KCopIGFzIGNvdW50IEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3VzZXJzIjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuICRyb3dbJ2NvdW50J107CiAgfQoKCiAgZnVuY3Rpb24gQ3JlYXRlVGVtcFVzZXIoICRnaWQsICR1c2VybmFtZSwgJHBhc3N3b3JkLCAkY29kZSApCiAgewogICAgCiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgIGlmKCAkdXNlcm5hbWUgPT0gJycgfHwgJHBhc3N3b3JkID09ICcnICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgLy8gZ2V0IGFuIGlkCiAgICAkaWQgPSAkZGItPkdlbklEKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NlbGZyZWdfdXNlcnNfc2VxIik7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NlbGZyZWdfdXNlcnMKICAgICAgICAgIFZBTFVFUyAoPyw/LD8sPyw/LD8pIjsgCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkLCAkZ2lkLCAkdXNlcm5hbWUsIG1kNSgkcGFzc3dvcmQpLCAkY29kZSwKCQkJCQkgJGRiLT5EQlRpbWVTVGFtcCh0aW1lKCkpKSk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKCXJldHVybiBhcnJheShGQUxTRSwkZGItPkVycm9yTXNnKCkpOwogICAgICB9CiAgICByZXR1cm4gYXJyYXkoVFJVRSwkaWQpOwogIH0KCgogIGZ1bmN0aW9uIEV4cGlyZU9sZFRlbXBVc2VycygkZXhwaXJ5Y29kZSkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRleHBpcmVzID0gJGRiLT5EYlRpbWVTdGFtcChzdHJ0b3RpbWUoICRleHBpcnljb2RlICkpOwogICAgLy8gZmluZCBhbGwgdGhlIHVzZXIgaWQncyB0aGF0IG1hdGNoCiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ191c2VycwogICAgICAgICAgV0hFUkUgY3JlYXRlZGF0ZSA+ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcSwgYXJyYXkoICRleHBpcmVzICkgKTsgCiAgICB3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApIAogICAgICB7CgkvLyB0aGVuIGRlbGV0ZSB0aGVpciBwcm9wZXJ0aWVzCgkkcTIgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3Byb3BlcnRpZXMKICAgICAgICAgICAgIFdIRVJFIHVzZXIgPSA/IjsKCSRkYnJlc3VsdDIgPSAkZGItPkV4ZWN1dGUoICRxMiwgYXJyYXkoICRyb3dbJ2lkJ10gKSApOwogICAgICB9CgogICAgLy8gdGhlbiBkZWxldGUgdGhlbQogICAgJHEgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9zZWxmcmVnX3VzZXJzCiAgICAgICAgICBXSEVSRSBjcmVhdGVkYXRlID4gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGV4cGlyZXMgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIERlbGV0ZVRlbXBVc2VyKCAkdWlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKICAgICRxID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfc2VsZnJlZ191c2VycwogICAgICAgICAgV0hFUkUgaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCR1aWQpICk7CiAgICBpZiggISRkYnJlc3VsdCApIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIGZ1bmN0aW9uIERlbGV0ZVRlbXBVc2VyUHJvcGVydGllcyggJHVpZCApCiAgewogICAgJGRiID0gJHRoaXMtPkdldERiKCk7CiAgICAkcSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NlbGZyZWdfcHJvcGVydGllcyAKICAgICAgICAgIFdIRVJFIHVzZXIgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkdWlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKCiAgZnVuY3Rpb24gR2V0VGVtcFVzZXJJRCggJHVzZXJuYW1lICkKICB7CiAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICBpZiggJHVzZXJuYW1lID09ICcnICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgJHEgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3NlbGZyZWdfdXNlcnMgV0hFUkUKICAgICAgICAgIHVzZXJuYW1lID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJHVzZXJuYW1lICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJZWNobyAiREVCVUcgIi4kZGItPkVycm9yTXNnKCk7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICEkcm93ICkKICAgICAgewoJcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgcmV0dXJuICRyb3dbJ2lkJ107CiAgfQoKfQoKPz4K]]></data>
  </file>
  <file>
    <filename>templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>templates/prefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQo8dGFibGUgd2lkdGg9IjEwMCUiPgogIDx0cj4KICAgIDx0ZCB3aWR0aD0iNTAlIj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9ub3RpZnl9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X25vdGlmeX08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jb25maXJtbWFpbF90b306PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY29uZmlybW1haWxfdG99PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZW1haWxfY29uZmlybWF0aW9ufTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9lbWFpbF9jb25maXJtYXRpb259PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc3VibWl0fXskY2FuY2VsfTwvcD4KCTwvZGl2PgogICA8L3RkPgogICA8dGQgd2lkdGg9IjUwJSIgdmFsaWduPSJ0b3AiPgogICAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9udW1yZXNldHJlY29yZHN9PC9wPgoJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRkYXRhX251bXJlc2V0cmVjb3Jkc308L3A+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+Cgk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3JlbW92ZTF3ZWVrfXskaW5wdXRfcmVtb3ZlMW1vbnRofXskaW5wdXRfcmVtb3ZlYWxsfTwvcD4KICAgICAgPC9kaXY+CiAgIDwvdGQ+CiAgPC90cj4KPC90YWJsZT4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>templates/signup.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Key9pZn0KeyRzdGFydGZvcm19CntpZiAkY29udHJvbGNvdW50ID4gMH0KICA8Y2VudGVyPgogIDx0YWJsZSB3aWR0aD0iNzUlIj4Ke2ZvcmVhY2ggZnJvbT0kY29udHJvbHMgaXRlbT1jb250cm9sfQogIDx0cj4KICAgIDx0ZD57JGNvbnRyb2wtPmhpZGRlbn0KICAgIDxmb250IGNvbG9yPSJ7JGNvbnRyb2wtPmNvbG9yfSI+eyRjb250cm9sLT5wcm9tcHR9eyRjb250cm9sLT5tYXJrZXJ9PC9mb250PgogICAgPC90ZD4KICAgIDx0ZD57JGNvbnRyb2wtPmNvbnRyb2x9PC90ZD4KICA8L3RyPgp7L2ZvcmVhY2h9CiAgPC90YWJsZT4KICA8L2NlbnRlcj4KPGJyLz4Key9pZn0KeyRoaWRkZW59eyRoaWRkZW4yfXskYmFja317JHN1Ym1pdH17JGNhbmNlbH0KeyRlbmRmb3JtfQo=]]></data>
  </file>
</module>
