<?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>Uploads</name>
  <version>1.1.7</version>
  <description></description>
  <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[PD9waHAKJGxhbmdbJ2luZm9fZGVzdG5hbWUnXSA9ICdVc2UgdGhpcyBmaWVsZCB0byBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhlIGZpbGUgb24gdXBsb2FkJzsKJGxhbmdbJ2Vycm9yX25vbWFpbGVybW9kdWxlJ10gPSAnVGhlIENNU01haWxlciBtb2R1bGUgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCc7CiRsYW5nWyd1cGxvYWRfbm90aWZpY2F0aW9uJ10gPSAnQSBuZXcgZmlsZSBoYXMgYmVlbiB1cGxvYWRlZCc7CiRsYW5nWyd0aXRsZV9lbWFpbF9vbl91cGxvYWQnXSA9ICdTZW5kIHVwbG9hZCBub3RpZmljYXRpb24gdG86JzsKJGxhbmdbJ2VtYWlsX3RlbXBsYXRlJ10gPSAnRW1haWwgVGVtcGxhdGUnOwokbGFuZ1sndGl0bGVfZHVtbXlfaW5kZXhfaHRtbCddID0gJ0NyZWF0ZSBkdW1teSBpbmRleC5odG1sIGZpbGVzIGluIGVhY2ggZGlyZWN0b3J5Pzxici8+PGVtPkFueSBleGlzdGluZyBpbmRleC5odG1sIGZpbGVzIHdpbGwgcmVtYWluPC9lbT4nOwokbGFuZ1snYWJvdXQnXSA9ICdBYm91dCc7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICdBY2Nlc3MgRGVuaWVkLiBQbGVhc2UgY2hlY2sgeW91ciBwZXJtaXNzaW9ucy4nOwokbGFuZ1snYWRkY2F0ZWdvcnknXSA9ICdBZGQgQ2F0ZWdvcnknOwokbGFuZ1snYWxsJ10gPSAnQWxsJzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICdBcmUgWW91IFN1cmU/JzsKJGxhbmdbJ2F1dGhvciddID0gJ0F1dGhvcic7CiRsYW5nWydjYW5jZWwnXSA9ICdDYW5jZWwnOwokbGFuZ1snY2Fubm90bW9kaWZ5cGF0aCddID0gJyhUaGUgcGF0aCBjYW5ub3QgYmUgbW9kaWZpZWQpJzsKJGxhbmdbJ2NhdGVnb3JpZXMnXSA9ICdDYXRlZ29yaWVzJzsKJGxhbmdbJ2NhdGVnb3J5J10gPSAnQ2F0ZWdvcnknOwokbGFuZ1snY2hhbmdlbG9nJ10gPSAnPHVsPgo8bGk+VmVyc2lvbiAxLjAuICAtIFNlcHRlbWJlciAyMDA1LiBJbml0aWFsIFJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMS4wMS4gLSBTZXB0ZW1iZXIgMjAwNS4gTWlub3IgZml4ZXMuPC9saT4KPGxpPlZlcnNpb24gMS4wMi4gLSBTZXB0ZW1iZXIgMjAwNS4gQWRkZWQgYWJpbGl0eSB0byBzcGVjaWZ5IHNvcnQgb3JkZXI8L2xpPgo8bGk+VmVyc2lvbiAxLjAzLiAtIFNlcHRlbWJlciAyMDA1LiBGaXggcmVnYXJkaW5nIGNvbmZsaWN0IGluIHRlbXBsYXRlIG5hbWVzPC9saT4KPGxpPlZlcnNpb24gMS4wNC4gLSBTZXB0ZW1iZXIgMjAwNS4gQWRkZWQgYWJpbGl0eSB0byByZS1zY2FuIGEgZGlyZWN0b3J5LCBhbmQgdG8gdXBsb2FkIGZpbGVzIGZyb20gdGhlIGFkbWluIHBhZ2U8L2xpPgo8bGk+VmVyc2lvbiAxLjA1LiAtIFNlcHRlbWJlciAyMDA1LiBGaXhlZCBzb21lIFBIUCB2YXJpYWJsZSBpc3N1ZXM8L2xpPgo8bGk+VmVyc2lvbiAxLjA2LiAtIFNlcHRlbWJlciAyMDA1LiBBZGRlZCBhdXRob3IgZmllbGQgdG8gdGhlIGFkbWluIHBhbmVsIHVwbG9hZCBmb3JtLCBhZGRlZCBhIHN1bW1hcnkgZmllbGQsIGFuZCBtYWRlIGRlc2NyaXB0aW9uIGEgdGV4dCBhcmVhLCBhbmQgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIGRlc3RpbmF0aW9uIGZpbGUgbmFtZS9saT4KPGxpPlZlcnNpb24gMS4wNy4gLSBTZXB0ZW1iZXIgMjAwNS4gQWRkZWQgdGhlIGFiaWxpdHkgdG8gcmVuYW1lIGZpbGVzIGFuZCBmaXhlZCBhIHNjYW4gZXJyb3I8L2xpPgo8bGk+VmVyc2lvbiAxLjA4LiAtIFNlcHRlbWJlciAyMDA1LiBCZXR0ZXIgaGFuZGxpbmcgb2YgbmFtZXMgd2l0aCBzcGFjZXMsIGFuZCBhIGZldyBtaW5vciBlcnJvcnMgZml4ZWQuICBBZGRlZCBzd2VkaXNoIHRyYW5zbGF0aW9uICh0aGFua3Mgd2VzdGlzKTwvbGk+CjxsaT5WZXJzaW9uIDEuMS4wLiAtIE9jdG9iZXIgMjAwNQogPHVsPgogICA8bGk+TW9kaWZpZWQgQXR0ZW1wdFVwbG9hZCBmdW5jdGlvbiBzbyBpdCBjb3VsZCBiZSBjYWxsZWQgZXh0ZXJuYWxseTwvbGk+CiAgIDxsaT5BZGRlZCBHZXRVcGxvYWREZXRhaWxzIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbGwgb2YgdGhlIGRldGFpbHMgYWJvdXQgYSBtb2R1bGUsIGluY2x1ZGluZyBhIGxpbms8L2xpPgogICA8bGk+QWRkZWQgUmVkaXJlY3RzIHNvIHRoYXQgd29ya2luZyB3aXRoIHRoZSBtb2R1bGUgaXMgYWxvdCBuaWNlciwgaXQgcmV0dXJucyB0byB0aGUgcmlnaHQgdGFiPC9saT4KICAgPGxpPkNoYW5nZWQgdGhlIGZyb250IHRlbXBsYXRlIHRvIGxvb2sgYSBsaXR0bGUgYmV0dGVyIGFuZCBtYWtlIG1vcmUgc2Vuc2U8L2xpPgogICA8bGk+Rml4ZXMgdG8gdGhlIHVwbG9hZHMgc3R1ZmYgc28gdGhhdCB0aGUgZGVzY3JpcHRpb24gaXMgc2V0LCBhbmQgbmFtZSBhbmQgc3VtbWFyeSBhcmUgcHV0IGluIHRoZSByaWdodCBwbGFjZTwvbGk+CiAgIDxsaT5GaXhlcyB0byBldmVuIGJldHRlciBoYW5kbGUgc3BhY2VzIGluIG5hbWVzPC9saT4KICAgPGxpPk9wdGlvbmFseSBwbGFjZSBkdW1teSBpbmRleC5odG1sIGZpbGVzIGluIGVhY2ggdXBsb2FkIGRpcmVjdG9yeTwvbGk+CiAgIDxsaT5JZiBzcGVjaWZ5aW5nIGEgZGVzdGluYXRpb24gbmFtZSwgYW5kIG5vIGV4dGVuc2lvbiBpcyBnaXZlbiwgdGhlIGV4dGVuc2lvbiBvZiB0aGUgb3JpZ2luYXRpbmcgZmlsZSAoaWYgYW55IGV4aXN0cyBpcyB1c2VkPC9saT4KIDwvdWw+CiA8cD48ZW0+PGI+SW1wb3J0YW50ITwvYj48L2VtPjxici8+SXQgaXMgbm90IHBvc3NpYmxlIHRvIHVwZ3JhZGUgZnJvbSBhbnkgb3RoZXIgdmVyc2lvbiBvZiB0aGUgVXBsb2FkcyBtb2R1bGUgdG8gMS4xLjAuICBUaGlzIGlzIGR1ZSB0byBzb21lIGVycm9ycyB0aGF0IHdlcmUgbWFkZSBpbiB0aGUgZGF0YWJhc2Ugcm91dGluZXMsIGFuZCBldmVuIGluIHRoZSB1cGdyYWRlIHJvdXRpbmUgaW4gMS4wLjYuICBZb3UgbXVzdCBkZS1pbnN0YWxsIHRoZSBvbGQgdmVyc2lvbiwgYW5kIHRoZW4gcmUtaW5zdGFsbCB0aGUgbmV3IHZlcmVzaW9uLiBUaGlzIHdpbGwgY2F1c2Ugc2lnbmlmaWNhbnQgZGlmZmljdWx0eSBpZiB5b3UgaGF2ZSBkc2NyaXB0aW9ucywgZXRjLCBpbiB5b3VyIHRhYmxlczwvcD4KPC9saT4KPGxpPlZlcnNpb24gMS4xLjEuIC0gT2N0b2JlciwgMjAwNS4gRml4ZWQgYSBjb3VwbGUgb2YgbWlub3IgYnVncyBpbiB0aGUgR2V0VXBsb2FkRGV0YWlscyBhbmQgYWRkZWQgYW5vdGhlciBsaW5rIChvciBhIHVybCkgdG8gdGhlIHVwbG9hZGVkIGZpbGUuPC9saT4KPGxpPlZlcnNpb24gMS4xLjIuIC0gT2N0b2JlciwgMjAwNS4gRml4ZWQgdGhlIFVSTCBmaWVsZCBpbiBHZXRVcGxvYWREZXRhaWxzIHRvIHJldHVybiBhIGRvd25sb2FkIGxpbmsgYW5kIGFkZGVkIGFuIGFic3VybCBmaWVsZCB3aGljaCByZXR1cm5zIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSB3ZWJzZXJ2ZXIuICBDbGlja3Mgb24gdGhpcyBsaW5rIHdpbGwgbm90IGJlIGNvdW50ZWQ8L2xpPgo8bGk+VmVyc2lvbiAxLjEuMy4gLSBPY3RvYmVyLCAyMDA1LiBGaXhlZCB0aGUgdXBncmFkZSBwcm9ibGVtIGZyb20gdGhlIDEuMC54IHNlcmllcy4gIFVzZXJzIG9mIHRoZSAxLjAueCBzZXJpZXMgc2hvdWxkIGJlIGFibGUgdG8gdXBncmFkZSB0byAxLjEuMyBub3cgd2l0aCBubyBkaWZmaWN1bHR5LiA8Yj5UaG9zZSBhcmUgZmFtb3VzIGxhc3Qgd29yZHMsIHBsZWFzZSBiYWNrdXAgZmlyc3Q8L2I+LiBGaXhlZCB0aGUgY29udGVudCByZWRpcmVjdCB0aGluZ3MgdGhhdCB3ZXJlIGlycml0YXRpbmcgbWUuICBBbHNvIGFkZGVkIGNhdGVnb3J5PWFsbCB0byBsaXN0IGFsbCBvZiB0aGUgdXBsb2FkcyBpbiBhbGwgbGlzdGFibGUgY2F0ZWdvcmllcyA8ZW0+KGxldHMgYWxsIGhvcGUgSSBnb3QgdGhlIHNxbCBmaWd1cmVkIG91dCBwcm9wZXJseSk8L2VtPi48L2xpPgo8bGk+VmVyc2lvbiAxLjEuNC4gLSBPY3RvYmVyLCAyMDA1LiBBZGRlZCB0aGUgY291bnQgcGFyYW1ldGVyIHRvIGxpc3Qgb25seSB0aGUgZmlyc3QgTiByZWNvcmRzLCBhbmQgYWRkZWQgInN1bW1hcnlsaW5rIiwgYW5kICJjYXRlZ29yeSIgdG8gdGhlIHRlbXBsYXRlcyBmb3Igd2VzdGlzLiAgRm9yIGV4YW1wbGVzIG9uIGhvdyB0byB1c2UgdGhlbSByZXNldCB5b3VyIHRlbXBsYXRlcyBiYWNrIHRvIGRlZmF1bHQuPC9saT4KPGxpPlZlcnNpb24gMS4xLjUuIC0gTm92ZW1iZXIsIDIwMDUuIEFkZGVkIGVtYWlsIG5vdGlmaWNhdGlvbiBhbmQgc29tZSBidWcgZml4ZXM8L2xpPgo8bGk+VmVyc2lvbiAxLjEuNi4gLSBOb3ZlbWJlciwgMjAwNS4gQWRkZWQgYW4gYXBpIGZ1bmN0aW9uIGFuZCBmaXhlZCBzb21lIHJlZGlyZWN0aW9uIHN0dWZmPC9saT4KPGxpPlZlcnNpb24gMS4xLjcuIC0gTm92ZW1iZXIsIDIwMDUuIE1vcmUgQVBJIGZ1bmN0aW9ucywgYW5kIG5vdyBpZ25vcmUgZG90IGZpbGVzIHdoZW4gc2Nhbm5pbmcuICBFbWFpbCBub3RpZmljYXRpb24gaXMgbm93IGluLjwvbGk+CjwvdWw+JzsKJGxhbmdbJ2RhdGUnXSA9ICdEYXRlJzsKJGxhbmdbJ2RhdGV1cGxvYWRlZCddID0gJ0RhdGUgVXBsb2FkZWQnOwokbGFuZ1snZGVmYXVsdCddID0gJ0RlZmF1bHRzJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ0RlbGV0ZSc7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ2Rlc3RuYW1lJ10gPSAnVXBsb2FkIEFzJzsKJGxhbmdbJ2RldGFpbF90ZW1wbGF0ZSddID0gJ0RldGFpbCBUZW1wbGF0ZSc7CiRsYW5nWydkb3dubG9hZGVkJ10gPSAnRmlsZSAlcyB3YXMgZG93bmxvYWRlZC4nOwokbGFuZ1snZG93bmxvYWRzJ10gPSAnRG93bmxvYWRzJzsKJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsKJGxhbmdbJ2VkaXRjYXRlZ29yeSddID0gJ0VkaXQgQ2F0ZWdvcnknOwokbGFuZ1snZWRpdHVwbG9hZCddID0gJ0VkaXQgVXBsb2FkJzsKJGxhbmdbJ2Vycm9yJ10gPSAnRXJyb3IhJzsKJGxhbmdbJ2Vycm9yX2NhdGVnb3J5ZXhpc3RzJ10gPSAnRXJyb3I6IENhdGVnb3J5IGFscmVhZHkgZXhpc3RzJzsKJGxhbmdbJ2Vycm9yX2NhdGVnb3J5bm90ZW1wdHknXSA9ICdFcnJvciEgQ2Fubm90IGRlbGV0ZSBhIGNhdGVnb3J5IHRoYXQgaXMgbm90IGVtcHR5JzsKJGxhbmdbJ2Vycm9yX2NhdGVnb3J5bm90Zm91bmQnXSA9ICdFcnJvcjogQ2F0ZWdvcnkgbm90IGZvdW5kISc7CiRsYW5nWydlcnJvcl9kYmVycm9yJ10gPSAnRXJyb3I6IERhdGFiYXNlIGVycm9yISc7CiRsYW5nWydlcnJvcl9lbXB0eWNhdGVnb3J5J10gPSAnRXJyb3I6IEVtcHR5IENhdGVnb3J5ISc7CiRsYW5nWydlcnJvcl9lbXB0eXBhdGgnXSA9ICdFcnJvcjogRW1wdHkgUGF0aCEnOwokbGFuZ1snZXJyb3JfZmlsZWV4aXN0cyddID0gJ0Vycm9yISBGaWxlICVzIGFscmVhZHkgZXhpc3RzLic7CiRsYW5nWydlcnJvcl9maWxlbm90Zm91bmQnXSA9ICdFcnJvciEgRmlsZSAlcyB3YXMgbm90IGZvdW5kLic7CiRsYW5nWydlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnXSA9ICdFcnJvcjogSW5zdWZmaWNpZW50IHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gbW9kdWxlISc7CiRsYW5nWydlcnJvcl9pbnZhbGlkYXV0aG9yJ10gPSAnRXJyb3I6IEludmFsaWQgKG9yIGVtcHR5KSBhdXRob3IuJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRjYXRlZ29yeSddID0gJ0Vycm9yOiBJbnZhbGlkIChvciBlbXB0eSkgY2F0ZWdvcnkuJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRkZXNjcmlwdGlvbiddID0gJ0Vycm9yOiBJbnZhbGlkIChvciBlbXB0eSkgZGVzY3JpcHRpb24uJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWRmaWxlJ10gPSAnRXJyb3I6IEludmFsaWQgKG9yIGVtcHR5KSBmaWxlbmFtZS4nOwokbGFuZ1snZXJyb3JfaW52YWxpZHVwbG9hZGZpbGVuYW1lJ10gPSAnRXJyb3I6IEZpbGVzIHdpdGggdGhhdCBuYW1lIChwcm9iYWJseSBleHRlbnNpb24pIGFyZSBub3QgYWxsb3dlZC4nOwokbGFuZ1snZXJyb3JfaW52YWxpZHVwbG9hZGlkJ10gPSAnRXJyb3I6IEludmFsaWQgdXBsb2FkIGlkJzsKJGxhbmdbJ2Vycm9yX25vZmlsZXMnXSA9ICdFcnJvcjogTm8gTWF0Y2hpbmcgRmlsZXMhJzsKJGxhbmdbJ2ZpbGVzJ10gPSAnRmlsZXMnOwokbGFuZ1snZml4bWUnXSA9ICdGaXggU3BhY2VzJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1VwbG9hZCBNb2R1bGUnOwokbGFuZ1snaGVscCddID0gJzxoMz5XaGF0IERvZXMgVGhpcyBEbz88L2gzPgo8cD5JdCBpcyBhIG1vZHVsZSBmb3IgYWxsb3dpbmcgcGVvcGxlIHRvIHVwbG9hZCBhbmQgZG93bmxvYWQgZmlsZXMgdG8gYW5kIGZyb20geW91ciBzaXRlLiAgSXQga2VlcHMgdHJhY2sgb2Ygd2hvIHVwbG9hZGVkIGEgZmlsZSwgYW5kIHdobyBoYXMgZG93bmxvYWRlZCBpdC4gIEFzIHdlbGwsIHlvdSBjYW4gc29ydCBmaWxlcyBpbnRvIGNhdGVnb3JpZXMsIGFuZCBtYW5hZ2UgdGhlIGZpbGVzIHRoYXQgd2VyZSB1cGxvYWRlZCBsaWtlIGV2ZXJ5IGFkbWluaXN0cmF0b3Igd291bGQgZG88L3A+IAo8aDM+SG93IERvIEkgVXNlIEl0PC9oMz4KPHA+VG8gdXNlIHRoaXMgbW9kdWxlLCB0byBhbGxvdyB1c2VycyB0byB1cGxvYWQgZmlsZXMgdG8geW91ciBzaXRlLCB5b3Ugc2hvdWxkIGluc3RhbGwgdGhlIG1vZHVsZSwgYW5kIHRoZW4gY3JlYXRlIG9uZSBvciBtb3JlIGNhdGVnb3JpZXMgKGEuay5hKSBkaXJlY3RvcmllcyBmb3IgdGhlIHVwbG9hZGVkIGZpbGVzIHRvIGdvIGludG8uIFRoZW4gYWRkIGEgdGFnIGludG8gYSBwYWdlIG9yIHRlbXBsYXRlIHNvbWV3aGVyZSBsaWtlIHtjbXNfbW9kdWxlIG1vZHVsZT0iVXBsb2FkcyIgY2F0ZWdvcnk9InNvbWVjYXRlZ29yeSIgbW9kZT0ic29tZW1vZGUifS4gIFdoZXJlIG1vZGUgbWF0Y2hlcyBvbmUgb2YgdGhlIG1vZGVzIGxpc3RlZCBiZWxvdy4gIFRoZSBvdXRwdXQgd2lsbCBkaWZmZXIgZGVwZW5kaW5nIHVwb24gd2hpY2ggbW9kZSB5b3Ugc2VsZWN0LjwvcD4KPHA+VGhpcyBtb2R1bGUgY2FuIHVzZSB0aGUgVXNlcklEIG1vZHVsZSAob3B0aW9uYWwpIHRvIGdldCBpbmZvcm1hdGlvbiBhYm91dCBhbnkgY3VycmVudGx5IGxvZ2dlZCBpbiB1c2VycyB0byBwYXJ0bHkgZmlsbCBpbiB0aGUgZm9ybSB3aGVuIHVwbG9hZGluZyBmaWxlczs8L3A+CjxoMz5QYXJhbWV0ZXJzPC9oMz4KPHVsPgo8bGk+PGVtPihSRVFVSVJFRCk8L2VtPiBtb2RlPSJuYW1lIjwvbGk+CiAgPHA+TW9kZXM6CiAgPHVsPgogIDxsaT48ZW0+dXJsIDxpPm9yPC9pPiBsaW5rPC9lbT4gLSBEaXNwbGF5IGEgbGluayB0byBhIGZpbGU8L2xpPgogIDxsaT48ZW0+ZGV0YWlsZWQ8L2VtPiAtIERpc3BsYXkgYSBkZXRhaWxlZCBsaXN0IG9mIGFsbCBmaWxlcyBpbiB0aGUgY2F0ZWdvcnk8L2xpPgogIDxsaT48ZW0+c3VtbWFyeTwvZW0+IC0gRGlzcGxheSBhIHN1bW1hcml6ZWQgbGlzdCBvZiBhbGwgZmlsZXMgaW4gdGhlIGNhdGVnb3J5PC9saT4KICA8bGk+PGVtPnNpbmdsZTwvZW0+IC0gRGlzcGxheSBhIGRldGFpbGVkIHJlcG9ydCBhYm91dCBhIHNpbmdsZSB1cGxvYWQ8L2xpPgogIDwvdWw+CiAgPC9wPgo8bGk+PGVtPihSRVFVSVJFRCk8L2VtPiBjYXRlZ29yeT0ibmFtZSI8L2xpPgogIDxwPjxiPk5vdGU6PC9iPiBDYXRlZ29yeSBjYW4gYmUgImFsbCIsIHdoaWNoIHdpbGwgbGlzdCBhbGwgb2YgdGhlIHVwbG9hZHMgZnJvbSBhbGwgPGVtPmxpc3RhYmxlPC9lbT4gY2F0ZWdvcmllcwogIDwvcD4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gY291bnQ9Ik4iPC9saT4KICA8cD5BIHBhcmFtZXRlciB0byBsaXN0IG9ubHkgdGhlIGZpcnN0IE4gcmVzdWx0cyBvZiB0aGUgcXVlcnkuICBQYWdpbmF0aW9uIHdvdWxkIGJlIGJldHRlciwgYnV0IHRoaXMgd2lsbCBkbyB0aGUgdHJpY2sgZm9yIG5vdzwvcD4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gc29ydG9yZGVyPSJvcmRlciI8L2xpPgogIDxwPlNvcnQgT3JkZXJzCiAgPHVsPgogIDxsaT48ZW0+ZGF0ZV9hc2M8L2VtPiAtIFNvcnQgYnkgYXNjZW5kaW5nIGRhdGU8L2xpPgogIDxsaT48ZW0+ZGF0ZV9kZXNjPC9lbT4gLSBTb3J0IGJ5IGRlc2NlbmRpbmcgZGF0ZTwvbGk+CiAgPGxpPjxlbT5uYW1lX2FzYzwvZW0+IC0gU29ydCBieSBhc2NlbmRpbmcgbmFtZTwvbGk+CiAgPGxpPjxlbT5uYW1lX2Rlc2M8L2VtPiAtIFNvcnQgYnkgZGVzY2VuZGluZyBuYW1lPC9saT4KICA8bGk+PGVtPnNpemVfYXNjPC9lbT4gLSBTb3J0IGJ5IGFzY2VuZGluZyBzaXplPC9saT4KICA8bGk+PGVtPnNpemVfZGVzYzwvZW0+IC0gU29ydCBieSBkZXNjZW5kaW5nIHNpemU8L2xpPgogIDxsaT48ZW0+ZGVzY19hc2M8L2VtPiAtIFNvcnQgYnkgYXNjZW5kaW5nIGRlc2NyaXB0aW9uPC9saT4KICA8bGk+PGVtPmRlc2NfZGVzYzwvZW0+IC0gU29ydCBieSBkZXNjZW5kaW5nIGRlc2NyaXB0aW9uPC9saT4KICA8bGk+PGVtPmF1dGhvcl9hc2M8L2VtPiAtIFNvcnQgYnkgYXNjZW5kaW5nIGF1dGhvcjwvbGk+CiAgPGxpPjxlbT5hdXRob3JfZGVzYzwvZW0+IC0gU29ydCBieSBkZXNjZW5kaW5nIGF1dGhvcjwvbGk+CiAgPGxpPjxlbT5pcF9hc2M8L2VtPiAtIFNvcnQgYnkgYXNjZW5kaW5nIGlwIGFkZHJlc3M8L2xpPgogIDxsaT48ZW0+aXBfZGVzYzwvZW0+IC0gU29ydCBieSBkZXNjZW5kaW5nIGlwIGFkZHJlc3M8L2xpPgogIDwvdWw+CiAgPC9wPgo8bGk+dXBsb2FkX2lkPSJpZCIgLSBzcGVjaWZ5IGEgc2luZ2xlIGZpbGUgZm9yIHRoZSB1cmwvbGluayBvciBzaW5nbGUgbW9kZXMgKGFib3ZlKTwvbGk+CjwvdWw+CjxwPjxiPk5vdGU6PC9iPiBUaGlzIG1vZHVsZSBkb2VzIG5vdCBieXBhc3Mgb3IgZ2V0IHBhc3QgYW55IGZpbGUgc2l6ZSBsaW1pdGF0aW9ucyBpbiBwaHAuICBJdCB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZW0uICBUaGVyZWZvcmUgeW91IG1heSBuZWVkIHRvIG1vZGlmeSB5b3VyIHBocC5pbmkgZmlsZSB0byBhbGxvdyB5b3UgdG8gdXBsb2FkIGZpbGVzIGFzIGxhcmdlIGFzIHdoYXQgeW91IGhhdmUgc2V0IGluIHRoZSB1cGxvYWRzIG1vZHVsZSBwcmVmZXJlbmNlcy4KJzsKJGxhbmdbJ2lkJ10gPSAnSWQnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydpcF9hZGRyZXNzJ10gPSAnSVAgQWRkcmVzcyc7CiRsYW5nWydtb2RkZXNjcmlwdGlvbiddID0gJ0EgbW9kdWxlIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHVwbG9hZCBmaWxlcywgYW5kIGFsbG93cyB5b3UgdG8gbWFuYWdlIHRoZW0uJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1lJzsKJGxhbmdbJ3JlbmFtZW1lc3NhZ2UnXSA9ICdDaGFuZ2UgdGhlIG5hbWUgaGVyZSB0byBleGVjdXRlIGEgcmVuYW1lJzsKJGxhbmdbJ3BhdGgnXSA9ICdQYXRoJzsKJGxhbmdbJ3BhdGhtZXNzYWdlJ10gPSAnQ2hhbmdlIHRoZSBjYXRlZ29yeSBoZXJlIHRvIG1vdmUgdGhlIGZpbGUgdG8gYW5vdGhlciBkaXJlY3RvcnknOwokbGFuZ1sncGF0aGludXBsb2FkcyddID0gJyhSZWxhdGl2ZSB0byB0aGUgdXBsb2FkcyBkaXJlY3RvcnkpJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnUG9zdCBJbnN0YWxsIE1lc3NhZ2UsIGUuZy4sIEJlIHN1cmUgdG8gc2V0ICJNYW5hZ2UgVXBsb2FkcyIgcGVybWlzc2lvbnMgdG8gdXNlIHRoaXMgbW9kdWxlISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSwgZS5nLiwgIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sncHJlZmVyZW5jZXMnXSA9ICdQcmVmZXJlbmNlcyc7CiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1sncHJvbXB0X2NhdGVnb3J5ZGVzYyddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ3Byb21wdF9jYXRlZ29yeWxpc3RhYmxlJ10gPSAnRmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgY2FuIGJlIGxpc3RlZCc7CiRsYW5nWydwcm9tcHRfY2F0ZWdvcnluYW1lJ10gPSAnQ2F0ZWdvcnkgTmFtZSc7CiRsYW5nWydwcm9tcHRfY2F0ZWdvcnlwYXRoJ10gPSAnU2VydmVyIFBhdGgnOwokbGFuZ1sncHJvbXB0X2RlbGV0ZWRpcmVjdG9yeSddID0gJ0RlbGV0ZSBjYXRlZ29yeSBkaXJlY3Rvcnk/JzsKJGxhbmdbJ3Byb21wdF9tYXhfdXBsb2Fkc2l6ZSddID0gJ01heGltdW0gZmlsZSBzaXplIGFsbG93ZWQgKEtiKSc7CiRsYW5nWydwcm9tcHRfdmFsaWRfdXBsb2FkZXh0ZW5zaW9ucyddID0gJ1ZhbGlkIHVwbG9hZCBleHRlbnNpb25zJzsKJGxhbmdbJ3NjYW4nXSA9ICdTY2FuJzsKJGxhbmdbJ3NlbGVjdGNhdGVnb3J5J10gPSAnU2VsZWN0IENhdGVnb3J5JzsKJGxhbmdbJ3NpemUnXSA9ICdTaXplJzsKJGxhbmdbJ3NpemVrYiddID0gJ1NpemUgKEtiKSc7CiRsYW5nWydzdWJtaXQnXSA9ICdTdWJtaXQnOwokbGFuZ1snc3VtbWFyeV90ZW1wbGF0ZSddID0gJ1N1bW1hcnkgVGVtcGxhdGUnOwokbGFuZ1snc3VtbWFyeSddID0gJ1N1bW1hcnknOwokbGFuZ1sndGl0bGVfYWRtaW5fcGFuZWwnXSA9ICdVcGxvYWRzIE1vZHVsZSc7CiRsYW5nWyd0aXRsZV9tb2RfYWRtaW4nXSA9ICdNb2R1bGUgQWRtaW4gUGFuZWwnOwokbGFuZ1sndGl0bGVfbW9kX3ByZWZzJ10gPSAnTW9kdWxlIFByZWZlcmVuY2VzJzsKJGxhbmdbJ3RpdGxlX3NpbmdfbG91ZGx5J10gPSAnU2luZyBMb3VkbHk/JzsKJGxhbmdbJ3RpdGxlX3N1Ym5ldF9leGNsdXNpb25zJ10gPSAnRXhjbHVkZSBzdWJuZXRzIGZyb20gc3RhdGlzdGljcyc7CiRsYW5nWyd0aXRsZV92YWxpZF91cGxvYWRleHRlbnNpb25zJ10gPSAnVmFsaWQgRXh0ZW5zaW9ucyc7CiRsYW5nWyd1bmluc3RhbGxlZCddID0gJ01vZHVsZSBVbmluc3RhbGxlZC4nOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bGUgdXBncmFkZWQgdG8gdmVyc2lvbiAlcy4nOwokbGFuZ1sndXBsb2FkJ10gPSAnVXBsb2FkJzsKJGxhbmdbJ3VwbG9hZGVkJ10gPSAnRmlsZSAlcyB3YXMgdXBsb2FkZWQuJzsKJGxhbmdbJ3VwbG9hZGZvcm1fdGVtcGxhdGUnXSA9ICdVcGxvYWQgVGVtcGxhdGUnOwokbGFuZ1sndXNlcm5hbWUnXSA9ICdVc2VybmFtZSc7CiRsYW5nWyd3YXJuaW5nX2RlbGV0ZWNhdGVnb3J5J10gPSAnV0FSTklORzogVXNlIGNhdXRpb24gd2hlbiBkZWxldGluZyBjYXRlZ29yaWVzLiAgRmlsZXMgbWF5IGJlIGxvc3QnOwokbGFuZ1snd2VsY29tZV90ZXh0J10gPSAnPHA+V2VsY29tZSB0byB0aGUgVXBsb2FkcyBNb2R1bGUgYWRtaW4gc2VjdGlvbi4gU29tZXRoaW5nIGVsc2Ugd291bGQgcHJvYmFibHkgZ28gaGVyZSBpZiB0aGUgbW9kdWxlIGFjdHVhbGx5IGRpZCBzb21ldGhpbmcuPC9wPic7Cj8+Cg==]]></data>
  </file>
  <file>
    <filename>lang/sv_SE.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ3RpdGxlX2R1bW15X2luZGV4X2h0bWwnXSA9ICdTa2FwYSBpbmRleC5odG1sLWZpbGVyIGkgdmFyamUgbWFwcD88YnIvPjxlbT5BbGxhIGJlZmludGxpZ2EgaW5kZXguaHRtbC1maWxlciBrb21tZXIgYXR0IGZpbm5hcyBrdmFyPC9lbT4nOwokbGFuZ1snYWJvdXQnXSA9ICdPbSc7CiRsYW5nWydhY2Nlc3NkZW5pZWQnXSA9ICfFdGtvbXN0IG5la2FkLiBWYXIgZ29kIGtvbnRyb2xsZXJhIGRpbmEgcuR0dGlnaGV0ZXIuJzsKJGxhbmdbJ2FkZGNhdGVnb3J5J10gPSAnTORnZyB0aWxsIGthdGVnb3JpJzsKJGxhbmdbJ2FsbCddID0gJ0FsbGEnOwokbGFuZ1snYXJleW91c3VyZSddID0gJ8RyIGR1IHPka2VyPyc7CiRsYW5nWydhdXRob3InXSA9ICdG9nJmYXR0YXJlJzsKJGxhbmdbJ2NhbmNlbCddID0gJ8VuZ3JhJzsKJGxhbmdbJ2Nhbm5vdG1vZGlmeXBhdGgnXSA9ICcoU/ZrduRnZW4ga2FuIGludGUg5G5kcmFzKSc7CiRsYW5nWydjYXRlZ29yaWVzJ10gPSAnS2F0ZWdvcmllcic7CiRsYW5nWydjYXRlZ29yeSddID0gJ0thdGVnb3JpJzsKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4KPGxpPlZlcnNpb24gMS4wLiAgLSBTZXB0ZW1iZXIgMjAwNS4gRvZyc3RhIHZlcnNpb25lbi48L2xpPgo8bGk+VmVyc2lvbiAxLjAxLiAtIFNlcHRlbWJlciAyMDA1LiBNaW5kcmUga29ycmlnZXJpbmdhci48L2xpPgo8bGk+VmVyc2lvbiAxLjAyLiAtIFNlcHRlbWJlciAyMDA1LiBMYSB0aWxsIG32amxpZ2hldCBhdHQgduRsamEgc29ydGVyaW5nc29yZG5pbmc8L2xpPgo8bGk+VmVyc2lvbiAxLjAzLiAtIFNlcHRlbWJlciAyMDA1LiBLb3JyaWdlcmluZyBy9nJhbmRlIGtvbmZsaWt0IGkgbWFsbG5hbW48L2xpPgo8bGk+VmVyc2lvbiAxLjA0LiAtIFNlcHRlbWJlciAyMDA1LiBMYSB0aWxsIG32amxpZ2hldCBhdHQg5XRlcnNjYW5uYSBlbiBtYXBwLCBvY2ggYXR0IGxhZGRhIHVwcCBmaWxlciBmcuVuIGFkbWluLXNpZGFuPC9saT4KPGxpPlZlcnNpb24gMS4wNS4gLSBTZXB0ZW1iZXIgMjAwNS4gS29ycmlnZXJpbmcgYXYgbuVncmEgZmVsYWt0aWdhIFBIUC12YXJpYWJsZXI8L2xpPgo8bGk+VmVyc2lvbiAxLjA2LiAtIFNlcHRlbWJlciAyMDA1LiBMYSB0aWxsIGb2cmZhdHRhcmbkbHQgaSB1cHBsYWRkbmluZ3Nmb3JtdWzkcmV0IGkgYWRtaW4tcGFuZWxlbiwgbGEgdGlsbCBzYW1tYW5mYXR0bmluZ3Nm5Gx0LCBvY2ggZ2pvcmRlIG9tIGJlc2tyaXZuaW5nIHRpbGwgdGV4dCBhcmVhLCBvY2ggdGlsbOV0IGFuduRuZGFyZW4gYXR0IHbkbGphIG5hbW4gcOUgZGVzdGluYXRpb25zZmlsZW48L2xpPgo8bGk+VmVyc2lvbiAxLjA3LiAtIFNlcHRlbWJlciAyMDA1LiBMYSB0aWxsIG32amxpZ2hldCBhdHQg5G5kcmEgZmlsbmFtbiwgb2NoIGtvcnJpZ2VyYWRlIGV0dCBtaW5kcmUgZmVsIGb2ciBzY2FubmluZyBhdiBtYXBwPC9saT4KPGxpPlZlcnNpb24gMS4wOC4gLSBTZXB0ZW1iZXIgMjAwNS4gQmV0dGVyIGhhbmRsaW5nIG9mIG5hbWVzIHdpdGggc3BhY2VzLCBhbmQgYSBmZXcgbWlub3IgZXJyb3JzIGZpeGVkLiAgQWRkZWQgc3dlZGlzaCB0cmFuc2xhdGlvbiAodGhhbmtzIHdlc3Rpcyk8L2xpPgo8bGk+VmVyc2lvbiAxLjEuMC4gLSBPa3RvYmVyIDIwMDUKIDx1bD4KICAgPGxpPk1vZGlmaWVyYWRlIEF0dGVtcHRVcGxvYWQtZnVua3Rpb25lbiBz5SBhdHQgZGVuIGt1bmRlIGthbGxhcyB1dGlmcuVuPC9saT4KICAgPGxpPkxhIHRpbGwgR2V0VXBsb2FkRGV0YWlscy1mdW5rdGlvbmVuIHNvbSByZXR1cm5lcmFyIGFsbGEgZGV0YWxqZXIgb20gZW4gbW9kdWwsIGlua2x1c2l2ZSBlbiBs5G5rPC9saT4KICAgPGxpPkxhIHRpbGwgUmVkaXJlY3RzIHPlIGF0dCBkZXQg5HIgbXlja2V0IHRyZXZsaWdhcmUgYXR0IGFyYmV0YSBtZWQgbW9kdWxlbiwgZGVuIG9tZGlyaWdlcmFyIHRpbGwgZGVuIHLkdHRhIGZsaWtlbjwvbGk+CiAgIDxsaT7EbmRyYWRlIGZyb250LW1hbGxlbiBm9nIgYXR0IHNlIGLkdHRyZSB1dCBvY2ggZnVuZ2VyYSB2ZXR0aWdhcmU8L2xpPgogICA8bGk+Rml4YXIgZvZyIHVwcGxhZGRuaW5nZW4sIHPlIGF0dCBiZXNrcml2bmluZ2VuIHN05GxscyBpbiBvY2ggbmFtbiBvY2ggc2FtbWFuZmF0dG5pbmcgaGFtbmFyIHDlIHLkdHQgc3TkbGxlPC9saT4KICAgPGxpPkZpeGFyIGb2ciBhdHQgaGFudGVyYSBtZWxsYW5zbGFnIGkgbmFtbiDkbm51IGLkdHRyZTxsaT4KICAgPGxpPk32amxpZ2hldCBhdHQgduRsamEgYXR0IGzkZ2dhIGluZGV4Lmh0bWwtZmlsZXIgaSB2YXJqZSB1cHBsYWRkbmluZ3NtYXBwPC9saT4KICAgPGxpPk9tIG1hbiBzcGVjaWZpY2VyYXIgZXR0IG3lbG5hbW4sIG9jaCBpbmdldCBmaWx0aWxs5GdnIGFuZ2VzLCBhbnbkbmRzIGZpbHRpbGzkZ2dldCBm9nIgb3JpZ2luYWxmaWxlbjwvbGk+CiA8L3VsPgogPHA+PGVtPjxiPlZpa3RpZ3QhPC9iPjwvZW0+PGJyLz5EZXQg5HIgaW50ZSBt9mpsaWd0IGF0dCB1cHBncmFkZXJhIGZy5W4gbuVnb24gYW5uYW4gdmVyc2lvbiBhdiBVcGxvYWRzbW9kdWxlbiB0aWxsIDEuMS4wLiAgRGV0dGEgcGdhIG7lZ3JhIGZlbCBzb20gZ2pvcmRlcyBpIGRhdGFiYXNydXRpbmVybmEsIG9jaCDkdmVuIGkgdXBwZ3JhZGVyaW5nc3J1dGluZW4gaSAxLjAuNi4gRHUgbeVzdGUgYXZpbnN0YWxsZXJhIGRlbiBnYW1sYSB2ZXJzaW9uZW4gb2NoIHNlZGFuIG9taW5zdGFsbGVyYSBkZW4gbnlhIHZlcnNpb25lbi4gRGV0dGEgb3JzYWthciBzdG9yYSBzduVyaWdoZXRlciBvbSBkdSBoYXIgYmVza3Jpdm5pbmdhciBvY2ggYW5uYXQgaSBkaW5hIHRhYmVsbGVyPC9wPgo8L2xpPgo8bGk+VmVyc2lvbiAxLjEuMS4gLSBPa3RvYmVyLCAyMDA1LiBGaXhhZGUgbuVncmEgbWluZHJlIGJ1Z2dhciBpIEdldFVwbG9hZERldGFpbHMgb2NoIGxhIHRpbGwgeXR0ZXJsaWdhcmUgZW4gbORuayAoZWxsZXIgZW4gdXJsKSB0aWxsIGRlIHVwcGxhZGRhZGUgZmlsZXJuYS48L2xpPgo8bGk+VmVyc2lvbiAxLjEuMi4gLSBPa3RvYmVyLCAyMDA1LiBGaXhhZGUgVVJMLWbkbHRldCBpIEdldFVwbG9hZERldGFpbHMgZvZyIGF0dCByZXR1cm5lcmEgZW4gbmVkbGFkZG5pbmdzbORuaywgb2NoIGxhIHRpbGwgZXR0IGFic3VybC1m5Gx0IHNvbSByZXR1cm5lcmFyIGRlbiBhYnNvbHV0YSBz9mt25GdlbiB0aWxsIGZpbGVuIHDlIHdlYmJzZXJ2ZXJuLiBLbGljayBw5SBkZW5uYSBs5G5rIGtvbW1lciBpbnRlIGF0dCBy5GtuYXMuPC9saT4KPC91bD4nOwokbGFuZ1snZGF0ZSddID0gJ0RhdHVtJzsKJGxhbmdbJ2RhdGV1cGxvYWRlZCddID0gJ0RhdHVtIHVwcGxhZGRhZCc7CiRsYW5nWydkZWZhdWx0J10gPSAnU3RhbmRhcmRpbnN05GxsbmluZ2FyJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ1RhIGJvcnQnOwokbGFuZ1snZGVzY3JpcHRpb24nXSA9ICdCZXNrcml2bmluZyc7CiRsYW5nWydkZXN0bmFtZSddID0gJ0xhZGRhIHVwcCBzb20nOwokbGFuZ1snZGV0YWlsX3RlbXBsYXRlJ10gPSAnRGV0YWxqbWFsbCc7CiRsYW5nWydkb3dubG9hZGVkJ10gPSAnRmlsZW4gJXMg5HIgbmVkbGFkZGFkLic7CiRsYW5nWydkb3dubG9hZHMnXSA9ICdOZWRsYWRkbmluZ2FyJzsKJGxhbmdbJ2VkaXQnXSA9ICdSZWRpZ2VyYSc7CiRsYW5nWydlZGl0Y2F0ZWdvcnknXSA9ICdSZWRpZ2VyYSBrYXRlZ29yaSc7CiRsYW5nWydlZGl0dXBsb2FkJ10gPSAnUmVkaWdlcmEgdXBwbGFkZG5pbmcnOwokbGFuZ1snZXJyb3InXSA9ICdGZWwhJzsKJGxhbmdbJ2Vycm9yX2NhdGVnb3J5ZXhpc3RzJ10gPSAnRmVsOiBLYXRlZ29yaW4gZmlubnMgcmVkYW4nOwokbGFuZ1snZXJyb3JfY2F0ZWdvcnlub3RlbXB0eSddID0gJ0ZlbCEgS2FuIGludGUgdGEgYm9ydCBlbiBrYXRlZ29yaSBzb20gaW50ZSDkciB0b20nOwokbGFuZ1snZXJyb3JfY2F0ZWdvcnlub3Rmb3VuZCddID0gJ0ZlbDogS2F0ZWdvcmluIGhpdHRhcyBpbnRlISc7CiRsYW5nWydlcnJvcl9kYmVycm9yJ10gPSAnRmVsOiBEYXRhYmFzZmVsISc7CiRsYW5nWydlcnJvcl9lbXB0eWNhdGVnb3J5J10gPSAnRmVsOiBUb20ga2F0ZWdvcmkhJzsKJGxhbmdbJ2Vycm9yX2VtcHR5cGF0aCddID0gJ0ZlbDogVG9tIHP2a3bkZyEnOwokbGFuZ1snZXJyb3JfZmlsZWV4aXN0cyddID0gJ0ZlbCEgRW4gZmlsIG1lZCBkZXR0YSBuYW1uZXQgZmlubnMgcmVkYW4uJzsKJGxhbmdbJ2Vycm9yX2ZpbGVub3Rmb3VuZCddID0gJ0ZlbCEgRmlsZW4gJXMgaGl0dGFkZXMgaW50ZS4nOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnRmVsOiBPdGlsbHLkY2tsaWdhIHBhcmFtZXRyYXIgYW5naXZuYSBm9nIgbW9kdWxlbiEnOwokbGFuZ1snZXJyb3JfaW52YWxpZGF1dGhvciddID0gJ0ZlbDogRmVsYWt0aWcgKGVsbGVyIHRvbSkgZvZyZmF0dGFyZS4nOwokbGFuZ1snZXJyb3JfaW52YWxpZGNhdGVnb3J5J10gPSAnRmVsOiBGZWxha3RpZyAoZWxsZXIgdG9tKSBrYXRlZ29yaS4nOwokbGFuZ1snZXJyb3JfaW52YWxpZGRlc2NyaXB0aW9uJ10gPSAnRmVsOiBGZWxha3RpZyAoZWxsZXIgdG9tKSBiZXNrcml2bmluZy4nOwokbGFuZ1snZXJyb3JfaW52YWxpZGZpbGUnXSA9ICdGZWw6IEZlbGFrdGlndCAoZWxsZXIgdG9tdCkgZmlsbmFtbi4nOwokbGFuZ1snZXJyb3JfaW52YWxpZHVwbG9hZGZpbGVuYW1lJ10gPSAnRmVsOiBGaWxlciBtZWQgZGV0IG5hbW5ldCAodHJvbGlnZW4gbWVkIGRldCBmaWx0aWxs5GdnZXQpIORyIGludGUgdGlsbOV0bmEuJzsKJGxhbmdbJ2Vycm9yX2ludmFsaWR1cGxvYWRpZCddID0gJ0ZlbDogT2dpbHRpZ3QgdXBwbGFkZG5pbmdzLWlkJzsKJGxhbmdbJ2Vycm9yX25vZmlsZXMnXSA9ICdGZWw6IEluZ2EgbWF0Y2hhbmRlIGZpbGVyISc7CiRsYW5nWydmaWxlcyddID0gJ0ZpbGVyJzsKJGxhbmdbJ2ZpeG1lJ10gPSAnRml4YSBtZWxsYW5zbGFnJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ1VwcGxhZGRuaW5nIChVcGxvYWRzKSc7CiRsYW5nWydoZWxwJ10gPSAnPGgzPlZhZCBn9nIgZGVuIGjkciBtb2R1bGVuPzwvaDM+CjxwPkRldCDkciBlbiBtb2R1bCBzb20gZ/ZyIGRldCBt9mpsaWd0IGF0dCBsYWRkYSB1cHAgb2NoIGxhZGRhIG5lciBmaWxlciB0aWxsIG9jaCBmcuVuIGRpbiB3ZWJic2lkYS4gRGVuIGjlbGxlciByZWRhIHDlIHZlbSBzb20gbGFkZGFkZSB1cHAgZW4gZmlsIG9jaCB2ZW0gc29tIGhhciBsYWRkYXQgbmVyIGRlbi4KRGVzc3V0b20ga2FuIGR1IGRlbGEgaW4gZmlsZXIgaSBrYXRlZ29yaWVyIG9jaCBoYW50ZXJhIGZpbGVybmEgc29tIORyIHVwcGxhZGRhZGUgcOUgc2FtbWEgc+R0dCBzb20gYWxsYSBhZG1pbmlzdHJhdPZyZXIgc2thIGt1bm5hIGf2cmEuPC9wPiAKCjxoMz5IdXIgYW525G5kZXIgamFnIG1vZHVsZW4/PC9oMz4KPHA+RvZyIGF0dCBhbnbkbmRhIGRlbiBo5HIgbW9kdWxlbiAtIGFsbHRz5SBhdHQgdGlsbOV0YSBhbnbkbmRhcmUgYXR0IGxhZGRhIHVwcCBmaWxlciB0aWxsIGRpbiB3ZWJic2lkYSAtIG3lc3RlIGR1IGluc3RhbGxlcmEgbW9kdWxlbiBvY2ggZORyZWZ0ZXIgc2thcGEgZW4gZWxsZXIgZmxlcmEga2F0ZWdvcmllci9tYXBwYXIKc29tIGRlIHVwcGxhZGRhZGUgZmlsZXJuYSBrYW4gbORnZ2FzIGkgKGkgbW9kdWxpbnN05GxsbmluZ2FybmEpLiBM5GdnIHNlZGFuIHRpbGwgZW4gdGFnZyBw5SBlbiBzaWRhIGVsbGVyIG1hbGwgdW5nZWbkciBz5SBo5HIge2Ntc19tb2R1bGUgbW9kdWxlPSJVcHBsYWRkYXQiIGNhdGVnb3J5PSJlbmthdGVnb3JpIiBtb2RlPSJzdGlsIn0uIApTdGlsZW4gc2thIGTlIG1hdGNoYSBu5WdvbiBhdiBzdGlsYXJuYSBuZWRhbi4gVmFkIHNvbSBza3JpdnMgdXQgc2tpbGplciBzaWcgYmVyb2VuZGUgcOUgdmlsa2VuIHN0aWwgZHUgduRsamVyLjwvcD4KCjxwPkRlbiBo5HIgbW9kdWxlbiBrYW4gYW525G5kYSBVc2VySUQtbW9kdWxlbiAodmFsZnJpdHQpIGb2ciBhdHQgZuUgaW5mb3JtYXRpb24gb20gYWxsYSBpbmxvZ2dhZGUgYW525G5kYXJlIGb2ciBhdHQgZGVsdmlzIGZ5bGxhIGkgZm9ybXVs5HJldCBu5HIgZmlsZXIgbGFkZGFzIHVwcDs8L3A+CjxoMz5QYXJhbWV0cmFyPC9oMz4KPHVsPgo8bGk+PGVtPihPQkxJR0FUT1JJU0spPC9lbT4gbW9kZT0ibmFtbiI8L2xpPgogIDxwPlN0aWxhciAobW9kZXMpOgogIDx1bD4KICA8bGk+PGVtPnVybCA8aT5lbGxlcjwvaT4gbGluazwvZW0+IC0gVmlzYXIgZW4gbORuayB0aWxsIGVuIGZpbDwvbGk+CiAgPGxpPjxlbT5kZXRhaWxlZDwvZW0+IC0gVmlzYXIgZW4gZGV0YWxqZXJhZCBsaXN0YSD2dmVyIGFsbGEgZmlsZXIgaSBlbiBrYXRlZ29yaTwvbGk+CiAgPGxpPjxlbT5zdW1tYXJ5PC9lbT4gLSBWaXNhciBlbiBzYW1tYW5mYXR0YWQgbGlzdGEg9nZlciBhbGxhIGZpbGVyIGkgZW4ga2F0ZWdvcmk8L2xpPgogIDxsaT48ZW0+c2luZ2xlPC9lbT4gLSBWaXNhciBlbiBkZXRhbGplcmFkIHJhcHBvcnQgZvZyIGVuIGVuc2tpbGQgdXBwbGFkZG5pbmc8L2xpPgogIDwvdWw+CiAgPC9wPgo8bGk+PGVtPihPQkxJR0FUT1JJU0spPC9lbT4gY2F0ZWdvcnk9Im5hbW4iPC9saT4KPGxpPjxlbT4odmFsZnJpKTwvZW0+IHNvcnRvcmRlcj0ib3JkbmluZyI8L2xpPgogIDxwPlNvcnRlcmluZ3NvcmRuaW5nYXIKICA8dWw+CiAgPGxpPjxlbT5kYXRlX2FzYzwvZW0+IC0gU29ydGVyYSBlZnRlciBkYXR1bSAtIHN0aWdhbmRlPC9saT4KICA8bGk+PGVtPmRhdGVfZGVzYzwvZW0+IC0gU29ydGVyYSBlZnRlciBkYXR1bSAtIGZhbGxhbmRlPC9saT4KICA8bGk+PGVtPm5hbWVfYXNjPC9lbT4gLSBTb3J0ZXJhIGVmdGVyIG5hbW4gLSBzdGlnYW5kZTwvbGk+CiAgPGxpPjxlbT5uYW1lX2Rlc2M8L2VtPiAtIFNvcnRlcmEgZWZ0ZXIgbmFtbiAtIGZhbGxhbmRlPC9saT4KICA8bGk+PGVtPnNpemVfYXNjPC9lbT4gLSBTb3J0ZXJhIGVmdGVyIHN0b3JsZWsgLSBzdGlnYW5kZTwvbGk+CiAgPGxpPjxlbT5zaXplX2Rlc2M8L2VtPiAtIFNvcnRlcmEgZWZ0ZXIgc3RvcmxlayAtIGZhbGxhbmRlPC9saT4KICA8bGk+PGVtPmRlc2NfYXNjPC9lbT4gLSBTb3J0ZXJhIGVmdGVyIGJlc2tyaXZuaW5nIC0gc3RpZ2FuZGU8L2xpPgogIDxsaT48ZW0+ZGVzY19kZXNjPC9lbT4gLSBTb3J0ZXJhIGVmdGVyIGJlc2tyaXZuaW5nIC0gZmFsbGFuZGU8L2xpPgogIDxsaT48ZW0+YXV0aG9yX2FzYzwvZW0+IC0gU29ydGVyYSBlZnRlciBm9nJmYXR0YXJlIC0gc3RpZ2FuZGU8L2xpPgogIDxsaT48ZW0+YXV0aG9yX2Rlc2M8L2VtPiAtIFNvcnRlcmEgZWZ0ZXIgZvZyZmF0dGFyZSAtIGZhbGxhbmRlPC9saT4KICA8bGk+PGVtPmlwX2FzYzwvZW0+IC0gU29ydGVyYSBlZnRlciBJUC1hZHJlc3MgLSBzdGlnYW5kZTwvbGk+CiAgPGxpPjxlbT5pcF9kZXNjPC9lbT4gLSBTb3J0ZXJhIGVmdGVyIElQLWFkcmVzcyAtIGZhbGxhbmRlPC9saT4KICA8L3VsPgogIDwvcD4KPGxpPnVwbG9hZF9pZD0iaWQiIC0gc3BlY2lmaWNlcmEgZW4gZW5za2lsZCBmaWwgZvZyIG7lZ29uIGF2IHN0aWxhcm5hIHVybC9saW5rIGVsbGVyIHNpbmdsZSAob3Zhbik8L2xpPgo8L3VsPgo8cD48Yj5Ob3Q6PC9iPiBEZW4gaORyIG1vZHVsZW4ga29tbWVyIGludGUgcnVudCBlbGxlciBm9nJiaSBu5WdyYSBmaWxzdG9ybGVrc2JlZ3LkbnNuaW5nYXIgaSBwaHAuIERlbiBmdW5nZXJhciB0aWxsc2FtbWFucyBtZWQgZGVtLiAKRORyZvZyIG3lc3RlIGR1IGV2ZW50dWVsbHQg5G5kcmEgaSBkaW4gcGhwLmluaS1maWwgZvZyIGF0dCB0aWxs5XRhIHVwcGxhZGRuaW5nIGF2IGZpbGVyIHPlIHN0b3JhIHNvbSBkdSBoYXIgc3TkbGx0IGluIGkgaW5zdORsbG5pbmdhcm5hIGb2ciB1cHBsYWRkbmluZ3Ntb2R1bGVuLic7CiRsYW5nWydpZCddID0gJ0lkJzsKJGxhbmdbJ2luc3RhbGxlZCddID0gJ01vZHVsdmVyc2lvbiAlcyBpbnN0YWxsZXJhZC4nOwokbGFuZ1snaXBfYWRkcmVzcyddID0gJ0lQLWFkZHJlc3MnOwokbGFuZ1snbW9kZGVzY3JpcHRpb24nXSA9ICdEZW4gaORyIG1vZHVsZW4g5HIgZW4gc2tlbGV0dG1vZHVsIHNvbSBpbnRlIGf2ciBu5WdvbnRpbmcuJzsKJGxhbmdbJ25hbWUnXSA9ICdOYW1uJzsKJGxhbmdbJ3JlbmFtZW1lc3NhZ2UnXSA9ICfEbmRyYSBuYW1uZXQgaORyIGb2ciBhdHQgZ/ZyYSBlbiBuYW1u5G5kcmluZyc7CiRsYW5nWydwYXRoJ10gPSAnU/ZrduRnJzsKJGxhbmdbJ3BhdGhtZXNzYWdlJ10gPSAnxG5kcmEga2F0ZWdvcmluIGjkciBm9nIgYXR0IGZseXR0YSBmaWxlbiB0aWxsIGVuIGFubmFuIG1hcHAnOwokbGFuZ1sncGF0aGludXBsb2FkcyddID0gJyhyZWxhdGl2IHRpbGwgdXBwbGFkZG5pbmdzbWFwcGVuKSc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ01lZGRlbGFuZGUgZWZ0ZXIgaW5zdGFsbGF0aW9uLCB0LmV4LiBHbPZtIGludGUgYXR0IHN05GxsYSBpbiBy5HR0aWdoZXRlciBm9nIgIk1hbmFnZSBVcGxvYWRzIiBm9nIgYXR0IGFuduRuZGEgZGVuIGjkciBtb2R1bGVuISc7CiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnTWVkZGVsYW5kZSBlZnRlciBhdmluc3RhbGxhdGlvbiwgdC5leC4gIlNraXQgb2Nrc+UhIEJlc2VncmFkIGlnZW4hIic7CiRsYW5nWydwcmVmZXJlbmNlcyddID0gJ0luc3TkbGxuaW5nYXInOwokbGFuZ1sncHJlZnN1cGRhdGVkJ10gPSAnTW9kdWxpbnN05GxsbmluZ2FyIHVwcGRhdGVyYWRlLic7CiRsYW5nWydwcm9tcHRfY2F0ZWdvcnlkZXNjJ10gPSAnQmVza3Jpdm5pbmcnOwokbGFuZ1sncHJvbXB0X2NhdGVnb3J5bGlzdGFibGUnXSA9ICdGaWxlcm5hIGkgZGVuIGjkciBtYXBwZW4ga2FuIGxpc3Rhcyc7CiRsYW5nWydwcm9tcHRfY2F0ZWdvcnluYW1lJ10gPSAnS2F0ZWdvcmluYW1uJzsKJGxhbmdbJ3Byb21wdF9jYXRlZ29yeXBhdGgnXSA9ICdTZXJ2ZXItc/ZrduRnJzsKJGxhbmdbJ3Byb21wdF9kZWxldGVkaXJlY3RvcnknXSA9ICdUYSBib3J0IGthdGVnb3JpbWFwcD8nOwokbGFuZ1sncHJvbXB0X21heF91cGxvYWRzaXplJ10gPSAnTWF4aW1hbCBmaWxzdG9ybGVrIHRpbGzldGVuIChLYiknOwokbGFuZ1sncHJvbXB0X3ZhbGlkX3VwbG9hZGV4dGVuc2lvbnMnXSA9ICdUaWxs5XRuYSBmaWx0aWxs5GdnIGb2ciB1cHBsYWRkYWRlIGZpbGVyJzsKJGxhbmdbJ3NjYW4nXSA9ICdTY2FubmEnOwokbGFuZ1snc2VsZWN0Y2F0ZWdvcnknXSA9ICdW5GxqIGthdGVnb3JpJzsKJGxhbmdbJ3NpemUnXSA9ICdTdG9ybGVrJzsKJGxhbmdbJ3NpemVrYiddID0gJ1N0b3JsZWsgKEtiKSc7CiRsYW5nWydzdWJtaXQnXSA9ICdM5GdnIHRpbGwnOwokbGFuZ1snc3VtbWFyeV90ZW1wbGF0ZSddID0gJ1NhbW1hbmZhdHRuaW5nc21hbGwnOwokbGFuZ1snc3VtbWFyeSddID0gJ1NhbW1hbmZhdHRuaW5nJzsKJGxhbmdbJ3RpdGxlX2FkbWluX3BhbmVsJ10gPSAnVXBwbGFkZG5pbmdzbW9kdWwnOwokbGFuZ1sndGl0bGVfbW9kX2FkbWluJ10gPSAnQWRtaW4tcGFuZWwgZvZyIG1vZHVsJzsKJGxhbmdbJ3RpdGxlX21vZF9wcmVmcyddID0gJ0luc3TkbGxuaW5nYXIgZvZyIG1vZHVsJzsKJGxhbmdbJ3RpdGxlX3NpbmdfbG91ZGx5J10gPSAnU2p1bmcgaPZndD8nOwokbGFuZ1sndGl0bGVfc3VibmV0X2V4Y2x1c2lvbnMnXSA9ICdFeGtsdWRlcmEgc3VibuR0IGZy5W4gc3RhdGlzdGlrJzsKJGxhbmdbJ3RpdGxlX3ZhbGlkX3VwbG9hZGV4dGVuc2lvbnMnXSA9ICdUaWxs5XRuYSBmaWx0aWxs5GdnJzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWwgYXZpbnN0YWxsZXJhZC4nOwokbGFuZ1sndXBncmFkZWQnXSA9ICdNb2R1bCB1cHBncmFkZXJhZCB0aWxsIHZlcnNpb24gJXMuJzsKJGxhbmdbJ3VwbG9hZCddID0gJ0xhZGRhIHVwcCc7CiRsYW5nWyd1cGxvYWRlZCddID0gJ0ZpbGVuICVzIORyIHVwcGxhZGRhZC4nOwokbGFuZ1sndXBsb2FkZm9ybV90ZW1wbGF0ZSddID0gJ1VwcGxhZGRuaW5nc21hbGwnOwokbGFuZ1sndXNlcm5hbWUnXSA9ICdBbnbkbmRhcm5hbW4nOwokbGFuZ1snd2FybmluZ19kZWxldGVjYXRlZ29yeSddID0gJ1ZBUk5JTkc6IFZhciBm9nJzaWt0aWcgbuRyIGR1IHRhciBib3J0IGthdGVnb3JpZXIuIEZpbGVyIGthbiBn5XIgZvZybG9yYWRlJzsKJGxhbmdbJ3dlbGNvbWVfdGV4dCddID0gJzxwPlbkbGtvbW1lbiB0aWxsIGFkbWluLXNla3Rpb25lbiBm9nIgVXBwbGFkZG5pbmdzbW9kdWxlbi4gSORyIHNrdWxsZSBkZXQgc+RrZXJ0IHN05SBu5WdvdCBhbm5hdCBvbSBtb2R1bGVuIGZha3Rpc2t0IGdqb3JkZSBu5WdvdC48L3A+JzsKPz4K]]></data>
  </file>
  <file>
    <filename>templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>templates/addcategory.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2NhdGVnb3J5bmFtZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NhdGVnb3J5bmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfY2F0ZWdvcnlkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2F0ZWdvcnlkZXNjfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9jYXRlZ29yeXBhdGh9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9jYXRlZ29yeXBhdGh9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRwYXRobWVzc2FnZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfY2F0ZWdvcnlsaXN0YWJsZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NhdGVnb3J5bGlzdGFibGV9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskc2Nhbn17JHN1Ym1pdH17JGNhbmNlbH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0Key9pZn0K]]></data>
  </file>
  <file>
    <filename>templates/adminpanel.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfc2VjdGlvbn08L2gzPgo8cD57JGFkbWluX25hdn08L3A+Cnskd2VsY29tZV90ZXh0fQ==]]></data>
  </file>
  <file>
    <filename>templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfbWF4X3VwbG9hZHNpemV9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X21heF91cGxvYWRzaXplfTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGl0bGVfdmFsaWRfdXBsb2FkZXh0ZW5zaW9uc306PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdmFsaWRfdXBsb2FkZXh0ZW5zaW9uc308L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX3N1Ym5ldF9leGNsdXNpb25zfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9zdWJuZXRfZXhjbHVzaW9uc308L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRpdGxlX2R1bW15X2luZGV4X2h0bWx9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2R1bW15X2luZGV4X2h0bWx9PC9wPgoJPC9kaXY+Cgk8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyR0aXRsZV9lbWFpbF9vbl91cGxvYWR9OjwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2VtYWlsX29uX3VwbG9hZH08L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>templates/brieflist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRpdGVtY291bnQgPiAwfQ0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4NCgk8dGhlYWQ+DQoJCTx0cj4NCgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+DQoJCQk8dGg+eyRhdXRob3J0ZXh0fTwvdGg+DQoJCSAgICAgICAgPHRoPnskZGF0ZXRleHR9PC90aD4NCgkJCTx0aD57JHNpemV0ZXh0fTwvdGg+CQ0KCQk8L3RyPg0KCTwvdGhlYWQ+DQoJPHRib2R5Pg0KCXtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9DQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4NCgkJCTx0ZD57JGVudHJ5LT5uYW1lfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+YXV0aG9yfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+ZGF0ZX08L3RkPg0KCQkJPHRkPnskZW50cnktPnNpemV9PC90ZD4NCgkJPC90cj4NCgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPg0KICAgICAgICAgICAgICAgCQk8dGQgY29sc3Bhbj0iNCI+eyRlbnRyeS0+ZGVzY3JpcHRpb259PC90ZD4gDQoJCTwvdHI+DQoJey9mb3JlYWNofQ0KCTwvdGJvZHk+DQo8L3RhYmxlPg0Key9pZn0NCg==]]></data>
  </file>
  <file>
    <filename>templates/categorylist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRpdGVtY291bnR9IENhdGVnb3JpZXMgRm91bmQ8L3A+PC9kaXY+DQp7aWYgJGl0ZW1jb3VudCA+IDB9DQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPg0KCTx0aGVhZD4NCgkJPHRyPg0KCQkJPHRoIHdpZHRoPSIxNSUiPnskY2F0ZWdvcnl0ZXh0fTwvdGg+DQoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPg0KCQkJPHRoPnskcGF0aHRleHR9PC90aD4NCgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+DQoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPg0KCQk8L3RyPg0KCTwvdGhlYWQ+DQoJPHRib2R5Pg0Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1lbnRyeX0NCgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPg0KCQkJPHRkPnskZW50cnktPmlkfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+bmFtZX08L3RkPg0KCQkJPHRkPnskZW50cnktPnBhdGh9PC90ZD4NCgkJCTx0ZD57JGVudHJ5LT5lZGl0bGlua308L3RkPg0KCQkJPHRkPnskZW50cnktPmRlbGV0ZWxpbmt9PC90ZD4NCgkJPC90cj4NCgkJPHRyIGNsYXNzPSJ7JGVudHJ5LT5yb3djbGFzc30iPiANCgkJCTx0ZD4mbmJzcDs8L3RkPg0KCQkJPHRkIGNvbHNwYW49IjQiPnskZW50cnktPmRlc2NyaXB0aW9ufTwvdGQ+DQoJCTwvdHI+DQoJIA0Key9mb3JlYWNofQ0KCTwvdGJvZHk+DQo8L3RhYmxlPg0Key9pZn0NCjxkaXYgY2xhc3M9InBhZ2VvcHRpb25zIj48cCBjbGFzcz0icGFnZW9wdGlvbnMiPnskYWRkbGlua308L3A+PC9kaXY+DQo=]]></data>
  </file>
  <file>
    <filename>templates/deletecategory.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19Cgk8cD57JHdhcm5pbmdfZGVsZXRlY2F0ZWdvcnl9PC9wPgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2RlbGV0ZWRpcmVjdG9yeX06PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfZGVsZXRlZGlyZWN0b3J5fTwvcD4KCTwvZGl2PgoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbn17JHN1Ym1pdH08L3A+Cgk8L2Rpdj4KeyRlbmRmb3JtfQo=]]></data>
  </file>
  <file>
    <filename>templates/editupload.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZG5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91cGxvYWRuYW1lfSZuYnNwO3skbmFtZW1lc3NhZ2V9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X21vdmVjYXRlZ29yeX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X21vdmVjYXRlZ29yeX0mbmJzcDt7JHBhdGhtZXNzYWdlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91cGxvYWRzaXplfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZGF0YV91cGxvYWRzaXplfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91cGxvYWRkYXRlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskZGF0YV91cGxvYWRkYXRlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91cGxvYWRhdXRob3J9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91cGxvYWRhdXRob3J9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZHN1bW1hcnl9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF91cGxvYWRzdW1tYXJ5fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF91cGxvYWRkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdXBsb2FkZGVzY308L3A+CiAgPC9kaXY+CiAge2lmICRpdGVtY291bnQgPiAwfQogICAgPGJyLz4KICAgIDx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+CiAgICAgIDx0aGVhZD4KICAgICAgICA8dHI+CgkgIDx0aD57JGRhdGV0ZXh0fTwvdGg+CiAgICAgICAgICA8dGg+eyRpcHRleHR9PC90aD4KCSAgPHRoPnskdXNlcnRleHR9PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RoZWFkPgogICAgICA8dGJvZHk+CiAgICAgIHtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9Cgk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+CgkgIDx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+CgkgIDx0ZD57JGVudHJ5LT5pcH08L3RkPgoJICA8dGQ+eyRlbnRyeS0+dXNlcn08L3RkPgoJPC90cj4KICAgICAgey9mb3JlYWNofQogICAgICA8L3Rib2R5PgogICAgPC90YWJsZT4KICB7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPiZuYnNwOzwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaGlkZGVufXskZml4fXskc3VibWl0fXskY2FuY2VsfTwvcD4KICA8L2Rpdj4KeyRlbmRmb3JtfQp7L2lmfQo=]]></data>
  </file>
  <file>
    <filename>templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>templates/expandedlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyRzdGFydGZvcm19DQo8ZGl2IGNsYXNzPSJwYWdlb3B0aW9ucyI+DQogIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRjYXRlZ29yeX08L3A+DQogIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2F0ZWdvcnl9eyRpbnB1dF9zZWxlY3R9eyRpbnB1dF9oaWRkZW59PC9wPg0KPC9kaXY+DQp7JGVuZGZvcm19DQp7aWYgJGl0ZW1jb3VudCA+IDB9DQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPg0KCTx0aGVhZD4NCgkJPHRyPg0KCQkJPHRoPnskdGl0bGV0ZXh0fTwvdGg+DQoJCQk8dGg+eyRwb3N0ZGF0ZXRleHR9PC90aD4NCgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+DQoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPg0KCQk8L3RyPg0KCTwvdGhlYWQ+DQoJPHRib2R5Pg0KCXtmb3JlYWNoIGZyb209JGl0ZW1zIGl0ZW09ZW50cnl9DQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9IiBvbm1vdXNlb3Zlcj0idGhpcy5jbGFzc05hbWU9J3skZW50cnktPnJvd2NsYXNzfWhvdmVyJzsiIG9ubW91c2VvdXQ9InRoaXMuY2xhc3NOYW1lPSd7JGVudHJ5LT5yb3djbGFzc30nOyI+DQoJCQk8dGQ+eyRlbnRyeS0+aWR9PC90ZD4NCgkJCTx0ZD57JGVudHJ5LT5uYW1lfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+YXV0aG9yfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+aXB9PC90ZD4NCgkJCTx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+DQoJCQk8dGQ+eyRlbnRyeS0+ZGVsZXRlbGlua308L3RkPg0KCQk8L3RyPg0KCQk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSIgb25tb3VzZW92ZXI9InRoaXMuY2xhc3NOYW1lPSd7JGVudHJ5LT5yb3djbGFzc31ob3Zlcic7IiBvbm1vdXNlb3V0PSJ0aGlzLmNsYXNzTmFtZT0neyRlbnRyeS0+cm93Y2xhc3N9JzsiPg0KCSAgICAgICAgCTx0ZD4mbmJzcDs8L3RkPg0KICAgICAgICAgICAgICAgCQk8dGQgY29sc3Bhbj0iNSI+eyRlbnRyeS0+ZGVzY3JpcHRpb259PC90ZD4gDQoJCTwvdHI+DQoJey9mb3JlYWNofQ0KCTwvdGJvZHk+DQo8L3RhYmxlPg0Ke2Vsc2V9DQo8L2JyPg0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4NCiAgIDxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+Tm8gRmlsZXMgRGV0ZWN0ZWQ8L3A+DQo8L2Rpdj4NCnsvaWZ9DQo=]]></data>
  </file>
  <file>
    <filename>templates/uploadform.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e3N0YXJ0Zm9ybX0KPHA+eyRwcm9tcHRfdXBsb2FkfXskaGlkZGVufXskaW5wdXRfc3VibWl0fTwvcD4Ke2VuZGZvcm19Cg==]]></data>
  </file>
  <file>
    <filename>templates/uploadlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGJyLz4KeyRzdGFydGZvcm19CiAgPHRhYmxlPgogICAgPHRyPjx0ZD57JGNhdGVnb3J5fTwvdGQ+PHRkPnskaW5wdXRfY2F0ZWdvcnl9eyRpbnB1dF9zZWxlY3R9eyRpbnB1dF9oaWRkZW59PC90ZD48L3RyPgogICAgPHRyPjx0ZD57JHByb21wdF9hdXRob3J9PC90ZD48dGQ+eyRpbnB1dF9hdXRob3J9PC90ZD48L3RyPgogICAgPHRyPjx0ZD57JHByb21wdF9kZXN0bmFtZX08L3RkPjx0ZD57JGlucHV0X2Rlc3RuYW1lfSZuYnNwO3skaW5mb19kZXN0bmFtZX08L3RkPjwvdHI+CiAgICA8dHI+PHRkPnskcHJvbXB0X3N1bW1hcnl9PC90ZD48dGQ+eyRpbnB1dF9zdW1tYXJ5fTwvdGQ+PC90cj4KICAgIDx0cj48dGQ+eyRwcm9tcHRfYnJvd3NlfTwvdGQ+PHRkPnskaW5wdXRfYnJvd3NlfSZuYnNwO3skaW5wdXRfc3VibWl0fTwvdGQ+PC90cj4KICA8L3RhYmxlPgogIDxici8+CnskZW5kZm9ybX0Ke2lmICRpdGVtY291bnQgPiAwfQo8dGFibGUgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJwYWdldGFibGUiPgoJPHRoZWFkPgoJCTx0cj4KCQkJPHRoPiZuYnNwOzwvdGg+CgkJCTx0aCB3aWR0aD0iMTUlIj57JHRpdGxldGV4dH08L3RoPgoJCQk8dGggd2lkdGg9IjQwJSI+eyRzdW1tYXJ5dGV4dH08L3RoPgoJCQk8dGg+eyRzaXpldGV4dH08L3RoPgoJCQk8dGg+eyRhdXRob3J0ZXh0fTwvdGg+CgkJCTx0aD57JGlwdGV4dH08L3RoPgoJCQk8dGg+eyRwb3N0ZGF0ZXRleHR9PC90aD4KCQkJPHRoPnskZGx0ZXh0fTwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJCTx0aCBjbGFzcz0icGFnZWljb24iPiZuYnNwOzwvdGg+CgkJPC90cj4KCTwvdGhlYWQ+Cgk8dGJvZHk+Cgl7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPmlkfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5uYW1lfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5zdW1tYXJ5fTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5zaXplfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5hdXRob3J9PC90ZD4KCQkJPHRkPnskZW50cnktPmlwfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kb3dubG9hZHN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4KCXsvZm9yZWFjaH0KCTwvdGJvZHk+CjwvdGFibGU+CntlbHNlfQo8L2JyPgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICA8cCBjbGFzcz0icGFnZW9wdGlvbnMiPk5vIEZpbGVzIERldGVjdGVkPC9wPgo8L2Rpdj4Key9pZn0K]]></data>
  </file>
  <file>
    <filename>Uploads.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IFVwbG9hZHMgLT0gYWxsb3cgdXNlcnMgdG8gdXBsb2FkIHN0dWZmLCBhIHBzZXVkbyBmaWxlIG1hbmFnZXIiIG1vZHVsZQojIFZlcnNpb246IDEuMS43LCBjYWxndXkxMDAwCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBDTVMgLSBDTVMgTWFkZSBTaW1wbGUgaXMgKGMpIDIwMDUgYnkgVGVkIEt1bHAgKHdpc2h5QGNtc21hZGVzaW1wbGUub3JnKQojIFRoaXMgcHJvamVjdCdzIGhvbWVwYWdlIGlzOiBodHRwOi8vd3d3LmNtc21hZGVzaW1wbGUub3JnCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKIyBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQojIE9yIHJlYWQgaXQgb25saW5lOiBodHRwOgkvL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmNsYXNzIFVwbG9hZHMgZXh0ZW5kcyBDTVNNb2R1bGUKewogLyoqCiAgKiBUaGUgZGVmYXVsdCB0ZW1wbGF0ZSB1c2VkIGluIGVtYWlsIG5vdGlmaWNhdGlvbnMKICAqLwogIHZhciAkZGZsdF9lbWFpbG5vdGlmeXRlbXBsYXRlID0gJwo8IS0tIEVtYWlsIGZvcm0gdGVtcGxhdGUgLS0+CjxwPlRoaXMgbWVzc2FnZSBpcyB0byBub3RpZnkgeW91IHRoYXQgYSBmaWxlIGhhcyBiZWVuIHVwbG9hZGVkIHRvIHlvdXIgd2Vic2l0ZS4gIFRoZSBkZXRhaWxzIG9mIHRoaXMgdXBsb2FkIGFyZSBhcyBmb2xsb3dzOjwvcD4KPHA+TmFtZTogeyRuYW1lfTwvcD4KPHA+U2l6ZTogeyRzaXplfTwvcD4KPHA+U3VtbWFyeTogeyRzdW1tYXJ5fTwvcD4KPHA+RGVzY3JpcHRpb246IHskZGVzY3JpcHRpb259PC9wPgo8cD5BdXRob3I6IHskYXV0aG9yfTwvcD4KPHA+SVAgQWRkcmVzczogeyRpcF9hZGRyZXNzfTwvcD4KPCEtLSBFbWFpbCBmb3JtIHRlbXBsYXRlIC0tPgogICAgJzsKIC8qKgogICAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHVzZWQgZm9yIHRoZSB1cGxvYWQgZm9ybQogICAqLwogIHZhciAkZGZsdF91cGxvYWRmb3JtdGVtcGxhdGUgPSAnCjwhLS0gVXBsb2FkIGZvcm0gdGVtcGxhdGUgLS0+Cnskc3RhcnRmb3JtfQogIDxwPnskcHJvbXB0X2F1dGhvcn17JGlucHV0X2F1dGhvcn08L3A+CjxwPnskcHJvbXB0X3N1bW1hcnl9eyRpbnB1dF9zdW1tYXJ5fTwvcD4KPHA+eyRwcm9tcHRfZGVzY3JpcHRpb259eyRpbnB1dF9kZXNjcmlwdGlvbn08L3A+CjxwPnskcHJvbXB0X2Rlc3RuYW1lfXskaW5wdXRfZGVzdG5hbWV9Jm5ic3A7eyRpbmZvX2Rlc3RuYW1lfTwvcD4KPHA+eyRwcm9tcHRfdXBsb2FkfXskaGlkZGVufXskaW5wdXRfYnJvd3NlfXskaW5wdXRfc3VibWl0fTwvcD4KeyRlbmRmb3JtfQo8IS0tIFVwbG9hZCBmb3JtIHRlbXBsYXRlIC0tPicKOwoKICAvKgogICAqIFRoZSBkZWZhdWx0IHRlbXBsYXRlIHVzZWQgZm9yIHRoZSBzdW1tYXJ5IHJlcG9ydAogICAqLwogIHZhciAkZGZsdF9zdW1tYXJ5dGVtcGxhdGUgPSAnCjwhLS0gU3RhcnQgVXBsb2FkIERpc3BsYXkgVGVtcGxhdGUgLS0+Cjx0YWJsZT4KICA8dHI+CiAgICA8dGg+eyRjYXRlZ29yeX08L3RoPgogICAgPHRoPnskbmFtZX08L3RoPgogICAgPHRoPnskYXV0aG9yfTwvdGg+CiAgICA8dGg+eyRkYXRlfTwvdGg+CiAgICA8dGg+eyRzaXplfTwvdGg+CiAgICA8dGg+eyRzdW1tYXJ5fTwvdGg+CiAgICA8dGg+eyRzdW1tYXJ5fTwvdGg+CiAgPC90cj4Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1lbnRyeX0KICA8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+IAogICAgPHRoPnskZW50cnktPmNhdGVnb3J5fTwvdGQ+CiAgICA8dGQ+eyRlbnRyeS0+bmFtZX08L3RkPgogICAgPHRkPnskZW50cnktPmF1dGhvcn08L3RkPgogICAgPHRkPnskZW50cnktPmRhdGV9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5zaXplfTwvdGQ+CiAgICA8dGQ+eyRlbnRyeS0+c3VtbWFyeX08L3RkPgogICAgPHRkPnskZW50cnktPnN1bW1hcnlsaW5rfTwvdGQ+CiAgPC90cj4Key9mb3JlYWNofQo8L3RhYmxlPgo8IS0tIEVuZCBVcGxvYWQgRGlzcGxheSBUZW1wbGF0ZSAtLT4KJzsKCiAgLyoqCiAgICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgdXNlZCBmb3IgdGhlIGRldGFpbCByZXBvcnQKICAgKi8KICB2YXIgJGRmbHRfZGV0YWlsdGVtcGxhdGUgPSAnCjwhLS0gRGV0YWlsIHRlbXBsYXRlIC0tPgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQo8dGFibGU+CiAgPHRyPgogICAgPHRkPnskY2F0ZWdvcnl9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5jYXRlZ29yeX08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPnskaWR9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5pZH08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPnskbmFtZX08L3RkPgogICAgPHRkPnskZW50cnktPm5hbWV9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD57JGRhdGV9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+eyRhdXRob3J9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5hdXRob3J9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZD57JHNpemV9PC90ZD4KICAgIDx0ZD57JGVudHJ5LT5zaXplfTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+eyRzdW1tYXJ5fTwvdGQ+CiAgICA8dGQ+eyRlbnRyeS0+c3VtbWFyeX08L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkPnskc3VtbWFyeX08L3RkPgogICAgPHRkPnskZW50cnktPnN1bW1hcnlsaW5rfTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQ+eyRkZXNjcmlwdGlvbn08L3RkPgogICAgPHRkPnskZW50cnktPmRlc2NyaXB0aW9ufTwvdGQ+CiAgPC90cj4KPC90YWJsZT4KPGJyLz4KPGJyLz4Key9mb3JlYWNofQo8IS0tIERldGFpbCB0ZW1wbGF0ZSAtLT4KJzsKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBfY2F0ZWdvcnlQYXRoKCAkY2F0ZWdvcnlwYXRoICkKICAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICAgR2VuZXJhdGUgYSBwYXRoIHRvIGEgY2VydGFpbiBjYXRlZ29yeQogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfY2F0ZWdvcnlQYXRoKCAkY2F0ZWdvcnlwYXRoICkKICB7CiAgICByZXR1cm4gJHRoaXMtPmNtcy0+Y29uZmlnWyd1cGxvYWRzX3BhdGgnXS5ESVJFQ1RPUllfU0VQQVJBVE9SLgogICAgICAgICAgICAgICAkY2F0ZWdvcnlwYXRoOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBVcGxvYWRQYXRoKCAkY2F0ZWdvcnlwYXRoLCAkZmlsZW5hbWUgKQogICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgICBHZW5lcmF0ZSBhIGZpbGUgc3BlY2lmaWNhdGlvbiB0byBhIGZpbGUgaW4gYSBjZXJ0YWluIAogICAgY2F0ZWdvcnkuCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF91cGxvYWRQYXRoKCAkY2F0ZWdvcnlwYXRoLCAkZmlsZW5hbWUgKQogIHsKICAgIHJldHVybiAkdGhpcy0+X2NhdGVnb3J5UGF0aCggJGNhdGVnb3J5cGF0aCApLkRJUkVDVE9SWV9TRVBBUkFUT1IuJGZpbGVuYW1lOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF90ZXN0aXAoJHJhbmdlLCRpcCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYSBmdW5jdGlvbiB0byBtYXRjaCBhbiBJUCBhZGRyZXNzIGFnYWluc3QgYW4gCiAgIGFkZHJlc3MgcmFuZ2Ugc3BlY2lmaWNhdGlvbi4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfdGVzdGlwKCRyYW5nZSwkaXApIAogIHsKICAgICRyZXN1bHQgPSAxOwoKICAgICMgSVAgUGF0dGVybiBNYXRjaGVyCiAgICAjIEouQWRhbXMgPGpuYUByZXRpbmEubmV0PgogICAgIwogICAgIyBNYXRjaGVzOgogICAgIwogICAgIyB4eHgueHh4Lnh4eC54eHggICAgICAgIChleGFjdCkKICAgICMgeHh4Lnh4eC54eHguW3l5eS16enpdICAocmFuZ2UpCiAgICAjIHh4eC54eHgueHh4Lnh4eC9ubiAgICAobm4gPSAjIGJpdHMsIGNpc2NvIHN0eWxlIC0tIGkuZS4gLzI0ID0gY2xhc3MgQykKICAgICMKICAgICMgRG9lcyBub3QgbWF0Y2g6CiAgICAjIHh4eC54eHgueHh4Lnh4W3l5eS16enpdICAocmFuZ2UsIHBhcnRpYWwgb2N0ZXRzIG5vdCBzdXBwb3J0ZWQpCiAKICAgIGlmIChlcmVnKCIoWzAtOV0rKVwuKFswLTldKylcLihbMC05XSspXC4oWzAtOV0rKS8oWzAtOV0rKSIsJHJhbmdlLCRyZWdzKSkgewogICAgICAjIHBlcmZvcm0gYSBtYXNrIG1hdGNoCiAgICAgICRpcGwgPSBpcDJsb25nKCRpcCk7CiAgICAgICRyYW5nZWwgPSBpcDJsb25nKCRyZWdzWzFdIC4gIi4iIC4gJHJlZ3NbMl0gLiAiLiIgLiAkcmVnc1szXSAuICIuIiAuICRyZWdzWzRdKTsKICAgICAgCiAgICAgICRtYXNrbCA9IDA7CiAgICAgIAogICAgICBmb3IgKCRpID0gMDsgJGk8IDMxOyAkaSsrKSB7CglpZiAoJGkgPCAkcmVnc1s1XS0xKSB7CiAgICAgICAgICAkbWFza2wgPSAkbWFza2wgKyBwb3coMiwoMzAtJGkpKTsKCX0KICAgICAgfQogICAgICAKICAgICAgaWYgKCgkbWFza2wgJiAkcmFuZ2VsKSA9PSAoJG1hc2tsICYgJGlwbCkpIHsKCSAgICAgIHJldHVybiAxOwogICAgICB9IGVsc2UgewoJICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIAogICAgICAjIHJhbmdlIGJhc2VkCiAgICAgICRtYXNrb2N0cyA9IHNwbGl0KCJcLiIsJHJhbmdlKTsKICAgICAgJGlwb2N0cyA9IHNwbGl0KCJcLiIsJGlwKTsKICAgICAgCiAgICAgICMgcGVyZm9ybSBhIHJhbmdlIG1hdGNoCiAgICAgIGZvciAoJGk9MDsgJGk8NDsgJGkrKykgewoJICAgICAgaWYgKGVyZWcoIlxbKFswLTldKylcLShbMC05XSspXF0iLCRtYXNrb2N0c1skaV0sJHJlZ3MpKSB7CgkgIAkJCWlmICggKCRpcG9jdHNbJGldID4gJHJlZ3NbMl0pIHx8ICgkaXBvY3RzWyRpXSA8ICRyZWdzWzFdKSkgewoJICAgIAkJCSRyZXN1bHQgPSAwOwoJICAJCQl9CgkJCQl9CgkJCQllbHNlCgkgIAkJewoJICAgIAkJaWYgKCRtYXNrb2N0c1skaV0gPD4gJGlwb2N0c1skaV0pIHsKCSAgICAgIAkJJHJlc3VsdCA9IDA7CgkgICAgCX0KCSAgCX0KICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdldENhdGVnb3J5RnJvbU5hbWUoKQogICAgUFVCTElDCiAgCiAgICByZXR1cm4gdGhlIGNhdGVnb3J5IGlkIGdpdmVuIGEgbmFtZSwgb3IgZmFsc2UKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBnZXRDYXRlZ29yeUZyb21OYW1lKCRuYW1lKQogIHsKICAgICRkYiA9ICR0aGlzLT5HZXREYigpOwogICAgJHF1ZXJ5ID0KICAgICAgIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4ICgpLgogICAgICAibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfbmFtZSA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlICgkcXVlcnksIGFycmF5ICgkbmFtZSkpOwogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAhJHJvdyApIAogICAgICB7CglyZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIHJldHVybiAkcm93OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBnZXRDYXRlZ29yeUxpc3QoKQogICAgUFVCTElDCiAgCiAgICByZXR1cm4gYSBsaXN0IG9mIGNhdGVnb3J5IG5hbWVzIGFuZCBpZCdzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlMaXN0KCkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRjYXRlZ29yeWxpc3QgPSBhcnJheSgpOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewogICAgICAgIHJldHVybiAkY2F0ZWdvcnlsaXN0OwogICAgICB9CgogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CgkkY2F0ZWdvcnlsaXN0WyRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9uYW1lJ11dID0gCgkgICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9pZCddOwogICAgICB9CiAgICByZXR1cm4gJGNhdGVnb3J5bGlzdDsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBnZXRDYXRlZ29yeVBhdGhGcm9tSUQoKQogICBQVUJMSUMKICAKICAgcmV0dXJuIHRoZSBjYXRlZ29yeSBwYXRoIGdpdmVuIGEgY2F0ZWdvcnkgaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICAgZnVuY3Rpb24gZ2V0Q2F0ZWdvcnlQYXRoRnJvbUlEKCAkY2F0ZWdvcnlfaWQgKQogICB7CiAgICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgV0hFUkUgIi4KICAgICAgICJ1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRjYXRlZ29yeV9pZCApICk7CiAgICAgaWYoICEkZGJyZXN1bHQgKQogICAgICAgewoJIHJldHVybjsKICAgICAgIH0KICAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgIGlmKCAhJHJvdyApCiAgICAgICB7CgkgcmV0dXJuOwogICAgICAgfQogICAgIAogICAgIHJldHVybiAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfcGF0aCddOwogICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgZ2V0Q2F0ZWdvcnlQYXRoRnJvbUZpbGVJRCgpCiAgICBQVUJMSUMKICAKICAgIHJldHVybiB0aGUgY2F0ZWdvcnkgcGF0aCBnaXZlbiBhIGZpbGUgaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBnZXRDYXRlZ29yeVBhdGhGcm9tRmlsZUlEKCAkZmlsZV9pZCApCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMgV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRmaWxlX2lkKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAhJHJvdyApCiAgICAgIHsKCXJldHVybjsKICAgICAgfQogICAgJGNhdCA9ICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9pZCddOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgV0hFUkUgIi4KICAgICAgInVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkY2F0ICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICEkcm93ICkKICAgICAgewoJcmV0dXJuOwogICAgICB9CgogICAgcmV0dXJuICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9wYXRoJ107CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdldEZpbGVMaXN0KCAkY2F0ZWdvcnlfaWQgKQogICAgUFVCTElDCiAgCiAgICByZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBnaXZlbiBjYXRlZ29yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIGdldEZpbGVMaXN0KCAkY2F0ZWdvcnlfaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJGZpbGVsaXN0ID0gYXJyYXkoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcyIuCiAgICAgICIgV0hFUkUgdXBsb2FkX2NhdGVnb3J5X2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRjYXRlZ29yeV9pZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApCiAgICAgIHsKICAgICAgICByZXR1cm4gJGZpbGVsaXN0OwogICAgICB9CgogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7CgkkZmlsZWxpc3RbJHJvd1sndXBsb2FkX25hbWUnXV0gPSAKCSAgJHJvd1sndXBsb2FkX2lkJ107CiAgICAgIH0KICAgIHJldHVybiAkZmlsZWxpc3Q7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGdldEZpbGVOYW1lKCAkZmlsZV9pZCApCiAgICBQVUJMSUMKICAKICAgIHJldHVybiBhIGxpc3Qgb2YgZmlsZXMgaW4gdGhlIGdpdmVuIGNhdGVnb3J5CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gZ2V0RmlsZU5hbWUoICRmaWxlX2lkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcyIuCiAgICAgICIgV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRmaWxlX2lkICkgKTsKICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICByZXR1cm4gJHJvd1sndXBsb2FkX25hbWUnXTsKICB9CgogIAogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBnZXRGaWxlRGV0YWlscyggJGZpbGVfaWQgKQogICAgUFVCTElDCiAgCiAgICByZXR1cm4gYSBsaXN0IG9mIGZpbGVzIGluIHRoZSBnaXZlbiBjYXRlZ29yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIGdldEZpbGVEZXRhaWxzKCAkZmlsZV9pZCApCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMiLgogICAgICAiIFdIRVJFIHVwbG9hZF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkZmlsZV9pZCApICk7CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgcmV0dXJuICRyb3c7CiAgfQoKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfZml4VG9BZGp1c3RUYWJsZVN0cnVjdHVyZTEoKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgLy8gbW92ZSB0aGUgZGVzY3JpcHRpb24gZmllbGQsIGV0YywgaW50byB0aGUgcHJvcGVyIHBsYWNlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICBmdW5jdGlvbiBfZml4VG9BZGp1c3RUYWJsZVN0cnVjdHVyZTEoKQogICB7CiAgICAgJGRiID0gJHRoaXMtPkdldERiKCk7CgogICAgIC8vIHRhYmxlIHNjaGVtYSBkZXNjcmlwdGlvbgogICAgICRmbGRzID0gInVwbG9hZF9pZCBJIEtFWSwKICAgICAgICAgICAgIHVwbG9hZF9jYXRlZ29yeV9pZCBJLAogICAgICAgICAgICAgdXBsb2FkX25hbWUgQygyNTUpLAogICAgICAgICAgICAgdXBsb2FkX2F1dGhvciBDKDI1NSksCiAgICAgICAgICAgICB1cGxvYWRfc3VtbWFyeSBDKDI1NSksIAogICAgICAgICAgICAgdXBsb2FkX2Rlc2NyaXB0aW9uIFgsCiAgICAgICAgICAgICB1cGxvYWRfaXAgQygyNTUpLAogICAgICAgICAgICAgdXBsb2FkX3NpemUgSSwKICAgICAgICAgICAgIHVwbG9hZF9kYXRlIFQKCSAgICAiOwoKICAgICAvLyBjcmVhdGUgaXQuIFRoaXMgc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nLCBidXQgSSdtIGEgbGF6eSBzb2QuCiAgICAgJHRhYm9wdGFycmF5ID0gYXJyYXkgKCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CiAgICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSAoJGRiKTsKICAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwgKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfbmV3IiwKCQkJCQkkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5ICgkc3FsYXJyYXkpOwogICAgIAogICAgIC8vIG5vdyBoYXZlIHRvIHRyYW5zZmVyIHRoZSBkYXRhCiAgICAgJHEgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX25ldyAKICAgICAgICAgICAgICBTRUxFQ1QgdXBsb2FkX2lkLCB1cGxvYWRfY2F0ZWdvcnlfaWQsIHVwbG9hZF9uYW1lLCB1cGxvYWRfYXV0aG9yLCB1cGxvYWRfZGVzY3JpcHRpb24sICcnLAogICAgICAgICAgICAgIHVwbG9hZF9pcCwgdXBsb2FkX3NpemUsIHVwbG9hZF9kYXRlIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIjsKICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxICk7CiAgICAgaWYoICEkZGJyZXN1bHQgKSB7CiAgICAgICAkdGhpcy0+U2V0RXJyb3IoICRkYi0+RXJyb3JNc2coKSApOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAKICAgICAvLyBhbmQgZHJvcCB0aGUgb3JpZ2luYWwgdGFibGUKICAgICAkc3FsYXJyYXkgPQogICAgICAgJGRpY3QtPkRyb3BUYWJsZVNRTCAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHMiLAoJCQkgICAgJGZsZHMsICR0YWJvcHRhcnJheSk7CiAgICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CiAgICAgCiAgICAgLy8gYW5kIHJlbmFtZSB0aGUgbmV3IHRhYmxlCiAgICAgJHNxbGFycmF5ID0KICAgICAgICRkaWN0LT5SZW5hbWVUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2Fkc19uZXciLAoJCQkgICAgICBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIiApOwogICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoICRzcWxhcnJheSApOwogICB9ICAKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9maXhUb0FkanVzdFRhYmxlU3RydWN0dXJlMigpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICAvLyBtb3ZlIHRoZSBkZXNjcmlwdGlvbiBmaWVsZCwgZXRjLCBpbnRvIHRoZSBwcm9wZXIgcGxhY2UuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgIGZ1bmN0aW9uIF9maXhUb0FkanVzdFRhYmxlU3RydWN0dXJlMigpCiAgIHsKICAgICAkZGIgPSAkdGhpcy0+R2V0RGIoKTsKCiAgICAgLy8gdGFibGUgc2NoZW1hIGRlc2NyaXB0aW9uCiAgICAgJGZsZHMgPSAidXBsb2FkX2lkIEkgS0VZLAogICAgICAgICAgICAgdXBsb2FkX2NhdGVnb3J5X2lkIEksCiAgICAgICAgICAgICB1cGxvYWRfbmFtZSBDKDI1NSksCiAgICAgICAgICAgICB1cGxvYWRfYXV0aG9yIEMoMjU1KSwKICAgICAgICAgICAgIHVwbG9hZF9zdW1tYXJ5IEMoMjU1KSwgCiAgICAgICAgICAgICB1cGxvYWRfZGVzY3JpcHRpb24gWCwKICAgICAgICAgICAgIHVwbG9hZF9pcCBDKDI1NSksCiAgICAgICAgICAgICB1cGxvYWRfc2l6ZSBJLAogICAgICAgICAgICAgdXBsb2FkX2RhdGUgVAoJICAgICI7CgogICAgIC8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4KICAgICAkdGFib3B0YXJyYXkgPSBhcnJheSAoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKTsKICAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5ICgkZGIpOwogICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTCAoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2Fkc19uZXciLAoJCQkJCSRmbGRzLCAkdGFib3B0YXJyYXkpOwogICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkgKCRzcWxhcnJheSk7CiAgICAgCiAgICAgLy8gbm93IGhhdmUgdG8gdHJhbnNmZXIgdGhlIGRhdGEKICAgICAkcSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfbmV3IAogICAgICAgICAgICAgIFNFTEVDVCB1cGxvYWRfaWQsIHVwbG9hZF9jYXRlZ29yeV9pZCwgdXBsb2FkX25hbWUsIHVwbG9hZF9hdXRob3IsIHVwbG9hZF9zdW1tYXJ5LCAKICAgICAgICAgICAgICB1cGxvYWRfZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgdXBsb2FkX2lwLCB1cGxvYWRfc2l6ZSwgdXBsb2FkX2RhdGUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMiOwogICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEgKTsKICAgICBpZiggISRkYnJlc3VsdCApIHsKICAgICAgICR0aGlzLT5TZXRFcnJvciggJGRiLT5FcnJvck1zZygpICk7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIAogICAgIC8vIGFuZCBkcm9wIHRoZSBvcmlnaW5hbCB0YWJsZQogICAgICRzcWxhcnJheSA9CiAgICAgICAkZGljdC0+RHJvcFRhYmxlU1FMIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfdXBsb2FkcyIsCgkJCSAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCAkc3FsYXJyYXkgKTsKICAgICAKICAgICAvLyBhbmQgcmVuYW1lIHRoZSBuZXcgdGFibGUKICAgICAkc3FsYXJyYXkgPQogICAgICAgJGRpY3QtPlJlbmFtZVRhYmxlU1FMKCBjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX25ldyIsCgkJCSAgICAgIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMiICk7CiAgICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSggJHNxbGFycmF5ICk7CgogICAgIAogICB9ICAKCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9nZXRVcGxvYWRDYXRlZ29yeURldGFpbHMoICRjYXRlZ29yeV9pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICByZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IHJlcHJlc2VudGluZyB0aGUgc3BlY2lmaWMKICAgcm93IG9mIHRoZSBjYXRlZ29yaWVzIGRhdGFiYXNlIG1hdGNoaW5nIHRoZSBzdXBwbGllZCAKICAgY2F0ZWdvcnkgaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfZ2V0VXBsb2FkQ2F0ZWdvcnlEZXRhaWxzKCAkY2F0ZWdvcnlfaWQgKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgV0hFUkUgdXBsb2FkX2NhdGVnb3J5X2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRjYXRlZ29yeV9pZCApICk7CiAgICBpZiggISRkYnJlc3VsdCApIHsKICAgICAgcmV0dXJuOwogICAgfQoKICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRyb3cgKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJHJvdzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfZ2V0VXBsb2FkRmlsZURldGFpbHMoICRjYXRlZ29yeV9pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICByZXR1cm5zIGFuIGFzc29jaWF0aXZlIGFycmF5IG1hdGNoaW5nIHRoZSBzcGVjaWZpYyByb3cgb2YKICAgdGhlIHVwbG9hZHMgdGFibGUgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCB1cGxvYWQgaWQKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfZ2V0VXBsb2FkRmlsZURldGFpbHMoICRmaWxlX2lkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcyBXSEVSRSB1cGxvYWRfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJGZpbGVfaWQgKSApOwogICAgaWYoICEkZGJyZXN1bHQgKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRyb3cgKSB7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJHJvdzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgX3NjYW5kaXIoICRkaXIsICRzb3J0ICkKICAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICAgU2NhbiBhIGRpcmVjdG9yeSBhbmQgcmV0dXJuIGEgc29ydGVkIGxpc3QuCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9zY2FuZGlyKCRkaXIgPSAnLi8nLCAkc29ydCA9IDApCiAgewogICAgJGRpcl9vcGVuID0gQCBvcGVuZGlyKCRkaXIpOwogIAogICAgaWYgKCEgJGRpcl9vcGVuKQogICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAKICAgICRmaWxlcyA9IGFycmF5KCk7CiAgICB3aGlsZSAoKCRkaXJfY29udGVudCA9IHJlYWRkaXIoJGRpcl9vcGVuKSkgIT0gZmFsc2UpCiAgICAgIHsKCS8vIHdlIGlnbm9yZSBpbmRleC5odG1sIGZpbGVzIGlmIHRoZSBwcmVmZXJlbmNlIGlzIHNldAoJaWYoICRkaXJfY29udGVudCA9PSAnaW5kZXguaHRtbCcgJiYgJHRoaXMtPkdldFByZWZlcmVuY2UoJ2NyZWF0ZV9kdW1teV9pbmRleF9odG1sJykpCgkgIHsKCSAgICBjb250aW51ZTsKCSAgfQoKCS8vIGlnbm9yZSBkb3QgZmlsZXMKCWlmKCBwcmVnX21hdGNoKCAiXlwuIiwgJGRpcl9jb250ZW50ICkgKQoJICB7CgkgICAgY29udGludWU7CgkgIH0KCgkkZmlsZXNbXSA9ICRkaXJfY29udGVudDsKICAgICAgfQogIAogICAgaWYoIGlzX2FycmF5KCAkZmlsZXMgKSApCiAgICAgIHsKCWlmICgkc29ydCA9PSAxKQoJICByc29ydCgkZmlsZXMsIFNPUlRfU1RSSU5HKTsKCWVsc2UKCSAgc29ydCgkZmlsZXMsIFNPUlRfU1RSSU5HKTsKICAgICAgfQogIAogICAgcmV0dXJuICRmaWxlczsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgX21rZGlyciggJHBhdGhuYW1lLCAkbW9kZSApCiAgICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgIE1ha2UgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX21rZGlyciAoJHBhdGhuYW1lLCAkbW9kZSA9IDA3NzcpCiAgewogICAgLy8gQ2hlY2sgaWYgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RzCiAgICBpZiAoaXNfZGlyICgkcGF0aG5hbWUpIHx8IGVtcHR5ICgkcGF0aG5hbWUpKQogICAgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBFbnN1cmUgYSBmaWxlIGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgd2l0aCB0aGUgc2FtZSBuYW1lCiAgICBpZiAoaXNfZmlsZSAoJHBhdGhuYW1lKSkKICAgIHsKICAgICAgLy8gUkM6IE1vZGlmaWNhdGlvbiBzdWNoIHRoYXQgdGhpcyBpc24ndCBhbiBlcnJvcgogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICAvLyBDcmF3bCB1cCB0aGUgZGlyZWN0b3J5IHRyZWUKICAgICRuZXh0X3BhdGhuYW1lID0KICAgICAgc3Vic3RyICgkcGF0aG5hbWUsIDAsIHN0cnJwb3MgKCRwYXRobmFtZSwgRElSRUNUT1JZX1NFUEFSQVRPUikpOwogICAgaWYgKCR0aGlzLT5fbWtkaXJyICgkbmV4dF9wYXRobmFtZSwgJG1vZGUpKQogICAgewogICAgICBpZiAoIWZpbGVfZXhpc3RzICgkcGF0aG5hbWUpKQogICAgICB7CgkJCQlyZXR1cm4gbWtkaXIgKCRwYXRobmFtZSwgJG1vZGUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9zY2FuZGlyZWN0b3J5KCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkZGlyICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEEgdXRpbGl0eSB0byBpbnNlcnQgcmVjb3JkcyBpbnRvIHRoZSB1cGxvYWRzIGRhdGFiYXNlCiAgIGZvciBhbGwgZmlsZXMgdGhhdCBjdXJyZW50bHkgZXhpc3QgaW4gYSBkaXJlY3RvcnkuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX3NjYW5kaXJlY3RvcnkoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJGRpciApCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIFZBTFVFUyAoPyw/LD8sPyw/LD8sPyw/LD8pIjsKICAgICRkZXNjID0gIlByZS1leGlzdGluZyBmaWxlIjsKCiAgICAkZmlsZXMgPSAkdGhpcy0+X3NjYW5kaXIoICRkaXIgKTsKICAgIGlmKCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY3JlYWVfZHVtbXlfaW5kZXhfaHRtbCcpICkKICAgICAgewoJdG91Y2goICRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUi4iaW5kZXguaHRtbCIgKTsKICAgICAgfQogICAgZm9yZWFjaCggJGZpbGVzIGFzICRmaWxlICkgewogICAgICAvLyBpZ25vcmUgZGlyZWN0b3JpZXMgLiBhbmQgLi4KICAgICAgaWYoICRmaWxlID09ICIuIiB8fCAkZmlsZSA9PSAiLi4iICkgewoJICAgICAgY29udGludWU7CiAgICAgIH0KCiAgICAgIC8vIGlnbm9yZSBhbnkgZGlyZWN0b3JpZXMKICAgICAgJHNyY3AgPSAkZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IuJGZpbGU7CiAgICAgIGlmKCBpc19kaXIoICRzcmNwICkgKSB7CgkgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgLy8gZ290IHRoZSBmaWxlLCBub3cgbmVlZCBpdCdzIHNpemUKICAgICAgJHNpemUgPSBmaWxlc2l6ZSgkc3JjcCk7CgogICAgICAvLyBub3cgd2UgbmVlZCB0byBtYXliZSByZW5hbWUgdGhlIGZpbGUuLi4KICAgICAgLy8gY3V6IGl0IG1heSBoYXZlIHNwYWNlcyBpbiBpdCwgYW5kIGh0dHAgbWF5IG5vdCBsaWtlIHRoYXQKICAgICAgJGRlc3RmaWxlID0gc3RyX3JlcGxhY2UgKGFycmF5ICgnICcsICclMjAnKSwgYXJyYXkgKCdfJywgJ18nKSwgJGZpbGUgKTsKICAgICAgaWYoICRkZXN0ZmlsZSAhPSAkZmlsZSApCgl7CgkgICRkZXN0cCA9ICRkaXIuRElSRUNUT1JZX1NFUEFSQVRPUi4kZGVzdGZpbGU7CgoJICAvLyB5ZXAsIHdlIGdvdHRhIHJlbmFtZSBpdAoJICAvLyBidXQgbWFrZSBzdXJlIHRoZSBmaWxlIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCBmaXJzdAoJICBpZiggZmlsZV9leGlzdHMoICRkZXN0cCApICkKCSAgICB7CgkgICAgICAvLyB1aC1vaCBpdCBleGlzdHMKCSAgICAgIC8vIHNraXAgdGhpcyBmaWUuCgkgICAgICBjb250aW51ZTsKCSAgICB9CgoJICByZW5hbWUoICRzcmNwLCAkZGVzdHAgKTsKCSAgJGZpbGUgPSAkZGVzdGZpbGU7Cgl9CgogICAgICAvLyBmaXJzdCBjaGVjayB0byBtYWtlIHN1cmUgaXRzIG5vdCBhbHJlYWR5IGluIHRoZXJlCiAgICAgICRxID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIFdIRVJFCiAgICAgICAgICAgIHVwbG9hZF9uYW1lID0gPyBBTkQgdXBsb2FkX2NhdGVnb3J5X2lkID0gPyI7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHEsIGFycmF5KCAkZmlsZSwgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkgKTsKICAgICAgaWYoICEkZGJyZXN1bHQgKSB7CiAgICAgICAgZWNobyAkZGItPkVycm9yTXNnKCkuIjxici8+IjsKCSAgICAgIHJldHVybjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICAgIGlmKCAkcm93ICkgewogICAgICAgICAgLy8gZmlsZSBleGlzdHMKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgfSAKCiAgICAgIC8vIGFuZCBhZGQgaXQgdG8gdGhlIGRhdGFiYXNlCiAgICAgICR1c2VyaWQgPSBnZXRfdXNlcmlkKCk7CiAgICAgICR1c2VybmFtZSA9ICRfU0VTU0lPTlsiY21zX2FkbWluX3VzZXJuYW1lIl07CiAgICAgICRuZXdpZCA9ICRkYi0+R2VuSUQgKGNtc19kYl9wcmVmaXggKCkuIm1vZHVsZV91cGxvYWRzX3NlcSIpOwogICAgICAkcGFybXMgPQlhcnJheSggJG5ld2lkLCAKCQkgICAgICAgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSwKCQkgICAgICAgJGZpbGUsIAoJCSAgICAgICAkdXNlcm5hbWUsIAoJCSAgICAgICAkZGVzYywgCgkJICAgICAgICIiLCAKCQkgICAgICAgImxvY2FsaG9zdCIsIAoJCSAgICAgICAkc2l6ZSwKCQkgICAgICAgJGRiLT5EQlRpbWVTdGFtcCh0aW1lKCkpICk7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCAkcGFybXMgKTsKICAgICAgaWYoICEkZGJyZXN1bHQgKSB7CgllY2hvICRkYi0+RXJyb3JNc2coKS4iPGJyLz4iOwoJcmV0dXJuOwogICAgICB9CiAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX2lzVmFsaWRGaWxlbmFtZSggJGZpbGVuYW1lICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRlc3QgYSBzdHJpbmcgdG8gc2VlIGlmIGl0IGlzIGEgdmFsaWQgZmlsZW5hbWUgKGkuZSkgdGhlCiAgIGV4dGVuc2lvbiBmYWxscyBpbiBvdXIgYWxsb3dlZCBleHRlbnNpb25zLCBhbmQgdGhlcmUgYXJlCiAgIG5vIGludmFsaWQgY2hhcmFjdGVycy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfaXNWYWxpZEZpbGVuYW1lICgkZmlsZW5hbWUpCiAgewogICAgJGZpbGVfbmFtZSA9IHRyaW0gKCRmaWxlbmFtZSk7CiAgICAkZXh0ZW5zaW9uID0gc3RydG9sb3dlciAoc3RycmNociAoJGZpbGVfbmFtZSwgIi4iKSk7CgogICAgLy8gYXJyYXkgb2YgZmlsZXMgd2UgZG9uJ3QgYWxsb3cKICAgICRleHRfc3RyID0gJHRoaXMtPkdldFByZWZlcmVuY2UgKCJ2YWxpZF91cGxvYWRleHRlbnNpb25zIik7CiAgICAkZXh0X2FycmF5ID0gc3BsaXQgKCIsIiwgJGV4dF9zdHIpOwogICAgJGV4dF9jb3VudCA9IGNvdW50ICgkZXh0X2FycmF5KTsKCiAgICBpZiAoISRmaWxlX25hbWUpCiAgICB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaWYgKCEkZXh0X2FycmF5KQogICAgICB7CglyZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKCWZvcmVhY2ggKCRleHRfYXJyYXkgYXMgJHZhbHVlKQoJewoJICAkZmlyc3RfY2hhciA9IHN1YnN0ciAoJHZhbHVlLCAwLCAxKTsKCSAgaWYgKCRmaXJzdF9jaGFyIDw+ICIuIikKCSAgewoJICAgICRleHRlbnNpb25zW10gPSAiLiIuc3RydG9sb3dlciAoJHZhbHVlKTsKCSAgfQoJICBlbHNlCgkgIHsKCSAgICAkZXh0ZW5zaW9uc1tdID0gc3RydG9sb3dlciAoJHZhbHVlKTsKCSAgfQoJfQoKCSR2YWxpZF9leHRlbnNpb24gPSBmYWxzZTsKCWZvcmVhY2ggKCRleHRlbnNpb25zIGFzICR2YWx1ZSkKCXsKCSAgaWYgKCR2YWx1ZSA9PSAkZXh0ZW5zaW9uKQoJICB7CgkgICAgJHZhbGlkX2V4dGVuc2lvbiA9IHRydWU7CgkgICAgYnJlYWs7CgkgIH0KCX0KCglyZXR1cm4gJHZhbGlkX2V4dGVuc2lvbjsKICAgICAgfQogICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIEVORCBPRiBVVElMSVRZIEZVTkNUSU9OUwogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICBtdXN0IHJldHVybiB0aGUgZXhhY3QgY2xhc3MgbmFtZSBvZiB0aGUgbW9kdWxlLgogICBJZiB0aGVzZSBkbyBub3QgbWF0Y2gsIGJhZCB0aGluZ3MgaGFwcGVuLgoJICAgCiAgIFRoaXMgaXMgdGhlIG5hbWUgdGhhdCdzIHNob3duIGluIHRoZSBtYWluIE1vZHVsZXMKICAgcGFnZSBpbiB0aGUgQWRtaW4uCgkgICAKICAgSWYgeW91IHdhbnQgdG8gYmUgc2FmZSwgeW91IGNhbiBqdXN0IHJlcGxhY2UgdGhlIGJvZHkKICAgb2YgdGhpcyBmdW5jdGlvbiB3aXRoOgogICByZXR1cm4gZ2V0X2NsYXNzKCR0aGlzKTsgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0TmFtZSAoKQogIHsKICAgIHJldHVybiAnVXBsb2Fkcyc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0RnJpZW5kbHlOYW1lKCkKICAgVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmcsIHByZWZlcmFibHkgYSBsb2NhbGl6ZWQgbmFtZQogICBvZiB0aGUgbW9kdWxlLiBUaGlzIGlzIHRoZSBuYW1lIHRoYXQncyBzaG93biBpbiB0aGUKICAgQWRtaW4gTWVudXMgYW5kIHNlY3Rpb24gcGFnZXMgKGlmIHRoZSBtb2R1bGUgaGFzIGFuIGFkbWluCiAgIGNvbXBvbmVudCkuCgkgICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRGcmllbmRseU5hbWUgKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcgKCdmcmllbmRseW5hbWUnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRWZXJzaW9uKCkKICAgVGhpcyBjYW4gcmV0dXJuIGFueSBzdHJpbmcsIHByZWZlcmFibHkgYSBudW1iZXIgb3IKICAgc29tZXRoaW5nIHRoYXQgbWFrZXMgc2Vuc2UgZm9yIGRlc2lnbmF0aW5nIGEgdmVyc2lvbi4KICAgVGhlIENNUyB3aWxsIHVzZSB0aGlzIHRvIGlkZW50aWZ5IHdoZXRoZXIgb3Igbm90CiAgIHRoZSBpbnN0YWxsZWQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIGlzIGN1cnJlbnQsIGFuZAogICB0aGUgbW9kdWxlIHdpbGwgdXNlIGl0IHRvIGZpZ3VyZSBvdXQgaG93IHRvIHVwZ3JhZGUKICAgaXRzZWxmIGlmIHJlcXVlc3RlZC4JICAgCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0VmVyc2lvbiAoKQogIHsKICAgIHJldHVybiAnMS4xLjcnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEhlbHAoKQogICBUaGlzIHJldHVybnMgSFRNTCBpbmZvcm1hdGlvbiBvbiB0aGUgbW9kdWxlLgogICBUeXBpY2FsbHksIHlvdSdsbCB3YW50IHRvIGluY2x1ZGUgaW5mb3JtYXRpb24gb24gaG93IHRvCiAgIHVzZSB0aGUgbW9kdWxlLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nICgnaGVscCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvcigpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvciAoKQogIHsKICAgIHJldHVybiAnY2FsZ3V5MTAwMCc7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0QXV0aG9yRW1haWwoKQogICBUaGlzIHJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyBwcmVzZW50ZWQgaW4gdGhlIE1vZHVsZQogICBBZG1pbiBpZiB5b3UgY2xpY2sgb24gdGhlICJBYm91dCIgbGluay4gSXQgaGVscHMgdXNlcnMKICAgb2YgeW91ciBtb2R1bGUgZ2V0IGluIHRvdWNoIHdpdGggeW91IHRvIHNlbmQgYnVnIHJlcG9ydHMsCiAgIHF1ZXN0aW9ucywgY2FzZXMgb2YgYmVlciwgYW5kL29yIGxhcmdlIHN1bXMgb2YgbW9uZXkuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwgKCkKICB7CiAgICByZXR1cm4gJ3JvYkB0ZWNoY29tLmR5bmRucy5vcmcnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldENoYW5nZUxvZygpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgbW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgQWJvdXQgbGluay4gSXQgaGVscHMgdXNlcnMKICAgZmlndXJlIG91dCB3aGF0J3MgY2hhbmdlZCBiZXR3ZWVuIHJlbGVhc2VzLgogICBTZWUgdGhlIG5vdGUgb24gbG9jYWxpemF0aW9uIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldENoYW5nZUxvZyAoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZyAoJ2NoYW5nZWxvZycpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIElzUGx1Z2luTW9kdWxlKCkKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgb3IgZmFsc2UsIGRlcGVuZGluZyB1cG9uCiAgIHdoZXRoZXIgdXNlcnMgY2FuIGluY2x1ZGUgdGhlIG1vZHVsZSBpbiBhIHBhZ2Ugb3IKICAgdGVtcGxhdGUgdXNpbmcgYSBzbWFydHkgdGFnIG9mIHRoZSBmb3JtCiAgIHtjbXNfbW9kdWxlIG1vZHVsZT0nVXBsb2FkcycgcGFyYW0xPXZhbCBwYXJhbTI9dmFsLi4ufQogICAKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBub3QgZ2V0IGluY2x1ZGVkIGluIHBhZ2VzIG9yCiAgIHRlbXBsYXRlcywgcmV0dXJuICJmYWxzZSIgaGVyZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSAoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEhhc0FkbWluKCkKICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYm9vbGVhbiB2YWx1ZSwgZGVwZW5kaW5nIG9uCiAgIHdoZXRoZXIgeW91ciBtb2R1bGUgYWRkcyBhbnl0aGluZyB0byB0aGUgQWRtaW4gYXJlYSBvZgogICB0aGUgc2l0ZS4gRm9yIHRoZSByZXN0IG9mIHRoZXNlIGNvbW1lbnRzLCBJJ2xsIGJlIGNhbGxpbmcKICAgdGhlIGFkbWluIHBhcnQgb2YgeW91ciBtb2R1bGUgdGhlICJBZG1pbiBQYW5lbCIgZm9yCiAgIHdhbnQgb2YgYSBiZXR0ZXIgdGVybS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBIYXNBZG1pbiAoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluU2VjdGlvbigpCiAgIElmIHlvdXIgbW9kdWxlIGhhcyBhbiBBZG1pbiBQYW5lbCwgeW91IGNhbiBzcGVjaWZ5CiAgIHdoaWNoIEFkbWluIFNlY3Rpb24gKG9yIHRvcC1sZXZlbCBBZG1pbiBNZW51KSBpdCBzaG93cwogICB1cCBpbi4gVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0cmluZyB0byBzcGVjaWZ5IHRoYXQKICAgc2VjdGlvbi4gVmFsaWQgcmV0dXJuIHZhbHVlcyBhcmU6CiAgIAogICBtYWluICAgICAgICAtIHRoZSBNYWluIG1lbnUgdGFiLgogICBjb250ZW50ICAgICAtIHRoZSBDb250ZW50IG1lbnUKICAgbGF5b3V0ICAgICAgLSB0aGUgTGF5b3V0IG1lbnUKICAgdXNlcnNncm91cHMgLSB0aGUgVXNlcnMgYW5kIEdyb3VwcyBtZW51CiAgIGV4dGVuc2lvbnMgIC0gdGhlIEV4dGVuc2lvbnMgbWVudSAodGhpcyBpcyB0aGUgZGVmYXVsdCkKICAgc2l0ZWFkbWluICAgLSB0aGUgU2l0ZSBBZG1pbiBtZW51CiAgIHZpZXdzaXRlICAgIC0gdGhlIFZpZXcgU2l0ZSBtZW51IHRhYgogICBsb2dvdXQgICAgICAtIHRoZSBMb2dvdXQgbWVudSB0YWIKICAgCiAgIE5vdGUgdGhhdCBpZiB5b3UgcGxhY2UgeW91ciBtb2R1bGUgaW4gdGhlIG1haW4sCiAgIHZpZXdzaXRlLCBvciBsb2dvdXQgc2VjdGlvbnMsIGl0IHdpbGwgc2hvdyB1cCBpbiB0aGUKICAgbWVudXMsIGJ1dCB3aWxsIG5vdCBiZSB2aXNpYmxlIGluIGFueSB0b3AtbGV2ZWwKICAgc2VjdGlvbiBwYWdlcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pblNlY3Rpb24gKCkKICB7CiAgICByZXR1cm4gJ2V4dGVuc2lvbnMnOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEFkbWluRGVzY3JpcHRpb24oKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gaGF2ZSBpdCByZXR1cm4gYSBkZXNjcmlwdGlvbiBzdHJpbmcgdGhhdCBnZXRzIHNob3duCiAgIGluIHRoZSBBZG1pbiBTZWN0aW9uIHBhZ2UgdGhhdCBjb250YWlucyB0aGUgbW9kdWxlLgogICAKICAgU2VlIHRoZSBub3RlIG9uIGxvY2FsaXphdGlvbiBhdCB0aGUgdG9wIG9mIHRoaXMgZmlsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nICgnbW9kZGVzY3JpcHRpb24nKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBWaXNpYmxlVG9BZG1pblVzZXIoKQogICBJZiB5b3VyIG1vZHVsZSBkb2VzIGhhdmUgYW4gQWRtaW4gUGFuZWwsIHlvdQogICBjYW4gY29udHJvbCB3aGV0aGVyIG9yIG5vdCBpdCdzIGRpc3BsYXllZCBieSB0aGUgYm9vbGVhbgogICB0aGF0IGlzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkCiAgIHRvIGhpZGUgbW9kdWxlcyBmcm9tIGFkbWlucyB3aG8gbGFjayBwZXJtaXNzaW9uIHRvIHVzZQogICB0aGVtLgogICBJbiB0aGlzIGNhc2UsIHRoZSBtb2R1bGUgd2lsbCBvbmx5IGJlIHZpc2libGUgdG8gYWRtaW5zCiAgIHdobyBoYXZlICJVc2UgVXBsb2FkcyIgcGVybWlzc2lvbnMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVmlzaWJsZVRvQWRtaW5Vc2VyICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgVXBsb2FkcycpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldERlcGVuZGVuY2llcygpCiAgIFlvdXIgbW9kdWxlIG1heSBuZWVkIGFub3RoZXIgbW9kdWxlIHRvIGFscmVhZHkgYmUgaW5zdGFsbGVkCiAgIGJlZm9yZSB5b3UgY2FuIGluc3RhbGwgaXQuCiAgIFRoaXMgbWV0aG9kIHJldHVybnMgYSBsaXN0IG9mIHRob3NlIGRlcGVuZGVuY2llcyBhbmQKICAgbWluaW11bSB2ZXJzaW9uIG51bWJlcnMgdGhhdCB0aGlzIG1vZHVsZSByZXF1aXJlcy4KICAgCiAgIEl0IHNob3VsZCByZXR1cm4gYW4gaGFzaCwgZWcuCiAgIHJldHVybiBhcnJheSgnc29tZW1vZHVsZSc9PicxLjAnLCAnb3RoZXJtb2R1bGUnPT4nMS4xJyk7CiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RGVwZW5kZW5jaWVzICgpCiAgewogICAgcmV0dXJuIGFycmF5ICgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGwoKQogICBXaGVuIHlvdXIgbW9kdWxlIGlzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGRvIHNvbWUKICAgc2V0dXAuIFR5cGljYWwgdGhpbmdzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHRoZSBjcmVhdGlvbgogICBhbmQgcHJlcG9wdWxhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsIGRhdGFiYXNlIHNlcXVlbmNlcywKICAgcGVybWlzc2lvbnMsIHByZWZlcmVuY2VzLCBldGMuCiAgIAogICBUaGlzIGV4YW1wbGUgY3JlYXRlcyBhIFNrZWxldG9uIGRhdGFiYXNlIHRhYmxlIGFuZAogICBzZXF1ZW5jZSwgaXQgY3JlYXRlcyB0aGUgIlVzZSBTa2VsZXRvbiIgcGVybWlzc2lvbiwKICAgYW5kIHNldHMgdGhlICJTaW5nIExvdWRseSIgcHJlZmVyZW5jZS4KICAgCiAgIFRoZSBkYXRhYmFzZSBpcyBub3QgYWN0dWFsbHkgdXNlZCBpbiB0aGlzIGV4YW1wbGU7CiAgIGNoZWNrIGFueSBvbmUgb2YgdGhlIG90aGVyIG1vZHVsZXMgaWYgeW91IHdhbnQgdG8gc2VlCiAgIG1ldGhvZCBjb2RlIHRoYXQgdXNlcyB0aGUgZGF0YWJhc2UuCiAgIAogICBGb3IgaW5mb3JtYXRpb24gb24gdGhlIGNyZWF0aW9uIG9mIGRhdGFiYXNlIHRhYmxlcywKICAgY2hlY2sgb3V0IHRoZSBBRE9EQiBEYXRhIERpY3Rpb25hcnkgcGFnZSBhdAogICBodHRwOi8vcGhwbGVucy5jb20vbGVucy9hZG9kYi9kb2NzLWRhdGFkaWN0Lmh0bQogICAKICAgVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgImZhbHNlIiBpbiBjYXNlIG9mIGFueSBlcnJvciwKICAgYW5kIENNUyB3aWxsIG5vdCBjb25zaWRlciB0aGUgbW9kdWxlIGluc3RhbGxlZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBJbnN0YWxsICgpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgogICAgJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSAoJGRiKTsKCiAgICAvLyB0YWJsZSBzY2hlbWEgZGVzY3JpcHRpb24KICAgICRmbGRzID0gInVwbG9hZF9pZCBJIEtFWSwKICAgICAgICAgICAgIHVwbG9hZF9jYXRlZ29yeV9pZCBJLAogICAgICAgICAgICAgdXBsb2FkX25hbWUgQygyNTUpLAogICAgICAgICAgICAgdXBsb2FkX2F1dGhvciBDKDI1NSksCiAgICAgICAgICAgICB1cGxvYWRfc3VtbWFyeSBDKDI1NSksIAogICAgICAgICAgICAgdXBsb2FkX2Rlc2NyaXB0aW9uIFgsCiAgICAgICAgICAgICB1cGxvYWRfaXAgQygyNTUpLAogICAgICAgICAgICAgdXBsb2FkX3NpemUgSSwKICAgICAgICAgICAgIHVwbG9hZF9kYXRlIFQKCSAgICAiOwoKICAgIC8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4KICAgICR0YWJvcHRhcnJheSA9IGFycmF5ICgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMIChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIiwKCQkJCSAgICAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkgKCRzcWxhcnJheSk7CiAgICAKICAgIC8vIGEgdGFibGUgZm9yIGRvd25sb2FkcwogICAgJGZsZHMgPSAiZG93bmxvYWRfaWQgSSBLRVksCiAJICAgICBmaWxlX2lkICAgICBJLCAKCSAgICAgZG93bmxvYWRfZGF0ZSBULAogICAgICAgICAgICAgZG93bmxvYWRfaXAgICBDKDI1NSksCiAgICAgICAgICAgICBkb3dubG9hZF91c2VyIEMoMjU1KQoJICAgICI7CgogICAgLy8gY3JlYXRlIGl0LiBUaGlzIHNob3VsZCBkbyBlcnJvciBjaGVja2luZywgYnV0IEknbSBhIGxhenkgc29kLgogICAgJHRhYm9wdGFycmF5ID0gYXJyYXkgKCdteXNxbCcgPT4gJ1RZUEU9TXlJU0FNJyk7CiAgICAkc3FsYXJyYXkgPQogICAgICAkZGljdC0+Q3JlYXRlVGFibGVTUUwgKGNtc19kYl9wcmVmaXggKCkuIm1vZHVsZV91cGxvYWRzX2Rvd25sb2FkcyIsCgkJCSAgICAgJGZsZHMsICR0YWJvcHRhcnJheSk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5ICgkc3FsYXJyYXkpOwoKICAgIC8vIGEgdGFibGUgZm9yIGNhdGVnb3JpZXMKICAgICRmbGRzID0gInVwbG9hZF9jYXRlZ29yeV9pZCBJIEtFWSwKCSAgICAgdXBsb2FkX2NhdGVnb3J5X25hbWUgQygyNTUpLAoJICAgICB1cGxvYWRfY2F0ZWdvcnlfZGVzY3JpcHRpb24gWCwKICAgICAgICAgICAgIHVwbG9hZF9jYXRlZ29yeV9wYXRoIEMoMjU1KSwKCSAgICAgdXBsb2FkX2NhdGVnb3J5X2xpc3RhYmxlIEkKCSAgICAiOwoKICAgIC8vIGNyZWF0ZSBpdC4gVGhpcyBzaG91bGQgZG8gZXJyb3IgY2hlY2tpbmcsIGJ1dCBJJ20gYSBsYXp5IHNvZC4KICAgICR0YWJvcHRhcnJheSA9IGFycmF5ICgnbXlzcWwnID0+ICdUWVBFPU15SVNBTScpOwogICAgJHNxbGFycmF5ID0KICAgICAgJGRpY3QtPkNyZWF0ZVRhYmxlU1FMIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfdXBsb2Fkc19jYXRlZ29yaWVzIiwKCQkJICAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkgKCRzcWxhcnJheSk7CiAgICAKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkgKCRzcWxhcnJheSk7CiAgICAvLyBjcmVhdGUgYSBzZXF1ZW5jZQogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfc2VxIik7CiAgICAKICAgIC8vIGFuZCBhbm90aGVyIG9uZQogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZSAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllc19zZXEiKTsKCiAgICAvLyBhbmQgYSB0aGlyZCBvbmUKICAgICRkYi0+Q3JlYXRlU2VxdWVuY2UgKGNtc19kYl9wcmVmaXggKCkuIm1vZHVsZV91cGxvYWRzX2Rvd25sb2Fkc19zZXEiKTsKCiAgICAvLyBjcmVhdGUgYSBwZXJtaXNzaW9uCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJywgJ01hbmFnZSBVcGxvYWRzJyk7CgogICAgLy8gY3JlYXRlIGEgcHJlZmVyZW5jZQogICAgJHRoaXMtPlNldFByZWZlcmVuY2UgKCJtYXhfdXBsb2Fkc2l6ZSIsIDEwMDAwMDApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UgKCJ2YWxpZF91cGxvYWRleHRlbnNpb25zIiwKCQkJICAiZ2lmLGpwZyxKUEVHLGJtcCx3bWYsd21hLHdtdixtcGcsemlwLHRhcixneixiejIsbXAzLHdhdixhdSxvZ2ciKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlICgic3VibmV0X2V4Y2x1c2lvbnMiLCAiIiApOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UgKCdjcmVhdGVfZHVtbXlfaW5kZXhfaHRtbCcsIDEpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UgKCdzZW5kX3VwbG9hZF9ub3RpZmljYXRpb25zX3RvJywnJyk7CiAgICAKICAgIC8vIFNldHVwIGZvcm0gdGVtcGxhdGUKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF91cGxvYWRmb3JtJywgJHRoaXMtPmRmbHRfdXBsb2FkZm9ybXRlbXBsYXRlKTsKICAgIC8vIFNldHVwIHN1bW1hcnkgdGVtcGxhdGUKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF9kaXNwbGF5c3VtbWFyeScsICR0aGlzLT5kZmx0X3N1bW1hcnl0ZW1wbGF0ZSk7CiAgICAvLyBTZXR1cCBkZXRhaWwgdGVtcGxhdGUKICAgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF9kaXNwbGF5ZGV0YWlsJywgJHRoaXMtPmRmbHRfZGV0YWlsdGVtcGxhdGUpOwogICAgLy8gdGVtcGxhdGUgdXNlZCBmb3IgZW1haWwgbm90aWZpY2F0aW9ucwogICAgJHRoaXMtPlNldFRlbXBsYXRlKCAndXBsb2FkX2VtYWlsdGVtcGxhdGUnLCAkdGhpcy0+ZGZsdF9lbWFpbG5vdGlmeXRlbXBsYXRlICk7CgogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQgKDAsICR0aGlzLT5MYW5nICgnZnJpZW5kbHluYW1lJyksCgkJICAkdGhpcy0+TGFuZyAoJ2luc3RhbGxlZCcsICR0aGlzLT5HZXRWZXJzaW9uICgpKSk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgQWZ0ZXIgaW5zdGFsbGF0aW9uLCB0aGVyZSBtYXkgYmUgdGhpbmdzIHlvdSB3YW50IHRvCiAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCiAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSW5zdGFsbFBvc3RNZXNzYWdlICgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nICgncG9zdGluc3RhbGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBVbmluc3RhbGxQb3N0TWVzc2FnZSgpCiAgIEFmdGVyIHJlbW92aW5nIGEgbW9kdWxlLCB0aGVyZSBtYXkgYmUgdGhpbmdzIHlvdSB3YW50IHRvCiAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCiAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UgKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcgKCdwb3N0dW5pbnN0YWxsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVXBncmFkZSgpCiAgIElmIHlvdXIgbW9kdWxlIHZlcnNpb24gbnVtYmVyIGRvZXMgbm90IG1hdGNoIHRoZSB2ZXJzaW9uCiAgIG51bWJlciBvZiB0aGUgaW5zdGFsbGVkIG1vZHVsZSwgdGhlIENNUyBBZG1pbiB3aWxsIGdpdmUKICAgeW91IGEgY2hhbmNlIHRvIHVwZ3JhZGUgdGhlIG1vZHVsZS4gVGhpcyBpcyB0aGUgZnVuY3Rpb24KICAgdGhhdCBhY3R1YWxseSBoYW5kbGVzIHRoZSB1cGdyYWRlLgogICBJZGVhbGx5LCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgdXBncmFkZXMgaW5jcmVtZW50YWxseSwKICAgc28geW91IGNvdWxkIHVwZ3JhZGUgZnJvbSB2ZXJzaW9uIDAuMC4xIHRvIDEwLjUuNyB3aXRoCiAgIGEgc2luZ2xlIGNhbGwuIEZvciBhIGdyZWF0IGV4YW1wbGUgb2YgdGhpcywgc2VlIHRoZSBOZXdzCiAgIG1vZHVsZSBpbiB0aGUgc3RhbmRhcmQgQ01TIGluc3RhbGwuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVXBncmFkZSAoJG9sZHZlcnNpb24sICRuZXd2ZXJzaW9uKQogIHsKICAgICRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKICAgIHN3aXRjaCggJG9sZHZlcnNpb24gKQogICAgICB7CiAgICAgIGNhc2UgIjEuMS4wIjoKICAgICAgY2FzZSAiMS4xLjEiOgogICAgICBjYXNlICIxLjEuMiI6CiAgICAgIGNhc2UgIjEuMS4zIjoKICAgICAgY2FzZSAiMS4xLjQiOgogICAgICBjYXNlICIxLjEuNSI6CiAgICAgIGNhc2UgIjEuMS42IjoKCSR0aGlzLT5TZXRQcmVmZXJlbmNlICgnc2VuZF91cGxvYWRfbm90aWZpY2F0aW9uc190bycsJycpOwoJJHRoaXMtPlNldFRlbXBsYXRlKCAndXBsb2FkX2VtYWlsdGVtcGxhdGUnLCAkdGhpcy0+ZGZsdF9lbWFpbG5vdGlmeXRlbXBsYXRlICk7CglyZXR1cm47CiAgICAgIH0KCiAgICBzd2l0Y2ggKCRvbGR2ZXJzaW9uKQogICAgewogICAgY2FzZSAiMS4wIjoKICAgIGNhc2UgIjEuMC4xIjoKICAgIGNhc2UgIjEuMC4yIjoKICAgIGNhc2UgIjEuMC4zIjoKICAgIGNhc2UgIjEuMC40IjoKICAgIGNhc2UgIjEuMC41IjoKICAgICAgewoJLy8gdGhlc2UgdmVyc2lvbnMgZGlkbid0IGhhdmUgYSBzdW1tYXJ5IGZpZWxkCgkvLyBzbyB3ZSBjb252ZXJ0IHRoZSBzY2hlbWEgb2YgdGhlIHVwbG9hZHMgdGFibGUgdG8gaGF2ZSBhIHN1bW1hcnkgZmllbGQKCS8vIGFuZCBjb3B5IHRoZSBvbGQgZGVzY3JpcHRpb24gaW50byB0aGUgbmV3IHN1bW1hcnkgZmllbGQuCgkkdGhpcy0+X2ZpeFRvQWRqdXN0VGFibGVTdHJ1Y3R1cmUxKCk7CglicmVhazsKICAgICAgfQogICAgY2FzZSAiMS4wLjYiOgogICAgICB7CgkvLyB0aGlzIG1vZHVsZSB3YXMgdmVyeSB2ZXJ5IG1lc3NlZCB1cC4KCXJldHVybiBmYWxzZTsKICAgICAgfQogICAgY2FzZSAiMS4wLjciOgogICAgY2FzZSAiMS4wLjgiOgogICAgY2FzZSAiMS4wLjkiOgogICAgICB7CgkvLyB0aGVzZSB2ZXJzaW9ucyBoYWQgYSBzdW1tYXJ5IGZpZWxkIGJ1dCBpdCAibWF5IiBoYXZlIGJlZW4gcGxhY2VkIGFzCgkvLyB0aGUgbGFzdCBjb2x1bW4gZHVlIHRvIHVwZ3JhZGluZyBmcm9tIDEuMC42IG9yIGVhcmxpZXIKCS8vIHRoaXMgd2lsbCByZS1jcmVhdGUgdGhlIHRhYmxlIHRvIGVuc3VyZSB0aGF0IHRoZSBkYXRhIHdpbGwgYmUgaW4KCS8vIHRoZSBjb3JyZWN0IG9yZGVyLgoJJHRoaXMtPl9maXhUb0FkanVzdFRhYmxlU3RydWN0dXJlMigpOwoJYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICAvLyBhbnl0aGluZyBwYXN0IGhlcmUgc2hvdWxkIGJlIGZpbmUuCiAgICByZXR1cm47CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVW5pbnN0YWxsKCkKICAgU29tZXRpbWVzLCBhbiBleGNlcHRpb25hbGx5IHVuZW5saWdodGVuZWQgb3IgaWdub3JhbnQKICAgYWRtaW4gd2lsbCB3aXNoIHRvIHVuaW5zdGFsbCB5b3VyIG1vZHVsZS4gV2hpbGUgaXQKICAgd291bGQgYmUgYmVzdCB0byBsYXkgaW50byB0aGVzZSBpZGlvdHMgd2l0aCBhIGNsdWVzdGljaywKICAgd2Ugd2lsbCBkbyB0aGUgbWFnbmFuaW1vdXMgdGhpbmcgYW5kIHJlbW92ZSB0aGUgbW9kdWxlCiAgIGFuZCBjbGVhbiB1cCB0aGUgZGF0YWJhc2UsIHBlcm1pc3Npb25zLCBhbmQgcHJlZmVyZW5jZXMKICAgdGhhdCBhcmUgc3BlY2lmaWMgdG8gaXQuCiAgIFRoaXMgaXMgdGhlIG1ldGhvZCB3aGVyZSB3ZSBkbyB0aGlzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVuaW5zdGFsbCAoKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoKICAgIC8vIHJlbW92ZSB0aGUgZGF0YWJhc2UgdGFibGUKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkgKCRkYik7CiAgICAkc3FsYXJyYXkgPSAkZGljdC0+RHJvcFRhYmxlU1FMIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfdXBsb2FkcyIpOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSAoJHNxbGFycmF5KTsKCiAgICAvLyByZW1vdmUgdGhlIHNlcXVlbmNlCiAgICAkZGItPkRyb3BTZXF1ZW5jZSAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfc2VxIik7CgogICAgLy8gcmVtb3ZlIHRoZSBjYXRlZ29yeSB0YWJsZQogICAgJHNxbGFycmF5ID0KICAgICAgJGRpY3QtPkRyb3BUYWJsZVNRTCAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyIpOwoKICAgIC8vIHJlbW92ZSBpdCdzIHNlcXVlbmNlCiAgICAkZGItPkRyb3BTZXF1ZW5jZSAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllc19zZXEiKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkgKCRzcWxhcnJheSk7CgogICAgLy8gcmVtb3ZlIHRoZSBkb3dubG9hZHMgdGFibGUKICAgICRzcWxhcnJheSA9CiAgICAgICRkaWN0LT5Ecm9wVGFibGVTUUwgKGNtc19kYl9wcmVmaXggKCkuIm1vZHVsZV91cGxvYWRzX2Rvd25sb2FkcyIpOwoKICAgIC8vIGFuZCBpdCdzIHNlcXVlbmNlCiAgICAkZGItPkRyb3BTZXF1ZW5jZSAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfZG93bmxvYWRzX3NlcSIpOwogICAgJGRpY3QtPkV4ZWN1dGVTUUxBcnJheSAoJHNxbGFycmF5KTsKCiAgICAvLyByZW1vdmUgdGhlIHBlcm1pc3Npb25zCiAgICAkdGhpcy0+UmVtb3ZlUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJyk7CgogICAgLy8gcmVtb3ZlIHRoZSBwcmVmZXJlbmNlCiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSAoIm1heF91cGxvYWRzaXplIik7CiAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSAoInZhbGlkX3VwbG9hZGV4dGVuc2lvbnMiKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlICgic3VibmV0X2V4Y2x1c2lvbnMiKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlICgiY3JlYXRlX2R1bW15X2luZGV4X2h0bWwiKTsKICAgICR0aGlzLT5SZW1vdmVQcmVmZXJlbmNlICgnc2VuZF91cGxvYWRfbm90aWZpY2F0aW9uc190bycpOwoKICAgIC8vIHJlbW92ZSB0ZW1wbGF0ZXMKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgndXBsb2FkX3VwbG9hZGZvcm0nKTsKICAgICR0aGlzLT5EZWxldGVUZW1wbGF0ZSgndXBsb2FkX2Rpc3BsYXlzdW1tYXJ5Jyk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3VwbG9hZF9kaXNwbGF5ZGV0YWlsJyk7CiAgICAkdGhpcy0+RGVsZXRlVGVtcGxhdGUoJ3VwbG9hZF9lbWFpbHRlbXBsYXRlJyk7CgogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQgKDAsICR0aGlzLT5MYW5nICgnZnJpZW5kbHluYW1lJyksCgkJICAkdGhpcy0+TGFuZyAoJ3VuaW5zdGFsbGVkJykpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIERvQWN0aW9uKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybmlkKQogICBUaGlzIGlzIHRoZSBtYWluIGZ1bmN0aW9uIHRoYXQgZ2V0cyBjYWxsZWQgaWYgeW91ciBtb2R1bGUKICAgaXMgYSBwbHVnLWluIHR5cGUgbW9kdWxlLgogICAKICAgSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gY2FsbCB2YXJpb3VzIGRpZmZlcmVudAogICBtZXRob2RzLCBkZXBlbmRpbmcgdXBvbiB0aGUgcmVxdWVzdGVkICJhY3Rpb24uIgogICAKICAgVGhlcmUgYXJlIHR3byBidWlsdC1pbiBhY3Rpb25zOiAiZGVmYXVsdCIgd2hpY2ggZ2V0cwogICBjYWxsZWQgaWYgdGhlIG1vZHVsZSBpcyBhY2Nlc3NlZCBmcm9tIGEgcGFnZSBvciB0ZW1wbGF0ZSwKICAgYW5kICJkZWZhdWx0YWRtaW4iIHdoaWNoIGdldHMgY2FsbGVkIGZyb20gdGhlIEFkbWluCiAgIHBhbmVsLgogICAKICAgVGhlIEFjdGlvbiBjYW4gYmUgb3ZlcnJpZGRlbiBieSBwYXNzaW5nIGEgZGlmZmVyZW50CiAgIGFjdGlvbiBlaXRoZXIgaW4geW91ciB0YWcsIGUuZy4sCiAgIHtjbXNfbW9kdWxlIG1vZHVsZT0nVXBsb2FkcycgYWN0aW9uPSdzb21ldGhpbmcnfQogICBvciBieSBwYXNzaW5nIGl0IGluIGEgbGluayBjcmVhdGUgYnkgdGhlIENyZWF0ZUxpbmsKICAgbWV0aG9kLiBNb3JlIG9uIHRoYXQgY2FuIGJlIHNlZW4gYmVsb3cgaW4gdGhlCiAgIERpc3BsYXlBZG1pbk5hdiBtZXRob2QuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gRG9BY3Rpb24gKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybmlkID0gLTEpCiAgewogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CiAgICAgIGNhc2UgJ2RlZmF1bHQnOgoJewoJICAvLyB0aGlzIGlzIHRoZSBwbHVnLWluIHNpZGUsIGkuZS4sIG5vbi1BZG1pbgoJICAkdGhpcy0+X0Rpc3BsYXlNb2R1bGVPdXRwdXQgKCRhY3Rpb24sICRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RlZmF1bHRhZG1pbic6Cgl7CgkgIC8vIG9ubHkgbGV0IHBlb3BsZSBhY2Nlc3MgbW9kdWxlIHByZWZlcmVuY2VzIGlmIHRoZXkgaGF2ZSBwZXJtaXNzaW9uCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblBhbmVsICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ2FjY2Vzc2RlbmllZCcpKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdnZXRmaWxlJzoKCXsKCSAgLy8gYSB1c2VyIHdhbnRzIGEgc3BlY2lmaWMgZmlsZQoJICAkdGhpcy0+U2VuZEZpbGUoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb191cGxvYWQnOgoJewoJICAvLyBhIHVzZXIgaXMgdHJ5aW5nIHRvIHVwbG9hZCBzb21ldGhpbmcKCSAgJHJldCA9ICR0aGlzLT5BdHRlbXB0VXBsb2FkICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CgkgIGlmKCAkcmV0WzBdID09IEZBTFNFICkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgICRyZXRbMV0gKTsKCSAgICAgIHJldHVybjsKCSAgICB9CgkgICR0aGlzLT5SZWRpcmVjdENvbnRlbnQoICRyZXR1cm5pZCApOwoJICBicmVhazsKCX0KICAgICAgY2FzZSAnc2F2ZV9hZG1pbl9wcmVmcyc6Cgl7CgkgIC8vIG9ubHkgbGV0IHBlb3BsZSBzYXZlIG1vZHVsZSBwcmVmZXJlbmNlcyBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9TYXZlQWRtaW5QcmVmcyAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2FkZGNhdGVnb3J5JzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgVXBsb2FkcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5BZGRDYXRlZ29yeSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RvX2FkZGNhdGVnb3J5JzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgVXBsb2FkcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5Eb0FkZENhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZWRpdGNhdGVnb3J5JzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgVXBsb2FkcycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5FZGl0Q2F0ZWdvcnkgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb19lZGl0Y2F0ZWdvcnknOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRWRpdENhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZGVsZXRlY2F0ZWdvcnknOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRlbGV0ZUNhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZG9fZGVsZXRlY2F0ZWdvcnknOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRGVsZXRlQ2F0ZWdvcnkgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKCSAgICB9CgkgIGJyZWFrOwoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZWRpdHVwbG9hZCc6Cgl7CgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRWRpdFVwbG9hZCAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RvX2VkaXR1cGxvYWQnOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvRWRpdFVwbG9hZCAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RvX2RlbGV0ZXVwbG9hZCc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRG9EZWxldGVVcGxvYWQgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICd1cGxvYWRmb3JtdGVtcGxhdGUnOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBVcGxvYWRzJykpCgkgICAgewoJICAgICAgaWYgKGlzc2V0ICgkcGFyYW1zWydkZWZhdWx0YnV0dG9uJ10pKQoJCXsKCQkgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF91cGxvYWRmb3JtJywgJHRoaXMtPmRmbHRfdXBsb2FkZm9ybXRlbXBsYXRlKTsKCQl9CgkgICAgICBlbHNlCgkJewoJCSAgJHRoaXMtPlNldFRlbXBsYXRlICgndXBsb2FkX3VwbG9hZGZvcm0nLCAkcGFyYW1zWyd0ZW1wbGF0ZWNvbnRlbnQnXSk7CgkJfQoJICAgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICd1cGxvYWRmb3JtX3RlbXBsYXRlJyk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAndXBkYXRlZW1haWx0ZW1wbGF0ZSc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2RlZmF1bHRidXR0b24nXSkpCgkJewoJCSAgJHRoaXMtPlNldFRlbXBsYXRlICgndXBsb2FkX2VtYWlsdGVtcGxhdGUnLAoJCQkJICAgICAgJHRoaXMtPmRmbHRfZW1haWxub3RpZnl0ZW1wbGF0ZSk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF9lbWFpbHRlbXBsYXRlJywgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50J10pOwoJCX0KCSAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZW1haWxfdGVtcGxhdGUnKTsKCSAgICB9Cgl9CiAgICAgIGNhc2UgJ3VwZGF0ZXN1bW1hcnl0ZW1wbGF0ZSc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2RlZmF1bHRidXR0b24nXSkpCgkJewoJCSAgJHRoaXMtPlNldFRlbXBsYXRlICgndXBsb2FkX2Rpc3BsYXlzdW1tYXJ5JywKCQkJCSAgICAgICR0aGlzLT5kZmx0X3N1bW1hcnl0ZW1wbGF0ZSk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF9kaXNwbGF5c3VtbWFyeScsICRwYXJhbXNbJ3RlbXBsYXRlY29udGVudCddKTsKCQl9CgkgICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ3N1bW1hcnlfdGVtcGxhdGUnKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICd1cGRhdGVkZXRhaWx0ZW1wbGF0ZSc6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIFVwbG9hZHMnKSkKCSAgICB7CgkgICAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2RlZmF1bHRidXR0b24nXSkpCgkJewoJCSAgJHRoaXMtPlNldFRlbXBsYXRlICgndXBsb2FkX2Rpc3BsYXlkZXRhaWwnLCAkdGhpcy0+ZGZsdF9kZXRhaWx0ZW1wbGF0ZSk7CgkJfQoJICAgICAgZWxzZQoJCXsKCQkgICR0aGlzLT5TZXRUZW1wbGF0ZSAoJ3VwbG9hZF9kaXNwbGF5ZGV0YWlsJywgJHBhcmFtc1sndGVtcGxhdGVjb250ZW50J10pOwoJCX0KCSAgICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZGV0YWlsX3RlbXBsYXRlJyk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEJFR0lOIE9GIFVJIFNVUFBPUlQgRlVOQ1RJT05TCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5FZGl0Q2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgZm9ybSBmb3IgdGhlIHVzZXIgdG8gZWRpdAogICBjYXRlZ29yeSBkZXRhaWxzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkVkaXRDYXRlZ29yeSAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgndGl0bGUnLCAkdGhpcy0+TGFuZyAoJ2VkaXRjYXRlZ29yeScpKTsKICAgIAogICAgLy8gY2hlY2sgdGhpbmdzIG91dAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX25vY2F0ZWdvcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGNhdGVnb3J5IGluZm8gZnJvbSB0aGUgZGF0YWJhc2UgKGZvciB0aGlzIGNhdGVnb3J5KQogICAgJHF1ZXJ5ID0KICAgICAgIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4ICgpLgogICAgICAibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LCBhcnJheSgkcGFyYW1zWydjYXRlZ29yeV9pZCddKSk7CiAgICBpZiAoISRkYnJlc3VsdCkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgMSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRjYXRlZ29yeS50cGwnKTsKCXJldHVybjsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3cgKCk7CiAgICBpZiAoISRyb3cpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBwb3B1bGF0ZSB0aGUgdGVtcGxhdGUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCJzdGFydGZvcm0iLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdkb19lZGl0Y2F0ZWdvcnknLCAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7ICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3NjYW4nLAoJICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCggJGlkLCAnc2NhbicsICR0aGlzLT5MYW5nKCdzY2FuJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnLCAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeW5hbWUnLCAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9jYXRlZ29yeW5hbWUnLAoJCQkJCQkJCQkgJHJvd1sndXBsb2FkX2NhdGVnb3J5X25hbWUnXSwgMjAsIDgwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfY2F0ZWdvcnlkZXNjJywgJHRoaXMtPkxhbmcgKCdwcm9tcHRfY2F0ZWdvcnlkZXNjJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJCQkJICAgJHJvd1sndXBsb2FkX2NhdGVnb3J5X2Rlc2NyaXB0aW9uJ10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9jYXRlZ29yeXBhdGgnLCR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5cGF0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5cGF0aCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5cGF0aCcsJHJvd1sndXBsb2FkX2NhdGVnb3J5X3BhdGgnXSwKCQkJCQkJICAgODAsIDI1NSwgInJlYWRvbmx5IikpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5bGlzdGFibGUnLCAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeWxpc3RhYmxlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfY2F0ZWdvcnlsaXN0YWJsZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94ICgkaWQsCgkJCQkJCSAgICAgICAnaW5wdXRfY2F0ZWdvcnlsaXN0YWJsZScsIDEsICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9saXN0YWJsZSddKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwYXRobWVzc2FnZScsICR0aGlzLT5MYW5nICgnY2Fubm90bW9kaWZ5cGF0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdoaWRkZW4nLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4gKCRpZCwgJ2NhdGVnb3J5X2lkJywKCQkJCQkJCSAgICAkcGFyYW1zWydjYXRlZ29yeV9pZCddKSk7CiAgICAKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRlbGV0ZUNhdGVnb3J5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBGdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGEgZm9ybSB0byBhbGxvdyB0aGUgdXNlciB0byBkZWxldGUKICAgYSBjYXRlZ29yeSBmcm9tIHRoZSBkYXRhYmFzZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5EZWxldGVDYXRlZ29yeSAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB0ZXN0IHRvIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgZmlsZXMgbGVmdCBpbiB0aGlzIGNhdGVnb3J5LCBpZiB0aGVyZSBhcmUsIHRoZW4gcHVrZQogICAgLy8gb3RoZXJ3aXNlIGRlbGV0ZSB0aGUgZGlyZWN0b3J5IHRvbyAobWF5YmUpCiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApICk7CiAgICAkYyA9ICRkYnJlc3VsdC0+UmVjb3JkQ291bnQoKTsKICAgIGlmKCAkZGJyZXN1bHQtPlJlY29yZENvdW50KCkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfY2F0ZWdvcnlub3RlbXB0eScpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGRpc3BsYXkgc29tZXRoaW5nIHRvIGFsbG93IHRoZSB1c2VyIHRvIGRlbGV0ZSB0aGUgY2F0ZWdvcnkuLi4uIHdpbGwgKG9wdGlvbmFsbHkpIGRlbGV0ZQogICAgLy8gYWxsIG9mIHRoZSAobWFuYWdlZCkgZmlsZXMgaW4gdGhlIGRpcmVjdG9yeSB0b28uCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICd3YXJuaW5nX2RlbGV0ZWNhdGVnb3J5JywKCQkJICAgJHRoaXMtPkxhbmcoJ3dhcm5pbmdfZGVsZXRlY2F0ZWdvcnknKSApOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCAnc3RhcnRmb3JtJyAsCgkJCSAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoICRpZCwgJ2RvX2RlbGV0ZWNhdGVnb3J5JywgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdoaWRkZW4nLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oICRpZCwgJ2NhdGVnb3J5X2lkJywgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkgKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ3Byb21wdF9kZWxldGVkaXJlY3RvcnknLAoJCQkgICAkdGhpcy0+TGFuZygncHJvbXB0X2RlbGV0ZWRpcmVjdG9yeScpICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdpbnB1dF9kZWxldGVkaXJlY3RvcnknLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCggJGlkLAoJCQkJCQkgICAgICAgJ2lucHV0X2RlbGV0ZWRpcmVjdG9yeScsCgkJCQkJCSAgICAgICAxLDAgKSApOwkJCQkJCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnc3VibWl0JywgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXQnLCAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdkZWxldGVjYXRlZ29yeS50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5Eb0RlbGV0ZUNhdGVnb3J5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBIGZ1bmN0aW9uIHRoYXQgYWN0dWFsbHkgZG9lcyB0aGUgZGVsZXRpb24gb2YgdGhlIGNhdGVnb3J5CiAgIGdpdmVuIHRoZSBjYXRlZ29yeSBpZCBpbiB0aGUgcGFyYW1ldGVycywgYW5kIGEgZmV3IG90aGVyCiAgIG5lY2Vzc2FyeSBkZXRhaWxzLiAgVGhpcyBmdW5jdGlvbiBhbHNvIHdpbGwgb3B0aW9uYWxseQogICByZW1vdmUgYWxsIGZpbGVzIGZyb20gdGhlIGRpcmVjdG9yeS4uLiB0aG91Z2ggSSBhbSBub3QKICAgY2VydGFpbiBpZiB0aGlzIGlzIGdvb2QgY29kZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRGVsZXRlQ2F0ZWdvcnkgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSBjYXRlZ29yeSBkZXRhaWxzCiAgICAkY2F0ZWdvcnkgPSAkdGhpcy0+X2dldFVwbG9hZENhdGVnb3J5RGV0YWlscyggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApOwogICAgaWYoICEkY2F0ZWdvcnkgKSB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgIH0KCiAgICBpZiggaXNzZXQoICRwYXJhbXNbJ2lucHV0X2RlbGV0ZWRpcmVjdG9yeSddKSAmJiAkcGFyYW1zWydpbnB1dF9kZWxldGVkaXJlY3RvcnknXSApCiAgICAgIHsKCSRwID0gJHRoaXMtPl9jYXRlZ29yeVBhdGgoICRjYXRlZ29yeVsndXBsb2FkX2NhdGVnb3J5X3BhdGgnXSApOwoJJGRpcl9vcGVuID0gQG9wZW5kaXIoICRwICk7CglpZiggISRkaXJfb3BlbiApIHsKCSAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgICR0aGlzLT5MYW5nICgnZXJyb3JfcGF0aGVycm9yJykpOwoJICByZXR1cm47Cgl9CgoJd2hpbGUoKCRkaXJfY29udGVudCA9IHJlYWRkaXIoJGRpcl9vcGVuKSkgIT0gZmFsc2UpCgkgIHsKCSAgICBpZiggaXNfZmlsZSggJHAuRElSRUNUT1JZX1NFUEFSQVRPUi4kZGlyX2NvbnRlbnQgKSApIHsKCSAgICAgIHVubGluayggJHAuRElSRUNUT1JZX1NFUEFSQVRPUi4kZGlyX2NvbnRlbnQgKTsKCSAgICB9CgkgIH0KCgkvLyBub3cgdHJ5IHRvIHVubGluayB0aGUgZGlyZWN0b3J5IGl0c2VsZgoJLy8gYnV0IGlnbm9yZSBhbnkgZXJyb3JzLgoJcm1kaXIoICRwICk7CiAgICAgIH0KCgogICAgLy8gZGVsZXRlIHRoZSBkaXJlY3RvcnkgY2F0ZWdvcnkKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJHF1ZXJ5ID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2Fkc19jYXRlZ29yaWVzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKTsKCiAgICAvLyBhbmQgd2UncmUgZG9uZQogICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYiggJGlkLCAnY2F0ZWdvcmllcycgKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5FZGl0VXBsb2FkKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBIGZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYSBmb3JtIHRvIGFsbG93IHRoZSB1c2VyIHRvIGVkaXQKICAgdGhlIHBhcmFtZXRlcnMgb3IgZGV0YWlscyBvZiBhbiB1cGxvYWRlZCBmaWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkVkaXRVcGxvYWQgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3RpdGxlJywgJHRoaXMtPkxhbmcgKCdlZGl0dXBsb2FkJykpOwogICAgCiAgICAvLyBjaGVjayB0aGluZ3Mgb3V0CiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWyd1cGxvYWRfaWQnXSkpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX25vaWQnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnZWRpdHVwbG9hZC50cGwnKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgaW5mbyBmcm9tIHRoZSBkYXRhYmFzZSAoZm9yIHRoaXMgZmlsZSkKICAgICRxdWVyeSA9CiAgICAgICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCAoKS4KICAgICAgIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlICgkcXVlcnksIGFycmF5KCRwYXJhbXNbJ3VwbG9hZF9pZCddKSk7CiAgICBpZiAoISRkYnJlc3VsdCkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgMSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdlZGl0dXBsb2FkLnRwbCcpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKTsKICAgIGlmICghJHJvdykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgMSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdlZGl0dXBsb2FkLnRwbCcpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gZ2V0IHRoZSBjYXRlZ29yeSBsaXN0CiAgICAkY2F0ZWdvcnlsaXN0ID0gYXJyYXkgKCk7CiAgICAkcXVlcnkgPQogICAgICAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXggKCkuCiAgICAgICJtb2R1bGVfdXBsb2Fkc19jYXRlZ29yaWVzIE9SREVSIEJZIHVwbG9hZF9jYXRlZ29yeV9uYW1lIEFTQyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSk7CiAgICBpZiAoISRkYnJlc3VsdCkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAxKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX25vY2F0ZWdvcmllcycpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkvLyB0aGlzIGNvdWxkIHByb2JhYmx5IGJlIGRvbmUgd2l0aCBhIGZvcl9lYWNoLCBidXQgd2hhdCB0aGUgaGVsbAoJd2hpbGUgKCRyb3cyID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKSkKCSAgewoJICAgICRjYXRlZ29yeWxpc3RbJHJvdzJbJ3VwbG9hZF9jYXRlZ29yeV9uYW1lJ11dID0KCSAgICAgICRyb3cyWyd1cGxvYWRfY2F0ZWdvcnlfaWQnXTsKCSAgfQogICAgICB9CgogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgic3RhcnRmb3JtIiwKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLCAnZG9fZWRpdHVwbG9hZCcsICRyZXR1cm5pZCkpOwoJICAvLyB0b2RvIGNoZWNrIHRoaXMgdG8gc2VlIGlmIHRoZXJlIGFyZSBzcGFjZXMgaW4gdGhlIG5hbWUKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdmaXgnLAoJCSAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZml4JywgJHRoaXMtPkxhbmcoJ2ZpeG1lJykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsICR0aGlzLT5MYW5nKCdzdWJtaXQnKSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ2NhbmNlbCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnY2FuY2VsJywgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIAoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91cGxvYWRuYW1lJywgJHRoaXMtPkxhbmcoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cGxvYWRuYW1lJywgCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCdpbnB1dF91cGxvYWRuYW1lJywKCQkJCQkJICAkcm93Wyd1cGxvYWRfbmFtZSddLCAyMCwgMjU1ICkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbmFtZW1lc3NhZ2UnLCAkdGhpcy0+TGFuZygncmVuYW1lbWVzc2FnZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91cGxvYWRkYXRlJywgJHRoaXMtPkxhbmcoJ2RhdGV1cGxvYWRlZCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2RhdGFfdXBsb2FkZGF0ZScsICRyb3dbJ3VwbG9hZF9kYXRlJ10pOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3VwbG9hZHNpemUnLCAkdGhpcy0+TGFuZygnc2l6ZWtiJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZGF0YV91cGxvYWRzaXplJywgaW50dmFsKCRyb3dbJ3VwbG9hZF9zaXplJ10gLyAxMDI0LjAgKyAwLjUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91cGxvYWRhdXRob3InLCAkdGhpcy0+TGFuZygnYXV0aG9yJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfdXBsb2FkYXV0aG9yJywgCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCAnaW5wdXRfdXBsb2FkYXV0aG9yJywKCQkJCQkJICAkcm93Wyd1cGxvYWRfYXV0aG9yJ10sIDIwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9tb3ZlY2F0ZWdvcnknLCAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9tb3ZlY2F0ZWdvcnknLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfbW92ZWNhdGVnb3J5IiwgJGNhdGVnb3J5bGlzdCwgLTEsCgkJCQkJCSAgICAgICAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncGF0aG1lc3NhZ2UnLCAkdGhpcy0+TGFuZygncGF0aG1lc3NhZ2UnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X3VwbG9hZHN1bW1hcnknLCAkdGhpcy0+TGFuZyAoJ3N1bW1hcnknKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cGxvYWRzdW1tYXJ5JywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfdXBsb2Fkc3VtbWFyeScsCgkJCQkJCSAgICRyb3dbJ3VwbG9hZF9zdW1tYXJ5J10sIDgwLCAyNTUpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfdXBsb2FkZGVzYycsICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cGxvYWRkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhIChmYWxzZSwgJGlkLCAkcm93Wyd1cGxvYWRfZGVzY3JpcHRpb24nXSwgJ2lucHV0X3VwbG9hZGRlc2MnICkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2hpZGRlbicsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiAoJGlkLCAndXBsb2FkX2lkJywkcGFyYW1zWyd1cGxvYWRfaWQnXSkuCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiAoJGlkLCAnY2F0ZWdvcnlfaWQnLCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKICAgIAogICAgLy8gcG9wdWxhdGUgdGhlIHJvd3Mgb2YgZG93bmxvYWQgaW5mb3JtYXRpb24KICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2Fkc19kb3dubG9hZHMgV0hFUkUgZmlsZV9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWyd1cGxvYWRfaWQnXSApICk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkYXRldGV4dCcsICR0aGlzLT5MYW5nKCdkYXRlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpcHRleHQnLCAkdGhpcy0+TGFuZygnaXBfYWRkcmVzcycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigndXNlcnRleHQnLCAkdGhpcy0+TGFuZygndXNlcm5hbWUnKSk7CiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHJvd2NsYXNzID0gJ3JvdzEnOwogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7Cgkkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7Cgkkb25lcm93LT5kYXRlID0gJHJvd1snZG93bmxvYWRfZGF0ZSddOwoJJG9uZXJvdy0+aXAgICA9ICRyb3dbJ2Rvd25sb2FkX2lwJ107Cgkkb25lcm93LT51c2VyID0gJHJvd1snZG93bmxvYWRfdXNlciddOwoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7CQkJICAgICAKCglhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cpOwoJKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwogICAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ2l0ZW1zJywgJHJvd2FycmF5KTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdlZGl0dXBsb2FkLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvRWRpdFVwbG9hZCggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgQWN0dWFsbHkgcGVyZm9ybSB0aGUgZGF0YWJhc2UgdXBkYXRlcyByZXF1ZXN0ZWQgaW4gdGhlCiAgIF9BZG1pbkVkaXRVcGxvYWQgZm9ybS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5Eb0VkaXRVcGxvYWQgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBhbGwgdGhlIHBhcmFtZXRlcnMgd2UgbmVlZAogICAgaWYoICFpc3NldCgkcGFyYW1zWyd1cGxvYWRfaWQnXSkgfHwKCSFpc3NldCgkcGFyYW1zWydpbnB1dF91cGxvYWRkZXNjJ10pIHx8CgkhaXNzZXQoJHBhcmFtc1snaW5wdXRfbW92ZWNhdGVnb3J5J10pICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KICAKCSAgLy8gdG9kbywgYXJlIHdlIGZpeGluZyBpdD8KIAogICAgLy8gbm93IHNlZSBpZiB3ZSBjYW4gZmluZCB0aGUgZGV0YWlscyBhYm91dCB0aGlzIHVwbG9hZAogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMgV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ3VwbG9hZF9pZCddICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgewogICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwogICAgICByZXR1cm47CiAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICEkcm93ICkgewogICAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gd293IHdlIGRpZC4uLiBub3cgYWxsIHdlIGhhdmUgdG8gZG8gaXMgY29tcGFyZSBjb21tZW50cywgYW5kIHRoZSBjYXRlZ29yaWVzLCBhbmQgb2ZmIHdlIGdvLgogICAgJGRvX3VwZGF0ZSA9IGZhbHNlOwogICAgJG5ld25hbWUgPSAkcm93Wyd1cGxvYWRfbmFtZSddOwogICAgJG5ld2NhdGVnb3J5ID0gJHJvd1sndXBsb2FkX2NhdGVnb3J5X2lkJ107CiAgICAkbmV3YXV0aG9yID0gJHJvd1sndXBsb2FkX2F1dGhvciddOwogICAgJG5ld2Rlc2MgPSAkcm93Wyd1cGxvYWRfZGVzY3JpcHRpb24nXTsKICAgICRuZXdzdW1tYXJ5ID0gJHJvd1sndXBsb2FkX3N1bW1hcnknXTsKICAgIGlmKCAkcGFyYW1zWydpbnB1dF9tb3ZlY2F0ZWdvcnknXSAhPSAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXSB8fAoJJHBhcmFtc1snaW5wdXRfdXBsb2FkbmFtZSddICE9ICRyb3dbJ3VwbG9hZF9uYW1lJ10gKSB7CiAgICAgIC8vIGxvb2tzIGxpa2Ugd2UgaGF2ZSB0byBtb3ZlIGl0CiAgICAgIC8vIGdldCB0aGUgaW5mbyBmb3IgdGhlIG5ldyBjYXRlZ29yeQogICAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydpbnB1dF9tb3ZlY2F0ZWdvcnknXSApICk7CiAgICAgICRjYXQxcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgICBpZiggISRjYXQxcm93ICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgICAvLyBhbmQgdGhlIG9sZCBjYXRlZ29yeQogICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9pZCddICkgKTsKICAgICAgJGNhdDJyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgIGlmKCAhJGNhdDJyb3cgKSB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CglyZXR1cm47CiAgICAgIH0KICAgICAgCiAgICAgIC8vIG5vdyB3ZSBjYW4gbW92ZSB0aGUgZmlsZSBmcm9tIGRpcmVjdG9yeSBvbmUgdG8gdHdvLgogICAgICAvLyBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QgaW4gdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQogICAgICAkZnJvbWZpbGUgPSAkdGhpcy0+X3VwbG9hZFBhdGgoICRjYXQycm93Wyd1cGxvYWRfY2F0ZWdvcnlfcGF0aCddLCB0cmltKCRyb3dbJ3VwbG9hZF9uYW1lJ10pICk7CiAgICAgICR0b2ZpbGUgICA9ICR0aGlzLT5fdXBsb2FkUGF0aCggJGNhdDFyb3dbJ3VwbG9hZF9jYXRlZ29yeV9wYXRoJ10sIHRyaW0oJHBhcmFtc1snaW5wdXRfdXBsb2FkbmFtZSddKSApOwoKICAgICAgaWYoIGZpbGVfZXhpc3RzKCAkdG9maWxlICkgKSB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX2ZpbGVleGlzdHMnKSk7CglyZXR1cm47CiAgICAgIH0KICAgICAgaWYoICFyZW5hbWUoICRmcm9tZmlsZSwgJHRvZmlsZSApICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJHRoaXMtPkxhbmcgKCdlcnJvcl9jYW5ub3RyZW5hbWUnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAgICRkb191cGRhdGUgPSB0cnVlOwogICAgICAkbmV3Y2F0ZWdvcnkgPSAkcGFyYW1zWydpbnB1dF9tb3ZlY2F0ZWdvcnknXTsKICAgICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksCgkJICAgICR0aGlzLT5MYW5nKCdtb3ZlZGZpbGUnLCAkZnJvbWZpbGUsICR0b2ZpbGUgKSk7CiAgICB9CgogICAgaWYoICRwYXJhbXNbJ2lucHV0X3VwbG9hZGRlc2MnXSAhPSAkcm93Wyd1cGxvYWRfZGVzY3JpcHRpb24nXSApIHsKICAgICAgJGRvX3VwZGF0ZSA9IHRydWU7CiAgICAgICRuZXdkZXNjID0gdHJpbSgkcGFyYW1zWydpbnB1dF91cGxvYWRkZXNjJ10pOwogICAgfQogICAgaWYoICRwYXJhbXNbJ2lucHV0X3VwbG9hZG5hbWUnXSAhPSAkcm93Wyd1cGxvYWRfbmFtZSddICkgewogICAgICAkZG9fdXBkYXRlID0gdHJ1ZTsKICAgICAgJG5ld25hbWUgPSB0cmltKCRwYXJhbXNbJ2lucHV0X3VwbG9hZG5hbWUnXSk7CiAgICB9CiAgICBpZiggJHBhcmFtc1snaW5wdXRfdXBsb2Fkc3VtbWFyeSddICE9ICRyb3dbJ3VwbG9hZF9zdW1tYXJ5J10gKSB7CiAgICAgICRkb191cGRhdGUgPSB0cnVlOwogICAgICAkbmV3c3VtbWFyeSA9IHRyaW0oJHBhcmFtc1snaW5wdXRfdXBsb2Fkc3VtbWFyeSddKTsKICAgIH0KICAgIGlmKCAkcGFyYW1zWydpbnB1dF91cGxvYWRhdXRob3InXSAhPSAkcm93Wyd1cGxvYWRfYXV0aG9yJ10gKSB7CiAgICAgICRkb191cGRhdGUgPSB0cnVlOwogICAgICAkbmV3YXV0aG9yID0gdHJpbSgkcGFyYW1zWydpbnB1dF91cGxvYWRhdXRob3InXSk7CiAgICB9CgogICAgaWYoICRkb191cGRhdGUgKSB7CiAgICAgICRxdWVyeSA9ICJVUERBVEUgIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIFNFVAogICAgICAgICAgICAgICAgICB1cGxvYWRfbmFtZSA9ID8sIHVwbG9hZF9hdXRob3IgPSA/LAogICAgICAgICAgICAgICAgICB1cGxvYWRfc3VtbWFyeSA9ID8sIHVwbG9hZF9kZXNjcmlwdGlvbiA9ID8sCiAgICAgICAgICAgICAgICAgIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8gV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJG5ld25hbWUsICRuZXdhdXRob3IsICRuZXdzdW1tYXJ5LCAkbmV3ZGVzYywgJG5ld2NhdGVnb3J5LCAkcGFyYW1zWyd1cGxvYWRfaWQnXSApICk7CiAgICB9CgogICAgLy8gZG9uZS4KICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZmlsZXMnLCBhcnJheSggJ2N1cmNhdGVnb3J5JyA9PiAkcGFyYW1zWydjYXRlZ29yeV9pZCddKSApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvRGVsZXRlVXBsb2FkKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBY3R1YWxseSBkZWxldGUgYW4gdXBsb2FkIGZyb20gdGhlIGZpbGVzeXN0ZW0gYW5kCiAgIGZyb20gdGhlIGRhdGFiYXNlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRGVsZXRlVXBsb2FkICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gd2UncmUgZ29ubmEgcHV0IHNvbWUgdGhvdWdodCBpbnRvIHRoaXMuLi4gdGhlIHVzZXIKICAgIC8vIGhhcyBhbHJlYWR5IGFuc3dlcmVkLCBZZXAsIFdlJ3JlIHN1cmUgdGhlIGZpbGUgZXhpc3RzLCBkb24ndCByZWFsbHkgY2FyZSBhbnl3YXlzCiAgICAvLyBzbyBhbGwgd2UgaGF2ZSB0byBkbyBpcyByZW1vdmUgdGhlIGZpbGUsIGFuZCByZW1vdmUgdGhlIHJlY29yZCBmcm9tIHRoZSBkYXRhYmFzZS4KCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWyd1cGxvYWRfaWQnXSApICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgaW5mbyBhYm91dCB0aGUgdXBsb2FkIHdlJ3JlIGdvbm5hIGRlbGV0ZQogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHMgV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ3VwbG9hZF9pZCddICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgIH0KICAgICR1cGxvYWRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISR1cGxvYWRyb3cgKSB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgfQogICAgCiAgICAvLyBhbmQgdGhlIGluZm8gYWJvdXQgaXQncyBjYXRlZ29yeQogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgV0hFUkUgdXBsb2FkX2NhdGVnb3J5X2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICR1cGxvYWRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9pZCddICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgIH0KICAgICRjYXRlZ29yeXJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgIGlmKCAhJGNhdGVnb3J5cm93ICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCXJldHVybjsKICAgIH0KICAgIAogICAgLy8gbm93IGJ1aWxkIHRoZSBwYXRoCiAgICAkZmlsZSA9ICR0aGlzLT5fdXBsb2FkUGF0aCggJGNhdGVnb3J5cm93Wyd1cGxvYWRfY2F0ZWdvcnlfcGF0aCddLCAkdXBsb2Fkcm93Wyd1cGxvYWRfbmFtZSddICk7CgogICAgLy8gYW5kIGRlbGV0ZSB0aGUgZmlsZQogICAgdW5saW5rKCAkZmlsZSApOwoKICAgIC8vIGFuZCB0aGUgZG93bmxvYWRzCiAgICAkcXVlcnkgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzX2Rvd25sb2FkcyBXSEVSRSBmaWxlX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICR1cGxvYWRyb3dbJ3VwbG9hZF9pZCddICkgKTsKCiAgICAvLyBhbmQgdGhlIHJlY29yZCBpdHNlbGYuCiAgICAkcXVlcnkgPSAiREVMRVRFIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkdXBsb2Fkcm93Wyd1cGxvYWRfaWQnXSApICk7CgogICAgLy8gYW5kIHdlJ3JlIGRvbmUKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoJGlkLCAnZmlsZXMnLCBhcnJheSggJ2lucHV0X2NhdGVnb3J5JyA9PiAkdXBsb2Fkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXSkpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvRWRpdENhdGVnb3J5KCRpZCwgJHBhcmFtcywgJHJldHVybmlkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgQWN0dWFsbHkgZWRpdCBhIGNhdGVnb3J5IGdpdmVuIHRoZSBpbmZvcm1hdGlvbiBnaXZlbgogICBpbiB0aGUgZWRpdCBjYXRlZ29yeSBmb3JtLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRWRpdENhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgICAgewoJJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsICdjYXRlZ29yaWVzJyk7CiAgICAgIH0KICAgIAogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkgfHwgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3Jfbm9jYXRlZ29yeWlkIikpOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddKQoJICAgICB8fCAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZW1wdHljYXRlZ29yeSIpKTsKICAgICAgfQogICAgZWxzZSBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeXBhdGgnXSkKCSAgICAgfHwgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlkZXNjJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2VtcHR5cGF0aCIpKTsKICAgICAgfQogICAgZWxzZSBpZiAoaXNzZXQoICRwYXJhbXNbJ3NjYW4nXSApICkKICAgICAgewogICAgICAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcwogICAgICAgICAgICBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pICk7CiAgICAgICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgICAgICB7CgkgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZGJlcnJvciIpKTsKICAgICAgICAgICB9IAogICAgICAgICBlbHNlIAogICAgICAgICAgIHsKICAgICAgICAgICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICAgICAgICAgICBpZiggISRyb3cgKSAKICAgICAgICAgICAgICAgewogICAJICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwogCSAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2RiZXJyb3IiKSk7CiAgICAgICAgICAgICAgIH0gCiAgICAgICAgICAgICBlbHNlIAogICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgJGRpciA9ICR0aGlzLT5fY2F0ZWdvcnlQYXRoKCAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfcGF0aCddICk7CiAgICAgICAgICAgICAgICAgJHRoaXMtPl9zY2FuZGlyZWN0b3J5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJGRpciApOwoJCSAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwgJ2ZpbGVzJywgYXJyYXkoJ2lucHV0X2NhdGVnb3J5JyA9PiAkcGFyYW1zWydjYXRlZ29yeV9pZCddKSApOwoJCSByZXR1cm47CiAgICAgICAgICAgICAgIH0gCiAgICAgICAgICB9CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gbm93IHByZXBhcmUgdG8gdXBkYXRlIHRoZSByZWNvcmQKCSRxdWVyeSA9CgkgICJVUERBVEUgIi5jbXNfZGJfcHJlZml4ICgpLgoJICAibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBTRVQgdXBsb2FkX2NhdGVnb3J5X25hbWUgPSA/LCIuCgkgICJ1cGxvYWRfY2F0ZWdvcnlfZGVzY3JpcHRpb24gPSA/LCB1cGxvYWRfY2F0ZWdvcnlfbGlzdGFibGUgPSA/IFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iOwoJJGRicmVzdWx0ID0KCSAgJGRiLT5FeGVjdXRlICgkcXVlcnksCgkJCWFycmF5ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSwKCQkJICAgICAgICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5ZGVzYyddLAoJCQkgICAgICAgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlsaXN0YWJsZSddLAoJCQkgICAgICAgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkpOwoJaWYgKCEkZGJyZXN1bHQpCgkgIHsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZGJlcnJvciIpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgJHRoaXMtPm15UmVkaXJlY3RUb1RhYigkaWQsJ2NhdGVnb3JpZXMnKTsKCSAgICByZXR1cm47CgkgIH0KICAgICAgfQogICAgCiAgICAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgiYWRkY2F0ZWdvcnkudHBsIik7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluQWRkQ2F0ZWdvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFByb3ZpZGUgYSBmb3JtIHRvIGFsbG93IHVzZXJzIHRvIGFkZCBhIGNhdGVnb3J5LgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkFkZENhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gcG9wdWxhdGUgdGhlIHRlbXBsYXRlCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd0aXRsZScsICR0aGlzLT5MYW5nICgnYWRkY2F0ZWdvcnknKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnc3RhcnRmb3JtJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAnZG9fYWRkY2F0ZWdvcnknLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ2NhbmNlbCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeW5hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaW5wdXRfY2F0ZWdvcnluYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfY2F0ZWdvcnluYW1lJywKCQkJCQkJICAgIiIsIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3Byb21wdF9jYXRlZ29yeWRlc2MnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeWRlc2MnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfY2F0ZWdvcnlkZXNjJywKCQkJCQkJICAgIiIsIDgwLCAyNTUpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgncHJvbXB0X2NhdGVnb3J5cGF0aCcsCgkJCSAgICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5cGF0aCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpbnB1dF9jYXRlZ29yeXBhdGgnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9jYXRlZ29yeXBhdGgnLAoJCQkJCQkgICAiIiwgODAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3BhdGhtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCdwYXRoaW51cGxvYWRzJykpOwogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgncHJvbXB0X2NhdGVnb3J5bGlzdGFibGUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeWxpc3RhYmxlJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ2lucHV0X2NhdGVnb3J5bGlzdGFibGUnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCAoJGlkLAoJCQkJCQkgICAgICAgJ2lucHV0X2NhdGVnb3J5bGlzdGFibGUnLAoJCQkJCQkgICAgICAgMSwwKSk7CiAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvQWRkQ2F0ZWdvcnkoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBY3R1YWxseSBwZXJmb3JtIHRoZSB3b3JrIG9mIGFkZGluZyBhIGNhdGVnb3J5IHRvIHRoZQogICBkYXRhYmFzZSBhbmQgdG8gdGhlIGZpbGVzeXN0ZW0KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5Eb0FkZENhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgewogICAgICAkdGhpcy0+bXlSZWRpcmVjdFRvVGFiKCRpZCwnY2F0ZWdvcmllcycpOwogICAgfQoKICAgICRlcnJvciA9IGZhbHNlOwogICAgCiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd29yayB3aXRoCiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSkKCXx8ICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddID09ICIiKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9lbXB0eWNhdGVnb3J5IikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZSBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeXBhdGgnXSkKCSAgICAgfHwgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlkZXNjJ10gPT0gIiIpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2VtcHR5cGF0aCIpKTsKCSRlcnJvciA9IHRydWU7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gY2hlY2sgaWYgdGhlIGNhdGVnb3J5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdAoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkcXVlcnkgPQoJICAiU0VMRUNUICogZnJvbSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICJtb2R1bGVfdXBsb2Fkc19jYXRlZ29yaWVzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9uYW1lID0gPyI7CgkkZGJyZXN1bHQgPQoJICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddKSk7CgkKCS8vIHllcCBpdCBkb2VzCglpZiAoJGRicmVzdWx0LT5GZXRjaFJvdyAoKSkKCSAgewoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywKCQkJCSAgICR0aGlzLT5MYW5nICgiZXJyb3JfY2F0ZWdvcnlleGlzdHMiKSk7CgkgICAgJGVycm9yID0gdHJ1ZTsKCSAgfQoJZWxzZQoJICB7CgkgICAgLy8gY2hlY2sgaWYgdGhlIGRpcmVjdG9yeSBpcyBhbHJlYWR5IGluIHVzZQoJICAgICRxdWVyeSA9CgkgICAgICAiU0VMRUNUICogZnJvbSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICAgICAibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfcGF0aCA9ID8iOwoJICAgICRkYnJlc3VsdCA9CgkgICAgICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5cGF0aCddKSk7CgkgICAgCgkgICAgaWYgKCRkYnJlc3VsdC0+RmV0Y2hSb3cgKCkpCgkgICAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX3BhdGhpbnVzZSIpKTsKCQkkZXJyb3IgPSB0cnVlOwoJICAgICAgfQoJICAgIGVsc2UKCSAgICAgIHsKCQkvLyBDcmVhdGUgdGhlIGRpcmVjdG9yeSBpZiBpdCBkb2Vzbid0IGV4aXN0CgkJJGRvX3NjYW4gPSBmYWxzZTsKCQkkZGlyID0gJHRoaXMtPl9jYXRlZ29yeVBhdGgoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlwYXRoJ10pOwoKCQlpZiggZmlsZV9leGlzdHMoICRkaXIgKSApIAoJCSAgewoJCSAgICAkZG9fc2NhbiA9IHRydWU7CgkJICB9CgkJZWxzZQoJCSAgewoJCSAgICAvLyBjcmVhdGUgdGhlIGRpcmVjdG9yeQoJCSAgICAkcmVzdWx0ID0gJHRoaXMtPl9ta2RpcnIgKCRkaXIpOwoJCSAgICBpZiAoJHJlc3VsdCA9PSBmYWxzZSkgCgkJICAgICAgewoJCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLAoJCQkJCSAgICAgICAkdGhpcy0+TGFuZyAoImVycm9yX2NhdGVnb3J5ZXhpc3RzIikpOwoJCQkkZXJyb3IgPSB0cnVlOwoJCSAgICAgIH0KCQkgICAgLy8gY3JlYXRlIGFuIGluZGV4Lmh0bWwgZmlsZSAoZW1wdHkpCgkJICAgIGlmKCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnY3JlYXRlX2R1bW15X2luZGV4X2h0bWwnKSApCgkJICAgICAgewoJCQl0b3VjaCggJGRpci5ESVJFQ1RPUllfU0VQQVJBVE9SLiJpbmRleC5odG1sIiApOwoJCSAgICAgIH0KCQkgIH0KCgkJaWYoICEkZXJyb3IgKQoJCSAgewoJCSAgICAvLyBBZGQgdGhlIHJlY29yZCB0byB0aGUgY2F0ZWdvcnkgdGFibGUKCQkgICAgJGNhdGlkID0KCQkgICAgICAkZGItPkdlbklEIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfdXBsb2Fkc19jYXRlZ29yaWVzX3NlcSIpOwoJCSAgICAkcGFyYW1zWydjYXRlZ29yeV9pZCddID0gJGNhdGlkOwoJCSAgICAkcXVlcnkgPQoJCSAgICAgICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXggKCkuCgkJICAgICAgIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgVkFMVUVTICg/LD8sPyw/LD8pIjsKCQkgICAgJGRicmVzdWx0ID0KCQkgICAgICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJCSAgICBhcnJheSAoJGNhdGlkLAoJCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5bmFtZSJdLAoJCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5ZGVzYyJdLAoJCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5cGF0aCJdLAoJCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5bGlzdGFibGUiXSkpOwoJCSAgICBpZiAoISRkYnJlc3VsdCkKCQkgICAgICB7CgkJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCQkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsCgkJCQkJICAgICAgICR0aGlzLT5MYW5nICgibWVzc2FnZV9jYXRlZ29yeWFkZGVkIikpOwoJCQkkZXJyb3IgPSB0cnVlOwoJCSAgICAgIH0KCQkgICAgZWxzZQoJCSAgICAgIHsKCQkJaWYoICRkb19zY2FuICkKCQkJICB7CgkJCSAgICAvLyBjYXRlZ29yeSBpcyBhZGRlZCwgYW5kIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdGVkLi4uIHNvIG5vdwoJCQkgICAgLy8gd2UncmUgZ29ubmEgc2NhbiB0aGUgZGlyZWN0b3J5IGFuZCBhZGQgZmlsZXMgdG8gdGhlIGRhdGFiYXNlCgkJCSAgICAkdGhpcy0+X3NjYW5kaXJlY3RvcnkoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLCAkZGlyICk7CgkJCSAgfQoJCSAgICAgIH0KCQkgIH0KCSAgICAgIH0KCSAgfQogICAgICB9CiAgICAKICAgIGlmICgkZXJyb3IpCiAgICAgIHsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSR0aGlzLT5teVJlZGlyZWN0VG9UYWIgKCRpZCwgJ2NhdGVnb3JpZXMnKTsKICAgICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5QWRtaW5QcmVmcygkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBEaXNwbGF5IGEgZm9ybSB0byBhbGxvdyB0aGUgYWRtaW5pc3RyYXRvciB0byBlZGl0CiAgIHByZWZlcmVuY2VzIHRoYXQgYXBwbHkgdG8gdGhlIGVudGlyZSBtb2R1bGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0Rpc3BsYXlBZG1pblByZWZzICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlID0gJycpCiAgewogICAgLy8gQ3JlYXRlRm9ybVN0YXJ0IHNldHMgdXAgYSBwcm9wZXIgZm9ybSB0YWcgdGhhdCB3aWxsIGNhdXNlIHRoZSBzdWJtaXQgdG8KICAgIC8vIHJldHVybiBjb250cm9sIHRvIHRoaXMgbW9kdWxlIGZvciBwcm9jZXNzaW5nLgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N0YXJ0Zm9ybScsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgJ3NhdmVfYWRtaW5fcHJlZnMnLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJHRoaXMtPkxhbmcoJ3N1Ym1pdCcpKSk7ICAgIAogICAgCiAgICAvLyBpdCdzIGdvb2QgcHJhY3RpY2UgdG8gc2V0IGV2ZW4gc3RhdGljIHRpdGxlcyB1c2luZyBzbWFydHksIHNvIGxvY2FsaXphdGlvbiBpcwogICAgLy8gZWFzaWVyLgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3RpdGxlX21heF91cGxvYWRzaXplJywKCQkJCSAgJHRoaXMtPkxhbmcgKCdwcm9tcHRfbWF4X3VwbG9hZHNpemUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgndGl0bGVfdmFsaWRfdXBsb2FkZXh0ZW5zaW9ucycsCgkJCQkgICR0aGlzLT5MYW5nICgndGl0bGVfdmFsaWRfdXBsb2FkZXh0ZW5zaW9ucycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCd0aXRsZV9zdWJuZXRfZXhjbHVzaW9ucycsCgkJCQkgICR0aGlzLT5MYW5nICgndGl0bGVfc3VibmV0X2V4Y2x1c2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgndGl0bGVfc2VjdGlvbicsCgkJCQkgICR0aGlzLT5MYW5nICgndGl0bGVfbW9kX3ByZWZzJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3RpdGxlX2R1bW15X2luZGV4X2h0bWwnLAoJCQkJICAkdGhpcy0+TGFuZyAoJ3RpdGxlX2R1bW15X2luZGV4X2h0bWwnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgndGl0bGVfZW1haWxfb25fdXBsb2FkJywKCQkJCSAgJHRoaXMtPkxhbmcgKCd0aXRsZV9lbWFpbF9vbl91cGxvYWQnKSk7CgogICAgLy8geW91J2xsIG9mdGVuIHdhbnQgdG8gZG8gdGhpbmdzIGxpa2UgdGhpcyB0byBwcm92aWRlIGZlZWRiYWNrOgogICAgaWYgKCRtZXNzYWdlICE9ICcnKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnbWVzc2FnZScsICRtZXNzYWdlKTsKICAgICAgfQogICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9tYXhfdXBsb2Fkc2l6ZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ21heF91cGxvYWRzaXplJywKCQkJCQkJICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF91cGxvYWRzaXplJywKCQkJCQkJCQkJJzEwMDAwMDAnKSwgJzEyJywgJzEyJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfdmFsaWRfdXBsb2FkZXh0ZW5zaW9ucycsCiAgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICd2YWxpZF91cGxvYWRleHRlbnNpb25zJywKCSAgICAgICR0aGlzLT5HZXRQcmVmZXJlbmNlICgndmFsaWRfdXBsb2FkZXh0ZW5zaW9ucycsCgkJCQkgICAgInppcCxneix0YXIiKSwgJzMwJywgJzI1NScpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfc3VibmV0X2V4Y2x1c2lvbnMnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KCAkaWQsICdzdWJuZXRfZXhjbHVzaW9ucycsCgkJCQkJCSAgICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdzdWJuZXRfZXhjbHVzaW9ucycsIiIpLDUwLDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZHVtbXlfaW5kZXhfaHRtbCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCAkaWQsICdpbnB1dF9kdW1teV9pbmRleF9odG1sJywKCQkJCQkJICAgICAgIDEsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCdjcmVhdGVfZHVtbXlfaW5kZXhfaHRtbCcpKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZW1haWxfb25fdXBsb2FkJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnZW1haWxfb25fdXBsb2FkJywKCQkJCQkJICAgJHRoaXMtPkdldFByZWZlcmVuY2UoJ3NlbmRfdXBsb2FkX25vdGlmaWNhdGlvbnNfdG8nKSwKCQkJCQkJICAgMzAsIDgwICkpOwoKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRtaW5wcmVmcy50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfU2F2ZUFkbWluUHJlZnMoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgU2F2ZSB0aGUgcHJlZmVyZW5jZXMgYXMgc3BlY2lmaWVkIGluIHRoZSBwcmVmZXJlbmNlcyBmb3JtLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9TYXZlQWRtaW5QcmVmcyAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlICgnbWF4X3VwbG9hZHNpemUnLAoJCQkgIGlzc2V0ICgkcGFyYW1zWydtYXhfdXBsb2Fkc2l6ZSddKSA/CgkJCSAgJHBhcmFtc1snbWF4X3VwbG9hZHNpemUnXSA6ICcwJyk7CiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSAoJ3ZhbGlkX3VwbG9hZGV4dGVuc2lvbnMnLAoJCQkgIGlzc2V0ICgkcGFyYW1zWyd2YWxpZF91cGxvYWRleHRlbnNpb25zJ10pID8KCQkJICAkcGFyYW1zWyd2YWxpZF91cGxvYWRleHRlbnNpb25zJ10gOiAnMCcpOwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UgKCdzdWJuZXRfZXhjbHVzaW9ucycsCgkJCSAgaXNzZXQgKCRwYXJhbXNbJ3N1Ym5ldF9leGNsdXNpb25zJ10pID8KCQkJICAkcGFyYW1zWydzdWJuZXRfZXhjbHVzaW9ucyddIDogJzAnKTsKICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlICgnY3JlYXRlX2R1bW15X2luZGV4X2h0bWwnLAoJCQkgIGlzc2V0ICgkcGFyYW1zWydpbnB1dF9kdW1teV9pbmRleF9odG1sJ10pID8KCQkJICAkcGFyYW1zWydpbnB1dF9kdW1teV9pbmRleF9odG1sJ10gOiAnMCcpOwogICAgJHRoaXMtPnNldFByZWZlcmVuY2UgKCdzZW5kX3VwbG9hZF9ub3RpZmljYXRpb25zX3RvJywKCQkJICBpc3NldCAoJHBhcmFtc1snZW1haWxfb25fdXBsb2FkJ10pID8KCQkJICAkcGFyYW1zWydlbWFpbF9vbl91cGxvYWQnXSA6ICcnICk7ICAgIAoKICAgICR0aGlzLT5teVJlZGlyZWN0VG9UYWIoICRpZCwgJ2FkbWluX3ByZWZzJyApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheU1vZHVsZU91dHB1dCgkYWN0aW9uLCAkaWQsICRwYXJhbXMsJHJldHVybmlkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgVGhpcyBkaXNwbGF5cyB0aGUgb3V0cHV0IHRvIGVuZCB1c2Vycywgbm90IHRvIAogICBhZG1pbmlzdHJhdG9ycy4gIEl0IGV4cGVjdHMgYSBtb2RlLCBhbmQgY2F0ZWdvcnkKICAgcGFyYW1ldGVyLCBhcyB3ZWxsIGFzIGFuIG9wdGlvbmFsIHVwbG9hZF9pZCBwYXJhbWV0ZXIKICAgZGVwZW5kaW5nIHVwb24gdGhlIG1vZGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0Rpc3BsYXlNb2R1bGVPdXRwdXQgKCRhY3Rpb24sICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgYXJndW1lbnRzCiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydtb2RlJ10pICkKICAgICAgewoJLy8gaWYgbW9kZSBvciBjYXRlZ29yeSBpc24ndCBzZXQuLi4gd2UgZG9uJ3QgZGlzcGxheSBhbnl0aGluZwoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIAogICAgCiAgICAvLyBzZXR1cAogICAgJHRlbXBsYXRlID0gJyc7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRyb3dhcnJheSA9IGFycmF5ICgpOwoKICAgIC8vIG1vZGUgaXMgc2V0LCBub3cgZGVjaWRlIHdoYXQgdG8gZG8KICAgIC8vIGhhbmRsZSBzdGhlIHNpbXBsZSBzdHVmZiAob25lIHNpbmdsZSBsaW5rKQogICAgaWYgKCRwYXJhbXNbJ21vZGUnXSA9PSAndXBsb2FkJykKICAgICAgewoJaWYoICFpc3NldCggJHBhcmFtc1snY2F0ZWdvcnknXSApICkKCSAgewoJICAgIC8vIGlmIG1vZGUgb3IgY2F0ZWdvcnkgaXNuJ3Qgc2V0Li4uIHdlIGRvbid0IGRpc3BsYXkgYW55dGhpbmcKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CgkgICAgcmV0dXJuOwoJICB9CgoJLy8gZGlzcGxheSBhIGZvcm0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gdXBsb2FkIGEgZmlsZS4uLi4gYnV0IG1heSBoYXZlIHRvIGhhdmUgcGVybWlzc2lvbiBmaXJzdAoJLy8gaG1tbSwgSSdsbCB0aGluayBhYm91dCB0aGUgcGVybWlzc2lvbiBzdHVmZiBsYXRlci4KCS8vIGFsc28sIG1heWJlIHRoaXMgdGVtcGxhdGUgc2hvdWxkIGJlIGFkbWluIG9kaWZpYWJsZSB0b28KCSR0ZW1wbGF0ZSA9ICd1cGxvYWRfdXBsb2FkZm9ybSc7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLCAnZG9fdXBsb2FkJywkcmV0dXJuaWQsJ3Bvc3QnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF91cGxvYWQnLCAkdGhpcy0+TGFuZyAoJ3VwbG9hZCcpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9hdXRob3InLCAkdGhpcy0+TGFuZyAoJ2F1dGhvcicpKTsKICAgICAgIAogICAgICAgIC8vIGF0dGVtcHQgdG8gZ2V0IGFuIGF1dGhvcgogICAgICAgICRhdXRob3IgPSAnJzsKICAgICAgICAkdXNlcmlkID0gJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdVc2VySUQnKTsKICAgICAgICBpZiggJHVzZXJpZCApCiAgICAgICAgICB7CiAgICAgICAgICAgICRhdXRob3IgPSAkdXNlcmlkLT5Mb2dnZWRJbk5hbWUoKTsKICAgICAgICAgIH0KCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9hdXRob3InLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYXV0aG9yJywgCgkJCQkJCSAgICAgICAkYXV0aG9yLCAyMCwgMjU1KSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfc3VtbWFyeScsCgkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ3N1bW1hcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9zdW1tYXJ5JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X3N1bW1hcnknLAoJCQkJCQkgICAgICAgJycsIDQwLCAyNTUpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9kZXN0bmFtZScsCgkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ2Rlc3RuYW1lJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZGVzdG5hbWUnLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfZGVzdG5hbWUnLAoJCQkJCQkgICAgICAgJycsIDQwLCAyNTUpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9fZGVzdG5hbWUnLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdpbmZvX2Rlc3RuYW1lJykpOwoKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9kZXNjcmlwdGlvbicsCgkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfZGVzY3JpcHRpb24nLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZVRleHRBcmVhKGZhbHNlLCAkaWQsICcnLCAnaW5wdXRfZGVzY3JpcHRpb24nICkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaGlkZGVuJywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiAoJGlkLCAnTUFYX0ZJTEVfU0laRScsCgkJCQkJCQkgJHRoaXMtPkdldFByZWZlcmVuY2UoJ21heF91cGxvYWRzaXplJywnMTAwMDAwMCcpKS4KCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiggJGlkLCAnY2F0ZWdvcnknLAoJCQkJCQkJICRwYXJhbXNbJ2NhdGVnb3J5J10pKTsgCgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9icm93c2UnLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUZpbGVVcGxvYWRJbnB1dCAoJGlkLCdpbnB1dF9icm93c2UnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9zdWJtaXQnLCR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnZG9fdXBsb2FkZmlsZScsCgkJCQkJCQkJCSR0aGlzLT5MYW5nICgnc3VibWl0JykpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2VuZGZvcm0nLCAkdGhpcy0+Q3JlYXRlRm9ybUVuZCAoKSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJaWYoICFpc3NldCggJHBhcmFtc1snY2F0ZWdvcnknXSApICkKCSAgewoJICAgIC8vIGlmIG1vZGUgb3IgY2F0ZWdvcnkgaXNuJ3Qgc2V0Li4uIHdlIGRvbid0IGRpc3BsYXkgYW55dGhpbmcKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CgkgICAgcmV0dXJuOwoJICB9CgoJLy8gdHJ5IHRvIGZpZ3VyZSBvdXQgYSBzb3J0IG9yZGVyCgkkc29ydG9yZGVyID0gIk9SREVSIEJZIHVwbG9hZF9kYXRlIEFTQyI7CglpZiggaXNzZXQoJHBhcmFtc1snc29ydG9yZGVyJ10pICkgewoJICBzd2l0Y2goICRwYXJhbXNbJ3NvcnRvcmRlciddICkgewoJICBjYXNlICJkYXRlX2FzYyI6CgkgICAgLy8gYXNjZW5kaW5nIGRhdGUKCSAgICAkc29ydG9yZGVyID0gIk9SREVSIEJZIHVwbG9hZF9kYXRlIEFTQyI7CgkgICAgYnJlYWs7CgkgIGNhc2UgImRhdGVfZGVzYyI6CgkgICAgLy8gZGVzY2VuZGluZyBkYXRlCgkgICAgJHNvcnRvcmRlciA9ICJPUkRFUiBCWSB1cGxvYWRfZGF0ZSBERVNDIjsKCSAgICBicmVhazsKCSAgY2FzZSAibmFtZV9hc2MiOgoJICAgIC8vIGFzY2VuZGluZyBuYW1lCgkgICAgJHNvcnRvcmRlciA9ICJPUkRFUiBCWSB1cGxvYWRfbmFtZSBBU0MiOwoJICAgIGJyZWFrOwoJICBjYXNlICJuYW1lX2Rlc2MiOgoJICAgIC8vIGRlc2NlbmRpbmcgbmFtZQoJICAgICRzb3J0b3JkZXIgPSAiT1JERVIgQlkgdXBsb2FkX25hbWUgREVTQyI7CgkgICAgYnJlYWs7CgkgIGNhc2UgInNpemVfYXNjIjoKCSAgICAvLyBhc2NlbmRpbmcgc2l6ZQoJICAgICRzb3J0b3JkZXIgPSAiT1JERVIgQlkgdXBsb2FkX3NpemUgQVNDIjsKCSAgICBicmVhazsKCSAgY2FzZSAic2l6ZV9kZXNjIjoKCSAgICAvLyBkZXNjZW5kaW5nIHNpemUKCSAgICAkc29ydG9yZGVyID0gIk9SREVSIEJZIHVwbG9hZF9zaXplIERFU0MiOwoJICAgIGJyZWFrOwoJICBjYXNlICJzdW1tX2FzYyI6CgkgICAgLy8gYXNjZW5kaW5nIHN1bW1hcnkKCSAgICAkc29ydG9yZGVyID0gIk9SREVSIEJZIHVwbG9hZF9zdW1tYXJ5IEFTQyI7CgkgICAgYnJlYWs7CgkgIGNhc2UgInN1bW1fZGVzYyI6CgkgICAgLy8gZGVzY2VuZGluZyBzdW1tYXJ5CgkgICAgJHNvcnRvcmRlciA9ICJPUkRFUiBCWSB1cGxvYWRfc3VtbWFyeSBERVNDIjsKCSAgICBicmVhazsKCSAgY2FzZSAiYXV0aG9yX2FzYyI6CgkgICAgLy8gYXNjZW5kaW5nIGF1dGhvcgoJICAgICRzb3J0b3JkZXIgPSAiT1JERVIgQlkgdXBsb2FkX2F1dGhvciBBU0MiOwoJICAgIGJyZWFrOwoJICBjYXNlICJhdXRob3JfZGVzYyI6CgkgICAgLy8gZGVzY2VuZGluZyBhdXRob3IKCSAgICAkc29ydG9yZGVyID0gIk9SREVSIEJZIHVwbG9hZF9hdXRob3IgREVTQyI7CgkgICAgYnJlYWs7CgkgIGNhc2UgImlwX2FzYyI6CgkgICAgLy8gYXNjZW5kaW5nIGlwCgkgICAgJHNvcnRvcmRlciA9ICJPUkRFUiBCWSB1cGxvYWRfaXAgQVNDIjsKCSAgICBicmVhazsKCSAgY2FzZSAiaXBfZGVzYyI6CgkgICAgLy8gZGVzY2VuZGluZyBpcAoJICAgICRzb3J0b3JkZXIgPSAiT1JERVIgQlkgdXBsb2FkX2lwIERFU0MiOwoJICAgIGJyZWFrOwoJICB9Cgl9Cgkkc29ydG9yZGVyID0gIiAiLiRzb3J0b3JkZXI7CgoJJGNvdW50ID0gIiI7CglpZiggaXNzZXQoICRwYXJhbXNbJ2NvdW50J10gKSApCgkgIHsKCSAgICAkY291bnQgPSAiIExJTUlUIDAsIi4kcGFyYW1zWydjb3VudCddOwoJICB9CgoJJGNhdGVnb3J5ID0gYXJyYXkoKTsKCWlmKCAkcGFyYW1zWydjYXRlZ29yeSddICE9ICdhbGwnICkKCSAgewoJICAgICRjYXRlZ29yeSA9ICR0aGlzLT5nZXRDYXRlZ29yeUZyb21OYW1lKCAkcGFyYW1zWydjYXRlZ29yeSddICk7CgkgICAgaWYoICEkY2F0ZWdvcnkgKQoJICAgICAgewoJCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2NhdGVnb3J5bm90Zm91bmQnKSk7CgkJcmV0dXJuOwoJICAgICAgfQoJICB9CgoJLy8gZ2V0IHJlYWR5IGZvciBhcnJheSBwcm9jZXNzaW5nCgkkcm93YXJyYXkgPSBhcnJheSgpOwoJJHF1ZXJ5ID0gJyc7CgkkZGJyZXN1bHQgPSAkZmFsc2U7CgoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjYXRlZ29yeScsJHRoaXMtPkxhbmcoJ2NhdGVnb3J5JykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZCcsJHRoaXMtPkxhbmcoJ2lkJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1lJywkdGhpcy0+TGFuZygnbmFtZScpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignZGF0ZScsJHRoaXMtPkxhbmcoJ2RhdGUnKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2F1dGhvcicsJHRoaXMtPkxhbmcoJ2F1dGhvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc2l6ZScsJHRoaXMtPkxhbmcoJ3NpemVrYicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignc3VtbWFyeScsJHRoaXMtPkxhbmcoJ3N1bW1hcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Rlc2NyaXB0aW9uJywkdGhpcy0+TGFuZygnZGVzY3JpcHRpb24nKSk7CgoJaWYoICRwYXJhbXNbJ2NhdGVnb3J5J10gPT0gJ2FsbCcgKQoJICB7CgkgICAgLy8gaGFuZGxlIGRpc3BsYXkgYWxsIGxpc3RhYmxlIGNhdGVnb3JpZXMKCSAgICBzd2l0Y2goICRwYXJhbXNbJ21vZGUnXSApCgkgICAgICB7CgkgICAgICBjYXNlICdkZXRhaWxlZCc6CgkJJHRlbXBsYXRlID0gJ3VwbG9hZF9kaXNwbGF5ZGV0YWlsJzsKCQkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSApOwoJCWJyZWFrOwoJICAgICAgY2FzZSAnc3VtbWFyeSc6CgkJJHRlbXBsYXRlID0gJ3VwbG9hZF9kaXNwbGF5c3VtbWFyeSc7CgkJYnJlYWs7CgkgICAgICB9CgkgICAgJHF1ZXJ5ID0gIlNFTEVDVCB1cGxvYWRfaWQsIEEudXBsb2FkX2NhdGVnb3J5X2lkIEFTIAogICAgICAgICAgICAgICAgICB1cGxvYWRfY2F0ZWdvcnlfaWQsIHVwbG9hZF9uYW1lLCB1cGxvYWRfYXV0aG9yLCB1cGxvYWRfc3VtbWFyeSwgdXBsb2FkX2Rlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICB1cGxvYWRfaXAsIHVwbG9hZF9zaXplLCB1cGxvYWRfZGF0ZSwgdXBsb2FkX2NhdGVnb3J5X25hbWUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBBUyBBLCIuCgkgICAgICAgICAgY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcyBBUyBCIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9saXN0YWJsZSA9IDEgCiAgICAgICAgICAgICAgICAgIEFORCBBLnVwbG9hZF9jYXRlZ29yeV9pZCA9IEIudXBsb2FkX2NhdGVnb3J5X2lkIi4kc29ydG9yZGVyLiRjb3VudDsgICAgIAoJICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5ICk7CgkgIH0KCWVsc2UgewoJICAvLyBpZiB0aGUgY2F0ZWdvcnkgaXNuJ3QgbGlzdGFibGUsIHdlIGNhbiBzdG9wIGhlcmUKCSAgaWYoICRjYXRlZ29yeVsndXBsb2FkX2NhdGVnb3J5X2xpc3RhYmxlJ10gPT0gMCApIHsKCSAgICByZXR1cm47CgkgIH0KCSAgJGNhdGVnb3J5X2lkID0gJGNhdGVnb3J5Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXTsKCSAgCgkgIGlmICgkcGFyYW1zWydtb2RlJ10gPT0gJ2RldGFpbGVkJykKCSAgICB7CgkgICAgICAvLyBhIGJyaWVmIGxpc3Rpbmcgb2YgYWxsIHRoZSBmaWxlcyBpbiB0aGUgY2F0ZWdvcnkKCSAgICAgICR0ZW1wbGF0ZSA9ICd1cGxvYWRfZGlzcGxheWRldGFpbCc7CgkgICAgICAkcXVlcnkgPQoJCSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCAoKS4KCQkibW9kdWxlX3VwbG9hZHMgV0hFUkUgdXBsb2FkX2NhdGVnb3J5X2lkID0gPyIuJHNvcnRvcmRlci4kY291bnQ7CgkgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkoJGNhdGVnb3J5X2lkKSk7CgkgICAgfQoJICBlbHNlIGlmICgkcGFyYW1zWydtb2RlJ10gPT0gJ3NpbmdsZScpCgkgICAgewoJICAgICAgLy8gZGlzcGxheSBpbmZvIGFib3V0IGEgc2luZ2xlIGZpbGUsIGluIGV4cGFuZGVkIGZvcm0KCSAgICAgIGlmKCAhaXNzZXQoJHBhcmFtc1sndXBsb2FkX2lkJ10pICkgewoJCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCQlyZXR1cm47CgkgICAgICB9CgkgICAgICAKCSAgICAgICR0ZW1wbGF0ZSA9ICd1cGxvYWRfZGlzcGxheWRldGFpbCc7CgkgICAgICAkcXVlcnkgPQoJCSJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLgoJCSJtb2R1bGVfdXBsb2FkcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/Ii4iIEFORCB1cGxvYWRfaWQgPSA/IjsKCSAgICAgICRkYnJlc3VsdCA9CgkJJGRiLT5FeGVjdXRlICgkcXVlcnksCgkJCSAgICAgIGFycmF5ICgkY2F0ZWdvcnlfaWQsICRwYXJhbXNbJ3VwbG9hZF9pZCddKSk7CgkgICAgfQoJICBlbHNlIGlmICgkcGFyYW1zWydtb2RlJ10gPT0gImxpbmsiKQoJICAgIHsKCSAgICAgICR0ZW1wbGF0ZSA9ICcnOwoJICAgICAgJHF1ZXJ5ID0gCgkJIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCgkJIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iLiIgQU5EIHVwbG9hZF9pZCA9ID8iOwoJICAgICAgJGRicmVzdWx0ID0KCQkkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJICAgICAgYXJyYXkgKCRjYXRlZ29yeV9pZCwgJHBhcmFtc1sndXBsb2FkX2lkJ10pKTsKCSAgICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CgkgICAgICBlY2hvICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdnZXRmaWxlJywgJHJldHVybmlkLCAkcm93Wyd1cGxvYWRfbmFtZSddLAoJCQkJICAgICAgYXJyYXkgKCd1cGxvYWRfaWQnID0+ICRyb3dbJ3VwbG9hZF9pZCddKSk7CgkgICAgfQoJICBlbHNlIGlmICgkcGFyYW1zWydtb2RlJ10gPT0gJ3VybCcpCgkgICAgewoJICAgICAgLy8gb3V0cHV0IGp1c3QgYSB1cmwKCSAgICAgIGlmKCAhaXNzZXQoJHBhcmFtc1sndXBsb2FkX2lkJ10pICkgewoJCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCQlyZXR1cm47CgkgICAgICB9CgkgICAgICAKCSAgICAgICR0ZW1wbGF0ZSA9ICcnOwoJICAgICAgJHF1ZXJ5ID0gCgkJIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCgkJIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iLiIgQU5EIHVwbG9hZF9pZCA9ID8iOwoJICAgICAgJGRicmVzdWx0ID0KCQkkZGItPkV4ZWN1dGUgKCRxdWVyeSwKCQkJICAgICAgYXJyYXkgKCRjYXRlZ29yeV9pZCwgJHBhcmFtc1sndXBsb2FkX2lkJ10pKTsKCSAgICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CgkgICAgICAKCSAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2dldGZpbGUnLCAkcmV0dXJuaWQsICcnLCAKCQkJCSAgICAgIGFycmF5ICgndXBsb2FkX2lkJyA9PiAkcm93Wyd1cGxvYWRfaWQnXSksICcnLCB0cnVlKTsKCSAgICB9CgkgIGVsc2UgaWYgKCRwYXJhbXNbJ21vZGUnXSA9PSAnc3VtbWFyeScpCgkgICAgewoJICAgICAgLy8gZGlzcGxheSBpbmZvIGFib3V0IGFsbCBvZiB0aGUgZmlsZXMgaW4gdGhlIGNhdGVnb3J5CgkgICAgICAkdGVtcGxhdGUgPSAndXBsb2FkX2Rpc3BsYXlzdW1tYXJ5JzsKCSAgICAgICRxdWVyeSA9CgkJIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCgkJIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8iLiRzb3J0b3JkZXIuJGNvdW50OzsKCSAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LCBhcnJheSgkY2F0ZWdvcnlfaWQpKTsKCSAgICB9Cgl9CgkgIAoJaWYgKCEkZGJyZXN1bHQpCgkgIHsKCSAgICAvLyBtYXliZSB0aGVyZSBhcmUgbm8gZmlsZXMgaW4gdGhpcyBjYXRlZ29yeQoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX25vZmlsZXMnKSk7CgkgIH0KCWVsc2UgaWYoICR0ZW1wbGF0ZSAhPSAnJyApIAoJICB7CgkgICAgLy8gZG8gdGhlIGxpc3QKCSAgICAkcm93Y2xhc3MgPSAncm93MSc7CgkgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93ICgpKQoJICAgICAgewoJCSRvbmVyb3cgPSBuZXcgc3RkQ2xhc3MgKCk7CgkJJG9uZXJvdy0+aWQgPSAkcm93Wyd1cGxvYWRfaWQnXTsKCQlpZiggJHBhcmFtc1snY2F0ZWdvcnknXSA9PSAnYWxsJyApCgkJICB7CgkJICAgICRvbmVyb3ctPmNhdGVnb3J5ID0gJHJvd1sndXBsb2FkX2NhdGVnb3J5X25hbWUnXTsKCQkgIH0KCQllbHNlIAoJCSAgewoJCSAgICAkb25lcm93LT5jYXRlZ29yeSA9ICRwYXJhbXNbJ2NhdGVnb3J5J107CgkJICB9CgkJJG9uZXJvdy0+bmFtZSA9CgkJICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZ2V0ZmlsZScsICRyZXR1cm5pZCwgJHJvd1sndXBsb2FkX25hbWUnXSwKCQkJCSAgICAgYXJyYXkgKCd1cGxvYWRfaWQnID0+ICRyb3dbJ3VwbG9hZF9pZCddKSk7CgkJJG9uZXJvdy0+YXV0aG9yID0gJHJvd1sndXBsb2FkX2F1dGhvciddOwoJCSRvbmVyb3ctPnN1bW1hcnkgPSAkcm93Wyd1cGxvYWRfc3VtbWFyeSddOwoJCWlmKCBpc3NldCggJHJvd1sndXBsb2FkX3N1bW1hcnknXSApICYmICRyb3dbJ3VwbG9hZF9zdW1tYXJ5J10gIT0gIiIgKQoJCSAgewoJCSAgICAkb25lcm93LT5zdW1tYXJ5bGluayA9CgkJICAgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2dldGZpbGUnLCAkcmV0dXJuaWQsICRyb3dbJ3VwbG9hZF9zdW1tYXJ5J10sCgkJCQkJIGFycmF5ICgndXBsb2FkX2lkJyA9PiAkcm93Wyd1cGxvYWRfaWQnXSkpOwoJCSAgfQoJCSRvbmVyb3ctPmRlc2NyaXB0aW9uID0gJHJvd1sndXBsb2FkX2Rlc2NyaXB0aW9uJ107CgkJJG9uZXJvdy0+aXAgPSAkcm93Wyd1cGxvYWRfaXAnXTsKCQkkb25lcm93LT5zaXplID0gaW50dmFsKCRyb3dbJ3VwbG9hZF9zaXplJ10gLyAxMDI0LjAgKyAwLjUpOwoJCSRvbmVyb3ctPmRhdGUgPSAkcm93Wyd1cGxvYWRfZGF0ZSddOwoJCSRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCQlhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKCSAgICAgIH0KCSAgICAKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaXRlbXMnLCAkcm93YXJyYXkpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKCSAgfQogICAgICB9CgogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBpZiggJHRlbXBsYXRlICE9ICcnICkKICAgICAgewoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlRnJvbURhdGFiYXNlICgkdGVtcGxhdGUpOwogICAgICB9CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAKICAgVGhpcyBpcyBhIG1ldGhvZCB0byBkaXNwbGF5CiAgIGVycm9yIGluZm9ybWF0aW9uIG9uIHRoZSBhZG1pbiBzaWRlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlID0gJycpCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3RpdGxlX2Vycm9yJywgJHRoaXMtPkxhbmcgKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ21lc3NhZ2UnLCAkbWVzc2FnZSk7CiAgICAgIH0KICAgIAogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdlcnJvci50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAKICAgVGhpcyBtZXRob2QgcHJvdmlkZXMgYWxsIG9mIHRoZSBhZG1pbiB1c2VyIGludGVyZmFjZSBhdAogICB0aGUgbWFpbiBsZXZlbC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUGFuZWwgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2UgPSAnJykKICB7CiAgICBnbG9iYWwgJGdDbXM7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY2F0ZWdvcnkgZm9yIHRoZSBmaWx0ZXIKICAgICRjdXJjYXRlZ29yeSA9CiAgICAgIChpc3NldCAoJHBhcmFtc1snY3VyY2F0ZWdvcnknXSkgPyAkcGFyYW1zWydjdXJjYXRlZ29yeSddIDogJycpOwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydzdWJtaXRjYXRlZ29yeSddKSkKICAgICAgewoJJGN1cmNhdGVnb3J5ID0KCSAgKGlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeSddKSA/ICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5J10gOgoJICAgJycpOwogICAgICB9CiAgICAgICAgCiAgICAvLyBhcmUgd2UgdXBsb2FkaW5nIGEgZmlsZSAgICAgIAogICAgaWYgKGlzc2V0KCAkcGFyYW1zWydzdWJtaXR1cGxvYWQnXSApICkKICAgICAgewoJJHVzZXJpZCA9IGdldF91c2VyaWQoKTsKCSR1c2VybmFtZSA9ICRfU0VTU0lPTlsiY21zX2FkbWluX3VzZXJuYW1lIl07CgkkcGFyYW1zWydjYXRlZ29yeV9pZCddID0gJGN1cmNhdGVnb3J5OwoJCgkkcmV0ID0gJHRoaXMtPkF0dGVtcHRVcGxvYWQoICRpZCwgJHBhcmFtcywgJHJldHVybmlkICk7CglpZiggJHJldFswXSA9PSBmYWxzZSApCgkgIHsKCSAgICAkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICAgICAkcmV0WzFdICk7CgkgICAgcmV0dXJuOwoJICB9CiAgICAgIH0KCiAgICAkYWN0aXZlX3RhYiA9IC0xOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2FjdGl2ZV90YWInXSkpCiAgICAgIHsKCSRhY3RpdmVfdGFiID0gJHBhcmFtc1snYWN0aXZlX3RhYiddOwogICAgICB9CiAgICAKICAgIC8vVGhlIHRhYnMKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiSGVhZGVycyAoKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciAoJ2ZpbGVzJywgJHRoaXMtPkxhbmcgKCdmaWxlcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ2ZpbGVzJykpOwogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyICgnY2F0ZWdvcmllcycsICR0aGlzLT5MYW5nICgnY2F0ZWdvcmllcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ2NhdGVnb3JpZXMnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIgKCd1cGxvYWRmb3JtX3RlbXBsYXRlJywKCQkJICAgICAgJHRoaXMtPkxhbmcgKCd1cGxvYWRmb3JtX3RlbXBsYXRlJyksCgkJCSAgICAgICgkYWN0aXZlX3RhYiA9PSAndXBsb2FkZm9ybV90ZW1wbGF0ZScpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciAoJ3N1bW1hcnlfdGVtcGxhdGUnLAoJCQkgICAgICAkdGhpcy0+TGFuZyAoJ3N1bW1hcnlfdGVtcGxhdGUnKSwKCQkJICAgICAgKCRhY3RpdmVfdGFiID09ICdzdW1tYXJ5X3RlbXBsYXRlJykpOwogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyICgnZGV0YWlsX3RlbXBsYXRlJywKCQkJICAgICAgJHRoaXMtPkxhbmcgKCdkZXRhaWxfdGVtcGxhdGUnKSwKCQkJICAgICAgKCRhY3RpdmVfdGFiID09ICdkZXRhaWxfdGVtcGxhdGUnKSk7CiAgICBlY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIgKCdlbWFpbF90ZW1wbGF0ZScsCgkJCSAgICAgICR0aGlzLT5MYW5nICgnZW1haWxfdGVtcGxhdGUnKSwKCQkJICAgICAgKCRhY3RpdmVfdGFiID09ICdlbWFpbF90ZW1wbGF0ZScpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciAoJ2FkbWluX3ByZWZzJywKCQkJICAgICAgJHRoaXMtPkxhbmcgKCdwcmVmZXJlbmNlcycpLAoJCQkgICAgICAoJGFjdGl2ZV90YWIgPT0gJ2FkbWluX3ByZWZzJykpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycyAoKTsKICAgIAogICAgLy9UaGUgY29udGVudCBvZiB0aGUgdGFicwogICAgZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50ICgpOwogICAgCiAgICAvLyB0aGUgZmlsZXMgdGFiCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYiAoImZpbGVzIik7CiAgICB7CiAgICAgIC8vIGdldCB0aGUgY2F0ZWdvcmllcyBmb3IgdGhlIGZpbHRlcgogICAgICAkY2F0ZWdvcnlsaXN0ID0gYXJyYXkgKCk7CiAgICAgICRxdWVyeSA9CgkiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXggKCkuCgkibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBPUkRFUiBCWSB1cGxvYWRfY2F0ZWdvcnlfbmFtZSBBU0MiOwogICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSk7CiAgICAgIGlmICghJGRicmVzdWx0KQoJewoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCdlcnJvcl9ub2NhdGVnb3JpZXMnKSk7Cgl9CiAgICAgIGVsc2UKCXsKCSAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93ICgpKQoJICAgIHsKCSAgICAgIGlmKCAkY3VyY2F0ZWdvcnkgPT0gJycgKSB7CgkJJGN1cmNhdGVnb3J5ID0gJHJvd1sndXBsb2FkX2NhdGVnb3J5X2lkJ107CgkgICAgICB9CgkgICAgICAkY2F0ZWdvcnlsaXN0WyRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9uYW1lJ11dID0KCQkkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXTsKCSAgICB9Cgl9CgogICAgICAvLyBzZXR1cCB0aGUgZm9ybSBwYXJ0IG9mIHRoZSB0ZW1wbGF0ZQogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdzdGFydGZvcm0nLAoJCQkgICAgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCwgJ3Bvc3QnLCAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnY2F0ZWdvcnknLCAkdGhpcy0+TGFuZyAoJ2NhdGVnb3J5JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeScsCgkJCSAgICAgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcERvd24gKCRpZCwgImlucHV0X2NhdGVnb3J5IiwgJGNhdGVnb3J5bGlzdCwgLTEsCgkJCQkJCQkgJGN1cmNhdGVnb3J5KSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X3NlbGVjdCcsCgkJCSAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXRjYXRlZ29yeScsCgkJCQkJCSAgICAgICAkdGhpcy0+TGFuZygnc2VsZWN0Y2F0ZWdvcnknKSkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9oaWRkZW4nLAoJCQkgICAgICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbiAoJGlkLCAnY3VyY2F0ZWdvcnknLAoJCQkJCQkgICAgICAgJGN1cmNhdGVnb3J5KSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X2Jyb3dzZScsICR0aGlzLT5MYW5nKCd1cGxvYWQnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2lucHV0X2Jyb3dzZScsCiAJCSAgICAgICAgICAgICAgJHRoaXMtPkNyZWF0ZUZpbGVVcGxvYWRJbnB1dCAoJGlkLCdpbnB1dF9icm93c2UnKSk7CgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfZGVzdG5hbWUnLAoJCQkgICAgICR0aGlzLT5MYW5nICgnZGVzdG5hbWUnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2Rlc3RuYW1lJywKCQkJICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9kZXN0bmFtZScsCgkJCQkJCSAgICAgJycsIDQwLCAyNTUpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19kZXN0bmFtZScsCgkJCSAgICAgJHRoaXMtPkxhbmcoJ2luZm9fZGVzdG5hbWUnKSk7CgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfc3VtbWFyeScsCgkJCSAgICAgJHRoaXMtPkxhbmcgKCdzdW1tYXJ5JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9zdW1tYXJ5JywKCQkJICAgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9zdW1tYXJ5JywKCQkJCQkJICAgICAnJywgODAsIDI1NSkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF9hdXRob3InLCR0aGlzLT5MYW5nKCdhdXRob3InKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiggJ2lucHV0X2F1dGhvcicsCgkJCSAgICAgJHRoaXMtPmNyZWF0ZUlucHV0VGV4dCggJGlkLCAnaW5wdXRfYXV0aG9yJywgJF9TRVNTSU9OWyJjbXNfYWRtaW5fdXNlcm5hbWUiXSwKCQkJCSAgICAyMCwgMjU1KSk7CgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oICdpbnB1dF9zdWJtaXQnLAoJICAgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0KCAkaWQsICdzdWJtaXR1cGxvYWQnLCAkdGhpcy0+TGFuZygndXBsb2FkJykpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKCiAgICAgICRkYnJlc3VsdCA9ICcnOwogICAgICAkcm93YXJyYXkgPSBhcnJheSAoKTsKICAgICAgaWYgKCRjdXJjYXRlZ29yeSA9PSAnJykKICAgICAgewoJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4ICgpLgoJICAibW9kdWxlX3VwbG9hZHMgT1JERVIgQlkgdXBsb2FkX2RhdGUiOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlICgkcXVlcnkpOwogICAgICB9CiAgICAgIGVsc2UKCXsKCSAgJHF1ZXJ5ID0KCSAgICAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICAgIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9jYXRlZ29yeV9pZCA9ID8gT1JERVIgQlkgdXBsb2FkX2RhdGUiOwoJICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRjdXJjYXRlZ29yeSkpOwoJfQoKICAgICAgLy8gbm93IHNldHVwIHRoZSByZXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAkcm93Y2xhc3MgPSAncm93MSc7CiAgICAgIAogICAgICBpZiAoJGRicmVzdWx0KQoJewoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lkdGV4dCcsJHRoaXMtPkxhbmcoJ25hbWUnKSk7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbigndGl0bGV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZScpKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdW1tYXJ5dGV4dCcsJHRoaXMtPkxhbmcoJ3N1bW1hcnknKSk7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGVzY3RleHQnLCR0aGlzLT5MYW5nKCdkZXNjcmlwdGlvbicpKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaXpldGV4dCcsJHRoaXMtPkxhbmcoJ3NpemVrYicpKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRob3J0ZXh0JywkdGhpcy0+TGFuZygnYXV0aG9yJykpOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lwdGV4dCcsJHRoaXMtPkxhbmcoJ2lwX2FkZHJlc3MnKSk7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbignZGx0ZXh0JywkdGhpcy0+TGFuZygnZG93bmxvYWRzJykpOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Bvc3RkYXRldGV4dCcsJHRoaXMtPkxhbmcoJ2RhdGUnKSk7CgkgIHdoaWxlICgkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKSkKCSAgICB7CgkgICAgICAkb25lcm93ID0gbmV3IHN0ZENsYXNzICgpOwoJICAgICAgJG9uZXJvdy0+aWQgPSAkcm93Wyd1cGxvYWRfaWQnXTsKCSAgICAgICRvbmVyb3ctPm5hbWUgPSAkcm93Wyd1cGxvYWRfbmFtZSddOwoJICAgICAgJG9uZXJvdy0+c2l6ZSA9IGludHZhbCgkcm93Wyd1cGxvYWRfc2l6ZSddIC8gMTAyNC4wICsgMC41KTsKCSAgICAgICRvbmVyb3ctPmF1dGhvciA9ICRyb3dbJ3VwbG9hZF9hdXRob3InXTsKCSAgICAgICRvbmVyb3ctPmlwID0gJHJvd1sndXBsb2FkX2lwJ107CgkgICAgICAkb25lcm93LT5zdW1tYXJ5ID0gJHJvd1sndXBsb2FkX3N1bW1hcnknXTsKCSAgICAgICRvbmVyb3ctPmRlc2NyaXB0aW9uID0gJHJvd1sndXBsb2FkX2Rlc2NyaXB0aW9uJ107CgkgICAgICAkb25lcm93LT5kYXRlID0gJHJvd1sndXBsb2FkX2RhdGUnXTsKCSAgICAgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoJICAgICAgCgkgICAgICAvLyBob3cgbWFueSB0aW1lcyBoYXMgdGhpcyBpdGVtIGJlZW4gZG93bmxvYWRlZAoJICAgICAgJHF1ZXJ5ID0gIlNFTEVDVCBDT1VOVChkb3dubG9hZF9pZCkgYXMgY291bnQgRlJPTSAiLgoJCWNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfZG93bmxvYWRzIFdIRVJFIGZpbGVfaWQgPSA/IjsKCSAgICAgICRkYnJlc3VsdDIgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRyb3dbJ3VwbG9hZF9pZCddICkgKTsKCSAgICAgICRyb3cyID0gJGRicmVzdWx0Mi0+RmV0Y2hSb3coKTsKCSAgICAgICRvbmVyb3ctPmRvd25sb2FkcyA9IDA7CgkgICAgICBpZiggJHJvdzIgKSB7CgkJJG9uZXJvdy0+ZG93bmxvYWRzID0gJHJvdzJbJ2NvdW50J107CgkgICAgICB9CiAgCgkgICAgICAkb25lcm93LT5lZGl0bGluayA9CgkJJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2VkaXR1cGxvYWQnLCAkcmV0dXJuaWQsCgkJCQkgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkJCQkJCSR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkgICBhcnJheSAoJ3VwbG9hZF9pZCcgPT4gJHJvd1sndXBsb2FkX2lkJ10sCgkJCQkJICAnY2F0ZWdvcnlfaWQnID0+ICRjdXJjYXRlZ29yeSkpOwoKCSAgICAgICRvbmVyb3ctPmRlbGV0ZWxpbmsgPSAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCdkb19kZWxldGV1cGxvYWQnLCRyZXR1cm5pZCwKCQkJCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCQkJCSAgICAkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkJCSAgICAgICBhcnJheSAoJ3VwbG9hZF9pZCcgPT4gJHJvd1sndXBsb2FkX2lkJ10sCgkJCQkJCQkgICAgICAnY2F0ZWdvcnlfaWQnID0+ICRjdXJjYXRlZ29yeSksCgkJCQkJCSAgICAgICAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmUnKSk7CgkgICAgICBhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJICAgICAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwoJICAgIH0KCX0KCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtcycsICRyb3dhcnJheSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtY291bnQnLCBjb3VudCAoJHJvd2FycmF5KSk7CiAgICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ3VwbG9hZGxpc3QudHBsJyk7CiAgICB9CiAgICBlY2hvICR0aGlzLT5FbmRUYWIgKCk7CgogICAgLy8gdGhlIGNhdGVnb3JpZXMgdGFiCiAgICBlY2hvICR0aGlzLT5TdGFydFRhYiAoImNhdGVnb3JpZXMiKTsKICAgIHsKICAgICAgJHJvd2FycmF5ID0gYXJyYXkgKCk7CiAgICAgICRxdWVyeSA9ICcnOwogICAgICAkZGJyZXN1bHQgPSAnJzsKCiAgICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyI7CiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5KTsKICAgICAgJHJvd2NsYXNzID0gJ3JvdzEnOwoKICAgICAgd2hpbGUgKCRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93ICgpKQoJewoJICAkb25lcm93ID0gbmV3IHN0ZENsYXNzICgpOwoJICAkb25lcm93LT5pZCA9ICRyb3dbInVwbG9hZF9jYXRlZ29yeV9pZCJdOwoJICAkb25lcm93LT5uYW1lID0gJHJvd1sidXBsb2FkX2NhdGVnb3J5X25hbWUiXTsKCSAgJG9uZXJvdy0+ZGVzY3JpcHRpb24gPSAkcm93WyJ1cGxvYWRfY2F0ZWdvcnlfZGVzY3JpcHRpb24iXTsKCSAgJG9uZXJvdy0+cGF0aCA9ICRyb3dbInVwbG9hZF9jYXRlZ29yeV9wYXRoIl07CgkgICRvbmVyb3ctPnJvd2NsYXNzID0gJHJvd2NsYXNzOwoKCSAgJG9uZXJvdy0+ZWRpdGxpbmsgPQoJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdlZGl0Y2F0ZWdvcnknLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPgoJCQkgICAgICAgRGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkgICAgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ2NhdGVnb3J5X2lkJyA9PiAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXSkpOwoJICAkb25lcm93LT5kZWxldGVsaW5rID0KCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZGVsZXRlY2F0ZWdvcnknLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPgoJCQkgICAgICAgRGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2RlbGV0ZS5naWYnLAoJCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdkZWxldGUnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkgICAgICAgYXJyYXkgKCdjYXRlZ29yeV9pZCcgPT4gJHJvd1sndXBsb2FkX2NhdGVnb3J5X2lkJ10pLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdhcmV5b3VzdXJlJykpOwoKCSAgYXJyYXlfcHVzaCAoJHJvd2FycmF5LCAkb25lcm93KTsKCSAgKCRyb3djbGFzcyA9PSAicm93MSIgPyAkcm93Y2xhc3MgPSAicm93MiIgOiAkcm93Y2xhc3MgPSAicm93MSIpOwoJfQoKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnY2F0ZWdvcnl0ZXh0JywgJHRoaXMtPkxhbmcgKCdjYXRlZ29yeScpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbmFtZXRleHQnLCAkdGhpcy0+TGFuZyAoJ25hbWUnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3BhdGh0ZXh0JywgJHRoaXMtPkxhbmcgKCdwYXRoJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaXRlbXMnLCAkcm93YXJyYXkpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnaXRlbWNvdW50JywgY291bnQgKCRyb3dhcnJheSkpOwoKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ2FkZGxpbmsnLAoJCQkJICAgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdhZGRjYXRlZ29yeScsCgkJCQkJCSAgICAgICAkcmV0dXJuaWQsCgkJCQkJCSAgICAgICAkdGhpcy0+CgkJCQkJCSAgICAgICBMYW5nICgnYWRkY2F0ZWdvcnknKSwKCQkJCQkJICAgICAgIGFycmF5ICgpLCAnJywgZmFsc2UsCgkJCQkJCSAgICAgICBmYWxzZSwKCQkJCQkJICAgICAgICdjbGFzcz0icGFnZW9wdGlvbnMiJykpOwoKICAgICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnY2F0ZWdvcnlsaXN0LnRwbCcpOwogICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiICgpOwoKICAgIC8vIHRoZSB1cGxvYWQgZm9ybSB0ZW1wbGF0ZSB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiICgidXBsb2FkZm9ybV90ZW1wbGF0ZSIpOwogICAgewogICAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3VwbG9hZGZvcm10ZW1wbGF0ZScpOwogICAgICBlY2hvICc8YnIvPjxwPicuJHRoaXMtPkNyZWF0ZVRleHRBcmVhIChmYWxzZSwgJGlkLAoJCQkJCSAgICAgJHRoaXMtPkdldFRlbXBsYXRlICgndXBsb2FkX3VwbG9hZGZvcm0nKSwKCQkJCQkgICAgICd0ZW1wbGF0ZWNvbnRlbnQnLCAnJykuJzwvcD4nOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdzdWJtaXQnKSk7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdkZWZhdWx0JykpOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpOwogICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiICgpOwoKICAgIC8vIHRoZSBzdW1tYXJ5IHRlbXBsYXRlIHRhYgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIgKCJzdW1tYXJ5X3RlbXBsYXRlIik7CiAgICB7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLCAndXBkYXRlc3VtbWFyeXRlbXBsYXRlJyk7CiAgICAgIGVjaG8gJzxici8+PHA+Jy4kdGhpcy0+Q3JlYXRlVGV4dEFyZWEgKGZhbHNlLCAkaWQsCgkJCQkJICAgICAkdGhpcy0+CgkJCQkJICAgICBHZXRUZW1wbGF0ZSAoJ3VwbG9hZF9kaXNwbGF5c3VtbWFyeScpLAoJCQkJCSAgICAgJ3RlbXBsYXRlY29udGVudCcsICcnKS4nPC9wPic7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdzdWJtaXRidXR0b24nLAoJCQkJICAgICAkdGhpcy0+TGFuZyAoJ3N1Ym1pdCcpKTsKICAgICAgZWNobyAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2RlZmF1bHRidXR0b24nLAoJCQkJICAgICAkdGhpcy0+TGFuZyAoJ2RlZmF1bHQnKSk7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCk7CiAgICB9CiAgICBlY2hvICR0aGlzLT5FbmRUYWIgKCk7CgogICAgLy8gdGhlIGRldGFpbCB0ZW1wbGF0ZSB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiICgiZGV0YWlsX3RlbXBsYXRlIik7CiAgICB7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLCAndXBkYXRlZGV0YWlsdGVtcGxhdGUnKTsKICAgICAgZWNobyAnPGJyLz48cD4nLiR0aGlzLT5DcmVhdGVUZXh0QXJlYSAoZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT4KCQkJCQkgICAgIEdldFRlbXBsYXRlICgndXBsb2FkX2Rpc3BsYXlkZXRhaWwnKSwKCQkJCQkgICAgICd0ZW1wbGF0ZWNvbnRlbnQnLCAnJykuJzwvcD4nOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdzdWJtaXQnKSk7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdkZWZhdWx0JykpOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpOwogICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiICgpOwoKICAgIC8vIHRoZSBlbWFpbCB0ZW1wbGF0ZSB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdlbWFpbF90ZW1wbGF0ZScpOwogICAgewogICAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ3VwZGF0ZWVtYWlsdGVtcGxhdGUnKTsKICAgICAgZWNobyAnPGJyLz48cD4nLiR0aGlzLT5DcmVhdGVUZXh0QXJlYSAoZmFsc2UsICRpZCwKCQkJCQkgICAgICR0aGlzLT4KCQkJCQkgICAgIEdldFRlbXBsYXRlICgndXBsb2FkX2VtYWlsdGVtcGxhdGUnKSwKCQkJCQkgICAgICd0ZW1wbGF0ZWNvbnRlbnQnLCAnJykuJzwvcD4nOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdzdWJtaXQnKSk7CiAgICAgIGVjaG8gJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdkZWZhdWx0YnV0dG9uJywKCQkJCSAgICAgJHRoaXMtPkxhbmcgKCdkZWZhdWx0JykpOwogICAgICBlY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpOwogICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoICdhZG1pbl9wcmVmcycgKTsKICAgIHsKICAgICAgJHRoaXMtPl9EaXNwbGF5QWRtaW5QcmVmcygkaWQsJHBhcmFtcywkcmV0dXJuaWQpOwogICAgfQogICAgZWNobyAkdGhpcy0+RW5kVGFiICgpOwoKICAgIC8vIGRvbmUgdGFicwogICAgZWNobyAkdGhpcy0+RW5kVGFiQ29udGVudCAoKTsKICAgIHJldHVybjsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRVcGxvYWREZXRhaWxzKCRpZCwkcmV0dXJuaWQpCiAgIAogICBSZXR1cm4gdGhlIGRldGFpbHMgYWJvdXQgYSBzcGVjaWZpYyB1cGxvYWQKICAgICAgdXBsb2FkX2lkCiAgICAgIHVwbG9hZF9jYXRlZ29yeV9pZAogICAgICB1cGxvYWRfbmFtZQogICAgICB1cGxvYWRfYXV0aG9yCiAgICAgIHVwbG9hZF9zdW1tYXJ5CiAgICAgIHVwbG9hZF9kZXNjcmlwdGlvbgogICAgICB1cGxvYWRfaXAKICAgICAgdXBsb2FkX3NpemUKICAgICAgdXBsb2FkX2RhdGUKICAgICAgdXJsCiAgICAgIGFic3VybAogICAgICBsaW5rCiAgIG9yIGFuIGFycmF5IChGQUxTRSxFUlJPUk1TRykKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRVcGxvYWREZXRhaWxzKCAkaWQsICRyZXR1cm5pZCApCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkcSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfdXBsb2FkcwogICAgICAgICAgV0hFUkUgdXBsb2FkX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxLCBhcnJheSggJGlkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJGRiLT5FcnJvck1zZygpICk7CiAgICAgIH0KICAgIGlmKCAhJGRicmVzdWx0LT5Sb3dDb3VudCgpICkKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJHRoaXMtPkxhbmcoJ2Vycm9yX2ludmFsaWR1cGxvYWRpZCcpKTsKICAgICAgfQogICAgJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCSAgaWYoICEkcm93ICkKICAgIHsKCSAgICByZXR1cm4gYXJyYXkoRkFMU0UsICRkYi0+RXJyb3JNc2coKSk7CiAgICB9CgogICAgLy8gaGF2ZSBkZXRhaWxzIGZyb20gdGhlIHRhYmxlLCBub3cKICAgIC8vIGhhdmUgdG8gYWRkIHNvbWV0aGluZyBzdWNoIHRoYXQgYSBsaW5rIGNhbiBiZSBnZW5lcmF0ZWQKICAgIC8vIHRoYXQgd2lsbCBzdGlsbCBjb3VudCB0aGUgbnVtYmVyIG9mIGRvd25sb2FkcywgZXRjCiAgICAkcm93Wyd1cmwnXSA9ICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdnZXRmaWxlJywgJHJldHVybmlkLCAnJywKCQkJCSAgICAgYXJyYXkgKCd1cGxvYWRfaWQnID0+ICRyb3dbJ3VwbG9hZF9pZCddKSwgJycsIHRydWUpOwogICAgJHJvd1snbGluayddID0gJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2dldGZpbGUnLCAkcmV0dXJuaWQsICRyb3dbJ3VwbG9hZF9uYW1lJ10sCgkJCQkgICAgICBhcnJheSAoJ3VwbG9hZF9pZCcgPT4gJHJvd1sndXBsb2FkX2lkJ10pKTsKICAgICRyb3dbJ2Fic3VybCddID0gJHRoaXMtPmNtcy0+Y29uZmlnWyd1cGxvYWRzX3VybCddLiIvIi4KICAgICAgJHRoaXMtPmdldENhdGVnb3J5UGF0aEZyb21GaWxlSUQoICRyb3dbJ3VwbG9hZF9pZCddICkuIi8iLgogICAgICAkcm93Wyd1cGxvYWRfbmFtZSddOwogICAgcmV0dXJuICRyb3c7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgQXR0ZW1wdFVwbG9hZCgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIAogICBUaGlzIGlzIGEgbWV0aG9kIHRvIGFjdHVhbGx5IHRyeSB1cGxvYWRpbmcgdGhlIGZpbGUKICAgZW5zdXJpbmcgaXQgaXMgdmFsaWQsIGFuZCB0aGVuIGFkZGluZyB0aGUgc3R1ZmYgdG8KICAgdGhlIGRhdGFiYXNlLgoKICAgUmV0dXJucyBhbiBhcnJheSwgZmlyc3QgZWxlbWVudCBpcyBzdWNjZXNzICh0cnVlL2ZhbHNlKQogICBzZWNvbmQgZWxlbWVudCBpcyAoaWYgZmlyc3QgZWxlbWVudCBpcyBmYWxzZSkgYW4gZXJyb3IgbWVzc2FnZSwKICAgb3IgdGhlIGlkIG9mIHRoZSB1cGxvYWRlZCBmaWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEF0dGVtcHRVcGxvYWQgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyBjaGVjayB0aGUgYXV0aG9yCiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9hdXRob3InXSkpCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkYXV0aG9yJykgKTsKICAgICAgfQogICAgCiAgICAvLyBjaGVjayB0aGUgZGVzY3JpcHRpb24KICAgIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X3N1bW1hcnknXSkpCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkc3VtbWFyeScpICk7CiAgICAgIH0KCiAgICAvLyB2YWxpZGF0ZSB0aGUgdXBsb2FkIG5hbWUKICAgICRkZXN0bmFtZSA9ICRfRklMRVNbJGlkLidpbnB1dF9icm93c2UnXVsnbmFtZSddOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ2lucHV0X2Rlc3RuYW1lJ10pICYmICRwYXJhbXNbJ2lucHV0X2Rlc3RuYW1lJ10gIT0gJycpCiAgICAgIHsKCSRkZXN0bmFtZSA9IHRyaW0oYmFzZW5hbWUoJHBhcmFtc1snaW5wdXRfZGVzdG5hbWUnXSkpOwogICAgICB9CgogICAgLy8gY2hlY2sgdGhlIGNhdGVnb3J5CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRkYnJlc3VsdCA9ICIiOwogICAgJHJvdyA9IGFycmF5KCk7CiAgICAkY2F0ZWdvcnlfaWQgPSAwOwogICAgaWYgKGlzc2V0KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKQogICAgICB7CiAgICAgICAgJGNhdGVnb3J5X2lkID0gJHBhcmFtc1snY2F0ZWdvcnlfaWQnXTsKICAgICAgICAkcXVlcnkgPQogICAgICAgICAgIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuCiAgICAgICAgICAibW9kdWxlX3VwbG9hZHNfY2F0ZWdvcmllcyBXSEVSRSB1cGxvYWRfY2F0ZWdvcnlfaWQgPSA/IjsKICAgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRjYXRlZ29yeV9pZCkpOwogICAgICB9CiAgICBlbHNlIGlmIChpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnknXSkpCiAgICAgIHsKICAgICAgICAvLyBnZXQgdGhlIGNhdGVnb3J5IGluZm8gZ2l2ZW4gaXQncyBuYW1lCiAgICAgICAgJHF1ZXJ5ID0KICAgICAgICAgICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLgogICAgICAgICAgIm1vZHVsZV91cGxvYWRzX2NhdGVnb3JpZXMgV0hFUkUgdXBsb2FkX2NhdGVnb3J5X25hbWUgPSA/IjsKICAgICAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRwYXJhbXNbJ2NhdGVnb3J5J10pKTsKICAgICAgfQogICAgaWYgKCEkZGJyZXN1bHQpCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkY2F0ZWdvcnknKSApOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKTsKICAgIGlmKCAhJHJvdyApCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl9pbnZhbGlkY2F0ZWdvcnknKSApOwogICAgICB9CiAgICAkY2F0ZWdvcnlfaWQgPSAkcm93Wyd1cGxvYWRfY2F0ZWdvcnlfaWQnXTsKIAogICAgLy8gY2hlY2sgZm9yIGEgZHVwbGlhdGUgZmlsZQogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV91cGxvYWRzIFdIRVJFIHVwbG9hZF9uYW1lID0gPyBBTkQKCQkJdXBsb2FkX2NhdGVnb3J5X2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRkZXN0bmFtZSwgJGNhdGVnb3J5X2lkICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICR0aGlzLT5MYW5nKCdlcnJvcl9kYmVycm9yJykgKTsKICAgICAgfQogICAgJHJvdzIgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggJHJvdzIgKSAKICAgICAgewoJcmV0dXJuIGFycmF5KCBGQUxTRSwgJHRoaXMtPkxhbmcoJ2Vycm9yX2ZpbGVleGlzdHMnKSApOwogICAgICB9CiAJICAgICAgIAogICAgLy8gbm93IGRvIHRoZSB1cGxvYWQsIGhvcGVmdWxseQogICAgJGRpciA9ICR0aGlzLT5fY2F0ZWdvcnlQYXRoKCRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9wYXRoJ10pOwogICAgJHJlc3VsdCA9CiAgICAgICR0aGlzLT5faGFuZGxlVXBsb2FkICgkZGlyLCR0aGlzLT5HZXRQcmVmZXJlbmNlICgnbWF4X3VwbG9hZHNpemUnLCAxMDAwMDAwKSAqIDEwMjQsIAoJCQkgICAgJGlkLidpbnB1dF9icm93c2UnLGZhbHNlLCRkZXN0bmFtZSk7CiAgICBpZiAoISRyZXN1bHRbMF0pCiAgICAgIHsKCXJldHVybiBhcnJheSggRkFMU0UsICRyZXN1bHRbMV0gKTsKICAgICAgfQoKCiAgICAvLyBhcHBhcmVudGx5IHRoZSB1cGxvYWQgc3VjY2VlZGVkLCBub3cgd2UgaGF2ZSB0byBsb2cgaXQKICAgICRkZXN0bmFtZSA9ICRyZXN1bHRbMV07CiAgICAkZGVzYyA9ICIiOwogICAgaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF9kZXNjcmlwdGlvbiddICkgKQogICAgICB7CgkkZGVzYyA9ICRwYXJhbXNbJ2lucHV0X2Rlc2NyaXB0aW9uJ107CiAgICAgIH0KCgogICAgJG5ld2lkID0gJGRiLT5HZW5JRCAoY21zX2RiX3ByZWZpeCAoKS4ibW9kdWxlX3VwbG9hZHNfc2VxIik7CiAgICAkcXVlcnkgPQogICAgICAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4ICgpLgogICAgICAibW9kdWxlX3VwbG9hZHMgVkFMVUVTICg/LD8sPyw/LD8sPyw/LD8sPykiOwogICAgJGRicmVzdWx0ID0KICAgICAgJGRiLT5FeGVjdXRlICgkcXVlcnksCgkJICAgIGFycmF5ICgkbmV3aWQsCgkJCSAgICRyb3dbJ3VwbG9hZF9jYXRlZ29yeV9pZCddLAoJCQkgICAkZGVzdG5hbWUsIAoJCQkgICAkcGFyYW1zWydpbnB1dF9hdXRob3InXSwKCQkJICAgJHBhcmFtc1snaW5wdXRfc3VtbWFyeSddLAoJCQkgICAkZGVzYywKCQkJICAgZ2V0ZW52ICgiUkVNT1RFX0FERFIiKSwgCgkJCSAgICRyZXN1bHRbMV1bJ3NpemUnXSwKCQkJICAgJGRiLT5EQlRpbWVTdGFtcCAodGltZSAoKSkKCQkJICAgKSk7CgogICAgLy8gdGhhdCBzaG91bGQgZG8gdGhlIHRyaWNrCiAgICAvLyBub3cgbWF5YmUgd2UnbGwgc2VuZCBhbiBlbWFpbAogICAgJHRvX2FkZHJlc3MgPSAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc2VuZF91cGxvYWRfbm90aWZpY2F0aW9uc190bycpOwogICAgaWYoICR0b19hZGRyZXNzICYmICR0b19hZGRyZXNzICE9ICcnICkKICAgICAgewoJLy8gZmlsbCBvdXQgdGhlIHRlbXBsYXRlLCBhbmQgc2VuZCBhbiBlbWFpbAoJJGNtc21haWxlciA9ICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSggJ0NNU01haWxlcicgKTsKCWlmKCAhJGNtc21haWxlciApCgkgIHsKCSAgICAvLyB3ZSdyZSBub3QgZ29ubmEgcmV0dXJuIGFuIGVycm9yLCBidXQgcHV0CgkgICAgLy8gYSBtZXNzYWdlIGludG8gdGhlIGFkbWluIGxvZwoJICAgICR0aGlzLT5BdWRpdCggMCwgJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpLAoJCQkgICR0aGlzLT5MYW5nKCdlcnJvcl9ub21haWxlcm1vZHVsZScpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduYW1lJywgJGRlc3RuYW1lICk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzaXplJywgJHJlc3VsdFsxXVsnc2l6ZSddICk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdW1tYXJ5JywgJHBhcmFtc1snaW5wdXRfc3VtbWFyeSddICk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdkZXNjcmlwdGlvbicsICRkZXNjICk7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhdXRob3InLCAkcGFyYW1zWydpbnB1dF9hdXRob3InXSApOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaXBfYWRkcmVzcycsIGdldGVudiAoIlJFTU9URV9BRERSIikgKTsKCSAgICAkYm9keSA9ICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGVGcm9tRGF0YWJhc2UoJ3VwbG9hZF9lbWFpbHRlbXBsYXRlJyk7CgkgICAgJGNtc21haWxlci0+QWRkQWRkcmVzcyggJHRvX2FkZHJlc3MgKTsKCSAgICAkY21zbWFpbGVyLT5TZXRCb2R5KCAkYm9keSApOwoJICAgICRjbXNtYWlsZXItPklzSFRNTCh0cnVlKTsKCSAgICAkY21zbWFpbGVyLT5TZXRTdWJqZWN0KCR0aGlzLT5MYW5nKCd1cGxvYWRfbm90aWZpY2F0aW9uJykpOwoJICAgICRjbXNtYWlsZXItPlNlbmQoKTsKCSAgfQogICAgICB9CgogICAgLy8gZXhjZXB0IGZvciBzb21lIGxvZ2dpbmcuCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5sYW5nKCdmcmllbmRseW5hbWUnKSwKCQkgICR0aGlzLT5sYW5nKCd1cGxvYWRlZCcsICRkZXN0bmFtZSkgKTsKCiAgICByZXR1cm4gYXJyYXkoIFRSVUUsICRuZXdpZCApOwogIH0KCgogIGZ1bmN0aW9uIG15UmVkaXJlY3RUb1RhYiggJGlkLCAkdGFiLCAkcGFyYW1zID0gJycgKQogIHsKICAgICRwYXJtcyA9IGFycmF5KCk7CiAgICBpZiggaXNfYXJyYXkoICRwYXJhbXMgKSApCiAgICAgIHsKCSRwYXJtcyA9ICRwYXJhbXM7CiAgICAgIH0KICAgICRwYXJtcyA9IGFycmF5KCdhY3RpdmVfdGFiJyA9PiAkdGFiICk7CiAgICAkdGhpcy0+bXlSZWRpcmVjdCggJGlkLCAnZGVmYXVsdGFkbWluJywgJHBhcm1zICk7CiAgfQoKICBmdW5jdGlvbiBteVJlZGlyZWN0KCAkaWQsICRhY3Rpb24sICRwYXJhbXMgPSAnJyApCiAgewogICAgdW5zZXQoICRwYXJhbXNbJ2FjdGlvbiddICk7CiAgICAkdGhpcy0+UmVkaXJlY3QoICRpZCwgJGFjdGlvbiwgJycsICRwYXJhbXMgKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfaGFuZGxlVXBsb2FkKCAkZGVzdERpciwgJG1heEZpbGVTaXplLCAkZmllbGROYW1lLCAkbmFtZUNhbGxiYWMgKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgVGhpcyBtZXRob2QgaGFuZGxlcyB2YWxpZGF0aW5nIHRoZSB1cGxvYWQgcGFyYW1ldGVycywgYW5kIGNvcHlpbmcKICAgdGhlIGZpbGUgZnJvbSBpdCdzIHRlbXBvcmFyeSBsb2NhdGlvbiB0byBpdCdzIHBlcm1hbmVudCBsb2NhdGlvbi4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfaGFuZGxlVXBsb2FkICgkZGVzdERpciwgJG1heEZpbGVTaXplID0KCQkJICBmYWxzZSwgJGZpZWxkTmFtZSA9ICdfdXBsb2FkJywgJG5hbWVDYWxsYmFjayA9IGZhbHNlLAoJCQkgICRkZXN0bmFtZSA9ICcnKQogIHsKICAgIC8vbWFrZSBzdXJlIHNvbWV0aGluZyBpcyB0aGVyZQogICAgaWYgKCFpc3NldCAoJF9GSUxFU1skZmllbGROYW1lXSkgfHwgIWlzc2V0ICgkX0ZJTEVTKQoJfHwgIWlzX2FycmF5ICgkX0ZJTEVTWyRmaWVsZE5hbWVdKSB8fCAhJF9GSUxFU1skZmllbGROYW1lXVsnbmFtZSddKQogICAgICByZXR1cm4gYXJyYXkgKGZhbHNlLAoJCSAgICAnTm8gZmlsZXMgd2VyZSB1cGxvYWRlZC4gTWFrZSBzdXJlIHlvdXIgZm9ybSB0YWdcJ3MgZW5jdHlwZSB3YXMgc2V0IHRvIG11bHRpcGFydC9mb3JtLWRhdGEgYW5kIHRoYXQgdGhlIHJpZ2h0IGZpZWxkIGlzIGJlaW5nIGNoZWNrZWQgZm9yIHRoZSB1cGxvYWRlZCBmaWxlLicpOwogICAgLy9ub3JtYWxpemUgdGhlIGZpbGUgdmFyaWFibGUKICAgICRmaWxlID0gJF9GSUxFU1skZmllbGROYW1lXTsKICAgIGlmICghaXNzZXQgKCRmaWxlWyd0eXBlJ10pKQogICAgICAkZmlsZVsndHlwZSddID0gJyc7CiAgICBpZiAoIWlzc2V0ICgkZmlsZVsnc2l6ZSddKSkKICAgICAgJGZpbGVbJ3NpemUnXSA9ICcnOwogICAgaWYgKCFpc3NldCAoJGZpbGVbJ3RtcF9uYW1lJ10pKQogICAgICAkZmlsZVsndG1wX25hbWUnXSA9ICcnOwogICAgJGZpbGVbJ25hbWUnXSA9CiAgICAgIHByZWdfcmVwbGFjZSgnL1teYS16QS1aMC05XC5cJFwlXCdcYFwtXEBce1x9XH5cIVwjXChcKVwmXF9cXl0vJywgJycsCiAgICAgICBzdHJfcmVwbGFjZSAoYXJyYXkgKCcgJywgJyUyMCcpLCBhcnJheSAoJ18nLCAnXycpLCAkZmlsZVsnbmFtZSddKSk7CgogICAgLy8gdmFsaWRhdGUgdGhlIGZpbGVuYW1lCiAgICBpZiAoISR0aGlzLT5faXNWYWxpZEZpbGVuYW1lICgkZmlsZVsnbmFtZSddKSkKICAgICAgewoJcmV0dXJuIGFycmF5IChmYWxzZSwgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnZhbGlkdXBsb2FkZmlsZW5hbWUnKSk7CgkvKiAgICdGaWxlcyB3aXRoIHRoYXQgbmFtZSAocHJvYmFibHkgZXh0ZW5zaW9uKSBhcmUgbm90IGFsbG93ZWQnKTsgKi8KICAgICAgfQoKICAgIC8vd2FzIGl0IHRvIGJpZz8KICAgIGlmICgkbWF4RmlsZVNpemUgJiYgKCRmaWxlWydzaXplJ10gPiAoJG1heEZpbGVTaXplICogMTAyNCkpKQogICAgICByZXR1cm4gYXJyYXkgKGZhbHNlLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX2ZpbGV0b29sYXJnZScpKTsKCiAgICAvL25vcm1hbGl6ZSBkZXN0RGlyCiAgICBpZiAoc3RybGVuICgkZGVzdERpcikgPiAwICYmICRkZXN0RGlyW3N0cmxlbiAoJGRlc3REaXIpIC0gMV0gIT0gIi8iKQogICAgICAkZGVzdERpciA9ICRkZXN0RGlyLicvJzsKCiAgICAvLyBnZXQgdGhlIGRlc3RpbmF0aW9uIG5hbWUKICAgIGlmKCAkZGVzdG5hbWUgPT0gJycgKSB7CiAgICAgICRkZXN0bmFtZSA9ICRmaWxlWyduYW1lJ107CiAgICB9CiAgICAKICAgIC8vc2hvdWxkIHdlIGNoYW5nZSB0aGUgZmlsZW5hbWUgdmlhIGEgY2FsbGJhY2s/CiAgICBpZiAoJG5hbWVDYWxsYmFjaykKICAgICAgewoJJGRlc3RuYW1lID0KCSAgY2FsbF91c2VyX2Z1bmNfYXJyYXkgKCRuYW1lQ2FsbGJhY2ssIGFycmF5ICgkZmlsZSwgJGRlc3REaXIpKTsKICAgICAgfQoKICAgIC8vIG1ha2Ugc3VyZSBpdCBoYXMgYW4gZXh0ZW5zaW9uCiAgICAvLyBpZiBpdCBkb2Vzbid0IGhhdmUgb25lLCB3ZSBnaXZlIGl0IG9uZSAodGhlIG9uZSBvZmYgdGhlIGlucHV0IGZpbGUpCiAgICBpZiggc3RycG9zKCRkZXN0bmFtZSwnLicpID09IGZhbHNlICkKICAgICAgewoJaWYoICgkcCA9IHN0cnBvcyggJGZpbGVbJ25hbWUnXSwgJy4nICkgKSAhPSBmYWxzZSApCgkgIHsKCSAgICAkZGVzdG5hbWUgPSAkZGVzdG5hbWUgLiBzdWJzdHIoICRmaWxlWyduYW1lJ10sICRwICk7CgkgIH0KICAgICAgfQoKICAgIC8vIGFuZCBjbGVhbiBpdCB1cAogICAgJGRlc3RuYW1lID0gCiAgICAgIHByZWdfcmVwbGFjZSgnL1teYS16QS1aMC05XC5cJFwlXCdcYFwtXEBce1x9XH5cIVwjXChcKVwmXF9cXl0vJywgJycsCgkJICAgc3RyX3JlcGxhY2UgKGFycmF5ICgnICcsICclMjAnKSwgYXJyYXkgKCdfJywgJ18nKSwgJGRlc3RuYW1lKSk7CgogICAgaWYoIGZpbGVfZXhpc3RzKCAkZGVzdERpci4kZGVzdG5hbWUgKSApIHsKICAgICAgcmV0dXJuIGFycmF5KCBmYWxzZSwgJHRoaXMtPkxhbmcoICdlcnJvcl9maWxlZXhpc3RzJywgJGRlc3REaXIuJGRlc3RuYW1lICkpOwogICAgfQoKICAgIC8vYW5kIG5vdyB0aGUgYmlnIG1vbWVudAogICAgaWYgKCFAY29weSAoJGZpbGVbJ3RtcF9uYW1lJ10sICRkZXN0RGlyLiRkZXN0bmFtZSkpCiAgICAgIHsKCXJldHVybiBhcnJheSAoZmFsc2UsCgkJICAgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9jb3VsZG5vdHdyaXRlJykuCgkJICAgICAgJzombmJzcCcuJGZpbGVbJ25hbWUnXS4iIC0+ICIuJGRlc3REaXIuIiAiLgoJCSAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfcGVybWlzc2lvbmRlbmllZCcpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CglyZXR1cm4gYXJyYXkgKHRydWUsICRkZXN0bmFtZSk7CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBTZW5kRmlsZSgkaWQsICRwYXJhbXMsICRyZXR1cm5pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKICAgCiAgIFRoaXMgbWV0aG9kIGFjdHVhbGx5IHNlbmRzIHRoZSByZXF1ZXN0ZWQgZmlsZSB0byB0aGUKICAgdXNlci4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBTZW5kRmlsZSAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgIGlmKCAhaXNzZXQoICRwYXJhbXNbJ3VwbG9hZF9pZCddICkgKQogICAgICB7CgkvLyB0b2RvIGRpc3BsYXkgZXJyb3IKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGlkCiAgICAkZmlsZV9pZCA9ICRwYXJhbXNbJ3VwbG9hZF9pZCddOwogICAgCiAgICAvLyBnZXQgdGhlIGRldGFpbHMKICAgICRmaWxlX2RldGFpbHMgPSAkdGhpcy0+X2dldFVwbG9hZEZpbGVEZXRhaWxzKCAkZmlsZV9pZCApOwogICAgaWYoICEkZmlsZV9kZXRhaWxzWyd1cGxvYWRfbmFtZSddICkgCiAgICAgIHsKCS8vIHRvZG8gZGlzcGxheSBlcnJvcgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCwKCQkJCSAkdGhpcy0+TGFuZyggJ2Vycm9yX2RiZXJyb3InICkgKTsKCXJldHVybjsKICAgICAgfQogICAgJGNhdGVnb3J5X2RldGFpbHMgPSAkdGhpcy0+X2dldFVwbG9hZENhdGVnb3J5RGV0YWlscyggJGZpbGVfZGV0YWlsc1sndXBsb2FkX2NhdGVnb3J5X2lkJ10gKTsKICAgIGlmKCAhJGNhdGVnb3J5X2RldGFpbHNbJ3VwbG9hZF9jYXRlZ29yeV9wYXRoJ10gKSAKICAgICAgewoJLy8gdG9kbyBkaXNwbGF5IGVycm9yCgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UoICRpZCwgJHBhcmFtcywgJHJldHVybmlkLAoJCQkJICR0aGlzLT5MYW5nKCAnZXJyb3JfZGJlcnJvcicgKSApOwoJcmV0dXJuOwogICAgICB9CgogICAgCiAgICAkZmlsZSA9ICR0aGlzLT5fdXBsb2FkUGF0aCggJGNhdGVnb3J5X2RldGFpbHNbJ3VwbG9hZF9jYXRlZ29yeV9wYXRoJ10sCgkJCSAgICAgICBzdHJfcmVwbGFjZSggYXJyYXkoJyAnLCclMjAnKSxhcnJheSgnXycsJ18nKSwkZmlsZV9kZXRhaWxzWyd1cGxvYWRfbmFtZSddICkgKTsKICAgIAogICAgaWYoICFmaWxlX2V4aXN0cyggJGZpbGUgKSB8fCAhaXNfcmVhZGFibGUoICRmaWxlICkgKQogICAgICB7CgkvLyB0b2RvIGRpc3BsYXkgZXJyb3IKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQsCgkJCQkgJHRoaXMtPkxhbmcoICdlcnJvcl9maWxlbm90Zm91bmQnLCAkZmlsZSApICk7CglyZXR1cm47CiAgICAgIH0KICAgIAogICAgaGVhZGVyKCdDb250ZW50LURlc2NyaXB0aW9uOiBGaWxlIFRyYW5zZmVyJyk7CiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vZm9yY2UtZG93bmxvYWQnKTsKICAgIGhlYWRlcignQ29udGVudC1MZW5ndGg6ICcgLiBmaWxlc2l6ZSgkZmlsZSkpOwogICAgaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0nIC4gYmFzZW5hbWUoJGZpbGUpKTsKICAgIHJlYWRmaWxlKCRmaWxlKTsgICAgIAoKICAgIC8vIG5vdyB0byBhZGQgdGhlIGRvd25sb2FkIHNodHVmZiB0byB0aGUgZGF0YWJhc2UKICAgIC8vIGlmIHdlIGFyZSBub3QgZXhjbHVkaW5nIHRoaXMgc3VibmV0CiAgICAkc3VibmV0cyA9IHNwbGl0KCIsIiwkdGhpcy0+R2V0UHJlZmVyZW5jZSgic3VibmV0X2V4Y2x1c2lvbiIpKTsKICAgICR0ZXN0ID0gMDsKICAgIGZvcmVhY2goJHN1Ym5ldHMgYXMgJHN1Ym5ldCkKICAgIHsKICAgICAgJHRlc3QgPSAkdGhpcy0+X3Rlc3RpcCggJHN1Ym5ldCwgZ2V0ZW52KCJSRU1PVEVfQUREUiIgKSApOwogICAgICBpZiggJHRlc3QgKQoJewoJICAvLyBkb24ndCBhbGxvdyBhbnkgbW9yZSBwcm9jZXNzaW5nCgkgIGV4aXQoKTsKCX0KICAgIH0KICAgIAogICAgLy8gZ2V0IGEgbmV3IHZhbHVlIGZyb20gdGhlIHNlcXVlbmNlIGRhdGFiYXNlCiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRuZXdpZCA9ICRkYi0+R2VuSUQoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfZG93bmxvYWRzX3NlcSIgKTsKICAgICRxdWVyeSA9ICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX3VwbG9hZHNfZG93bmxvYWRzIFZBTFVFUyAoPyw/LD8sPyw/KSI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgCgkJCSAgICAgIGFycmF5KCAkbmV3aWQsICRmaWxlX2lkLCAKCQkJCSAgICAgICRkYi0+REJUaW1lU3RhbXAodGltZSgpKSwKCQkJCSAgICAgIGdldGVudigiUkVNT1RFX0FERFIiKSwgInVua25vd24iIC8qIFRPRE8sIGZpbGwgdGhpcyBpbiBsYXRlciAqLyApICk7CiAgICAvKiBJIHdvdWxkIG5vcm1hbGx5IGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSwgYnV0IGRvbid0IHdhbnQgcGVvcGxlIHRvIG5lY2Vzc2FyaWx5IGtub3cgSSBhbSB0cmFja2luZyB0aGVtICovCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5sYW5nKCdmcmllbmRseW5hbWUnKSwKCQkgICR0aGlzLT5sYW5nKCdkb3dubG9hZGVkJywgJGZpbGUpICk7CgogICAgLy8gZG9uJ3QgYWxsb3cgYW55IG1vcmUgcHJvY2Vzc2luZwogICAgZXhpdCgpOwogIH0KCgp9CgojIHZpbTp0cz0yIHN3PTIgbm9ldAo/Pgo=]]></data>
  </file>
</module>
