<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>NeoModule</name>
	<version>0.3.0</version>
  <mincmsversion>1.8</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRyZXQgYW5naXZlciBodmlsa2V0IHNwcm9nIGRlciBza2FsIGJydWdlcyB0aWwgdmlzbmluZyBmb3IgYmVzJm9zbGFzaDtnZW5kZS4gSWtrZSBhbGxlIG1vZHVsZXIgdW5kZXJzdCZvc2xhc2g7dHRlciBlbGxlciBiZWgmb3NsYXNoO3ZlciBkZXR0ZS48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC4zLjA8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CjxsaT52ZXJzaW9uIDAuMy4wPGJyLz4KICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9TZXRQcmVmcywgc2hvcnRpbmcgdGhlIHNhdmluZyBvZiBwcmVmcyBmb3IgaW5zdGFuY2UKICAgIDxici8+CiAgICBhZGRlZCBlYXN5IGZvcm0tdmFsaWRhdGlvbiBhbmQgbmljZSBtZXNzYWdlcyBsaW5rZWQgdG8gdGhhdAogICAgPGJyLz4KICAgIE9ic29sZXRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQuCiAgICA8YnIvPgogICAgQWRkZWQgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgogIDxsaT52ZXJzaW9uIDAuMi44PGJyLz4KICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZQogICAgCiAgPGxpPnZlcnNpb24gMC4yLjc8YnIvPgogICAgZml4ZWQgTmVvQ21zTGluayBmb3IgcHJldHR5IHVybHMsIG1pc3NlZCB0aGUgdGFyZ2V0Y29udGVudG9ubHkgcGFyYW1ldGVyLi4uCgogIDxsaT52ZXJzaW9uIDAuMi42PGJyLz4KICAgIEFkZGVkIGEgU2V0UHJlZi1zaG9ydGN1dCBhbmQgYSBuaWNlIE5lb1NldFByZWYtbWV0aG9kIChzZWUgaGVscCkKICAgIDxici8+CiAgICBzZXQgZW50aXR5IHByb3BzIGZyb20gYXJyYXkgbm93IHVzZXMgc3RvcmVkIHBhcmFtcy12YWx1ZXMgaXMgb3RoZXIgbm90IHNwZWNpZmllcwogICAgPGJyLz4KICAgIFJld29ya2VkIE5lb1JlZGlyZWN0KEZ1bGwpIHRvIGJlIGZhc3RlciB0byB1c2UKICAgIDxici8+CiAgICBBZGRlZCBOZW9WYWxpZGF0ZVVSTC1tZXRob2QKICAgIDxici8+CiAgICBBZGRlZCBEZWNvZGVIVE1MRW50aXRpZXMKICAgIDxici8+CiAgICBBZGRlZCBOZW9BZG1pblJldHVybgoKCiAgPGxpPnZlcnNpb24gMC4yLjU8YnIvPgogICAgQWRkZWQgYW4gb3B0aW9uIHRvIE5lb0FkZEljb24gdG8gYWxzbyBpbmNsdWRlIHRoZSBmb2xsaW5ncyB0ZXh0IGxpbmsKICAgIDxici8+CiAgICBBZGRlZCBJc1RhYmxlRW1wdHkKICAgIDxici8+CiAgICBVcGRhdGUgRW1haWxWYWxpZGF0aW9uIHRvIG1haWwtY2FwYWJpbGl0aWVzIG9mIGRvbWFpbiBhcyB3ZWxsCiAgICA8YnIvPgogICAgTWFkZSAybmQgcGFyYW0gdG8gTmVvUMOFYXJhbVZhbHVlIGRvdWJsZSBhcyBkZWZhdWx0IHZhbHVlICh3aGVuIG5vdCBhbiBhcnJheSkKCgoKICA8bGk+dmVyc2lvbiAwLjIuNDxici8+CiAgICBBZGRlZCBOZW9FbXB0eS1mdW5jdGlvbiB3aGljaCBjaGVja3MgZm9yIGFuIGluZGV4IGluIGFuIGFycmF5CiAgICA8YnIvPgogICAgTWFkZSBOZW9QcmludFIgb3V0cHV0IGNvbnRlbnQgb2YgJF9wYXJhbXMgaWYgbm8gcGFyYW1ldGVyIHdhcyBnaXZlbgogICAgPGJyLz5BZGRlZCBOZW9WYWxpZGF0ZUVtYWlsLWZ1bmN0aW9uCiAgICA8YnIvPkFkZGVkIE5lb05vQnJlYWtzLWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4zPGJyLz4KICAgIE5vdyBwb3NzaWJsZSB0byByZWdpc3RlciAkcGFyYW1zIGZvciBldmVuIGVhc2llciBzeW50YXggaW4gcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgTlBWCiAgICA8YnIvPgogICAgQWRkZWQgQ3JlYXRlSW5wdXRQYXNzd29yZC13cmFwcGVyCiAgICA8YnIvPgogICAgQWRkZWQgZmlsbCBwYXJhbWV0ZXIgdG8gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkKCgogIDxsaT52ZXJzaW9uIDAuMi4yPGJyLz4KICAgIEFkZGVkIGEgY3VzdG9tIHJldHVybnZhbHVlIHRvIGNoZWNrZW50aXR5Y29ubmVjdGlvbnMKICAgIDxici8+CiAgICBJbXBsZW1lbnRlZCBNYWtlU2ltcGxlQXJyYXkKICAgIDxici8+CiAgICBBZGRlZCBOZW9UcnVlSWNvbiBhbmQgIE5lb1RydWVJY29uCgogIDxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KICAgIGFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgogICAgPGJyLz4KICAgIEFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCiAgICA8YnIvPgogICAgQWRkZWQgU21hcnRBc3NpZ25QcmVmLW1ldGhvZAogICAgPGJyLz4KICAgIEFkZGVkIFRvb2x0aXAtU3VwcG9ydAogICAgPGJyLz4KICAgIEFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KICAgIC0gZ2VuZXJhbCBidWdmaXhpbmc8YnIvPgogICAgLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgogICAgLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgogICAgLSBhZGRlZCBzdXBwb3J0IGZvciAzcmQgcGFyYW1ldGVyIHRvIFNsYXNoLWZ1bmN0aW9uPGJyLz4KICAgIC0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+CiAgICAtIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+CiAgICAtIGFkZGVkIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW48YnIvPgoKICA8L2xpPgogIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgIC0gaW5pdGlhbCByZWxlYXNlPC9saT4KPC91bD48YnIgLz4=]]></about>
	<description><![CDATA[An extended module-class, mainly for the Neo-series modules, but also for others to use]]></description>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/formmessages/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/formmessages/messages.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gZm9ybSB2YWxpZGF0aW9uIGZ1bmN0aW9uIC8vCi8qZnVuY3Rpb24gdmFsaWRhdGUoZm9ybSkgewogIHZhciBuYW1lID0gZm9ybS5uYW1lLnZhbHVlOwogIHZhciBlbWFpbCA9IGZvcm0uZW1haWwudmFsdWU7CiAgdmFyIGdlbmRlciA9IGZvcm0uZ2VuZGVyLnZhbHVlOwogIHZhciBtZXNzYWdlID0gZm9ybS5tZXNzYWdlLnZhbHVlOwogIHZhciBuYW1lUmVnZXggPSAvXlthLXpBLVpdKygoW1wnXCxcLlwtIF1bYS16QS1aIF0pP1thLXpBLVpdKikqJC87CiAgdmFyIGVtYWlsUmVnZXggPSAvXltcdy1cLl0rQChbXHctXStcLikrW1x3LV17Miw0fSQvOwogIHZhciBtZXNzYWdlUmVnZXggPSBuZXcgUmVnRXhwKC88XC8/XHcrKChccytcdysoXHMqPVxzKig/OiIuKj8ifCcuKj8nfFteJyI+XHNdKykpPykrXHMqfFxzKilcLz8+L2dpbSk7CiAgaWYobmFtZSA9PSAiIikgewogICAgaW5saW5lTXNnKCduYW1lJywnWW91IG11c3QgZW50ZXIgeW91ciBuYW1lLicsMik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKCFuYW1lLm1hdGNoKG5hbWVSZWdleCkpIHsKICAgIGlubGluZU1zZygnbmFtZScsJ1lvdSBoYXZlIGVudGVyZWQgYW4gaW52YWxpZCBuYW1lLicsMik7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKGVtYWlsID09ICIiKSB7CiAgICBpbmxpbmVNc2coJ2VtYWlsJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBtdXN0IGVudGVyIHlvdXIgZW1haWwuJywyKTsKICAgIHJldHVybiBmYWxzZTsKICB9CiAgaWYoIWVtYWlsLm1hdGNoKGVtYWlsUmVnZXgpKSB7CiAgICBpbmxpbmVNc2coJ2VtYWlsJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBoYXZlIGVudGVyZWQgYW4gaW52YWxpZCBlbWFpbC4nLDIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZihnZW5kZXIgPT0gIiIpIHsKICAgIGlubGluZU1zZygnZ2VuZGVyJywnPHN0cm9uZz5FcnJvcjwvc3Ryb25nPjxiciAvPllvdSBtdXN0IHNlbGVjdCB5b3VyIGdlbmRlci4nLDIpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBpZihtZXNzYWdlID09ICIiKSB7CiAgICBpbmxpbmVNc2coJ21lc3NhZ2UnLCdZb3UgbXVzdCBlbnRlciBhIG1lc3NhZ2UuJyk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIGlmKG1lc3NhZ2UubWF0Y2gobWVzc2FnZVJlZ2V4KSkgewogICAgaW5saW5lTXNnKCdtZXNzYWdlJywnWW91IGhhdmUgZW50ZXJlZCBhbiBpbnZhbGlkIG1lc3NhZ2UuJyk7CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB0cnVlOwp9Ki8KCi8vIFNUQVJUIE9GIE1FU1NBR0UgU0NSSVBUIC8vCgp2YXIgTVNHVElNRVIgPSAyMDsKdmFyIE1TR1NQRUVEID0gNTsKdmFyIE1TR09GRlNFVCA9IDM7CnZhciBNU0dISURFID0gMzsKCi8vIGJ1aWxkIG91dCB0aGUgZGl2cywgc2V0IGF0dHJpYnV0ZXMgYW5kIGNhbGwgdGhlIGZhZGUgZnVuY3Rpb24gLy8KZnVuY3Rpb24gaW5saW5lTXNnKHRhcmdldCxzdHJpbmcsYXV0b2hpZGUpIHsKICB2YXIgbXNnOwogIHZhciBtc2djb250ZW50OwogIGlmKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnJykpIHsKICAgIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgbXNnLmlkID0gJ21zZyc7CiAgICBtc2djb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICBtc2djb250ZW50LmlkID0gJ21zZ2NvbnRlbnQnOwogICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtc2cpOwogICAgbXNnLmFwcGVuZENoaWxkKG1zZ2NvbnRlbnQpOwogICAgbXNnLnN0eWxlLmZpbHRlciA9ICdhbHBoYShvcGFjaXR5PTApJzsKICAgIG1zZy5zdHlsZS5vcGFjaXR5ID0gMDsKICAgIG1zZy5hbHBoYSA9IDA7CiAgfSBlbHNlIHsKICAgIG1zZyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtc2cnKTsKICAgIG1zZ2NvbnRlbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnY29udGVudCcpOwogIH0KICBtc2djb250ZW50LmlubmVySFRNTCA9IHN0cmluZzsKICBtc2cuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7CiAgdmFyIG1zZ2hlaWdodCA9IG1zZy5vZmZzZXRIZWlnaHQ7CiAgdmFyIHRhcmdldGRpdiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRhcmdldCk7CiAgdGFyZ2V0ZGl2LmZvY3VzKCk7CiAgdmFyIHRhcmdldGhlaWdodCA9IHRhcmdldGRpdi5vZmZzZXRIZWlnaHQ7CiAgdmFyIHRhcmdldHdpZHRoID0gdGFyZ2V0ZGl2Lm9mZnNldFdpZHRoOwogIHZhciB0b3Bwb3NpdGlvbiA9IHRvcFBvc2l0aW9uKHRhcmdldGRpdikgLSAoKG1zZ2hlaWdodCAtIHRhcmdldGhlaWdodCkgLyAyKTsKICB2YXIgbGVmdHBvc2l0aW9uID0gbGVmdFBvc2l0aW9uKHRhcmdldGRpdikgKyB0YXJnZXR3aWR0aCArIE1TR09GRlNFVDsKICBtc2cuc3R5bGUudG9wID0gdG9wcG9zaXRpb24gKyAncHgnOwogIG1zZy5zdHlsZS5sZWZ0ID0gbGVmdHBvc2l0aW9uICsgJ3B4JzsKICBjbGVhckludGVydmFsKG1zZy50aW1lcik7CiAgbXNnLnRpbWVyID0gc2V0SW50ZXJ2YWwoImZhZGVNc2coMSkiLCBNU0dUSU1FUik7CiAgaWYoIWF1dG9oaWRlKSB7CiAgICBhdXRvaGlkZSA9IE1TR0hJREU7ICAKICB9CiAgd2luZG93LnNldFRpbWVvdXQoImhpZGVNc2coKSIsIChhdXRvaGlkZSAqIDEwMDApKTsKfQoKLy8gaGlkZSB0aGUgZm9ybSBhbGVydCAvLwpmdW5jdGlvbiBoaWRlTXNnKG1zZykgewogIHZhciBtc2cgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXNnJyk7CiAgaWYoIW1zZy50aW1lcikgewogICAgbXNnLnRpbWVyID0gc2V0SW50ZXJ2YWwoImZhZGVNc2coMCkiLCBNU0dUSU1FUik7CiAgfQp9CgovLyBmYWNlIHRoZSBtZXNzYWdlIGJveCAvLwpmdW5jdGlvbiBmYWRlTXNnKGZsYWcpIHsKICBpZihmbGFnID09IG51bGwpIHsKICAgIGZsYWcgPSAxOwogIH0KICB2YXIgbXNnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21zZycpOwogIHZhciB2YWx1ZTsKICBpZihmbGFnID09IDEpIHsKICAgIHZhbHVlID0gbXNnLmFscGhhICsgTVNHU1BFRUQ7CiAgfSBlbHNlIHsKICAgIHZhbHVlID0gbXNnLmFscGhhIC0gTVNHU1BFRUQ7CiAgfQogIG1zZy5hbHBoYSA9IHZhbHVlOwogIG1zZy5zdHlsZS5vcGFjaXR5ID0gKHZhbHVlIC8gMTAwKTsKICBtc2cuc3R5bGUuZmlsdGVyID0gJ2FscGhhKG9wYWNpdHk9JyArIHZhbHVlICsgJyknOwogIGlmKHZhbHVlID49IDk5KSB7CiAgICBjbGVhckludGVydmFsKG1zZy50aW1lcik7CiAgICBtc2cudGltZXIgPSBudWxsOwogIH0gZWxzZSBpZih2YWx1ZSA8PSAxKSB7CiAgICBtc2cuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIGNsZWFySW50ZXJ2YWwobXNnLnRpbWVyKTsKICB9Cn0KCi8vIGNhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGVsZW1lbnQgaW4gcmVsYXRpb24gdG8gdGhlIGxlZnQgb2YgdGhlIGJyb3dzZXIgLy8KZnVuY3Rpb24gbGVmdFBvc2l0aW9uKHRhcmdldCkgewogIHZhciBsZWZ0ID0gMDsKICBpZih0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICB3aGlsZSgxKSB7CiAgICAgIGxlZnQgKz0gdGFyZ2V0Lm9mZnNldExlZnQ7CiAgICAgIGlmKCF0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm9mZnNldFBhcmVudDsKICAgIH0KICB9IGVsc2UgaWYodGFyZ2V0LngpIHsKICAgIGxlZnQgKz0gdGFyZ2V0Lng7CiAgfQogIHJldHVybiBsZWZ0Owp9CgovLyBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbGVtZW50IGluIHJlbGF0aW9uIHRvIHRoZSB0b3Agb2YgdGhlIGJyb3dzZXIgd2luZG93IC8vCmZ1bmN0aW9uIHRvcFBvc2l0aW9uKHRhcmdldCkgewogIHZhciB0b3AgPSAwOwogIGlmKHRhcmdldC5vZmZzZXRQYXJlbnQpIHsKICAgIHdoaWxlKDEpIHsKICAgICAgdG9wICs9IHRhcmdldC5vZmZzZXRUb3A7CiAgICAgIGlmKCF0YXJnZXQub2Zmc2V0UGFyZW50KSB7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgdGFyZ2V0ID0gdGFyZ2V0Lm9mZnNldFBhcmVudDsKICAgIH0KICB9IGVsc2UgaWYodGFyZ2V0LnkpIHsKICAgIHRvcCArPSB0YXJnZXQueTsKICB9CiAgcmV0dXJuIHRvcDsKfQoKLy8gcHJlbG9hZCB0aGUgYXJyb3cgLy8KaWYoZG9jdW1lbnQuaW1hZ2VzKSB7CiAgYXJyb3cgPSBuZXcgSW1hZ2UoNyw4MCk7IAogIGFycm93LnNyYyA9ICJpbWFnZXMvbXNnX2Fycm93LmdpZiI7IAp9]]></data>
	</file>
	<file>
	  <filename>/formmessages/msg_arrow.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhBwBQAJEAAPPm5pJJSf///wAAACH5BAEAAAIALAAAAAAHAFAAAAJIlB1xqJsrnmtHVsqgzVPj+G2gR3bmVaInp7bsO66xO8NbQuEAEwC77gP6QL0h0XichJYpG1Mmij5p0mbtWoVOndYsdYsFexkFADs=]]></data>
	</file>
	<file>
	  <filename>/mimetypes.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICAgIGZ1bmN0aW9uIHJldHVybk1JTUVUeXBlKCRmaWxlbmFtZSkKICAgIHsKICAgICAgICBwcmVnX21hdGNoKCJ8XC4oW2EtejAtOV17Miw0fSkkfGkiLCAkZmlsZW5hbWUsICRmaWxlU3VmZml4KTsKCiAgICAgICAgc3dpdGNoKHN0cnRvbG93ZXIoJGZpbGVTdWZmaXhbMV0pKQogICAgICAgIHsKICAgICAgICAgICAgY2FzZSAianMiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IjsKCiAgICAgICAgICAgIGNhc2UgImpzb24iIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24vanNvbiI7CgogICAgICAgICAgICBjYXNlICJqcGciIDoKICAgICAgICAgICAgY2FzZSAianBlZyIgOgogICAgICAgICAgICBjYXNlICJqcGUiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvanBnIjsKCiAgICAgICAgICAgIGNhc2UgInBuZyIgOgogICAgICAgICAgICBjYXNlICJnaWYiIDoKICAgICAgICAgICAgY2FzZSAiYm1wIiA6CiAgICAgICAgICAgIGNhc2UgInRpZmYiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiaW1hZ2UvIi5zdHJ0b2xvd2VyKCRmaWxlU3VmZml4WzFdKTsKCiAgICAgICAgICAgIGNhc2UgImNzcyIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L2NzcyI7CgogICAgICAgICAgICBjYXNlICJ4bWwiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veG1sIjsKCiAgICAgICAgICAgIGNhc2UgImRvYyIgOgogICAgICAgICAgICBjYXNlICJkb2N4IiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL21zd29yZCI7CgogICAgICAgICAgICBjYXNlICJ4bHMiIDoKICAgICAgICAgICAgY2FzZSAieGx0IiA6CiAgICAgICAgICAgIGNhc2UgInhsbSIgOgogICAgICAgICAgICBjYXNlICJ4bGQiIDoKICAgICAgICAgICAgY2FzZSAieGxhIiA6CiAgICAgICAgICAgIGNhc2UgInhsYyIgOgogICAgICAgICAgICBjYXNlICJ4bHciIDoKICAgICAgICAgICAgY2FzZSAieGxsIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCI7CgogICAgICAgICAgICBjYXNlICJwcHQiIDoKICAgICAgICAgICAgY2FzZSAicHBzIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50IjsKCiAgICAgICAgICAgIGNhc2UgInJ0ZiIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi9ydGYiOwoKICAgICAgICAgICAgY2FzZSAicGRmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3BkZiI7CgogICAgICAgICAgICBjYXNlICJodG1sIiA6CiAgICAgICAgICAgIGNhc2UgImh0bSIgOgogICAgICAgICAgICBjYXNlICJwaHAiIDoKICAgICAgICAgICAgICAgIHJldHVybiAidGV4dC9odG1sIjsKCiAgICAgICAgICAgIGNhc2UgInR4dCIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L3BsYWluIjsKCiAgICAgICAgICAgIGNhc2UgIm1wZWciIDoKICAgICAgICAgICAgY2FzZSAibXBnIiA6CiAgICAgICAgICAgIGNhc2UgIm1wZSIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ2aWRlby9tcGVnIjsKCiAgICAgICAgICAgIGNhc2UgIm1wMyIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJhdWRpby9tcGVnMyI7CgogICAgICAgICAgICBjYXNlICJ3YXYiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXVkaW8vd2F2IjsKCiAgICAgICAgICAgIGNhc2UgImFpZmYiIDoKICAgICAgICAgICAgY2FzZSAiYWlmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImF1ZGlvL2FpZmYiOwoKICAgICAgICAgICAgY2FzZSAiYXZpIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gInZpZGVvL21zdmlkZW8iOwoKICAgICAgICAgICAgY2FzZSAid212IiA6CiAgICAgICAgICAgICAgICByZXR1cm4gInZpZGVvL3gtbXMtd212IjsKCiAgICAgICAgICAgIGNhc2UgIm1vdiIgOgogICAgICAgICAgICAgICAgcmV0dXJuICJ2aWRlby9xdWlja3RpbWUiOwoKICAgICAgICAgICAgY2FzZSAiemlwIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3ppcCI7CgogICAgICAgICAgICBjYXNlICJ0YXIiIDoKICAgICAgICAgICAgICAgIHJldHVybiAiYXBwbGljYXRpb24veC10YXIiOwoKICAgICAgICAgICAgY2FzZSAic3dmIiA6CiAgICAgICAgICAgICAgICByZXR1cm4gImFwcGxpY2F0aW9uL3gtc2hvY2t3YXZlLWZsYXNoIjsKCiAgICAgICAgICAgIGRlZmF1bHQgOgogICAgICAgICAgICBpZihmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRmaWxlU3VmZml4ID0gbWltZV9jb250ZW50X3R5cGUoJGZpbGVuYW1lKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duLyIgLiB0cmltKCRmaWxlU3VmZml4WzBdLCAiLiIpOwogICAgICAgIH0KICAgIH0KPz4=]]></data>
	</file>
	<file>
	  <filename>/NeoModule.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDktMTAgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKCWZ1bmN0aW9uIHN0cmlwb3MoJHN0ciwkbmVlZGxlKSB7CgkJcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwoJfQp9CmlmICghZnVuY3Rpb25fZXhpc3RzKCJhcnJheV9kaWZmX2tleSIpKSB7CiAgZnVuY3Rpb24gYXJyYXlfZGlmZl9rZXkoKSB7CiAgICAkYXJycyA9IGZ1bmNfZ2V0X2FyZ3MoKTsKICAgICRyZXN1bHQgPSBhcnJheV9zaGlmdCgkYXJycyk7CiAgICBmb3JlYWNoICgkYXJycyBhcyAkYXJyYXkpIHsKICAgICAgZm9yZWFjaCAoJHJlc3VsdCBhcyAka2V5ID0+ICR2KSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJGFycmF5KSkgewogICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJpc19hc3NvYyIpKSB7CiAgZnVuY3Rpb24gaXNfYXNzb2MoJGFycmF5KSB7CiAgICByZXR1cm4gKGlzX2FycmF5KCRhcnJheSkgJiYgMCAhPT0gY291bnQoYXJyYXlfZGlmZl9rZXkoJGFycmF5LCBhcnJheV9rZXlzKGFycmF5X2tleXMoJGFycmF5KSkpKSk7CiAgfQp9CgpjbGFzcyBOZW9Nb2R1bGUgZXh0ZW5kcyBDTVNNb2R1bGUgewogIC8qCiAgICoKICAgKiBBIGNvdXBsZSBvZiB2YXJpYWJsZXMgYW5kIG1ldGhvZHMgZm9yIGludGVybmFsIG1vZHVsZSB1c2FnZQogICAqCiAgICovCiAgdmFyICRfZGF0YXN0b3JhZ2U9ZmFsc2U7CiAgdmFyICRfaWQ9ZmFsc2U7CiAgdmFyICRfcmV0dXJuaWQ9ZmFsc2U7CiAgdmFyICRfZXJyb3JzPSIiOwogIHZhciAkX3RoZW1lb2JqZWN0PWZhbHNlOwogIHZhciAkX3BhcmFtcz1hcnJheSgpOwogIHZhciAkX2Z1bGx2YWxpZGF0aW9uPWZhbHNlOwogIAogIGZ1bmN0aW9uIF9nZXRkcygpIHsKICAgIGlmICgkdGhpcy0+X2RhdGFzdG9yYWdlIT09ZmFsc2UpIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogICAgJHRoaXMtPl9kYXRhc3RvcmFnZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoIk5lb0RhdGFTdG9yYWdlIik7CiAgICByZXR1cm4gJHRoaXMtPl9kYXRhc3RvcmFnZTsKICB9CiAgCiAgZnVuY3Rpb24gX2dldHRoZW1lb2JqKCkgewogICAgZ2xvYmFsICRnQ21zOwogICAgaWYgKCR0aGlzLT5fdGhlbWVvYmplY3QhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgICAkdGhpcy0+X3RoZW1lb2JqZWN0PSR0aGVtZU9iamVjdCA9ICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXTsKICAgIHJldHVybiAkdGhpcy0+X3RoZW1lb2JqZWN0OwogIH0KCiAgLyoKICAgKgogICAqIFN0YW5kYXJkIG1vZHVsZS1BUEktbWV0aG9kcyBiZWhhdmluZyBpbiBhIHN0YW5kYXJkIHdheQogICAqCiAgICovCgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ05lb01vZHVsZSc7Cgl9CgogIGZ1bmN0aW9uIEdldFZlcnNpb24oKSB7CiAgICByZXR1cm4gIjAuMy4wIjsKICB9CgogIGZ1bmN0aW9uIEdldEZyaWVuZGx5TmFtZSgpIHsKCQlyZXR1cm4gIk5lbyBNb2R1bGUgYmFzZS1jbGFzcyI7Cgl9CgoJZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWZ1bmN0aW9uIE1pbmltdW1DTVNWZXJzaW9uKCkgewoJCXJldHVybiAnMS44JzsKCX0KCglmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewoJCXJldHVybiAiQW4gZXh0ZW5kZWQgbW9kdWxlLWNsYXNzLCBtYWlubHkgZm9yIHRoZSBOZW8tc2VyaWVzIG1vZHVsZXMsIGJ1dCBhbHNvIGZvciBvdGhlcnMgdG8gdXNlIjsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yKCkgewoJCXJldHVybiAnTW9ydGVuIFBvdWxzZW4nOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJewoJCXJldHVybiAnbW9ydGVuQHBvdWxzZW4ub3JnJzsKCX0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKSB7CiAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaGVscC50cGwnKTsKIAl9CgogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCXsKCQlyZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgiY2hhbmdlbG9nLnRwbCIpOwoJfQoKICAvKgogICAqCiAgICogU2V0dXAgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRJZCgkaWQpIHsKICAgICR0aGlzLT5faWQ9JGlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KICBmdW5jdGlvbiBOZW9TZXR1cCgkaWQsJG1vZHVsZSwkcmV0dXJuaWQ9IjAiLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPk5lb1NldElkKCRpZCk7CiAgICAkdGhpcy0+TmVvU2V0UmV0dXJuSWQoJHJldHVybmlkKTsKICAgICR0aGlzLT5OZW9TZXRQYXJhbXMoJHBhcmFtcyk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduQ01TKCRtb2R1bGUpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigibW9kdWxlX2lkIiwkaWQpOwogIH0KCgogIC8qCiAgICoKICAgKiBHZW5lcmFsIHNob3J0Y3V0IGZ1bmN0aW9ucwogICAqCiAgICovCiAgZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+R2V0UHJlZmVyZW5jZSgkcHJlZm5hbWUsJGRlZmF1bHQpOwogIH0KCiAgZnVuY3Rpb24gU2V0UHJlZigkcHJlZm5hbWUsICR2YWx1ZSkgewogICAgcmV0dXJuICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmLCR2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiBOZW9TZXRQcmVmKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlPWZhbHNlLCAkZGVsZXRlaWZub3RzZXQ9ZmFsc2UpIHsKICAgIC8vaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChpc3NldCgkcGFyYW1zWyRwcmVmbmFtZV0pKSB7ICAgICAgCiAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkcGFyYW1zWyRwcmVmbmFtZV0pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEkZGVsZXRlaWZub3RzZXQpIHsKICAgICAgICBpZiAoJG5vdHNldHZhbHVlIT1mYWxzZSkgewogICAgICAgICAgJHRoaXMtPlNldFByZWZlcmVuY2UoJHByZWZuYW1lLCAkbm90c2V0dmFsdWUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgkcHJlZm5hbWUpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBOZW9TZXRQcmVmcygkcHJlZnM9YXJyYXkoKSkgewogICAgaWYgKGlzX2Fzc29jKCRwcmVmcykpIHsKICAgICAgZm9yZWFjaCAoJHByZWZzIGFzICRrZXkgPT4gJG5vdHNldHZhbHVlKSB7CiAgICAgICAgJHRoaXMtPk5lb1NldFByZWYoJGtleSwgJG5vdHNldHZhbHVlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCAoJHByZWZzIGFzICRwcmVmKSB7CiAgICAgICAgJHRoaXMtPk5lb1NldFByZWYoJHByZWYpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBOZW9DbXNMaW5rKCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkY29udGVudHM9JycsICRwYXJhbXM9YXJyYXkoKSwgJHdhcm5fbWVzc2FnZT0nJywgJG9ubHlocmVmPWZhbHNlLCAkaW5saW5lPWZhbHNlLCAkYWRkdHRleHQ9JycsICR0YXJnZXRjb250ZW50b25seT1mYWxzZSwgJHByZXR0eXVybD0nJykKICAgIC8vZWNobyAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKTsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlTGluaygKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWN0aW9uIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgiY29udGVudCIsInRleHQiKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIndhcm5tZXNzYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgZmFsc2UsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ0YXJnZXRjb250ZW50b25seSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwcmV0dHl1cmwiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zVXJsKCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVMaW5rKCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkY29udGVudHM9JycsICRwYXJhbXM9YXJyYXkoKSwgJHdhcm5fbWVzc2FnZT0nJywgJG9ubHlocmVmPWZhbHNlLCAkaW5saW5lPWZhbHNlLCAkYWRkdHRleHQ9JycsICR0YXJnZXRjb250ZW50b25seT1mYWxzZSwgJHByZXR0eXVybD0nJykKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlTGluaygKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWN0aW9uIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJldHVybmlkIiwkcGFyYW1zLCR0aGlzLT5fcmV0dXJuaWQpLAogICAgICAiIiwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgIiIsCiAgICAgIHRydWUgLAogICAgICBmYWxzZSwKICAgICAgIiIsCiAgICAgIGZhbHNlLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsICRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzX2FycmF5KCRhY3Rpb24pKSAkdGhpcy0+TmVvUmVkaXJlY3RGdWxsKCRhY3Rpb24pOwogICAgcmV0dXJuICR0aGlzLT5OZW9SZWRpcmVjdEZ1bGwoCiAgICAgIGFycmF5ICgKICAgICAgICAiYWN0aW9uIiA9PiAkYWN0aW9uLAogICAgICAgICJwYXJhbXMiID0+ICRwYXJhbXMKICAgICAgKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1JlZGlyZWN0RnVsbCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vUmVkaXJlY3QoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRwYXJhbXM9YXJyYXkoKSwgJGlubGluZT1mYWxzZSkKICAgIHJldHVybiAkdGhpcy0+UmVkaXJlY3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSkKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCBhcnJheSgibW9kdWxlX21lc3NhZ2UiPT4kdGhpcy0+TGFuZygic2V0dGluZ3NzYXZlZCIpLCJ0YWIiPT4ic2V0dGluZ3MiKSk7CiAgICAkbWVzc2FnZSA9ICR0aGlzLT5OUFYoIm1lc3NhZ2UiLCAkcGFyYW1zKTsKICAgICRlcnJvciA9ICR0aGlzLT5OUFYoImVycm9yIiwgJHBhcmFtcyk7CiAgICAkdGFiID0gJHRoaXMtPk5QVigidGFiIiwgJHBhcmFtcyk7CgogICAgJHRoaXMtPk5lb1JlZGlyZWN0KCJkZWZhdWx0YWRtaW4iLAogICAgICBhcnJheSgKICAgICAgICAibW9kdWxlX21lc3NhZ2UiID0+ICRtZXNzYWdlLAogICAgICAgICJtb2R1bGVfZXJyb3JzIiA9PiAkZXJyb3IsCiAgICAgICAgInRhYiIgPT4gJHRhYgogICAgICApCiAgICApOwogIH0KCiAgLyoKICAgKgogICAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBzbWFydHkgYXNzaWdubWVudHMKICAgKgogICAqLwogIGZ1bmN0aW9uIE5lb1NldEZ1bGxWYWxpZGF0aW9uKCRmdWxsdmFsaWRhdGlvbj10cnVlKSB7CiAgICAkdGhpcy0+X2Z1bGx2YWxpZGF0aW9uPSRmdWxsdmFsaWRhdGlvbjsKICB9CgogIGZ1bmN0aW9uIE5lb0Zvcm1WYWxpZGF0aW9uKCRmaWVsZHM9YXJyYXkoKSkgewogICAgaWYgKGVtcHR5KCRmaWVsZHMpKSByZXR1cm4gIiI7CiAgICBzdGF0aWMgJGFscmVhZHl1c2VkPWZhbHNlOwogICAgc3RhdGljICR2YWxpZGF0aW9uY291bnQ9MDsKCiAgICAkb3V0cHV0PSIiOwogICAgJGNvbmZpZz0kdGhpcy0+R2V0Q29uZmlnKCk7CiAgICBpZiAoISRhbHJlYWR5dXNlZCkgewogICAgICAkb3V0cHV0Lj0nPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9OZW9Nb2R1bGUvZm9ybW1lc3NhZ2VzL21lc3NhZ2VzLmpzIj48L3NjcmlwdD4KJzsKICAgICAgJG91dHB1dC49Jwo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAjbXNnIHtkaXNwbGF5Om5vbmU7IHBvc2l0aW9uOmFic29sdXRlOyB6LWluZGV4OjIwMDsgYmFja2dyb3VuZDp1cmwoJy4kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9OZW9Nb2R1bGUvZm9ybW1lc3NhZ2VzL21zZ19hcnJvdy5naWYpIGxlZnQgY2VudGVyIG5vLXJlcGVhdDsgcGFkZGluZy1sZWZ0OjdweH0KICAgI21zZ2NvbnRlbnQge2Rpc3BsYXk6YmxvY2s7IGJhY2tncm91bmQ6I2YzZTZlNjsgYm9yZGVyOjJweCBzb2xpZCAjOTI0OTQ5OyBib3JkZXItbGVmdDpub25lOyBwYWRkaW5nOjVweDsgbWluLXdpZHRoOjE1MHB4OyBtYXgtd2lkdGg6MjUwcHh9Cjwvc3R5bGU+Cgo8c2NyaXB0IHR5cGU9InRleHQvSmF2YVNjcmlwdCI+CmZ1bmN0aW9uIG5lb3RyaW0oc3RyKSB7CiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXHMrfFxzKyQvZywgXCdcJyk7Cn0KPC9zY3JpcHQ+Cic7CiAgICAgICRhbHJlYWR5dXNlZD10cnVlOwogICAgfQogICAgJG91dHB1dC49IjxzY3JpcHQgdHlwZT0ndGV4dC9KYXZhU2NyaXB0Jz4KIjsKICAgICRvdXRwdXQuPScKZnVuY3Rpb24gTmVvVmFsaWRhdGVGb3JtJy4kdmFsaWRhdGlvbmNvdW50LicodGhpc2Zvcm0pIHsKICB2YXIgZW1haWxSZWdleCA9IC9eW1x3LVwuXStAKFtcdy1dK1wuKStbXHctXXsyLDR9JC87Cic7CiAgICAkdmFsaWRhdGlvbnN0cmluZz0icmV0dXJuIGZhbHNlOyI7CiAgICAkcmV0dXJuc3RyaW5nPSJyZXR1cm4gdHJ1ZTsiOwogICAgaWYgKCR0aGlzLT5fZnVsbHZhbGlkYXRpb24pIHsKICAgICAgJG91dHB1dC49JwogIHZhciB2YWxpZGF0ZWQgPSB0cnVlOwonOwogICAgICAkdmFsaWRhdGlvbnN0cmluZz0idmFsaWRhdGVkID0gZmFsc2U7IjsKICAgICAgJHJldHVybnN0cmluZz0icmV0dXJuIHZhbGlkYXRlZDsiOwogICAgfQogICAgJG91dHB1dC49JwogIHdpdGggKHRoaXNmb3JtKSB7Cic7CiAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJGZpZWxkKSB7CiAgICAgICRmaWVsZGlkPSR0aGlzLT5faWQuJGZpZWxkWyJuYW1lIl07CiAgICAgIHN3aXRjaCgkZmllbGRbInZhbGlkYXRpb24iXSkgewogICAgICAgIGNhc2UgIm5vbmVtcHR5IiA6IHsKICAgICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcuJGZpZWxkaWQuJy52YWx1ZSk9PSIiKSB7CiAgICAgIGlubGluZU1zZygiJy4kZmllbGRpZC4nIiwiJy4kZmllbGRbIm1lc3NhZ2UiXS4nIiwxMCk7CiAgICAgICcuJHZhbGlkYXRpb25zdHJpbmcuJwogICAgfSc7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAidmFsaWRlbWFpbCIgOiB7CiAgICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoIScuJGZpZWxkaWQuJy52YWx1ZS5tYXRjaChlbWFpbFJlZ2V4KSkgewogICAgICBpbmxpbmVNc2coIicuJGZpZWxkaWQuJyIsIicuJGZpZWxkWyJtZXNzYWdlIl0uJyIsMTApOwogICAgICAnLiR2YWxpZGF0aW9uc3RyaW5nLicKICAgIH0nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgIm1pbmxlbmd0aCIgOiB7CiAgICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnLiRmaWVsZGlkLicudmFsdWUpLmxlbmd0aDwnLiRmaWVsZFsibGVuZ3RoIl0uJykgewogICAgICBpbmxpbmVNc2coIicuJGZpZWxkaWQuJyIsIicuJGZpZWxkWyJtZXNzYWdlIl0uJyIsMTApOwogICAgICAnLiR2YWxpZGF0aW9uc3RyaW5nLicKICAgIH0nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgIm1heGxlbmd0aCIgOiB7CiAgICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnLiRmaWVsZGlkLicudmFsdWUpLmxlbmd0aD4nLiRmaWVsZFsibGVuZ3RoIl0uJykgewogICAgICBpbmxpbmVNc2coIicuJGZpZWxkaWQuJyIsIicuJGZpZWxkWyJtZXNzYWdlIl0uJyIsMTApOwogICAgICAnLiR2YWxpZGF0aW9uc3RyaW5nLicKICAgIH0nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImV4YWN0bGVuZ3RoIiA6IHsKICAgICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcuJGZpZWxkaWQuJy52YWx1ZSkubGVuZ3RoIT0nLiRmaWVsZFsibGVuZ3RoIl0uJykgewogICAgICBpbmxpbmVNc2coIicuJGZpZWxkaWQuJyIsIicuJGZpZWxkWyJtZXNzYWdlIl0uJyIsMTApOwogICAgICAnLiR2YWxpZGF0aW9uc3RyaW5nLicKICAgIH0nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImNoZWNrZWQiIDogewogICAgICAgICAgJG91dHB1dC49JwogICAgaWYgKCEnLiRmaWVsZGlkLicuY2hlY2tlZCkgewogICAgICBpbmxpbmVNc2coIicuJGZpZWxkaWQuJyIsIicuJGZpZWxkWyJtZXNzYWdlIl0uJyIsMTApOwogICAgICAnLiR2YWxpZGF0aW9uc3RyaW5nLicKICAgIH0nOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgInVuY2hlY2tlZCIgOiB7CiAgICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoJy4kZmllbGRpZC4nLmNoZWNrZWQpIHsKICAgICAgaW5saW5lTXNnKCInLiRmaWVsZGlkLiciLCInLiRmaWVsZFsibWVzc2FnZSJdLiciLDEwKTsKICAgICAgJy4kdmFsaWRhdGlvbnN0cmluZy4nCiAgICB9JzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgJG91dHB1dC49IgogIH0KICAiLiRyZXR1cm5zdHJpbmcuIgp9Cjwvc2NyaXB0PlxuXG4iOwogICAgJGV4dHJhPSJvbnN1Ym1pdD0ncmV0dXJuIE5lb1ZhbGlkYXRlRm9ybSIuJHZhbGlkYXRpb25jb3VudC4iKHRoaXMpOyciOwogICAgJGZ1bmN0aW9uY2FsbD0iTmVvVmFsaWRhdGVGb3JtIi4kdmFsaWRhdGlvbmNvdW50LiIodGhpcykiOwogICAgJHZhbGlkYXRpb25jb3VudCsrOwogICAgcmV0dXJuIGFycmF5KCJmdW5jdGlvbiI9PiRvdXRwdXQsImV4dHJhIj0+JGV4dHJhLCAiZnVuY3Rpb25jYWxsIj0+JGZ1bmN0aW9uY2FsbCk7CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL0NyZWF0ZUZvcm1TdGFydCgkaWQsICRhY3Rpb249J2RlZmF1bHQnLCAkcmV0dXJuaWQ9JycsICRtZXRob2Q9J3Bvc3QnLCAkZW5jdHlwZT0nJywgJGlubGluZT1mYWxzZSwgJGlkc3VmZml4PScnLCAkcGFyYW1zID0gYXJyYXkoKSwgJGV4dHJhPScnKQogICAgJHZhbGlkYXRpb249IiI7CiAgICAkZXh0cmE9IiI7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1sidmFsaWRhdGlvbiJdKSkgewogICAgICAkdmFsaWRhdGlvbj0kdGhpcy0+TmVvRm9ybVZhbGlkYXRpb24oJHBhcmFtc1sidmFsaWRhdGlvbiJdKTsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbImV4dHJhdGVtcGxhdGUiXSkpIHsKICAgICAgICAkZXh0cmE9JHBhcmFtc1siZXh0cmF0ZW1wbGF0ZSJdOwogICAgICAgICRleHRyYT1zdHJfcmVwbGFjZSgiJXZhbGlkYXRpb25jYWxsJSIsJHZhbGlkYXRpb25bImZ1bmN0aW9uY2FsbCJdLCRleHRyYSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJGV4dHJhPSR2YWxpZGF0aW9uWyJleHRyYSJdOwogICAgICB9CiAgICAgICR2YWxpZGF0aW9uPSR2YWxpZGF0aW9uWyJmdW5jdGlvbiJdOwogICAgfQogICAgcmV0dXJuICR2YWxpZGF0aW9uLiR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiZGVmYXVsdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtZXRob2QiLCRwYXJhbXMsInBvc3QiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImVuY3R5cGUiLCJlbmNvZGluZyIpLCRwYXJhbXMsIm11bHRpcGFydC9mb3JtLWRhdGEiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZHN1ZmZpeCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJleHRyYSIsJHBhcmFtcywkZXh0cmEpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtU3RhcnQoJHBhcmFtcykpOwogIH0KCiAgLy9PYnNvbGV0ZQogIGZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsgICAgCiAgICAkdGhpcy0+U21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXMpOwogIH0KCiAgZnVuY3Rpb24gTmVvRm9ybUVuZCgpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5Rm9ybUVuZCgkc21hcnR5bmFtZSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvRm9ybUVuZCgpKTsKICB9CgogIC8qZnVuY3Rpb24gU21hcnR5SW5wdXRTdWJtaXQoJHNtYXJ0eW5hbWUsJG5hbWUsJHRleHQsJGNvbmZpcm10ZXh0PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dFN1Ym1pdChhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR0ZXh0LCJjb25maXJtdGV4dCI9PiRjb25maXJtdGV4dCkpKTsKICB9Ki8KCiAgCiAgCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW5NdWx0aSgkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICRvdXRwdXQ9IlxuIjsKICAgIGZvcmVhY2goJGZpZWxkcyBhcyAkbmFtZT0+JHZhbHVlKSB7CiAgICAgICRvdXRwdXQuPSR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpLiJcbiI7CiAgICB9CiAgICAkb3V0cHV0Lj0iXG4iOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkb3V0cHV0KTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUxpbmsoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9DbXNMaW5rKCRmaWVsZHMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0RmlsZSgkcGFyYW1zKSB7CiAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRGaWxlKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjY2VwdCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFRleHQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRUZXh0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFRleHQoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRQYXNzd29yZCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzaXplIiwkcGFyYW1zLCIxMCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibWF4bGVuZ3RoIiwkcGFyYW1zLCIyNTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlJbnB1dFBhc3N3b3JkKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFBhc3N3b3JkKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1RleHRhcmVhKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVUZXh0QXJlYSgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImVuYWJsZXd5c2l3eWciLCRwYXJhbXMsZmFsc2UpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJ2YWx1ZSIsInRleHQiLCJjb250ZW50IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNsYXNzIiwiY2xhc3NuYW1lIiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJodG1saWQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5jb2RpbmciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic3R5bGVzaGVldCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb2xzIiwkcGFyYW1zLCI4MCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicm93cyIsJHBhcmFtcywiMTUiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImZvcmNld3lzaXd5ZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YW50ZWRzeW50YXgiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dFRleHRhcmVhKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9UZXh0YXJlYSgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dENoZWNrYm94KCRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzc2V0KCRwYXJhbXNbImNoZWNrZWQiXSkgJiYgJHBhcmFtc1siY2hlY2tlZCJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbInNlbGVjdGVkdmFsdWUiXT0kcGFyYW1zWyJ2YWx1ZSJdOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dENoZWNrYm94KCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0U3VibWl0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikgewogICAgaWYgKGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFN1Ym1pdCgkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRTdWJtaXQoYXJyYXkoIm5hbWUiPT4kcGFyYW1zLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSwkb3B0dmFsdWU9IiIpIHsKICAgIGlmIChpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbigkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRuYW1lLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICAgIH0KCiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkaW5kZXgiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJkZWxpbWl0ZXIiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0KCiAgLyoqCiAgICoKICAgKiBMaXN0IGhlbHBlciBmdW5jdGlvbnMKICAgKgogICAqLwogICBmdW5jdGlvbiBOZW9EZWxldGVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCR0aGlzLT5OZW9TeXN0ZW1JY29uKCJkZWxldGUuZ2lmIiwkdGV4dCksJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CgogICBmdW5jdGlvbiBOZW9Db3B5SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImNvcHkuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJlZGl0LmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvVHJ1ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJ0cnVlLmdpZiIsJHRleHQpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KICAgZnVuY3Rpb24gTmVvRmFsc2VJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZmFsc2UuZ2lmIiwkdGV4dCksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiLCAkaW5jbHVkZXRleHRsaW5rID0gdHJ1ZSkgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0aGlzLT5OZW9TeXN0ZW1JY29uKCJuZXdvYmplY3QuZ2lmIiwkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIGlmICgkaW5jbHVkZXRleHRsaW5rKSB7CiAgICAgICAkaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIH0KICAgICAvLyRpY29uLj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRleHQsICRwYXJhbXMsICRjb25maXJtYXRpb24sIGZhbHNlLCBmYWxzZSwgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKTsKCiAgICAgLy89JHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgMCwgJHRoZW1lT2JqZWN0LT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9uZXdvYmplY3QuZ2lmJywkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwnJywnJywnc3lzdGVtaWNvbicpLCBhcnJheSgpLCAnJywgZmFsc2UsIGZhbHNlLCAnJykgLicgJy4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwgYXJyYXkoInRvZG8iPT4iYWRkIiksICcnLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CiAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb1N5c3RlbUljb24oJGljb24sJHRleHQ9IiIpIHsKICAgICAkdGhlbWVvYmo9JHRoaXMtPl9nZXR0aGVtZW9iaigpOwogICAgIGlmICgkdGhlbWVvYmopIHsKICAgICAgIHJldHVybiAkdGhlbWVvYmotPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtLycuJGljb24sICR0ZXh0LCcnLCcnLCdzeXN0ZW1pY29uJyk7CiAgICAgfSByZXR1cm4gIiI7CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0hpZGRlbkNvbnRlbnQoJHRleHQsICRjb250ZW50LCAkY2xpY2t0eXBlPSJ0ZXh0IiwgJHN0YXJ0c2hvd249ZmFsc2UpIHsKICAgICByZXR1cm4gIjxzdHJvbmc+JHRleHQ8L3N0cm9uZz48YnIvPiRjb250ZW50IjsKICAgfQoKCiAgLyoqCiAgICoKICAgKiBOZW9EYXRhU3RvcmFnZSBzaG9ydGN1dHMKICAgKgogICAqLwogIGZ1bmN0aW9uIEFkZEVudGl0eSgkdGFibGUsICRwcm9wcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCR0YWJsZSwkcHJvcHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5EZWxldGVFbnRpdHkoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERlbGV0ZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERlbGV0ZUVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RGVsZXRlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcz1hcnJheSgpLCAkZmlsbGZpZWxkcz1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzLCAkZmlsbGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllcygkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCRhbHdheXNyZXR1cm5hcnJheSkgewogICAgICAgIHJldHVybiBhcnJheSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZVNvcnRlZEVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkc29ydGZpZWxkcz1hcnJheSgpICkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0aWVzRnVsbCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhcj10cnVlKi8pIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyKi8pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcz1hcnJheSgpLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkdmFsdWVzKSkgewogICAgICAkdmFsdWVzPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyLCAkZmlsbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlc2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5SZW1vdmVNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wcygkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICAkZHMtPkNvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXg6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+U29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTb3J0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdGllc0NvdW50KCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXRpZXNDb3VudCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBFbnRpdGllc0NvdW50OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJNb2R1bGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyTW9kdWxlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb3VudEVudGl0aWVzKCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCkpIHsKICAgICRlbnRpdGllcz0kdGhpcy0+R2V0RW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWEsIHRydWUpOwogICAgcmV0dXJuIGNvdW50KCRlbnRpdGllcyk7CiAgfQoKICBmdW5jdGlvbiBJc1RhYmxlRW1wdHkoJHRhYmxlKSB7ICAgIAogICAgcmV0dXJuICgkdGhpcy0+Q291bnRFbnRpdGllcygkdGFibGUpPT0wKTsKICB9CgogIC8qCiAgICoKICAgKiBDb25uZWN0aW9uIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiLCAkcmV0dXJudmFsdWU9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUsICRyZXR1cm52YWx1ZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9uczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEFkZEZpZWxkU2V0KCRuYW1lLCRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+QWRkRmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSwkZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSwkbmFtZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdHlTZXRVbnNldFByb3BzKCR0aGlzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpKSwkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCgogIGZ1bmN0aW9uIEdldERTRXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkbmwyYnIsJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU2hvd0RTRXJyb3JzKCRjbGVhcj10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVycm9ycygkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2hvd0RTRXJyb3JzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRFNJbkVycm9yKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5JbkVycm9yKCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBEU0luRXJyb3I6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogVXRpbGl0eSBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpIHsKCQkkcmVzdWx0PXN0cl9yZXBsYWNlKCJcXCIsIi8iLCR1cmwpOwogICAgLy9ZZXMsIHBocCB1bmRlciB3aW5kb3dzIHJ1bnMgcGVyZmVjdGx5IHdpdGggdGhvc2Ugc2xhc2hlcywgYXMgbG9uZyBhcyB5b3UKICAgIC8vZG9uJ3QgbWl4IHRoZW0gd2l0aCBiYWNrc2xhc2hlcyEhCgkJLy8kcmVzdWx0PXN0cl9yZXBsYWNlKCIvIixESVJFQ1RPUllfU0VQQVJBVE9SLCR1cmwpOwoJCS8vcmV0dXJuIHN0cl9yZXBsYWNlKCJcXCIsRElSRUNUT1JZX1NFUEFSQVRPUiwkcmVzdWx0KTsKCQlyZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gRGVjb2RlSFRNTEVudGl0aWVzKCRzKSB7CiAgICAkdG1wPWh0bWxfZW50aXR5X2RlY29kZSgkcyk7CiAgICB3aGlsZSAoJHRtcCE9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApKSB7CiAgICAgICR0bXA9aHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApOwogICAgfQogICAgcmV0dXJuIGh0bWxfZW50aXR5X2RlY29kZSgkdG1wKTsKICB9CgogIGZ1bmN0aW9uIFNsYXNoZXMoJHVybCkgewogICAgcmV0dXJuICR0aGlzLT5OZW9TbGFzaGVzKCR1cmwpOwogIH0KCglmdW5jdGlvbiBTbGFzaCgkc3RyLCRzdHIyPSIiLCRzdHIzPSIiKSB7CgkJaWYgKCRzdHI9PSIiKSByZXR1cm4gJHN0cjI7CgkJaWYgKCRzdHIyPT0iIiAmJiAkc3RyMz09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKCQlpZiAoJHN0cltzdHJsZW4oJHN0ciktMV0hPSIvIikgewoJCQlpZiAoJHN0cjJbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuJHN0cjI7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRzdHIuc3Vic3RyKCRzdHIyLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIGlmICgkc3RyMz09IiIpIHJldHVybiAkcmVzdWx0OwogICAgaWYgKCRyZXN1bHRbc3RybGVuKCRyZXN1bHQpLTFdIT0iLyIpIHsKCQkJaWYgKCRzdHIzWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4iLyIuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0KCQl9IGVsc2UgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kcmVzdWx0LnN1YnN0cigkc3RyMywxKTsgLy90cmltIGF3YXkgb25lIG9mIHRoZSBzbGFzaGVzCgkJCX0KCQl9CiAgICByZXR1cm4gJHJlc3VsdDsKCX0KCiAgZnVuY3Rpb24gTmVvRGlyTGlzdCgkcm9vdCwkcmV0dXJuPSJmaWxlcyIsJGludHJvZHVjdGlvbj1hcnJheSgpLCRleGNsdWRlcz1hcnJheSgpLCRtYXhyZWN1cnNpb249LTEpIHsKICAgICRkaXJsaXN0PWFycmF5KCk7CiAgICAkY29uZmlnPSR0aGlzLT5HZXRDb25maWcoKTsKICAgICRtb2RlPSIiOwogICAgc3dpdGNoKCRyZXR1cm4pIHsKICAgICAgY2FzZSAiZmlsZXMiOiAkbW9kZT0iRklMRVMiO2JyZWFrOwogICAgICBjYXNlICJkaXJzIjogJG1vZGU9IkRJUlMiO2JyZWFrOwogICAgICBjYXNlICJib3RoIjogJG1vZGU9IkZVTEwiO2JyZWFrOwogICAgfQogICAgJGZ1bGxyb290PSR0aGlzLT5TbGFzaCgkY29uZmlnWyJyb290X3BhdGgiXSwkcm9vdCk7CiAgICAkZmlsZXJlYz0gZ2V0X3JlY3Vyc2l2ZV9maWxlX2xpc3QgKCRmdWxscm9vdCwgJGV4Y2x1ZGVzICwkbWF4cmVjdXJzaW9uICwkbW9kZSk7IC8vTm8gbWF4ZGVwdGggaW4gcmVjdXJzaW9uCiAgICBpZiAoIWVtcHR5KCRpbnRyb2R1Y3Rpb24pKSB7CiAgICAgICRkaXJsaXN0PSRpbnRyb2R1Y3Rpb247CiAgICB9CiAgICBmb3JlYWNoKCRmaWxlcmVjIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICAkdmFsdWUxPSR0aGlzLT5TbGFzaGVzKHN0cl9yZXBsYWNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLCcnLCR2YWx1ZSkpOwogICAgICAvL3ByZXZlbnQgY3VycmVudCBkaXIgZnJvbSBzaG93aW5nIHVwCiAgICAgIC8vaWYgKCR2YWx1ZTE9PSgkcHJvZmlsZVsicGF0aCJdLiIvIikpIGNvbnRpbnVlOwogICAgICAvL0NoZWNrIGZvciBoaWRkZW4gZmlsZXMKICAgICAgJGRpcnM9ZXhwbG9kZSgiLyIsJHZhbHVlMSk7CiAgICAgICRoaWRkZW49ZmFsc2U7CiAgICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgIGlmIChzdWJzdHIoJGRpciwwLDEpPT0iLiIpIHskaGlkZGVuPXRydWU7IGJyZWFrO30KICAgICAgfQogICAgICBpZiAoJGhpZGRlbikgY29udGludWU7CgogICAgICAvL25vdCBoaWRkZW4sIGFkZCB0byBsaXN0CiAgICAgICRkaXJsaXN0WyR2YWx1ZTFdPSR2YWx1ZTE7CiAgICB9CiAgICByZXR1cm4gJGRpcmxpc3Q7CiAgfQoKICBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZSgkZmlsZW5hbWUsICRpbmNsdWRlZW5jb2RpbmcgPSB0cnVlKSB7CiAgICBpZiAoY2xhc3NfZXhpc3RzKCJmaW5mbyIpKSB7CiAgICAgICRmaW5mbyA9IGFycmF5KCk7CiAgICAgIGlmICgkaW5jbHVkZWVuY29kaW5nKSB7CiAgICAgICAgJGZpbmZvID0gbmV3IGZpbmZvKEZJTEVJTkZPX01JTUUpOyAvLyByZXR1cm4gbWltZSB0eXBlIGFsYSBtaW1ldHlwZSBleHRlbnNpb24KICAgICAgfSBlbHNlIHsKICAgICAgICAkZmluZm8gPSBuZXcgZmluZm8oRklMRUlORk9fTUlNRV9UWVBFKTsgLy8gcmV0dXJuIG1pbWUgdHlwZSBhbGEgbWltZXR5cGUgZXh0ZW5zaW9uCiAgICAgIH0KICAgICAgaWYgKCEkZmluZm8pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuICRmaW5mby0+ZmlsZSgkZmlsZW5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgewogICAgICAgIHJldHVybiBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZW5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiJtaW1ldHlwZXMucGhwIik7CiAgICAgICAgcmV0dXJuIHJldHVybk1JTUVUeXBlKCRmaWxlbmFtZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICAgKmFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIG5vdAogICovCiAgZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zPWFycmF5KCksJGRlZmF1bHQ9IiIpIHsKICAgIAogICAgaWYgKCFpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAvL1RoaXMgd2F5IDJuZCBwYXJhbWV0ZXIgY2FuIGFsc28gYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlCiAgICAgIGlmICgkcGFyYW1zIT0iIiAmJiAkZGVmYXVsdD09IiIpIHsKICAgICAgICAkZGVmYXVsdD0kcGFyYW1zOwogICAgICB9CiAgICAgICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICB9IGVsc2UgewogICAgICBpZiAoZW1wdHkoJHBhcmFtcykpICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoIWlzX2FycmF5KCRuYW1lKSkgewogICAgICBpZiAoaXNzZXQoJHBhcmFtc1skbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skbmFtZV07CiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2ggKCRuYW1lIGFzICRzaW5nbGVuYW1lKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJHNpbmdsZW5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJHNpbmdsZW5hbWVdOwogICAgICB9CiAgICAgIHJldHVybiAkZGVmYXVsdDsKICAgIH0KICB9CgogIC8vU2hvcnRjdXQgZm9yIHRoZSBhYm92ZQogIGZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcz1mYWxzZSwgJGRlZmF1bHQ9IiIpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgkbmFtZSwgJHBhcmFtcywgJGRlZmF1bHQpOwogIH0KCiAgRnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zPWFycmF5KCksICRpbmRleGVzPWFycmF5KCksICRhbHdheXNmaWxsPWZhbHNlKSB7CiAgICBpZiAoZW1wdHkoJHBhcmFtcykpICRwYXJhbXM9JHRoaXMtPl9wYXJhbXM7CiAgICBpZiAoZW1wdHkoJHBhcmFtcykgfHwgZW1wdHkoJGluZGV4ZXMpKSByZXR1cm4gJHRoaXNhcnJheTsKICAgIGlmIChpc19hc3NvYygkaW5kZXhlcykpIHsKICAgICAgZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXg9PiRkZWZhdWx0dmFsdWUpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRkZWZhdWx0dmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleCkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoJGFsd2F5c2ZpbGwpIHsKICAgICAgICAgICAgaWYgKCFpc3NldCgkdGhpc2FycmF5WyRpbmRleF0pKSAkdGhpc2FycmF5WyRpbmRleF09IiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvL3ByaW50X3IoJHRoaXNhcnJheSk7CiAgICByZXR1cm4gJHRoaXNhcnJheTsKICB9CgogIGZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkLCRhc3NvY2lkPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+TWFrZVNpbXBsZUFycmF5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGZpZWxkLCAkYXNzb2NpZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7OwogICAgfQogIH0KCiAgZnVuY3Rpb24gTWFrZUFzc29jQXJyYXkoJHRhYmxlLCRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+TWFrZUFzc29jQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQ2hlY2tGaWxlRXh0ZW5zaW9uKCRmaWxlbmFtZSwgJGFsbG93ZWRleHRlbnNpb25zPWFycmF5KCkpIHsKCQkkZXhwbG9kZWRmaWxlPWV4cGxvZGUoIi4iLCRmaWxlbmFtZSk7CgkJJGV4dD1zdHJ0b2xvd2VyKGFycmF5X3BvcCgkZXhwbG9kZWRmaWxlKSk7CgkJaWYgKGluX2FycmF5KCRleHQsJGFsbG93ZWRleHRlbnNpb25zKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBOZW9Ub29sVGlwKCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRleHQ9JHRoaXMtPk5QVigidGV4dCIsJHBhcmFtcywiPyIpOwogICAgJHVybD0kdGhpcy0+TlBWKCJ1cmwiLCRwYXJhbXMsIiIpOwogICAgJHRpdGxlPSR0aGlzLT5OUFYoInRpdGxlIiwkcGFyYW1zLCIiKTsKICAgICRjb250ZW50PSR0aGlzLT5OUFYoImNvbnRlbnQiLCRwYXJhbXMsIiIpOwogICAgJHNwYW5jbGFzcz0kdGhpcy0+TlBWKCJzcGFuY2xhc3MiLCRwYXJhbXMsIm5lb3Rvb2x0aXAiKTsKICAgIGlmICgkdXJsIT0iIikgewogICAgICAkcmVzdWx0PSc8YSBjbGFzcz0iJy4kc3BhbmNsYXNzLiciIGhyZWY9IicuJHVybC4nIj4nOwogICAgfSBlbHNlIHsKICAgICAgJHJlc3VsdD0nPGEgY2xhc3M9IicuJHNwYW5jbGFzcy4nIiBzdHlsZT0iY3Vyc29yOiBkZWZhdWx0OyIgaHJlZj0iIyIgb25jbGljaz0icmV0dXJuIGZhbHNlOyI+JzsKICAgIH0KICAgICRyZXN1bHQuPSR0ZXh0OwogICAgJHJlc3VsdC49JzxzcGFuPic7CiAgICBpZiAoJHRpdGxlIT0iIikgewogICAgICAkcmVzdWx0Lj0iPHN0cm9uZz4iLiR0aXRsZS4iPC9zdHJvbmc+PGJyLz4iOwogICAgfQogICAgJHJlc3VsdC49JGNvbnRlbnQ7CiAgICAkcmVzdWx0Lj0iPC9zcGFuPiI7CiAgICAkcmVzdWx0Lj0iPC9hPiI7CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIE5lb0VtcHR5KCRpbmRleD0iIiwkZGF0YT1hcnJheSgpKSB7CiAgICBpZiAoIWlzX2FycmF5KCRkYXRhKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgaWYgKGVtcHR5KCRkYXRhKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoJGluZGV4PT0iIikgcmV0dXJuIHRydWU7CiAgICBpZiAoIWlzc2V0KCRkYXRhWyRpbmRleF0pKSByZXR1cm4gdHJ1ZTsKICAgIGlmICh0cmltKCRkYXRhWyRpbmRleF0pPT0iIikgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpIHsKICAgIGlmIChlcmVnaSgiXlthLXpBLVowLTlfXStAW2EtekEtWjAtOVwtXStcLlthLXpBLVowLTlcLVwuXSskXSIsICRlbWFpbCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICgkYXZvaWRvbmxpbmUpIHJldHVybiB0cnVlOwoKICAgIGxpc3QoJFVzZXJuYW1lLCAkRG9tYWluKSA9IHNwbGl0KCJAIiwgJGVtYWlsKTsKCiAgICBpZiAoZ2V0bXhycigkRG9tYWluLCAkTVhIb3N0KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChAZnNvY2tvcGVuKCREb21haW4sIDI1LCAkZXJybm8sICRlcnJzdHIsIDMwKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewogICAgLy8kcGF0dGVybiA9ICcvXigoW1x3XSs6KT9cL1wvKT8oKFtcZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSsoOihbXGRcd118JVthLWZBLWZcZF17MiwyfSkrKT9AKT8oW1xkXHddWy1cZFx3XXswLDI1M31bXGRcd11cLikrW1x3XXsyLDR9KDpbXGRdKyk/KFwvKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKikqKFw/KCZhbXA7PyhbLStffi5cZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KT0/KSopPygjKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKik/JC8nOwogICAgcmV0dXJuICggISBwcmVnX21hdGNoKCcvXihodHRwfGh0dHBzfGZ0cCk6XC9cLyhbQS1aMC05XVtBLVowLTlfLV0qKD86XC5bQS1aMC05XVtBLVowLTlfLV0qKSspOj8oXGQrKT9cLz8vaScsICR1cmwpKSA/IEZBTFNFIDogVFJVRTsKCgkgIC8vcmV0dXJuIHByZWdfbWF0Y2goJHBhdHRlcm4sICR1cmwpOwogIH0KCiAgZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykgewogICAgJHN0cmluZz1zdHJfcmVwbGFjZSgiICIsIiZuYnNwOyIsJHN0cmluZyk7CiAgICByZXR1cm4gJHN0cmluZzsKICB9CgogIGZ1bmN0aW9uIE5lb1ByaW50UigkZGF0YT1hcnJheSgpLCRzZW5kb3V0PXRydWUpIHsKICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSJubyBjb250ZW50IGZvdW5kIjsKICAgIH0KICAgICRvdXRwdXQ9Jzxici8+PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjayI+JzsKICAgICRvdXRwdXQuPSI8cHJlPiI7CiAgICAkb3V0cHV0Lj1wcmludF9yKCRkYXRhLHRydWUpOwogICAgJG91dHB1dC49IjwvcHJlPiI7CiAgICAkb3V0cHV0Lj0iPC9kaXY+PGJyLz4iOwogICAgaWYgKCRzZW5kb3V0KSB7CiAgICAgIGVjaG8gJG91dHB1dDsKICAgIH0KICAgIHJldHVybiAkb3V0cHV0OwogIH0KCiAgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpICAgewogICAgJG91dGFycmF5PWFycmF5KCk7CiAgICBmb3JlYWNoICgkaW5hcnJheSBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgaWYgKHRyaW0oJHZhbHVlKT09IiIpIGNvbnRpbnVlOwogICAgICAkb3V0YXJyYXlbJGtleV09dHJpbSgkdmFsdWUpOwogICAgfQogICAgcmV0dXJuICRvdXRhcnJheTsKICB9CgogIAoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIikgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgkc21hcnR5aW5mbz09IiIpIHsKICAgICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogc21hcnR5LXZhcm5hbWUgbm90IHNldCIsZmFsc2UsYXJyYXkoInNtYXJ0eWluZm8iPT4kc21hcnR5aW5mbywic21hcnR5Y29udGVudCI9PiRzbWFydHljb250ZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLy9PayBpdCdzIGFuIGFycmF5CiAgICBpZiAoaXNfYXNzb2MoJHNtYXJ0eWluZm8pKSB7CiAgICAgIC8vSXQncyBhbiBhc3NvY19hcnJheSwgc28gd2UgYXNzaWduIGV2ZXJ5IHNpbmdsZSBwYWlyIG9mIGluZm8KICAgICAgZm9yZWFjaCgkc21hcnR5aW5mbyBhcyAkc21hcnR5bmFtZT0+JHNtYXJ0eWNvbnRlbnQpIHsKICAgICAgICBpZiAoaXNfYXJyYXkoJHNtYXJ0eWNvbnRlbnQpKSB7CiAgICAgICAgICAvL2l0J3MgYSBuZXN0ZWQgYXJyYXkKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfQogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvL0l0J3Mgbm90IGFuIGFzc29jX2FycmF5LCBzbyB3ZSBzaW1wbHkgcmVmLWFzc2lnbiBpdC4KICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgfQogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBOZW9TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKICAgIGlmICgkcHJlZmVyZW5jZW5hbWUhPSIiKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRwcmVmZXJlbmNlbmFtZSkpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHNtYXJ0eW5hbWUpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlLCRzbWFydHluYW1lPSJtb2R1bGUiKSB7CiAgICBpZiAoaXNfb2JqZWN0KCRtb2R1bGUpKSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICRtb2R1bGUpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCRtb2R1bGUpKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBEZWJ1Z2dpbmcgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gRmlyZURlYnVnKCRjb21tYW5kLCRtZXNzYWdlPSIiLCR2YXJpYWJsZXM9YXJyYXkoKSkgewogICAgJGZpcmVwaHBtb2R1bGU9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCdGaXJlUEhQRGVidWcnKTsKICAgIGlmICgkZmlyZXBocG1vZHVsZSkgewogICAgICAvL01vZHVsZSBmb3VuZAogICAgICAkZmlyZXBocG1vZHVsZS0+U2V0TW9kdWxlTmFtZSgkdGhpcy0+R2V0TmFtZSgpKTsKICAgICAgJGZpcmVwaHBtb2R1bGUtPkNvbW1hbmQoJGNvbW1hbmQsICRtZXNzYWdlLCAkdmFyaWFibGVzKTsKICAgIH0gLy9lbHNlIE1vZHVsZSBub3QgZm91bmR9CiAgfQoKCiAgLyoKICAgKgogICAqIEVycm9yIGhhbmRsaW5nCiAgICoKICAgKi8KICBmdW5jdGlvbiBFcnJvcigkZXJyb3J0ZXh0LCRyZXR1cm52YWx1ZT1mYWxzZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5fZXJyb3JzLj0kdGV4dDsKICAgIGlmICghZW1wdHkoJHBhcmFtcykgJiYgaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPl9lcnJvcnMuPSIgKCI7CiAgICAgICRmaXJzdD10cnVlOyAvL0hhbmRsaW5nIHRoZSBjb21tYQogICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbT0+JHZhbHVlKSB7CiAgICAgICAgaWYgKCRmaXJzdCkgJGZpcnN0PWZhbHNlOyBlbHNlICR0aGlzLT5fZXJyb3JzLj0iLCI7CiAgICAgICAgJHRoaXMtPl9lcnJvcnMuPSRwYXJhbS4iPT4iLiR2YWx1ZTsKICAgICAgfQogICAgICAkdGhpcy0+X2Vycm9ycy49IikiOwogICAgfQogICAgJHRoaXMtPl9lcnJvcnMuPSJcbiI7CiAgICByZXR1cm4gJHJldHVybnZhbHVlOwogIH0KCiAgZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgJGVycm9ycz0kdGhpcy0+X2Vycm9yczsKICAgIGlmICgkbmwyYnIpIHsKICAgICAgJGVycm9ycz1ubDJicigkZXJyb3JzKTsKICAgIH0KICAgIGlmICgkaW5jbHVkZWRzKSB7CiAgICAgIGlmICgkdGhpcy0+RFNJbkVycm9yKCkpIHsKICAgICAgICAkZXJyb3JzLj0kdGhpcy0+R2V0RFNFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICAgIH0KICAgIH0KICAgIGlmICgkY2xlYXIpIHsKICAgICAgJHRoaXMtPl9lcnJvcnM9IiI7CiAgICB9CiAgICByZXR1cm4gJGVycm9yczsKICB9CgogIGZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgIGlmICgkdGhpcy0+SW5FcnJvcigpKSB7CiAgICAgIGVjaG8gIlxuXG48ZGl2IHN0eWxlPSdib3JkZXI6M3B4IHNvbGlkIHJlZD5cbiI7CiAgICAgIGVjaG8gJHRoaXMtPkdldEVycm9ycyh0cnVlLCRjbGVhciwkaW5jbHVkZWRzKTsKICAgICAgZWNobyAiXG48L2Rpdj5cblxuIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEluRXJyb3IoKSB7CiAgICByZXR1cm4gKCR0aGlzLT5fZXJyb3JzIT0iIik7CiAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgo8bGk+dmVyc2lvbiAwLjMuMDxici8+CiAgICBhZGRlZCBuZXcgZnVuY3Rpb24gTmVvU2V0UHJlZnMsIHNob3J0aW5nIHRoZSBzYXZpbmcgb2YgcHJlZnMgZm9yIGluc3RhbmNlCiAgICA8YnIvPgogICAgYWRkZWQgZWFzeSBmb3JtLXZhbGlkYXRpb24gYW5kIG5pY2UgbWVzc2FnZXMgbGlua2VkIHRvIHRoYXQKICAgIDxici8+CiAgICBPYnNvbGV0ZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0LgogICAgPGJyLz4KICAgIEFkZGVkIGZ1bmN0aW9uIE5lb1RyaW1BcnJheSgkaW5hcnJheT1hcnJheSgpKQoKICA8bGk+dmVyc2lvbiAwLjIuODxici8+CiAgICBhZGRlZCBuZXcgZnVuY3Rpb24gTmVvR2V0TWltZVR5cGUKICAgIAogIDxsaT52ZXJzaW9uIDAuMi43PGJyLz4KICAgIGZpeGVkIE5lb0Ntc0xpbmsgZm9yIHByZXR0eSB1cmxzLCBtaXNzZWQgdGhlIHRhcmdldGNvbnRlbnRvbmx5IHBhcmFtZXRlci4uLgoKICA8bGk+dmVyc2lvbiAwLjIuNjxici8+CiAgICBBZGRlZCBhIFNldFByZWYtc2hvcnRjdXQgYW5kIGEgbmljZSBOZW9TZXRQcmVmLW1ldGhvZCAoc2VlIGhlbHApCiAgICA8YnIvPgogICAgc2V0IGVudGl0eSBwcm9wcyBmcm9tIGFycmF5IG5vdyB1c2VzIHN0b3JlZCBwYXJhbXMtdmFsdWVzIGlzIG90aGVyIG5vdCBzcGVjaWZpZXMKICAgIDxici8+CiAgICBSZXdvcmtlZCBOZW9SZWRpcmVjdChGdWxsKSB0byBiZSBmYXN0ZXIgdG8gdXNlCiAgICA8YnIvPgogICAgQWRkZWQgTmVvVmFsaWRhdGVVUkwtbWV0aG9kCiAgICA8YnIvPgogICAgQWRkZWQgRGVjb2RlSFRNTEVudGl0aWVzCiAgICA8YnIvPgogICAgQWRkZWQgTmVvQWRtaW5SZXR1cm4KCgogIDxsaT52ZXJzaW9uIDAuMi41PGJyLz4KICAgIEFkZGVkIGFuIG9wdGlvbiB0byBOZW9BZGRJY29uIHRvIGFsc28gaW5jbHVkZSB0aGUgZm9sbGluZ3MgdGV4dCBsaW5rCiAgICA8YnIvPgogICAgQWRkZWQgSXNUYWJsZUVtcHR5CiAgICA8YnIvPgogICAgVXBkYXRlIEVtYWlsVmFsaWRhdGlvbiB0byBtYWlsLWNhcGFiaWxpdGllcyBvZiBkb21haW4gYXMgd2VsbAogICAgPGJyLz4KICAgIE1hZGUgMm5kIHBhcmFtIHRvIE5lb1DDhWFyYW1WYWx1ZSBkb3VibGUgYXMgZGVmYXVsdCB2YWx1ZSAod2hlbiBub3QgYW4gYXJyYXkpCgoKCiAgPGxpPnZlcnNpb24gMC4yLjQ8YnIvPgogICAgQWRkZWQgTmVvRW1wdHktZnVuY3Rpb24gd2hpY2ggY2hlY2tzIGZvciBhbiBpbmRleCBpbiBhbiBhcnJheQogICAgPGJyLz4KICAgIE1hZGUgTmVvUHJpbnRSIG91dHB1dCBjb250ZW50IG9mICRfcGFyYW1zIGlmIG5vIHBhcmFtZXRlciB3YXMgZ2l2ZW4KICAgIDxici8+QWRkZWQgTmVvVmFsaWRhdGVFbWFpbC1mdW5jdGlvbgogICAgPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMzxici8+CiAgICBOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgogICAgPGJyLz4KICAgIEFkZGVkIENyZWF0ZUlucHV0UGFzc3dvcmQtd3JhcHBlcgogICAgPGJyLz4KICAgIEFkZGVkIGZpbGwgcGFyYW1ldGVyIHRvIFNldEVudGl0eVByb3BzRnJvbUFycmF5CgoKICA8bGk+dmVyc2lvbiAwLjIuMjxici8+CiAgICBBZGRlZCBhIGN1c3RvbSByZXR1cm52YWx1ZSB0byBjaGVja2VudGl0eWNvbm5lY3Rpb25zCiAgICA8YnIvPgogICAgSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5CiAgICA8YnIvPgogICAgQWRkZWQgTmVvVHJ1ZUljb24gYW5kICBOZW9UcnVlSWNvbgoKICA8bGk+dmVyc2lvbiAwLjIuMTxici8+CiAgICBhZGRlZCBhcnJheV9kaWZmX2tleSBpbXBsZW1lbnRhdGlvbiBmb3IgcHJlLTUuMS4wIHZlcnNpb24KICAgIDxici8+CiAgICBBZGRlZCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UgdG8gR2V0RW50aXRpZXMoRnVsbCktbWV0aG9kcwogICAgPGJyLz4KICAgIEFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKICAgIDxici8+CiAgICBBZGRlZCBUb29sdGlwLVN1cHBvcnQKICAgIDxici8+CiAgICBBZGRlZCBOZW9SZWRpcmVjdC1mdW5jdGlvbgoKICA8bGk+dmVyc2lvbiAwLjIuMDxici8+CiAgICAtIGdlbmVyYWwgYnVnZml4aW5nPGJyLz4KICAgIC0gQWRkZWQgYSBOZW9EaXJMaXN0LWZ1bmN0aW9uPGJyLz4KICAgIC0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KICAgIC0gYWRkZWQgc3VwcG9ydCBmb3IgM3JkIHBhcmFtZXRlciB0byBTbGFzaC1mdW5jdGlvbjxici8+CiAgICAtIGFkZGVkIE5lb0Ntc0xpbmsgYW5kIE5lb0Ntc1VybCBzaG9ydGN1dHM8YnIvPgogICAgLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgogICAgLSBhZGRlZCBTbWFydHlJbnB1dE11bHRpSGlkZGVuPGJyLz4KCiAgPC9saT4KICA8bGk+dmVyc2lvbiAwLjEuMDxici8+CiAgICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
