<?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.5.0</version>
  <mincmsversion>1.9</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRyZTwvaDM+PHVsPjxsaT48ZW0+KG9wdGlvbmFsKTwvZW0+IGxhbmc9ImVuX1VTIiAtIFBhcmFtZXRyZXQgYW5naXZlciBodmlsa2V0IHNwcm9nIGRlciBza2FsIGJydWdlcyB0aWwgdmlzbmluZyBmb3IgYmVzJm9zbGFzaDtnZW5kZS4gSWtrZSBhbGxlIG1vZHVsZXIgdW5kZXJzdCZvc2xhc2g7dHRlciBlbGxlciBiZWgmb3NsYXNoO3ZlciBkZXR0ZS48L2xpPjwvdWw+]]></help>
	<about><![CDATA[PGJyIC8+TGF2ZXQgYWY6IE1vcnRlbiBQb3Vsc2VuICZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogMC41LjA8YnIgLz48YnIgLz5IaXN0b3JpayBvdmVyICZhZWxpZztuZHJpbmdlcjo8YnIgLz48dWw+CiAgPGxpPnZlcnNpb24gMC41LjA8L2xpPgogIEZpeGVzLCBjbGVhbnVwcywgYW5kIGVuZGluZyBvZiB2ZXJzaW9uIGNvbmZ1c2lvbgogIAogIDxsaT52ZXJzaW9uIDAuNC4xPC9saT4KICBBZGRlZCBtb3JlIHZhbGlkYXRpb25zLCBlcXVhbCBhbmQgaWRlbnRpY2FsPGJyLz4KICBBZGRlZCBldmVuIHNob3J0ZXIgTmVvVXJsIGFuZCBOZW9MaW5rCiAgUHJlcGFyZWQgZm9yIGNtc21zIDEuMTAKCiAgPGxpPnZlcnNpb24gMC40LjA8L2xpPgogIEFkZGVkIGRhdGV0aW1lcGlja2VyIGFuZCBpbnRlZ3JhdGVkIGl0CgogIDxsaT52ZXJzaW9uIDAuMy41PGJyLz4KICBNdWx0aXBsZSBidWdmaXhlcyBkaXNjb3ZlcmVkIGJ5IFBocFN0b3JtCiAgPGJyLz4KCiAgPGxpPnZlcnNpb24gMC4zLjQ8YnIvPgogIHJld29ya2VkIGZvciBjbXNtcygpLW1ldGhvZHMKICA8YnIvPgoKCiAgPGxpPnZlcnNpb24gMC4zLjM8YnIvPgogIE5ldyBmb3JtdmFsaWRhdGlvbiBtZXRob2RzIGZvciBkcm9wZG93bnMgYW5kIHJhZGlvZ3JvdXBzCiAgPGJyLz4KICAKICA8bGk+dmVyc2lvbiAwLjMuMjxici8+CiAgYWRkZWQgY3NzLWluamVjdGlvbnMgc3R5bGluZyB0aGUgZm9ybXZhbGlkYXRpb24tcG9wdXAKICA8YnIvPgogIHN0YXJ0ZWQgZG9pbmcgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBtb2R1bGUtY2xhc3MKCiAgPGxpPnZlcnNpb24gMC4zLjE8YnIvPgogIGZpeGVkIHRoZSB1Z2x5IGNzcyBpbiBib2R5LGl0J3Mgbm93IGphdmFzY3JpcHQKICA8YnIvPgoKPGxpPnZlcnNpb24gMC4zLjA8YnIvPgogICAgYWRkZWQgbmV3IGZ1bmN0aW9uIE5lb1NldFByZWZzLCBzaG9ydGluZyB0aGUgc2F2aW5nIG9mIHByZWZzIGZvciBpbnN0YW5jZQogICAgPGJyLz4KICAgIGFkZGVkIGVhc3kgZm9ybS12YWxpZGF0aW9uIGFuZCBuaWNlIG1lc3NhZ2VzIGxpbmtlZCB0byB0aGF0CiAgICA8YnIvPgogICAgT2Jzb2xldGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydC4KICAgIDxici8+CiAgICBBZGRlZCBmdW5jdGlvbiBOZW9UcmltQXJyYXkoJGluYXJyYXk9YXJyYXkoKSkKCiAgPGxpPnZlcnNpb24gMC4yLjg8YnIvPgogICAgYWRkZWQgbmV3IGZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlCiAgICAKICA8bGk+dmVyc2lvbiAwLjIuNzxici8+CiAgICBmaXhlZCBOZW9DbXNMaW5rIGZvciBwcmV0dHkgdXJscywgbWlzc2VkIHRoZSB0YXJnZXRjb250ZW50b25seSBwYXJhbWV0ZXIuLi4KCiAgPGxpPnZlcnNpb24gMC4yLjY8YnIvPgogICAgQWRkZWQgYSBTZXRQcmVmLXNob3J0Y3V0IGFuZCBhIG5pY2UgTmVvU2V0UHJlZi1tZXRob2QgKHNlZSBoZWxwKQogICAgPGJyLz4KICAgIHNldCBlbnRpdHkgcHJvcHMgZnJvbSBhcnJheSBub3cgdXNlcyBzdG9yZWQgcGFyYW1zLXZhbHVlcyBpcyBvdGhlciBub3Qgc3BlY2lmaWVzCiAgICA8YnIvPgogICAgUmV3b3JrZWQgTmVvUmVkaXJlY3QoRnVsbCkgdG8gYmUgZmFzdGVyIHRvIHVzZQogICAgPGJyLz4KICAgIEFkZGVkIE5lb1ZhbGlkYXRlVVJMLW1ldGhvZAogICAgPGJyLz4KICAgIEFkZGVkIERlY29kZUhUTUxFbnRpdGllcwogICAgPGJyLz4KICAgIEFkZGVkIE5lb0FkbWluUmV0dXJuCgoKICA8bGk+dmVyc2lvbiAwLjIuNTxici8+CiAgICBBZGRlZCBhbiBvcHRpb24gdG8gTmVvQWRkSWNvbiB0byBhbHNvIGluY2x1ZGUgdGhlIGZvbGxpbmdzIHRleHQgbGluawogICAgPGJyLz4KICAgIEFkZGVkIElzVGFibGVFbXB0eQogICAgPGJyLz4KICAgIFVwZGF0ZSBFbWFpbFZhbGlkYXRpb24gdG8gbWFpbC1jYXBhYmlsaXRpZXMgb2YgZG9tYWluIGFzIHdlbGwKICAgIDxici8+CiAgICBNYWRlIDJuZCBwYXJhbSB0byBOZW9Qw4VhcmFtVmFsdWUgZG91YmxlIGFzIGRlZmF1bHQgdmFsdWUgKHdoZW4gbm90IGFuIGFycmF5KQoKCgogIDxsaT52ZXJzaW9uIDAuMi40PGJyLz4KICAgIEFkZGVkIE5lb0VtcHR5LWZ1bmN0aW9uIHdoaWNoIGNoZWNrcyBmb3IgYW4gaW5kZXggaW4gYW4gYXJyYXkKICAgIDxici8+CiAgICBNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCiAgICA8YnIvPkFkZGVkIE5lb1ZhbGlkYXRlRW1haWwtZnVuY3Rpb24KICAgIDxici8+QWRkZWQgTmVvTm9CcmVha3MtZnVuY3Rpb24KCiAgPGxpPnZlcnNpb24gMC4yLjM8YnIvPgogICAgTm93IHBvc3NpYmxlIHRvIHJlZ2lzdGVyICRwYXJhbXMgZm9yIGV2ZW4gZWFzaWVyIHN5bnRheCBpbiByZWxldmFudCBmdW5jdGlvbnMgbGlrZSBOUFYKICAgIDxici8+CiAgICBBZGRlZCBDcmVhdGVJbnB1dFBhc3N3b3JkLXdyYXBwZXIKICAgIDxici8+CiAgICBBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCiAgPGxpPnZlcnNpb24gMC4yLjI8YnIvPgogICAgQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwogICAgPGJyLz4KICAgIEltcGxlbWVudGVkIE1ha2VTaW1wbGVBcnJheQogICAgPGJyLz4KICAgIEFkZGVkIE5lb1RydWVJY29uIGFuZCAgTmVvVHJ1ZUljb24KCiAgPGxpPnZlcnNpb24gMC4yLjE8YnIvPgogICAgYWRkZWQgYXJyYXlfZGlmZl9rZXkgaW1wbGVtZW50YXRpb24gZm9yIHByZS01LjEuMCB2ZXJzaW9uCiAgICA8YnIvPgogICAgQWRkZWQgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlIHRvIEdldEVudGl0aWVzKEZ1bGwpLW1ldGhvZHMKICAgIDxici8+CiAgICBBZGRlZCBTbWFydEFzc2lnblByZWYtbWV0aG9kCiAgICA8YnIvPgogICAgQWRkZWQgVG9vbHRpcC1TdXBwb3J0CiAgICA8YnIvPgogICAgQWRkZWQgTmVvUmVkaXJlY3QtZnVuY3Rpb24KCiAgPGxpPnZlcnNpb24gMC4yLjA8YnIvPgogICAgLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+CiAgICAtIEFkZGVkIGEgTmVvRGlyTGlzdC1mdW5jdGlvbjxici8+CiAgICAtIEZpeGVkIG5hbWUgZXJyb3Igb24gTmVvSW5wdXREcm9wZG93bjxici8+CiAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgogICAgLSBhZGRlZCBOZW9DbXNMaW5rIGFuZCBOZW9DbXNVcmwgc2hvcnRjdXRzPGJyLz4KICAgIC0gYWRkZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0PGJyLz4KICAgIC0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogIDwvbGk+CiAgPGxpPnZlcnNpb24gMC4xLjA8YnIvPgogICAgLSBpbml0aWFsIHJlbGVhc2U8L2xpPgo8L3VsPjxiciAvPg==]]></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>/action.datetimepicker.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGRpZSgpOwoKJGpzPWZpbGVfZ2V0X2NvbnRlbnRzKGRpcm5hbWUoX19GSUxFX18pLiIvZGF0ZXRpbWVwaWNrZXIvZGF0ZXRpbWVwaWNrZXJfY3NzLmpzIik7CgppZiAoISRqcykgZGllKCk7CgokcG9zPXN0cnBvcygkanMsIi8vZW5kIEdsb2JhbCB2YXJpYWJsZSIpOwoKJHN0YXJ0PXN1YnN0cigkanMsMCwkcG9zKTsKJGVuZD1zdWJzdHIoJGpzLCRwb3MpOwokY29uZmlnPWNtc21zKCktPkdldENvbmZpZygpOwoKJHJlc3VsdD0nCgp2YXIgaW1hZ2VGaWxlc1BhdGggPSAiJy4kY29uZmlnWyJyb290X3VybCJdLicvbW9kdWxlcy9OZW9Nb2R1bGUvZGF0ZXRpbWVwaWNrZXIvaW1hZ2VzLyI7CgonOwoKJHJlc3VsdD0kc3RhcnQuJHJlc3VsdC4kZW5kOwoKJHJlc3VsdD1zdHJfcmVwbGFjZSgKICBhcnJheSgKICAgICciTW9uZGF5IicsCiAgICAnIlR1ZXNkYXkiJywKICAgICciV2VkbmVzZGF5IicsCiAgICAnIlRodXJzZGF5IicsCiAgICAnIkZyaWRheSInLAogICAgJyJTYXR1cmRheSInLAogICAgJyJTdW5kYXkiJwogICksCiAgYXJyYXkoCiAgICAnIicuaHRtbF9lbnRpdHlfZGVjb2RlKCR0aGlzLT5MYW5nKCJtb25kYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygidHVlc2RheSIpLEVOVF9OT1FVT1RFUywiVVRGLTgiKS4nIicsCiAgICAnIicuaHRtbF9lbnRpdHlfZGVjb2RlKCR0aGlzLT5MYW5nKCJ3ZWRuZXNkYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygidGh1cnNkYXkiKSxFTlRfTk9RVU9URVMsIlVURi04IikuJyInLAogICAgJyInLmh0bWxfZW50aXR5X2RlY29kZSgkdGhpcy0+TGFuZygiZnJpZGF5IiksRU5UX05PUVVPVEVTLCJVVEYtOCIpLiciJywKICAgICciJy5odG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPkxhbmcoInNhdHVyZGF5IiksRU5UX05PUVVPVEVTLCJVVEYtOCIpLiciJywKICAgICciJy5odG1sX2VudGl0eV9kZWNvZGUoJHRoaXMtPkxhbmcoInN1bmRheSIpLEVOVF9OT1FVT1RFUywiVVRGLTgiKS4nIicKICApCiAgLCRyZXN1bHQpOwoKCgplY2hvICRyZXN1bHQ7CmRpZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/datetimepicker/datetimepicker_css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly9KYXZhc3JpcHQgbmFtZTogTXkgRGF0ZSBUaW1lIFBpY2tlcgovL0RhdGUgY3JlYXRlZDogMTYtTm92LTIwMDMgMjM6MTkKLy9DcmVhdG9yOiBUZW5nWW9uZyBOZwovL1dlYnNpdGU6IGh0dHA6Ly93d3cucmFpbmZvcmVzdG5ldC5jb20KLy9Db3B5cmlnaHQgKGMpIDIwMDMgVGVuZ1lvbmcgTmcKLy9GaWxlTmFtZTogRGF0ZVRpbWVQaWNrZXJfY3NzLmpzCi8vVmVyc2lvbjogMi4yLjAKLy8gTm90ZTogUGVybWlzc2lvbiBnaXZlbiB0byB1c2UgYW5kIG1vZGlmeSB0aGlzIHNjcmlwdCBpbiBBTlkga2luZCBvZiBhcHBsaWNhdGlvbnMgaWYKLy8gICAgICAgaGVhZGVyIGxpbmVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KLy9QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhpcyBqYXZhc2NyaXB0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgMy4wLgovL05ldyBDc3Mgc3R5bGUgdmVyc2lvbiBhZGRlZCBieSBZdmFuIExhdm9pZSAoUXXDqWJlYywgQ2FuYWRhKSAyOS1KYW4tMjAwOQovL0Zvcm1hdHRlZCBmb3IgSlNMaW50IGNvbXBhdGliaWxpdHkgYnkgTGFic21lZGlhLmNvbSAoMzAtRGVjLTIwMTApCgovL0dsb2JhbCB2YXJpYWJsZXMKdmFyIHdpbkNhbDsKdmFyIGR0VG9kYXk7CnZhciBDYWw7CnZhciBNb250aE5hbWU7CnZhciBXZWVrRGF5TmFtZTE7CnZhciBXZWVrRGF5TmFtZTI7CnZhciBleERhdGVUaW1lOy8vRXhpc3RpbmcgRGF0ZSBhbmQgVGltZQp2YXIgc2VsRGF0ZTsvL3NlbGVjdGVkIGRhdGUuIHZlcnNpb24gMS43CnZhciBjYWxTcGFuSUQgPSAiY2FsQm9yZGVyIjsgLy8gc3BhbiBJRAp2YXIgZG9tU3R5bGUgPSBudWxsOyAvLyBzcGFuIERPTSBvYmplY3Qgd2l0aCBzdHlsZQp2YXIgY25MZWZ0ID0gIjAiOy8vbGVmdCBjb29yZGluYXRlIG9mIGNhbGVuZGFyIHNwYW4KdmFyIGNuVG9wID0gIjAiOy8vdG9wIGNvb3JkaW5hdGUgb2YgY2FsZW5kYXIgc3Bhbgp2YXIgeHBvcyA9IDA7IC8vIG1vdXNlIHggcG9zaXRpb24KdmFyIHlwb3MgPSAwOyAvLyBtb3VzZSB5IHBvc2l0aW9uCnZhciBjYWxIZWlnaHQgPSAwOyAvLyBjYWxlbmRhciBoZWlnaHQKdmFyIENhbFdpZHRoID0gMjA4Oy8vIGNhbGVuZGFyIHdpZHRoCnZhciBDZWxsV2lkdGggPSAzMDsvLyB3aWR0aCBvZiBkYXkgY2VsbC4KdmFyIFRpbWVNb2RlID0gMjQ7Ly8gRGVmYXVsdCBUaW1lTW9kZSB2YWx1ZS4gMTIgb3IgMjQKdmFyIENhbFBvc09mZnNldFggPSA4OyAvL1ggcG9zaXRpb24gb2Zmc2V0IHJlbGF0aXZlIHRvIGNhbGVuZGFyIGljb24sIGNhbiBiZSBuZWdhdGl2ZSB2YWx1ZQp2YXIgQ2FsUG9zT2Zmc2V0WSA9IDg7IC8vWSBwb3NpdGlvbiBvZmZzZXQgcmVsYXRpdmUgdG8gY2FsZW5kYXIgaWNvbiwgY2FuIGJlIG5lZ2F0aXZlIHZhbHVlCgovL0NvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIC0gc3RhcnQKdmFyIFNwYW5Cb3JkZXJDb2xvciA9ICIjMDAwMDAwIjsvL0NhbGVuZGFyIGJvcmRlciBjb2xvcgp2YXIgTW9udGhZZWFyQ29sb3IgPSAiI2NjMDAzMyI7IC8vRm9udCBDb2xvciBvZiBNb250aCBhbmQgWWVhciBpbiBDYWxlbmRhciBoZWFkZXIKdmFyIFdlZWtIZWFkQ29sb3IgPSAiIzE4ODYxQiI7IC8vQmFja2dyb3VuZCBDb2xvciBpbiBXZWVrIGhlYWRlcgp2YXIgU3VuZGF5Q29sb3IgPSAiI0MwRjY0RiI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiBTdW5kYXkKdmFyIFNhdHVyZGF5Q29sb3IgPSAiI0MwRjY0RiI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiBTYXR1cmRheQp2YXIgV2Vla0RheUNvbG9yID0gIiNGRkVEQTYiOyAvL0JhY2tncm91bmQgY29sb3Igb2Ygd2Vla2RheXMKdmFyIFRvZGF5Q29sb3IgPSAiI2ZmYmQzNSI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiB0b2RheQp2YXIgU2VsRGF0ZUNvbG9yID0gIiM4REQ1M0MiOyAvL0JhY2tncm9uZCBjb2xvciBvZiBzZWxlY3RlZCBkYXRlIGluIHRleHRib3gKdmFyIFlyU2VsQ29sb3IgPSAiI2NjMDAzMyI7IC8vY29sb3Igb2YgZm9udCBvZiBNb250aC1ZZWFyIHNlbGVjdG9yLkFwcGxpZXMgb25seSBmb3IgQXJyb3cgbmF2aWdhdGlvbgp2YXIgSG92ZXJDb2xvciA9ICIjRTBGRjM4IjsgLy9jb2xvciBvZiBjZWxsIGJhY2tncm91bmQgd2hlbiBtb3VzZSBtb3ZlIG92ZXIKdmFyIERpc2FibGVDb2xvciA9ICIjOTk5OTY2IjsgLy9jb2xvciBvZiBkaXNhYmxlZCBjZWxsCnZhciBDYWxCZ0NvbG9yID0gIiNGRkZGRkYiOyAvL0JhY2tncm91bmQgY29sb3Igb2YgQ2FsZW5kYXIgd2luZG93IG5vdCBjZWxsCgp2YXIgU3RhcnRZZWFyID0gMTk0MDsgLy9GaXJzdCBzZWxlY3RhYmxlIHllYXIKdmFyIEVuZFllYXIgPSA1OyAvLyBUaGUgb2Zmc2V0IGxhc3QgeWVhciBvZiBwaWNrYWJsZSBkYXRlLiBJZiBjdXJyZW50IHllYXIgaXMgMjAxMSwgdGhlIGxhc3QgeWVhciB0aGF0IHN0aWxsIHBpY2tlciB3aWxsIGJlIDIwMTYgKDIwMTErNSkKdmFyIFdlZWtDaGFyID0gMjsvL251bWJlciBvZiBjaGFyYWN0ZXIgZm9yIHdlZWsgZGF5LiBpZiAyIHRoZW4gTW8sVHUsV2UuIGlmIDMgdGhlbiBNb24sVHVlLFdlZAp2YXIgRGF0ZVNlcGFyYXRvciA9ICIvIjsvL0RhdGUgU2VwYXJhdG9yLCB5b3UgY2FuIGNoYW5nZSBpdCB0byAiLyIgYXMgeW91IHdpc2gKdmFyIFNob3dMb25nTW9udGggPSB0cnVlOy8vU2hvdyBsb25nIG1vbnRoIG5hbWUgaW4gQ2FsZW5kYXIgaGVhZGVyLiBleGFtcGxlOiAiSmFudWFyeSIKdmFyIFNob3dNb250aFllYXIgPSB0cnVlOy8vU2hvdyBNb250aCBhbmQgWWVhciBpbiBDYWxlbmRhciBoZWFkZXIuTm90IGFwcGxpY2FibGUgZm9yIEFycm93IG5hdmlnYXRpb24KdmFyIFByZWNlZGVaZXJvID0gdHJ1ZTsvL1ByZWNlZGluZyB6ZXJvIGluIGRhdGUgZm9ybWF0CnZhciBNb25kYXlGaXJzdERheSA9IHRydWU7Ly90cnVlOlVzZSBNb25kYXkgYXMgZmlyc3QgZGF5OyBmYWxzZTpTdW5kYXkgYXMgZmlyc3QgZGF5LiBbdHJ1ZXxmYWxzZV0gCnZhciBVc2VJbWFnZUZpbGVzID0gdHJ1ZTsvL1VzZSBpbWFnZSBmaWxlcyB3aXRoICJhcnJvd3MiIGFuZCAiY2xvc2UiIGJ1dHRvbgp2YXIgRGlzYWJsZUJlZm9yZVRvZGF5ID0gZmFsc2U7IC8vTWFrZSBkYXRlIGJlZm9yZSB0b2RheSB1bmNsaWNrYWJsZQp2YXIgaW1hZ2VGaWxlc1BhdGggPSAiaW1hZ2VzLyI7IC8vUGF0aCBvZiBkYXRlIHRpbWUgcGlja2VyIGltYWdlIGZpbGVzIHJlbGF0aXZlIHRvIEhUTUwgcGFnZS4KLy9Db25maWd1cmFibGUgcGFyYW1ldGVycyAtIGVuZAoKLy91c2UgdGhlIE1vbnRoIGFuZCBXZWVrZGF5IGluIHlvdXIgcHJlZmVycmVkIGxhbmd1YWdlLgp2YXIgTW9udGhOYW1lID0gWyJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyIiwgIkRlY2VtYmVyIl07CnZhciBXZWVrRGF5TmFtZTEgPSBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il07CnZhciBXZWVrRGF5TmFtZTIgPSBbIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiLCAiU3VuZGF5Il07CgoKLy9lbmQgQ29uZmlndXJhYmxlIHBhcmFtZXRlcnMKCi8vZW5kIEdsb2JhbCB2YXJpYWJsZQoKCi8vIENhbGVuZGFyIHByb3RvdHlwZQpmdW5jdGlvbiBDYWxlbmRhcihwRGF0ZSwgcEN0cmwpCnsKCgkvL1Byb3BlcnRpZXMKCXRoaXMuRGF0ZSA9IHBEYXRlLmdldERhdGUoKTsvL3NlbGVjdGVkIGRhdGUKCXRoaXMuTW9udGggPSBwRGF0ZS5nZXRNb250aCgpOy8vc2VsZWN0ZWQgbW9udGggbnVtYmVyCgl0aGlzLlllYXIgPSBwRGF0ZS5nZXRGdWxsWWVhcigpOy8vc2VsZWN0ZWQgeWVhciBpbiA0IGRpZ2l0cwoJdGhpcy5Ib3VycyA9IHBEYXRlLmdldEhvdXJzKCk7CgoJaWYgKHBEYXRlLmdldE1pbnV0ZXMoKSA8IDEwKQoJewoJCXRoaXMuTWludXRlcyA9ICIwIiArIHBEYXRlLmdldE1pbnV0ZXMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLk1pbnV0ZXMgPSBwRGF0ZS5nZXRNaW51dGVzKCk7Cgl9CgoJaWYgKHBEYXRlLmdldFNlY29uZHMoKSA8IDEwKQoJewoJCXRoaXMuU2Vjb25kcyA9ICIwIiArIHBEYXRlLmdldFNlY29uZHMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLlNlY29uZHMgPSBwRGF0ZS5nZXRTZWNvbmRzKCk7Cgl9CgoKCXRoaXMuTXlXaW5kb3cgPSB3aW5DYWw7Cgl0aGlzLkN0cmwgPSBwQ3RybDsKCXRoaXMuRm9ybWF0ID0gImRkTU15eXl5IjsKCXRoaXMuU2VwYXJhdG9yID0gRGF0ZVNlcGFyYXRvcjsKCXRoaXMuU2hvd1RpbWUgPSBmYWxzZTsKCXRoaXMuU2Nyb2xsZXIgPSAiRFJPUERPV04iOwoJaWYgKHBEYXRlLmdldEhvdXJzKCkgPCAxMikKCXsKCQl0aGlzLkFNb3JQTSA9ICJBTSI7Cgl9CgllbHNlCgl7CgkJdGhpcy5BTW9yUE0gPSAiUE0iOwoJfQoKCXRoaXMuU2hvd1NlY29uZHMgPSBmYWxzZTsKfQoKQ2FsZW5kYXIucHJvdG90eXBlLkdldE1vbnRoSW5kZXggPSBmdW5jdGlvbiAoc2hvcnRNb250aE5hbWUpCnsKCWZvciAodmFyIGkgPSAwOyBpIDwgMTI7IGkgKz0gMSkKCXsKCQlpZiAoTW9udGhOYW1lW2ldLnN1YnN0cmluZygwLCAzKS50b1VwcGVyQ2FzZSgpID09PSBzaG9ydE1vbnRoTmFtZS50b1VwcGVyQ2FzZSgpKQoJCXsKCQkJcmV0dXJuIGk7CgkJfQoJfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLkluY1llYXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoQ2FsLlllYXIgPD0gZHRUb2RheS5nZXRGdWxsWWVhcigpK0VuZFllYXIpCgkgICAgQ2FsLlllYXIgKz0gMTsKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5EZWNZZWFyID0gZnVuY3Rpb24gKCkgewogICAgaWYgKENhbC5ZZWFyID4gU3RhcnRZZWFyKQoJICAgIENhbC5ZZWFyIC09IDE7Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuSW5jTW9udGggPSBmdW5jdGlvbigpIHsKICAgIGlmIChDYWwuWWVhciA8PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkgKyBFbmRZZWFyKSB7CiAgICAgICAgQ2FsLk1vbnRoICs9IDE7CiAgICAgICAgaWYgKENhbC5Nb250aCA+PSAxMikgewogICAgICAgICAgICBDYWwuTW9udGggPSAwOwogICAgICAgICAgICBDYWwuSW5jWWVhcigpOwogICAgICAgIH0KICAgIH0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5EZWNNb250aCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKENhbC5ZZWFyID49IFN0YXJ0WWVhcikgewogICAgICAgIENhbC5Nb250aCAtPSAxOwogICAgICAgIGlmIChDYWwuTW9udGggPCAwKSB7CiAgICAgICAgICAgIENhbC5Nb250aCA9IDExOwogICAgICAgICAgICBDYWwuRGVjWWVhcigpOwogICAgICAgIH0KICAgIH0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Td2l0Y2hNdGggPSBmdW5jdGlvbiAoaW50TXRoKQp7CglDYWwuTW9udGggPSBwYXJzZUludChpbnRNdGgsIDEwKTsKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Td2l0Y2hZZWFyID0gZnVuY3Rpb24gKGludFllYXIpCnsKCUNhbC5ZZWFyID0gcGFyc2VJbnQoaW50WWVhciwgMTApOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlNldEhvdXIgPSBmdW5jdGlvbiAoaW50SG91cikKewoJdmFyIE1heEhvdXIsCglNaW5Ib3VyLAoJSG91ckV4cCA9IG5ldyBSZWdFeHAoIl5cXGRcXGQiKSwKCVNpbmdsZURpZ2l0ID0gbmV3IFJlZ0V4cCgiXFxkIik7CgoJaWYgKFRpbWVNb2RlID09PSAyNCkKCXsKCQlNYXhIb3VyID0gMjM7CgkJTWluSG91ciA9IDA7Cgl9CgllbHNlIGlmIChUaW1lTW9kZSA9PT0gMTIpCgl7CgkJTWF4SG91ciA9IDEyOwoJCU1pbkhvdXIgPSAxOwoJfQoJZWxzZQoJewoJCWFsZXJ0KCJUaW1lTW9kZSBjYW4gb25seSBiZSAxMiBvciAyNCIpOwoJfQoKCWlmICgoSG91ckV4cC50ZXN0KGludEhvdXIpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50SG91cikpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPiBNYXhIb3VyKSkKCXsKCQlpbnRIb3VyID0gTWluSG91cjsKCX0KCgllbHNlIGlmICgoSG91ckV4cC50ZXN0KGludEhvdXIpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50SG91cikpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPCBNaW5Ib3VyKSkKCXsKCQlpbnRIb3VyID0gTWF4SG91cjsKCX0KCglpZiAoU2luZ2xlRGlnaXQudGVzdChpbnRIb3VyKSkKCXsKCQlpbnRIb3VyID0gIjAiICsgaW50SG91cjsKCX0KCglpZiAoSG91ckV4cC50ZXN0KGludEhvdXIpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPD0gTWF4SG91cikgJiYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA+PSBNaW5Ib3VyKSkKCXsKCQlpZiAoKFRpbWVNb2RlID09PSAxMikgJiYgKENhbC5BTW9yUE0gPT09ICJQTSIpKQoJCXsKCQkJaWYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA9PT0gMTIpCgkJCXsKCQkJCUNhbC5Ib3VycyA9IDEyOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApICsgMTI7CgkJCX0KCQl9CgoJCWVsc2UgaWYgKChUaW1lTW9kZSA9PT0gMTIpICYmIChDYWwuQU1vclBNID09PSAiQU0iKSkKCQl7CgkJCWlmIChpbnRIb3VyID09PSAxMikKCQkJewoJCQkJaW50SG91ciAtPSAxMjsKCQkJfQoKCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApOwoJCX0KCgkJZWxzZSBpZiAoVGltZU1vZGUgPT09IDI0KQoJCXsKCQkJQ2FsLkhvdXJzID0gcGFyc2VJbnQoaW50SG91ciwgMTApOwoJCX0KCX0KCn07CgpDYWxlbmRhci5wcm90b3R5cGUuU2V0TWludXRlID0gZnVuY3Rpb24gKGludE1pbikKewoJdmFyIE1heE1pbiA9IDU5LAoJTWluTWluID0gMCwKCglTaW5nbGVEaWdpdCA9IG5ldyBSZWdFeHAoIlxcZCIpLAoJU2luZ2xlRGlnaXQyID0gbmV3IFJlZ0V4cCgiXlxcZHsxfSQiKSwKCU1pbkV4cCA9IG5ldyBSZWdFeHAoIl5cXGR7Mn0kIiksCgoJc3RyTWluID0gMDsKCglpZiAoKE1pbkV4cC50ZXN0KGludE1pbikgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRNaW4pKSAmJiAocGFyc2VJbnQoaW50TWluLCAxMCkgPiBNYXhNaW4pKQoJewoJCWludE1pbiA9IE1pbk1pbjsKCX0KCgllbHNlIGlmICgoTWluRXhwLnRlc3QoaW50TWluKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludE1pbikpICYmIChwYXJzZUludChpbnRNaW4sIDEwKSA8IE1pbk1pbikpCgl7CgkJaW50TWluID0gTWF4TWluOwoJfQoKCXN0ck1pbiA9IGludE1pbiArICIiOwoJaWYgKFNpbmdsZURpZ2l0Mi50ZXN0KGludE1pbikpCgl7CgkJc3RyTWluID0gIjAiICsgc3RyTWluOwoJfQoKCWlmICgoTWluRXhwLnRlc3QoaW50TWluKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludE1pbikpICYmIChwYXJzZUludChpbnRNaW4sIDEwKSA8PSA1OSkgJiYgKHBhcnNlSW50KGludE1pbiwgMTApID49IDApKQoJewoJCUNhbC5NaW51dGVzID0gc3RyTWluOwoJfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlNldFNlY29uZCA9IGZ1bmN0aW9uIChpbnRTZWMpCnsKCXZhciBNYXhTZWMgPSA1OSwKCU1pblNlYyA9IDAsCgoJU2luZ2xlRGlnaXQgPSBuZXcgUmVnRXhwKCJcXGQiKSwKCVNpbmdsZURpZ2l0MiA9IG5ldyBSZWdFeHAoIl5cXGR7MX0kIiksCglTZWNFeHAgPSBuZXcgUmVnRXhwKCJeXFxkezJ9JCIpLAoKCXN0clNlYyA9IDA7CgoJaWYgKChTZWNFeHAudGVzdChpbnRTZWMpIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50U2VjKSkgJiYgKHBhcnNlSW50KGludFNlYywgMTApID4gTWF4U2VjKSkKCXsKCQlpbnRTZWMgPSBNaW5TZWM7Cgl9CgoJZWxzZSBpZiAoKFNlY0V4cC50ZXN0KGludFNlYykgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRTZWMpKSAmJiAocGFyc2VJbnQoaW50U2VjLCAxMCkgPCBNaW5TZWMpKQoJewoJCWludFNlYyA9IE1heFNlYzsKCX0KCglzdHJTZWMgPSBpbnRTZWMgKyAiIjsKCWlmIChTaW5nbGVEaWdpdDIudGVzdChpbnRTZWMpKQoJewoJCXN0clNlYyA9ICIwIiArIHN0clNlYzsKCX0KCglpZiAoKFNlY0V4cC50ZXN0KGludFNlYykgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRTZWMpKSAmJiAocGFyc2VJbnQoaW50U2VjLCAxMCkgPD0gNTkpICYmIChwYXJzZUludChpbnRTZWMsIDEwKSA+PSAwKSkKCXsKCQlDYWwuU2Vjb25kcyA9IHN0clNlYzsKCX0KCn07CgpDYWxlbmRhci5wcm90b3R5cGUuU2V0QW1QbSA9IGZ1bmN0aW9uIChwdmFsdWUpCnsKCXRoaXMuQU1vclBNID0gcHZhbHVlOwoJaWYgKHB2YWx1ZSA9PT0gIlBNIikKCXsKCQl0aGlzLkhvdXJzID0gcGFyc2VJbnQodGhpcy5Ib3VycywgMTApICsgMTI7CgkJaWYgKHRoaXMuSG91cnMgPT09IDI0KQoJCXsKCQkJdGhpcy5Ib3VycyA9IDEyOwoJCX0KCX0KCgllbHNlIGlmIChwdmFsdWUgPT09ICJBTSIpCgl7CgkJdGhpcy5Ib3VycyAtPSAxMjsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5nZXRTaG93SG91ciA9IGZ1bmN0aW9uICgpCnsKCXZhciBmaW5hbEhvdXI7CgoJaWYgKFRpbWVNb2RlID09PSAxMikKCXsKCQlpZiAocGFyc2VJbnQodGhpcy5Ib3VycywgMTApID09PSAwKQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiQU0iOwoJCQlmaW5hbEhvdXIgPSBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkgKyAxMjsKCQl9CgoJCWVsc2UgaWYgKHBhcnNlSW50KHRoaXMuSG91cnMsIDEwKSA9PT0gMTIpCgkJewoJCQl0aGlzLkFNb3JQTSA9ICJQTSI7CgkJCWZpbmFsSG91ciA9IDEyOwoJCX0KCgkJZWxzZSBpZiAodGhpcy5Ib3VycyA+IDEyKQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiUE0iOwoJCQlpZiAoKHRoaXMuSG91cnMgLSAxMikgPCAxMCkKCQkJewoJCQkJZmluYWxIb3VyID0gIjAiICsgKChwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkpIC0gMTIpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJZmluYWxIb3VyID0gcGFyc2VJbnQodGhpcy5Ib3VycywgMTApIC0gMTI7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJdGhpcy5BTW9yUE0gPSAiQU0iOwoJCQlpZiAodGhpcy5Ib3VycyA8IDEwKQoJCQl7CgkJCQlmaW5hbEhvdXIgPSAiMCIgKyBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCk7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlmaW5hbEhvdXIgPSB0aGlzLkhvdXJzOwoJCQl9CgkJfQoJfQoKCWVsc2UgaWYgKFRpbWVNb2RlID09PSAyNCkKCXsKCQlpZiAodGhpcy5Ib3VycyA8IDEwKQoJCXsKCQkJZmluYWxIb3VyID0gIjAiICsgcGFyc2VJbnQodGhpcy5Ib3VycywgMTApOwoJCX0KCQllbHNlCgkJewoJCQlmaW5hbEhvdXIgPSB0aGlzLkhvdXJzOwoJCX0KCX0KCglyZXR1cm4gZmluYWxIb3VyOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLmdldFNob3dBTW9yUE0gPSBmdW5jdGlvbiAoKQp7CglyZXR1cm4gdGhpcy5BTW9yUE07Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuR2V0TW9udGhOYW1lID0gZnVuY3Rpb24gKElzTG9uZykKewoJdmFyIE1vbnRoID0gTW9udGhOYW1lW3RoaXMuTW9udGhdOwoJaWYgKElzTG9uZykKCXsKCQlyZXR1cm4gTW9udGg7Cgl9CgllbHNlCgl7CgkJcmV0dXJuIE1vbnRoLnN1YnN0cigwLCAzKTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5HZXRNb25EYXlzID0gZnVuY3Rpb24oKSB7IC8vR2V0IG51bWJlciBvZiBkYXlzIGluIGEgbW9udGgKCiAgICB2YXIgRGF5c0luTW9udGggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICBpZiAoQ2FsLklzTGVhcFllYXIoKSkgewogICAgICAgIERheXNJbk1vbnRoWzFdID0gMjk7CiAgICB9CgogICAgcmV0dXJuIERheXNJbk1vbnRoW3RoaXMuTW9udGhdOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLklzTGVhcFllYXIgPSBmdW5jdGlvbiAoKQp7CglpZiAoKHRoaXMuWWVhciAlIDQpID09PSAwKQoJewoJCWlmICgodGhpcy5ZZWFyICUgMTAwID09PSAwKSAmJiAodGhpcy5ZZWFyICUgNDAwKSAhPT0gMCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJZWxzZQoJewoJCXJldHVybiBmYWxzZTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Gb3JtYXREYXRlID0gZnVuY3Rpb24gKHBEYXRlKQp7Cgl2YXIgTW9udGhEaWdpdCA9IHRoaXMuTW9udGggKyAxOwoJaWYgKFByZWNlZGVaZXJvID09PSB0cnVlKQoJewoJCWlmICgocERhdGUgPCAxMCkgJiYgU3RyaW5nKHBEYXRlKS5sZW5ndGg9PT0xKSAvL2xlbmd0aCBjaGVja2luZyBhZGRlZCBpbiB2ZXJzaW9uIDIuMgoJCXsJCQoJCQlwRGF0ZSA9ICIwIiArIHBEYXRlOwoJCX0KCQlpZiAoTW9udGhEaWdpdCA8IDEwKQoJCXsKCQkJTW9udGhEaWdpdCA9ICIwIiArIE1vbnRoRGlnaXQ7CgkJfQoJfQoKCXN3aXRjaCAodGhpcy5Gb3JtYXQudG9VcHBlckNhc2UoKSkKCXsKCQljYXNlICJERE1NWVlZWSI6CgkJcmV0dXJuIChwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiRERNTU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NRERZWVlZIjoKCQlyZXR1cm4gKE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJNTU1ERFlZWVkiOgoJCXJldHVybiAodGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiWVlZWU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWVlZTU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJZGVmYXVsdDoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArICh0aGlzLk1vbnRoICsgMSkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCX0KfTsKCi8vIGVuZCBDYWxlbmRhciBwcm90b3R5cGUKCmZ1bmN0aW9uIEdlbkNlbGwocFZhbHVlLCBwSGlnaExpZ2h0LCBwQ29sb3IsIHBDbGlja2FibGUpCnsgLy9HZW5lcmF0ZSB0YWJsZSBjZWxsIHdpdGggdmFsdWUKCXZhciBQVmFsdWUsCglQQ2VsbFN0ciwKCVBDbGlja2FibGUsCgl2VGltZVN0cjsKCglpZiAoIXBWYWx1ZSkKCXsKCQlQVmFsdWUgPSAiIjsKCX0KCWVsc2UKCXsKCQlQVmFsdWUgPSBwVmFsdWU7Cgl9CgoJaWYgKHBDb2xvciA9PT0gdW5kZWZpbmVkKQoJICAgIHBDb2xvciA9IENhbEJnQ29sb3I7CgkKCWlmIChwQ2xpY2thYmxlICE9PSB1bmRlZmluZWQpewoJCVBDbGlja2FibGUgPSBwQ2xpY2thYmxlOwoJfQoJZWxzZXsKCQlQQ2xpY2thYmxlID0gdHJ1ZTsKCX0KCglpZiAoQ2FsLlNob3dUaW1lKQoJewoJCXZUaW1lU3RyID0gJyAnICsgQ2FsLkhvdXJzICsgJzonICsgQ2FsLk1pbnV0ZXM7CgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJCXZUaW1lU3RyICs9ICc6JyArIENhbC5TZWNvbmRzOwoJCX0KCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJdlRpbWVTdHIgKz0gJyAnICsgQ2FsLkFNb3JQTTsKCQl9Cgl9CgoJZWxzZQoJewoJCXZUaW1lU3RyID0gIiI7Cgl9CgoJaWYgKFBWYWx1ZSAhPT0gIiIpCgl7CgkJaWYgKFBDbGlja2FibGUgPT09IHRydWUpIHsKCQkgICAgaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQkgICAgeyBQQ2VsbFN0ciA9ICI8dGQgaWQ9J2MiICsgUFZhbHVlICsgIicgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBvbm1vdXNlZG93bj0nc2VsZWN0RGF0ZSh0aGlzLCIgKyBQVmFsdWUgKyAiKTsnPiIgKyBQVmFsdWUgKyAiPC90ZD4iOyB9CgkJICAgIGVsc2UgeyBQQ2VsbFN0ciA9ICI8dGQgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiICsgcENvbG9yICsgIicgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKTsnIG9ubW91c2VvdXQ9XCJjaGFuZ2VCb3JkZXIodGhpcywgMSwgJyIgKyBwQ29sb3IgKyAiJyk7XCIgb25DbGljaz1cImphdmFzY3JpcHQ6Y2FsbGJhY2soJyIgKyBDYWwuQ3RybCArICInLCciICsgQ2FsLkZvcm1hdERhdGUoUFZhbHVlKSArICInKTtcIj4iICsgUFZhbHVlICsgIjwvdGQ+IjsgfQoJCX0KCQllbHNlCgkJeyBQQ2VsbFN0ciA9ICI8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IitwQ29sb3IrIicgY2xhc3M9J2NhbFREJz4iK1BWYWx1ZSsiPC90ZD4iOyB9Cgl9CgllbHNlCgl7IFBDZWxsU3RyID0gIjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBjbGFzcz0nY2FsVEQnPiZuYnNwOzwvdGQ+IjsgfQoKCXJldHVybiBQQ2VsbFN0cjsKfQoKZnVuY3Rpb24gUmVuZGVyQ3NzQ2FsKGJOZXdDYWwpCnsKCglpZiAodHlwZW9mIGJOZXdDYWwgPT09ICJ1bmRlZmluZWQiIHx8IGJOZXdDYWwgIT09IHRydWUpCgl7CgkJYk5ld0NhbCA9IGZhbHNlOwoJfQoJdmFyIHZDYWxIZWFkZXIsCgl2Q2FsRGF0YSwKCXZDYWxUaW1lID0gIiIsCgl2Q2FsQ2xvc2luZyA9ICIiLAoJd2luQ2FsRGF0YSA9ICIiLAoJQ2FsRGF0ZSwKCglpLAoJaiwKCglTZWxlY3RTdHIsCgl2RGF5Q291bnQgPSAwLAoJdkZpcnN0RGF5LAoKCVdlZWtEYXlOYW1lID0gW10sLy9BZGRlZCB2ZXJzaW9uIDEuNwoJc3RyQ2VsbCwKCglzaG93SG91ciwKCVNob3dBcnJvd3MgPSBmYWxzZSwKCUhvdXJDZWxsV2lkdGggPSAiMzVweCIsIC8vY2VsbCB3aWR0aCB3aXRoIHNlY29uZHMuCgoJU2VsZWN0QW0sCglTZWxlY3RQbSwKCglmdW5jQ2FsYmFjaywKCgloZWFkSUQsCgllLAoJY3NzU3RyLAoJc3R5bGUsCgljc3NUZXh0LAoJc3BhbjsKCgljYWxIZWlnaHQgPSAwOyAvLyByZXNldCB0aGUgd2luZG93IGhlaWdodCBvbiByZWZyZXNoCgoJLy8gU2V0IHRoZSBkZWZhdWx0IGN1cnNvciBmb3IgdGhlIGNhbGVuZGFyCgoJd2luQ2FsRGF0YSA9ICI8c3BhbiBzdHlsZT0nY3Vyc29yOmF1dG87Jz4iOwoJdkNhbEhlYWRlciA9ICI8dGFibGUgc3R5bGU9J2JhY2tncm91bmQtY29sb3I6IitDYWxCZ0NvbG9yKyI7d2lkdGg6MjAwcHg7cGFkZGluZzowO21hcmdpbjo1cHggYXV0byA1cHggYXV0byc+PHRib2R5PiI7CgoJLy9UYWJsZSBmb3IgTW9udGggJiBZZWFyIFNlbGVjdG9yCgoJdkNhbEhlYWRlciArPSAiPHRyPjx0ZCBjb2xzcGFuPSc3Jz48dGFibGUgYm9yZGVyPScwJyB3aWR0aD0nMjAwcHgnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRyPiI7CgkvLyoqKioqKioqKioqKioqKioqKk1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGRyb3Bkb3duIGxpc3QqKioqKioqKioqKioqKioqKioqKioqKioKCglpZiAoQ2FsLlNjcm9sbGVyID09PSAiRFJPUERPV04iKQoJewoJICAgIHZDYWxIZWFkZXIgKz0gIjx0ZCBhbGlnbj0nY2VudGVyJz48c2VsZWN0IG5hbWU9J01vbnRoU2VsZWN0b3InIG9uQ2hhbmdlPSdqYXZhc2NyaXB0OkNhbC5Td2l0Y2hNdGgodGhpcy5zZWxlY3RlZEluZGV4KTtSZW5kZXJDc3NDYWwoKTsnPiI7CgkJZm9yIChpID0gMDsgaSA8IDEyOyBpICs9IDEpCgkJewoJCQlpZiAoaSA9PT0gQ2FsLk1vbnRoKQoJCQl7CgkJCQlTZWxlY3RTdHIgPSAiU2VsZWN0ZWQiOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJU2VsZWN0U3RyID0gIiI7CgkJCX0KCQkJdkNhbEhlYWRlciArPSAiPG9wdGlvbiAiICsgU2VsZWN0U3RyICsgIiB2YWx1ZT0iICsgaSArICI+IiArIE1vbnRoTmFtZVtpXSArICI8L29wdGlvbj4iOwoJCX0KCgkJdkNhbEhlYWRlciArPSAiPC9zZWxlY3Q+PC90ZD4iOwoJCS8vWWVhciBzZWxlY3RvcgoKCQl2Q2FsSGVhZGVyICs9ICI8dGQgYWxpZ249J2NlbnRlcic+PHNlbGVjdCBuYW1lPSdZZWFyU2VsZWN0b3InIHNpemU9JzEnIG9uQ2hhbmdlPSdqYXZhc2NyaXB0OkNhbC5Td2l0Y2hZZWFyKHRoaXMudmFsdWUpO1JlbmRlckNzc0NhbCgpOyc+IjsKCQlmb3IgKGkgPSBTdGFydFllYXI7IGkgPD0gKGR0VG9kYXkuZ2V0RnVsbFllYXIoKSArIEVuZFllYXIpOyBpICs9IDEpCgkJewoJCQlpZiAoaSA9PT0gQ2FsLlllYXIpCgkJCXsKCQkJCVNlbGVjdFN0ciA9ICdzZWxlY3RlZD0ic2VsZWN0ZWQiJzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCVNlbGVjdFN0ciA9ICcnOwoJCQl9CgkJCXZDYWxIZWFkZXIgKz0gIjxvcHRpb24gIiArIFNlbGVjdFN0ciArICIgdmFsdWU9IiArIGkgKyAiPiIgKyBpICsgIjwvb3B0aW9uPlxuIjsKCQl9CgkJdkNhbEhlYWRlciArPSAiPC9zZWxlY3Q+PC90ZD5cbiI7CgkJY2FsSGVpZ2h0ICs9IDMwOwoJfQoKCS8vKioqKioqKioqKioqKioqKioqRW5kIE1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGRyb3Bkb3duIGxpc3QqKioqKioqKioqKioqKioqKioqKioKCgkvLyoqKioqKioqKioqKioqKioqKk1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGFycm93KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJZWxzZSBpZiAoQ2FsLlNjcm9sbGVyID09PSAiQVJST1ciKQoJewoJCWlmIChVc2VJbWFnZUZpbGVzKQoJCXsKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxpbWcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkRlY1llYXIoKTtSZW5kZXJDc3NDYWwoKTsnIHNyYz0nIitpbWFnZUZpbGVzUGF0aCsiY2FsX2Zhc3RyZXZlcnNlLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOScgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD5cbiI7Ly9ZZWFyIHNjcm9sbGVyIChkZWNyZWFzZSAxIHllYXIpCgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48aW1nIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNNb250aCgpO1JlbmRlckNzc0NhbCgpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX3JldmVyc2UuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPlxuIjsgLy9Nb250aCBzY3JvbGxlciAoZGVjcmVhc2UgMSBtb250aCkKCQkJdkNhbEhlYWRlciArPSAiPHRkIHdpZHRoPSc3MCUnIGNsYXNzPSdjYWxSJyBzdHlsZT0nY29sb3I6IitZclNlbENvbG9yKyInPiIrIENhbC5HZXRNb250aE5hbWUoU2hvd0xvbmdNb250aCkgKyAiICIgKyBDYWwuWWVhciArICI8L3RkPiI7IC8vTW9udGggYW5kIFllYXIKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxpbWcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkluY01vbnRoKCk7UmVuZGVyQ3NzQ2FsKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfZm9yd2FyZC5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzknIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+XG4iOyAvL01vbnRoIHNjcm9sbGVyIChpbmNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jWWVhcigpO1JlbmRlckNzc0NhbCgpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX2Zhc3Rmb3J3YXJkLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOScgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD5cbiI7IC8vWWVhciBzY3JvbGxlciAoaW5jcmVhc2UgMSB5ZWFyKQoJCQljYWxIZWlnaHQgKz0gMjI7CgkJfQoJCWVsc2UKCQl7CgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48c3BhbiBpZD0nZGVjX3llYXInIHRpdGxlPSdyZXZlcnNlIHllYXInIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNZZWFyKCk7UmVuZGVyQ3NzQ2FsKCk7JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlOyBjb2xvcjoiICsgWXJTZWxDb2xvciArICInPi08L3NwYW4+PC90ZD4iOy8vWWVhciBzY3JvbGxlciAoZGVjcmVhc2UgMSB5ZWFyKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PHNwYW4gaWQ9J2RlY19tb250aCcgdGl0bGU9J3JldmVyc2UgbW9udGgnIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5EZWNNb250aCgpO1JlbmRlckNzc0NhbCgpOycgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+Jmx0Ozwvc3Bhbj48L3RkPlxuIjsvL01vbnRoIHNjcm9sbGVyIChkZWNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQgd2lkdGg9JzcwJScgY2xhc3M9J2NhbFInIHN0eWxlPSdjb2xvcjoiICsgWXJTZWxDb2xvciArICInPiIgKyBDYWwuR2V0TW9udGhOYW1lKFNob3dMb25nTW9udGgpICsgIiAiICsgQ2FsLlllYXIgKyAiPC90ZD5cbiI7IC8vTW9udGggYW5kIFllYXIKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxzcGFuIGlkPSdpbmNfbW9udGgnIHRpdGxlPSdmb3J3YXJkIG1vbnRoJyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jTW9udGgoKTtSZW5kZXJDc3NDYWwoKTsnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPiZndDs8L3NwYW4+PC90ZD5cbiI7Ly9Nb250aCBzY3JvbGxlciAoaW5jcmVhc2UgMSBtb250aCkKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxzcGFuIGlkPSdpbmNfeWVhcicgdGl0bGU9J2ZvcndhcmQgeWVhcicgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkluY1llYXIoKTtSZW5kZXJDc3NDYWwoKTsnICBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlOyBjb2xvcjoiICsgWXJTZWxDb2xvciArICInPis8L3NwYW4+PC90ZD5cbiI7Ly9ZZWFyIHNjcm9sbGVyIChpbmNyZWFzZSAxIHllYXIpCgkJCWNhbEhlaWdodCArPSAyMjsKCQl9Cgl9CgoJdkNhbEhlYWRlciArPSAiPC90cj48L3RhYmxlPjwvdGQ+PC90cj4iOwoKCS8vKioqKioqKioqKioqKioqKioqRW5kIE1vbnRoIGFuZCBZZWFyIHNlbGVjdG9yIGluIGFycm93KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJLy9DYWxlbmRhciBoZWFkZXIgc2hvd3MgTW9udGggYW5kIFllYXIKCWlmIChTaG93TW9udGhZZWFyICYmIENhbC5TY3JvbGxlciA9PT0gIkRST1BET1dOIikKCXsKCSAgICB2Q2FsSGVhZGVyICs9ICI8dHI+PHRkIGNvbHNwYW49JzcnIGNsYXNzPSdjYWxSJyBzdHlsZT0nY29sb3I6IiArIE1vbnRoWWVhckNvbG9yICsgIic+IiArIENhbC5HZXRNb250aE5hbWUoU2hvd0xvbmdNb250aCkgKyAiICIgKyBDYWwuWWVhciArICI8L3RkPjwvdHI+IjsKCQljYWxIZWlnaHQgKz0gMTk7Cgl9CgoJLy9XZWVrIGRheSBoZWFkZXIKCgl2Q2FsSGVhZGVyICs9ICI8dHI+PHRkIGNvbHNwYW49XCI3XCI+PHRhYmxlIHN0eWxlPSdib3JkZXItc3BhY2luZzoxcHg7Ym9yZGVyLWNvbGxhcHNlOnNlcGFyYXRlOyc+PHRyPiI7CglpZiAoTW9uZGF5Rmlyc3REYXkgPT09IHRydWUpCgl7CgkJV2Vla0RheU5hbWUgPSBXZWVrRGF5TmFtZTI7Cgl9CgllbHNlCgl7CgkJV2Vla0RheU5hbWUgPSBXZWVrRGF5TmFtZTE7Cgl9Cglmb3IgKGkgPSAwOyBpIDwgNzsgaSArPSAxKQoJewoJICAgIHZDYWxIZWFkZXIgKz0gIjx0ZCBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjoiK1dlZWtIZWFkQ29sb3IrIjt3aWR0aDoiK0NlbGxXaWR0aCsicHg7Y29sb3I6I0ZGRkZGRicgY2xhc3M9J2NhbFREJz4iICsgV2Vla0RheU5hbWVbaV0uc3Vic3RyKDAsIFdlZWtDaGFyKSArICI8L3RkPiI7Cgl9CgoJY2FsSGVpZ2h0ICs9IDE5OwoJdkNhbEhlYWRlciArPSAiPC90cj4iOwoJLy9DYWxlbmRhciBkZXRhaWwKCUNhbERhdGUgPSBuZXcgRGF0ZShDYWwuWWVhciwgQ2FsLk1vbnRoKTsKCUNhbERhdGUuc2V0RGF0ZSgxKTsKCgl2Rmlyc3REYXkgPSBDYWxEYXRlLmdldERheSgpOwoKCS8vQWRkZWQgdmVyc2lvbiAxLjcKCglpZiAoTW9uZGF5Rmlyc3REYXkgPT09IHRydWUpCgl7CgkJdkZpcnN0RGF5IC09IDE7CgkJaWYgKHZGaXJzdERheSA9PT0gLTEpCgkJewoJCQl2Rmlyc3REYXkgPSA2OwoJCX0KCX0KCgkvL0FkZGVkIHZlcnNpb24gMS43Cgl2Q2FsRGF0YSA9ICI8dHI+IjsKCWNhbEhlaWdodCArPSAxOTsKCWZvciAoaSA9IDA7IGkgPCB2Rmlyc3REYXk7IGkgKz0gMSkKCXsKCQl2Q2FsRGF0YSA9IHZDYWxEYXRhICsgR2VuQ2VsbCgpOwoJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7Cgl9CgoJLy9BZGRlZCB2ZXJzaW9uIDEuNwoJZm9yIChqID0gMTsgaiA8PSBDYWwuR2V0TW9uRGF5cygpOyBqICs9IDEpCgl7CgkJaWYgKCh2RGF5Q291bnQgJSA3ID09PSAwKSAmJiAoaiA+IDEpKQoJCXsKCQkJdkNhbERhdGEgPSB2Q2FsRGF0YSArICI8dHI+IjsKCQl9CgoJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7CgkJLy9hZGRlZCB2ZXJzaW9uIDIuMS4yCgkJaWYgKERpc2FibGVCZWZvcmVUb2RheSA9PT0gdHJ1ZSAmJiAoKGogPCBkdFRvZGF5LmdldERhdGUoKSkgJiYgKENhbC5Nb250aCA9PT0gZHRUb2RheS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkgfHwgKENhbC5Nb250aCA8IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpIHx8IChDYWwuWWVhciA8IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkpKQoJCXsKCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgZmFsc2UsIERpc2FibGVDb2xvciwgZmFsc2UpOy8vQmVmb3JlIHRvZGF5J3MgZGF0ZSBpcyBub3QgY2xpY2thYmxlCgkJfQoJCS8vaWYgRW5kIFllYXIgKyBDdXJyZW50IFllYXIgPSBDYWwuWWVhci4gRGlzYWJsZS4KCQllbHNlIGlmIChDYWwuWWVhciA+IChkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikpCgkJewoJCSAgICBzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgRGlzYWJsZUNvbG9yLCBmYWxzZSk7IAoJCX0KCQllbHNlIGlmICgoaiA9PT0gZHRUb2RheS5nZXREYXRlKCkpICYmIChDYWwuTW9udGggPT09IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpKQoJCXsKCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgdHJ1ZSwgVG9kYXlDb2xvcik7Ly9IaWdobGlnaHQgdG9kYXkncyBkYXRlCgkJfQoJCWVsc2UKCQl7CgkJCWlmICgoaiA9PT0gc2VsRGF0ZS5nZXREYXRlKCkpICYmIChDYWwuTW9udGggPT09IHNlbERhdGUuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBzZWxEYXRlLmdldEZ1bGxZZWFyKCkpKXsKCQkJICAgICAvL21vZGlmaWVkIHZlcnNpb24gMS43CgkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCB0cnVlLCBTZWxEYXRlQ29sb3IpOwogICAgICAgICAgICB9CgkJCWVsc2UKCQkJewoJCQkJaWYgKE1vbmRheUZpcnN0RGF5ID09PSB0cnVlKQoJCQkJewoJCQkJCWlmICh2RGF5Q291bnQgJSA3ID09PSAwKQoJCQkJCXsKCQkJCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgZmFsc2UsIFN1bmRheUNvbG9yKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKHZEYXlDb3VudCArIDEpICUgNyA9PT0gMCkKCQkJCQl7CgkJCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBTYXR1cmRheUNvbG9yKTsKCQkJCQl9CgkJCQkJZWxzZQoJCQkJCXsKCQkJCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgbnVsbCwgV2Vla0RheUNvbG9yKTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlCgkJCQl7CgkJCQkJaWYgKHZEYXlDb3VudCAlIDcgPT09IDApCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgU2F0dXJkYXlDb2xvcik7CgkJCQkJfQoJCQkJCWVsc2UgaWYgKCh2RGF5Q291bnQgKyA2KSAlIDcgPT09IDApCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgU3VuZGF5Q29sb3IpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBudWxsLCBXZWVrRGF5Q29sb3IpOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCgkJdkNhbERhdGEgPSB2Q2FsRGF0YSArIHN0ckNlbGw7CgoJCWlmICgodkRheUNvdW50ICUgNyA9PT0gMCkgJiYgKGogPCBDYWwuR2V0TW9uRGF5cygpKSkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiXG48L3RyPiI7CgkJCWNhbEhlaWdodCArPSAxOTsKCQl9Cgl9CgoJLy8gZmluaXNoIHRoZSB0YWJsZSBwcm9wZXIKCglpZiAodkRheUNvdW50ICUgNyAhPT0gMCkKCXsKCQl3aGlsZSAodkRheUNvdW50ICUgNyAhPT0gMCkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyBHZW5DZWxsKCk7CgkJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7CgkJfQoJfQoKCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiPC90YWJsZT48L3RkPjwvdHI+IjsKCgoJLy9UaW1lIHBpY2tlcgoJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCXsKCQlzaG93SG91ciA9IENhbC5nZXRTaG93SG91cigpOwoKCQlpZiAoQ2FsLlNob3dTZWNvbmRzID09PSBmYWxzZSAmJiBUaW1lTW9kZSA9PT0gMjQpCgkJewoJCQlTaG93QXJyb3dzID0gdHJ1ZTsKCQkJSG91ckNlbGxXaWR0aCA9ICIxMHB4IjsKCQl9CgoJCXZDYWxUaW1lID0gIjx0cj48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj48dGFibGUgYm9yZGVyPScwJyB3aWR0aD0nMTk5cHgnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRib2R5Pjx0cj48dGQgaGVpZ2h0PSc1cHgnIHdpZHRoPSciICsgSG91ckNlbGxXaWR0aCArICInPiZuYnNwOzwvdGQ+IjsKCgkJaWYgKFNob3dBcnJvd3MgJiYgVXNlSW1hZ2VGaWxlcykgLy90aGlzIGlzIHdoZXJlIHRoZSB1cCBhbmQgZG93biBhcnJvdyBjb250cm9sIHRoZSBob3VyLgoJCXsKCQkgICAgdkNhbFRpbWUgKz0gIjx0ZCBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PHRhYmxlIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMCcgc3R5bGU9J2xpbmUtaGVpZ2h0OjBwdDt3aWR0aDoxMDAlOyc+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9uY2xpY2s9J25leHRTdGVwKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNlZG93bj0nc3RhcnRTcGluKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfcGx1cy5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzlweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBvbmNsaWNrPSduZXh0U3RlcChcIkhvdXJcIiwgXCJtaW51c1wiKTsnIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJIb3VyXCIsIFwibWludXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfbWludXMuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+XG4iOwoJCX0KCgkJdkNhbFRpbWUgKz0gIjx0ZCB3aWR0aD0nMjJweCc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2hvdXInIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOjIycHhcIiB2YWx1ZT0iICsgc2hvd0hvdXIgKyAiIG9ua2V5dXA9XCJqYXZhc2NyaXB0OkNhbC5TZXRIb3VyKHRoaXMudmFsdWUpXCI+IjsKCQl2Q2FsVGltZSArPSAiPC90ZD48dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjpjZW50ZXI7Jz46PC90ZD48dGQgd2lkdGg9JzIycHgnPiI7CgkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdtaW51dGUnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5NaW51dGVzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0TWludXRlKHRoaXMudmFsdWUpXCI+IjsKCgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJICAgIHZDYWxUaW1lICs9ICI8L3RkPjx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDsnPjo8L3RkPjx0ZCB3aWR0aD0nMjJweCc+IjsKCQkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZWNvbmQnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5TZWNvbmRzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0U2Vjb25kKHBhcnNlSW50KHRoaXMudmFsdWUsMTApKVwiPiI7CgkJfQoKCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJU2VsZWN0QW0gPSAoQ2FsLkFNb3JQTSA9PT0gIkFNIikgPyAiU2VsZWN0ZWQiIDogIiI7CgkJCVNlbGVjdFBtID0gKENhbC5BTW9yUE0gPT09ICJQTSIpID8gIlNlbGVjdGVkIiA6ICIiOwoKCQkJdkNhbFRpbWUgKz0gIjwvdGQ+PHRkPiI7CgkJCXZDYWxUaW1lICs9ICI8c2VsZWN0IG5hbWU9XCJhbXBtXCIgb25DaGFuZ2U9XCJqYXZhc2NyaXB0OkNhbC5TZXRBbVBtKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTtcIj4iOwoJCQl2Q2FsVGltZSArPSAiPG9wdGlvbiAiICsgU2VsZWN0QW0gKyAiIHZhbHVlPVwiQU1cIj5BTTwvb3B0aW9uPiI7CgkJCXZDYWxUaW1lICs9ICI8b3B0aW9uICIgKyBTZWxlY3RQbSArICIgdmFsdWU9XCJQTVwiPlBNPG9wdGlvbj4iOwoJCQl2Q2FsVGltZSArPSAiPC9zZWxlY3Q+IjsKCQl9CgoJCWlmIChTaG93QXJyb3dzICYmIFVzZUltYWdlRmlsZXMpIC8vdGhpcyBpcyB3aGVyZSB0aGUgdXAgYW5kIGRvd24gYXJyb3cgdG8gY2hhbmdlIHRoZSAiTWludXRlIi4KCQl7CgkJICAgIHZDYWxUaW1lICs9ICI8L3RkPlxuPHRkIHN0eWxlPSd2ZXJ0aWNhbC1hbGlnbjptaWRkbGU7Jz48dGFibGUgY2VsbHNwYWNpbmc9JzAnIGNlbGxwYWRkaW5nPScwJyBzdHlsZT0nbGluZS1oZWlnaHQ6MHB0O3dpZHRoOjEwMCUnPjx0cj48dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBvbmNsaWNrPSduZXh0U3RlcChcIk1pbnV0ZVwiLCBcInBsdXNcIik7JyBvbm1vdXNlZG93bj0nc3RhcnRTcGluKFwiTWludXRlXCIsIFwicGx1c1wiKTsnIG9ubW91c2V1cD0nc3RvcFNwaW4oKTsnIHNyYz0nIiArIGltYWdlRmlsZXNQYXRoICsgImNhbF9wbHVzLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOXB4JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPjwvdHI+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJNaW51dGVcIiwgXCJtaW51c1wiKTsnIG9ubW91c2V1cD0nc3RvcFNwaW4oKTsnIG9uY2xpY2s9J25leHRTdGVwKFwiTWludXRlXCIsXCJtaW51c1wiKTsnIHNyYz0nIiArIGltYWdlRmlsZXNQYXRoICsgImNhbF9taW51cy5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzlweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD48L3RyPjwvdGFibGU+IjsKCQl9CgoJCXZDYWxUaW1lICs9ICI8L3RkPlxuPHRkIGFsaWduPSdyaWdodCcgdmFsaWduPSdib3R0b20nIHdpZHRoPSciICsgSG91ckNlbGxXaWR0aCArICJweCc+PC90ZD48L3RyPiI7CgkJdkNhbFRpbWUgKz0gIjx0cj48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj48aW5wdXQgc3R5bGU9J3dpZHRoOjYwcHg7Zm9udC1zaXplOjEycHg7JyBvbkNsaWNrPSdqYXZhc2NyaXB0OmNsb3Nld2luKFwiIiArIENhbC5DdHJsICsgIlwiKTsnICB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJPS1wiPiZuYnNwOzxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDtmb250LXNpemU6MTJweDsnIG9uQ2xpY2s9J2phdmFzY3JpcHQ6IHdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIicgdHlwZT1cImJ1dHRvblwiIHZhbHVlPVwiQ2FuY2VsXCI+PC90ZD48L3RyPiI7Cgl9CgllbHNlIC8vaWYgbm90IHRvIHNob3cgdGltZS4KCXsKCSAgICB2Q2FsVGltZSArPSAiXG48dHI+XG48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiPiI7CgkgICAgLy9jbG9zZSBidXR0b24KCSAgICBpZiAoVXNlSW1hZ2VGaWxlcykgewoJICAgICAgICB2Q2FsQ2xvc2luZyArPSAiPGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpjbG9zZXdpbihcIiIgKyBDYWwuQ3RybCArICJcIik7IHN0b3BTcGluKCk7JyBzcmM9JyIraW1hZ2VGaWxlc1BhdGgrImNhbF9jbG9zZS5naWYnIHdpZHRoPScxNnB4JyBoZWlnaHQ9JzE0cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD4iOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgdkNhbENsb3NpbmcgKz0gIjxzcGFuIGlkPSdjbG9zZV9jYWwnIHRpdGxlPSdjbG9zZSdvbm1vdXNlZG93bj0namF2YXNjcmlwdDpjbG9zZXdpbihcIiIgKyBDYWwuQ3RybCArICJcIik7c3RvcFNwaW4oKTsnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZTsgZm9udC1mYW1pbHk6IEFyaWFsO2ZvbnQtc2l6ZTogMTBwdDsnPng8L3NwYW4+PC90ZD4iOwoJICAgIH0KCSAgICB2Q2FsQ2xvc2luZyArPSAiPC90cj4iOwoJfQoKCgoJdkNhbENsb3NpbmcgKz0gIjwvdGJvZHk+PC90YWJsZT48L3RkPjwvdHI+IjsKCWNhbEhlaWdodCArPSAzMTsKCXZDYWxDbG9zaW5nICs9ICI8L3Rib2R5PjwvdGFibGU+XG48L3NwYW4+IjsKCgkvL2VuZCB0aW1lIHBpY2tlcgoJZnVuY0NhbGJhY2sgPSAiZnVuY3Rpb24gY2FsbGJhY2soaWQsIGRhdHVtKSB7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIiB2YXIgQ2FsSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7IGlmIChkYXR1bT09PSAndW5kZWZpbmVkJykgeyB2YXIgZCA9IG5ldyBEYXRlKCk7IGRhdHVtID0gZC5nZXREYXRlKCkgKyAnLycgKyhkLmdldE1vbnRoKCkrMSkgKyAnLycgKyBkLmdldEZ1bGxZZWFyKCk7IH0gd2luZG93LmNhbERhdHVtPWRhdHVtO0NhbElkLnZhbHVlPWRhdHVtO1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgaWYgKENhbC5TaG93VGltZSkge1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgQ2FsSWQudmFsdWUrPScgJytDYWwuZ2V0U2hvd0hvdXIoKSsnOicrQ2FsLk1pbnV0ZXM7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIiBpZiAoQ2FsLlNob3dTZWNvbmRzKVxuICBDYWxJZC52YWx1ZSs9JzonK0NhbC5TZWNvbmRzO1xuIjsKCWZ1bmNDYWxiYWNrICs9ICIgaWYgKFRpbWVNb2RlID09PSAxMilcbiAgQ2FsSWQudmFsdWUrPScnK0NhbC5nZXRTaG93QU1vclBNKCk7XG4iOwoJZnVuY0NhbGJhY2sgKz0gIn1cbiB3aW5DYWwuc3R5bGUudmlzaWJpbGl0eT0naGlkZGVuJztcbn1cbiI7CgoKCS8vIGRldGVybWluZXMgaWYgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIG9wZW4gdGhlIGNhbCBhYm92ZSB0aGUgcG9zaXRpb24gd2hlcmUgaXQgaXMgY2FsbGVkCglpZiAoeXBvcyA+IGNhbEhlaWdodCkKCXsKCQl5cG9zID0geXBvcyAtIGNhbEhlaWdodDsKCX0KCglpZiAoIXdpbkNhbCkKCXsKCQloZWFkSUQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdOwoKCQkvLyBhZGQgamF2YXNjcmlwdCBmdW5jdGlvbiB0byB0aGUgc3BhbiBjYWwKCQllID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CgkJZS50eXBlID0gInRleHQvamF2YXNjcmlwdCI7CgkJZS5sYW5ndWFnZSA9ICJqYXZhc2NyaXB0IjsKCQllLnRleHQgPSBmdW5jQ2FsYmFjazsKCQloZWFkSUQuYXBwZW5kQ2hpbGQoZSk7CgkJLy8gYWRkIHN0eWxlc2hlZXQgdG8gdGhlIHNwYW4gY2FsCgoJCWNzc1N0ciA9ICIuY2FsVEQge2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgYm9yZGVyOjA7IH1cbiI7CgkJY3NzU3RyICs9ICIuY2FsUiB7Zm9udC1mYW1pbHk6IHZlcmRhbmE7IGZvbnQtc2l6ZTogMTJweDsgdGV4dC1hbGlnbjogY2VudGVyOyBmb250LXdlaWdodDogYm9sZDt9IjsKCgkJc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpOwoJCXN0eWxlLnR5cGUgPSAidGV4dC9jc3MiOwoJCXN0eWxlLnJlbCA9ICJzdHlsZXNoZWV0IjsKCQlpZiAoc3R5bGUuc3R5bGVTaGVldCkKCQl7IC8vIElFCgkJCXN0eWxlLnN0eWxlU2hlZXQuY3NzVGV4dCA9IGNzc1N0cjsKCQl9CgoJCWVsc2UKCQl7IC8vIHczYwoJCQljc3NUZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3NzU3RyKTsKCQkJc3R5bGUuYXBwZW5kQ2hpbGQoY3NzVGV4dCk7CgkJfQoKCQloZWFkSUQuYXBwZW5kQ2hpbGQoc3R5bGUpOwoJCS8vIGNyZWF0ZSB0aGUgb3V0ZXIgZnJhbWUgdGhhdCBhbGxvd3MgdGhlIGNhbC4gdG8gYmUgbW92ZWQKCQlzcGFuID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwoJCXNwYW4uaWQgPSBjYWxTcGFuSUQ7CgkJc3Bhbi5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CgkJc3Bhbi5zdHlsZS5sZWZ0ID0gKHhwb3MgKyBDYWxQb3NPZmZzZXRYKSArICdweCc7CgkJc3Bhbi5zdHlsZS50b3AgPSAoeXBvcyAtIENhbFBvc09mZnNldFkpICsgJ3B4JzsKCQlzcGFuLnN0eWxlLndpZHRoID0gQ2FsV2lkdGggKyAncHgnOwoJCXNwYW4uc3R5bGUuYm9yZGVyID0gInNvbGlkIDFwdCAiICsgU3BhbkJvcmRlckNvbG9yOwoJCXNwYW4uc3R5bGUucGFkZGluZyA9ICIwIjsKCQlzcGFuLnN0eWxlLmN1cnNvciA9ICJtb3ZlIjsKCQlzcGFuLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IENhbEJnQ29sb3I7CgkJc3Bhbi5zdHlsZS56SW5kZXggPSAxMDA7CgkJZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzcGFuKTsKCQl3aW5DYWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChjYWxTcGFuSUQpOwoJfQoKCWVsc2UKCXsKCQl3aW5DYWwuc3R5bGUudmlzaWJpbGl0eSA9ICJ2aXNpYmxlIjsKCQl3aW5DYWwuc3R5bGUuSGVpZ2h0ID0gY2FsSGVpZ2h0OwoKCQkvLyBzZXQgdGhlIHBvc2l0aW9uIGZvciBhIG5ldyBjYWxlbmRhciBvbmx5CgkJaWYgKGJOZXdDYWwgPT09IHRydWUpCgkJewoJCQl3aW5DYWwuc3R5bGUubGVmdCA9ICh4cG9zICsgQ2FsUG9zT2Zmc2V0WCkgKyAncHgnOwoJCQl3aW5DYWwuc3R5bGUudG9wID0gKHlwb3MgLSBDYWxQb3NPZmZzZXRZKSArICdweCc7CgkJfQoJfQoKCXdpbkNhbC5pbm5lckhUTUwgPSB3aW5DYWxEYXRhICsgdkNhbEhlYWRlciArIHZDYWxEYXRhICsgdkNhbFRpbWUgKyB2Q2FsQ2xvc2luZzsKCXJldHVybiB0cnVlOwp9CgoKZnVuY3Rpb24gTmV3Q3NzQ2FsKHBDdHJsLCBwRm9ybWF0LCBwU2Nyb2xsZXIsIHBTaG93VGltZSwgcFRpbWVNb2RlLCBwU2hvd1NlY29uZHMpCnsKCS8vIGdldCBjdXJyZW50IGRhdGUgYW5kIHRpbWUKCglkdFRvZGF5ID0gbmV3IERhdGUoKTsKCUNhbCA9IG5ldyBDYWxlbmRhcihkdFRvZGF5KTsKCglpZiAocFNob3dUaW1lICE9PSB1bmRlZmluZWQpCgl7CgkgICAgaWYgKHBTaG93VGltZSkgewoJICAgICAgICBDYWwuU2hvd1RpbWUgPSB0cnVlOwoJICAgIH0KCSAgICBlbHNlIHsKCSAgICAgICAgQ2FsLlNob3dUaW1lID0gZmFsc2U7CgkgICAgfQoKCQlpZiAocFRpbWVNb2RlKQoJCXsKCQkJcFRpbWVNb2RlID0gcGFyc2VJbnQocFRpbWVNb2RlLCAxMCk7CgkJfQoJCWlmIChwVGltZU1vZGUgPT09IDEyIHx8IHBUaW1lTW9kZSA9PT0gMjQpCgkJewoJCQlUaW1lTW9kZSA9IHBUaW1lTW9kZTsKCQl9CgkJZWxzZQoJCXsKCQkJVGltZU1vZGUgPSAyNDsKCQl9CgoJCWlmIChwU2hvd1NlY29uZHMgIT09IHVuZGVmaW5lZCkKCQl7CgkJCWlmIChwU2hvd1NlY29uZHMpCgkJCXsKCQkJCUNhbC5TaG93U2Vjb25kcyA9IHRydWU7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlDYWwuU2hvd1NlY29uZHMgPSBmYWxzZTsKCQkJfQoJCX0KCQllbHNlCgkJewoJCQlDYWwuU2hvd1NlY29uZHMgPSBmYWxzZTsKCQl9CgoJfQoKCWlmIChwQ3RybCAhPT0gdW5kZWZpbmVkKQoJewoJCUNhbC5DdHJsID0gcEN0cmw7Cgl9CgoJaWYgKHBGb3JtYXQgIT09IHVuZGVmaW5lZCkKCXsKCQlDYWwuRm9ybWF0ID0gcEZvcm1hdC50b1VwcGVyQ2FzZSgpOwoJfQoJZWxzZQoJewoJCUNhbC5Gb3JtYXQgPSAiTU1ERFlZWVkiOwoJfQoKCWlmIChwU2Nyb2xsZXIgIT09IHVuZGVmaW5lZCkKCXsKCQlpZiAocFNjcm9sbGVyLnRvVXBwZXJDYXNlKCkgPT09ICJBUlJPVyIpCgkJewoJCQlDYWwuU2Nyb2xsZXIgPSAiQVJST1ciOwoJCX0KCQllbHNlCgkJewoJCQlDYWwuU2Nyb2xsZXIgPSAiRFJPUERPV04iOwoJCX0KCX0KCglleERhdGVUaW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocEN0cmwpLnZhbHVlOyAvL0V4aXN0aW5nIERhdGUgVGltZSB2YWx1ZSBpbiB0ZXh0Ym94LgoKCWlmIChleERhdGVUaW1lKQoJeyAvL1BhcnNlIGV4aXN0aW5nIERhdGUgU3RyaW5nCgkJdmFyIFNwMSA9IGV4RGF0ZVRpbWUuaW5kZXhPZihEYXRlU2VwYXJhdG9yLCAwKSwvL0luZGV4IG9mIERhdGUgU2VwYXJhdG9yIDEKCQlTcDIgPSBleERhdGVUaW1lLmluZGV4T2YoRGF0ZVNlcGFyYXRvciwgcGFyc2VJbnQoU3AxLCAxMCkgKyAxKSwvL0luZGV4IG9mIERhdGUgU2VwYXJhdG9yIDIKCQl0U3AxLC8vSW5kZXggb2YgVGltZSBTZXBhcmF0b3IgMQoJCXRTcDIsLy9JbmRleCBvZiBUaW1lIFNlcGFyYXRvciAyCgkJc3RyTW9udGgsCgkJc3RyRGF0ZSwKCQlzdHJZZWFyLAoJCWludE1vbnRoLAoJCVllYXJQYXR0ZXJuLAoJCXN0ckhvdXIsCgkJc3RyTWludXRlLAoJCXN0clNlY29uZCwKCQl3aW5IZWlnaHQsCgkJb2Zmc2V0ID0gcGFyc2VJbnQoQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpLmxhc3RJbmRleE9mKCJNIiksIDEwKSAtIHBhcnNlSW50KENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKS5pbmRleE9mKCJNIiksIDEwKSAtIDEsCgkJc3RyQU1QTSA9ICIiOwoJCS8vcGFyc2UgbW9udGgKCgkJaWYgKENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gIkRETU1ZWVlZIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJERE1NTVlZWVkiKQoJCXsKCQkJaWYgKERhdGVTZXBhcmF0b3IgPT09ICIiKQoJCQl7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDIsIDQgKyBvZmZzZXQpOwoJCQkJc3RyRGF0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDIpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQgKyBvZmZzZXQsIDggKyBvZmZzZXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaWYgKGV4RGF0ZVRpbWUuaW5kZXhPZigiRCoiKSAhPT0gLTEpCgkJCQl7ICAgLy9EVEcKCQkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDgsIDExKTsKCQkJCQlzdHJEYXRlICA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDIpOwoJCQkJCXN0clllYXIgID0gIjIwIiArIGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDExLCAxMyk7ICAvL0hhY2ssIG51ciBmw7xyIEphaHJlc3phaGxlbiBhYiAyMDAwCgoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgNSk7CgkJCQl9CgkJCX0KCQl9CgoJCWVsc2UgaWYgKENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gIk1NRERZWVlZIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJNTU1ERFlZWVkiKXsKCQkJaWYgKERhdGVTZXBhcmF0b3IgPT09ICIiKXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgMiArIG9mZnNldCk7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMiArIG9mZnNldCwgNCArIG9mZnNldCk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoNCArIG9mZnNldCwgOCArIG9mZnNldCk7CgkJCX0KCQkJZWxzZXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDEgKyAxLCBTcDIpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMiArIDEsIFNwMiArIDUpOwoJCQl9CgkJfQoKCQllbHNlIGlmIChDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWVlZTU1ERCIgfHwgQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIil7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQsIDYgKyBvZmZzZXQpOwoJCQkJc3RyRGF0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDYgKyBvZmZzZXQsIDggKyBvZmZzZXQpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDQpOwoJCQl9CgkJCWVsc2V7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMSArIDEsIFNwMik7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgMyk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJfQoJCX0KCgkJZWxzZSBpZiAoQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlNTUREIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIikKCQkJewoJCQkJc3RyTW9udGggPSBleERhdGVUaW1lLnN1YnN0cmluZygyLCA0ICsgb2Zmc2V0KTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyg0ICsgb2Zmc2V0LCA2ICsgb2Zmc2V0KTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCAyKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDIgKyAxLCBTcDIgKyAzKTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCBTcDEpOwoJCQl9CgkJfQoKCQlpZiAoaXNOYU4oc3RyTW9udGgpKXsKCQkJaW50TW9udGggPSBDYWwuR2V0TW9udGhJbmRleChzdHJNb250aCk7CgkJfQoJCWVsc2V7CgkJCWludE1vbnRoID0gcGFyc2VJbnQoc3RyTW9udGgsIDEwKSAtIDE7CgkJfQoJCWlmICgocGFyc2VJbnQoaW50TW9udGgsIDEwKSA+PSAwKSAmJiAocGFyc2VJbnQoaW50TW9udGgsIDEwKSA8IDEyKSkJewoJCQlDYWwuTW9udGggPSBpbnRNb250aDsKCQl9CgkJLy9lbmQgcGFyc2UgbW9udGgKCgkJLy9wYXJzZSB5ZWFyCgkJWWVhclBhdHRlcm4gPSAvXlxkezR9JC87CgkJaWYgKFllYXJQYXR0ZXJuLnRlc3Qoc3RyWWVhcikpIHsKCQkgICAgaWYgKChwYXJzZUludChzdHJZZWFyLCAxMCk+PVN0YXJ0WWVhcikgJiYgKHBhcnNlSW50KHN0clllYXIsIDEwKTw9IChkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikpKQoJCSAgICAgICAgQ2FsLlllYXIgPSBwYXJzZUludChzdHJZZWFyLCAxMCk7CgkJfQoJCS8vZW5kIHBhcnNlIHllYXIKCQkKCQkvL3BhcnNlIERhdGUKCQlpZiAoKHBhcnNlSW50KHN0ckRhdGUsIDEwKSA8PSBDYWwuR2V0TW9uRGF5cygpKSAmJiAocGFyc2VJbnQoc3RyRGF0ZSwgMTApID49IDEpKSB7CgkJCUNhbC5EYXRlID0gc3RyRGF0ZTsKCQl9CgkJLy9lbmQgcGFyc2UgRGF0ZQoKCQkvL3BhcnNlIHRpbWUKCgkJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQl7CgoJCQkvL3BhcnNlIEFNIG9yIFBNCgoJCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCQl7CgkJCQlzdHJBTVBNID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoZXhEYXRlVGltZS5sZW5ndGggLSAyLCBleERhdGVUaW1lLmxlbmd0aCk7CgkJCQlDYWwuQU1vclBNID0gc3RyQU1QTTsKCQkJfQoKCQkJdFNwMSA9IGV4RGF0ZVRpbWUuaW5kZXhPZigiOiIsIDApOwoJCQl0U3AyID0gZXhEYXRlVGltZS5pbmRleE9mKCI6IiwgKHBhcnNlSW50KHRTcDEsIDEwKSArIDEpKTsKCQkJaWYgKHRTcDEgPiAwKQoJCQl7CgoJCQkJc3RySG91ciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKHRTcDEsIHRTcDEgLSAyKTsKCQkJCUNhbC5TZXRIb3VyKHN0ckhvdXIpOwoKCQkJCXN0ck1pbnV0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKHRTcDEgKyAxLCB0U3AxICsgMyk7CgkJCQlDYWwuU2V0TWludXRlKHN0ck1pbnV0ZSk7CgoJCQkJc3RyU2Vjb25kID0gZXhEYXRlVGltZS5zdWJzdHJpbmcodFNwMiArIDEsIHRTcDIgKyAzKTsKCQkJCUNhbC5TZXRTZWNvbmQoc3RyU2Vjb25kKTsKCgkJCX0KCQkJZWxzZSBpZiAoZXhEYXRlVGltZS5pbmRleE9mKCJEKiIpICE9PSAtMSkKCQkJeyAgIC8vRFRHCgkJCQlzdHJIb3VyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMiwgNCk7CgkJCQlDYWwuU2V0SG91cihzdHJIb3VyKTsKCQkJCXN0ck1pbnV0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQsIDYpOwoJCQkJQ2FsLlNldE1pbnV0ZShzdHJNaW51dGUpOwoKCQkJfQoJCX0KCgl9CgoJc2VsRGF0ZSA9IG5ldyBEYXRlKENhbC5ZZWFyLCBDYWwuTW9udGgsIENhbC5EYXRlKTsvL3ZlcnNpb24gMS43CglSZW5kZXJDc3NDYWwodHJ1ZSk7Cn0KCmZ1bmN0aW9uIGNsb3Nld2luKGlkKSB7CiAgICBpZiAoQ2FsLlNob3dUaW1lID09PSB0cnVlKSB7CiAgICAgICAgdmFyIE1heFllYXIgPSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkgKyBFbmRZZWFyOwogICAgICAgIHZhciBiZWZvcmVUb2RheSA9CiAgICAgICAgICAgICAgICAgICAgKENhbC5EYXRlIDwgZHRUb2RheS5nZXREYXRlKCkpICYmCiAgICAgICAgICAgICAgICAgICAgKENhbC5Nb250aCA9PT0gZHRUb2RheS5nZXRNb250aCgpKSAmJgogICAgICAgICAgICAgICAgICAgIChDYWwuWWVhciA9PT0gZHRUb2RheS5nZXRGdWxsWWVhcigpKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKENhbC5Nb250aCA8IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYKICAgICAgICAgICAgICAgICAgICAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChDYWwuWWVhciA8IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSk7CgogICAgICAgIGlmICgoQ2FsLlllYXIgPD0gTWF4WWVhcikgJiYgKENhbC5ZZWFyID49IFN0YXJ0WWVhcikgJiYgKENhbC5Nb250aCA9PT0gc2VsRGF0ZS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IHNlbERhdGUuZ2V0RnVsbFllYXIoKSkpIHsKICAgICAgICAgICAgaWYgKERpc2FibGVCZWZvcmVUb2RheSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgaWYgKGJlZm9yZVRvZGF5ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgIH0KICAgIH0KICAgIAoJdmFyIENhbElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJQ2FsSWQuZm9jdXMoKTsKCXdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCmZ1bmN0aW9uIGNoYW5nZUJvcmRlcihlbGVtZW50LCBjb2wsIG9sZEJnQ29sb3IpCnsKCWlmIChjb2wgPT09IDApCgl7CgkJZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gSG92ZXJDb2xvcjsKCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gImJsYWNrIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKCX0KCgllbHNlCgl7CgkJaWYgKG9sZEJnQ29sb3IpCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSBvbGRCZ0NvbG9yOwoJCX0KCQllbHNlCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAid2hpdGUiOwoJCX0KCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gIndoaXRlIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJhdXRvIjsKCX0KfQoKZnVuY3Rpb24gc2VsZWN0RGF0ZShlbGVtZW50LCBkYXRlKSB7CiAgICBDYWwuRGF0ZSA9IGRhdGU7CiAgICBzZWxEYXRlID0gbmV3IERhdGUoQ2FsLlllYXIsIENhbC5Nb250aCwgQ2FsLkRhdGUpOwogICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gU2VsRGF0ZUNvbG9yOwogICAgUmVuZGVyQ3NzQ2FsKCk7Cn0KCmZ1bmN0aW9uIHBpY2tJdChldnQpCnsKCXZhciBvYmplY3RJRCwKCWRvbSwKCWRlLAoJYjsKCS8vIGFjY2Vzc2VzIHRoZSBlbGVtZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSBldmVudCBhbmQgcmV0cmlldmVzIGl0cyBJRAoJaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpCgl7IC8vIHczYwoJCW9iamVjdElEID0gZXZ0LnRhcmdldC5pZDsKCQlpZiAob2JqZWN0SUQuaW5kZXhPZihjYWxTcGFuSUQpICE9PSAtMSkKCQl7CgkJCWRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9iamVjdElEKTsKCQkJY25MZWZ0ID0gZXZ0LnBhZ2VYOwoJCQljblRvcCA9IGV2dC5wYWdlWTsKCgkJCWlmIChkb20ub2Zmc2V0TGVmdCkKCQkJewoJCQkJY25MZWZ0ID0gKGNuTGVmdCAtIGRvbS5vZmZzZXRMZWZ0KTsKCQkJCWNuVG9wID0gKGNuVG9wIC0gZG9tLm9mZnNldFRvcCk7CgkJCX0KCQl9CgoJCS8vIGdldCBtb3VzZSBwb3NpdGlvbiBvbiBjbGljawoJCXhwb3MgPSAoZXZ0LnBhZ2VYKTsKCQl5cG9zID0gKGV2dC5wYWdlWSk7Cgl9CgoJZWxzZQoJeyAvLyBJRQoJCW9iamVjdElEID0gZXZlbnQuc3JjRWxlbWVudC5pZDsKCQljbkxlZnQgPSBldmVudC5vZmZzZXRYOwoJCWNuVG9wID0gKGV2ZW50Lm9mZnNldFkpOwoKCQkvLyBnZXQgbW91c2UgcG9zaXRpb24gb24gY2xpY2sKCQlkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQliID0gZG9jdW1lbnQuYm9keTsKCgkJeHBvcyA9IGV2ZW50LmNsaWVudFggKyAoZGUuc2Nyb2xsTGVmdCB8fCBiLnNjcm9sbExlZnQpIC0gKGRlLmNsaWVudExlZnQgfHwgMCk7CgkJeXBvcyA9IGV2ZW50LmNsaWVudFkgKyAoZGUuc2Nyb2xsVG9wIHx8IGIuc2Nyb2xsVG9wKSAtIChkZS5jbGllbnRUb3AgfHwgMCk7Cgl9CgoJLy8gdmVyaWZ5IGlmIHRoaXMgaXMgYSB2YWxpZCBlbGVtZW50IHRvIHBpY2sKCWlmIChvYmplY3RJRC5pbmRleE9mKGNhbFNwYW5JRCkgIT09IC0xKQoJewoJCWRvbVN0eWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqZWN0SUQpLnN0eWxlOwoJfQoKCWlmIChkb21TdHlsZSkKCXsKCQlkb21TdHlsZS56SW5kZXggPSAxMDA7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWVsc2UKCXsKCQlkb21TdHlsZSA9IG51bGw7CgkJcmV0dXJuOwoJfQp9CgoKCmZ1bmN0aW9uIGRyYWdJdChldnQpCnsKCWlmIChkb21TdHlsZSkKCXsKCQlpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikKCQl7IC8vZm9yIElFCgkJCWRvbVN0eWxlLmxlZnQgPSAoZXZlbnQuY2xpZW50WCAtIGNuTGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkgKyAncHgnOwoJCQlkb21TdHlsZS50b3AgPSAoZXZlbnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9CgkJZWxzZQoJCXsgIC8vRmlyZWZveAoJCQlkb21TdHlsZS5sZWZ0ID0gKGV2dC5jbGllbnRYIC0gY25MZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSArICdweCc7CgkJCWRvbVN0eWxlLnRvcCA9IChldnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9Cgl9Cn0KCi8vIHBlcmZvcm1zIGEgc2luZ2xlIGluY3JlbWVudCBvciBkZWNyZW1lbnQKZnVuY3Rpb24gbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbikKewoJaWYgKHdoYXRTcGlubmVyID09PSAiSG91ciIpCgl7CgkJaWYgKGRpcmVjdGlvbiA9PT0gInBsdXMiKQoJCXsKCQkJQ2FsLlNldEhvdXIoQ2FsLkhvdXJzICsgMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCQllbHNlIGlmIChkaXJlY3Rpb24gPT09ICJtaW51cyIpCgkJewoJCQlDYWwuU2V0SG91cihDYWwuSG91cnMgLSAxKTsKCQkJUmVuZGVyQ3NzQ2FsKCk7CgkJfQoJfQoJZWxzZSBpZiAod2hhdFNwaW5uZXIgPT09ICJNaW51dGUiKQoJewoJCWlmIChkaXJlY3Rpb24gPT09ICJwbHVzIikKCQl7CgkJCUNhbC5TZXRNaW51dGUocGFyc2VJbnQoQ2FsLk1pbnV0ZXMsIDEwKSArIDEpOwoJCQlSZW5kZXJDc3NDYWwoKTsKCQl9CgkJZWxzZSBpZiAoZGlyZWN0aW9uID09PSAibWludXMiKQoJCXsKCQkJQ2FsLlNldE1pbnV0ZShwYXJzZUludChDYWwuTWludXRlcywgMTApIC0gMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCX0KCn0KCi8vIHN0YXJ0cyB0aGUgdGltZSBzcGlubmVyCmZ1bmN0aW9uIHN0YXJ0U3Bpbih3aGF0U3Bpbm5lciwgZGlyZWN0aW9uKQp7Cglkb2N1bWVudC50aGlzTG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpCgl7CgkJbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbik7Cgl9LCAxMjUpOyAvLzEyNSBtcwp9CgovL3N0b3BzIHRoZSB0aW1lIHNwaW5uZXIKZnVuY3Rpb24gc3RvcFNwaW4oKQp7CgljbGVhckludGVydmFsKGRvY3VtZW50LnRoaXNMb29wKTsKfQoKZnVuY3Rpb24gZHJvcEl0KCkKewoJc3RvcFNwaW4oKTsKCglpZiAoZG9tU3R5bGUpCgl7CgkJZG9tU3R5bGUgPSBudWxsOwoJfQp9CgovLyBEZWZhdWx0IGV2ZW50cyBjb25maWd1cmF0aW9uCgpkb2N1bWVudC5vbm1vdXNlZG93biA9IHBpY2tJdDsKZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkcmFnSXQ7CmRvY3VtZW50Lm9ubW91c2V1cCA9IGRyb3BJdDs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/demo_datetimepicker.htm</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFET0NUWVBFIGh0bWw+CjxodG1sIGxhbmc9ImVuIj4KPGhlYWQ+CiAgICA8dGl0bGU+SmF2YXNjcmlwdCBEYXRlIFRpbWUgUGlja2VyIERlbW8gUGFnZTwvdGl0bGU+CiAgICA8c2NyaXB0IHNyYz0iZGF0ZXRpbWVwaWNrZXJfY3NzLmpzIj48L3NjcmlwdD4KPC9oZWFkPgo8Ym9keT4KCiAgICA8ZGl2IHN0eWxlPSJ0ZXh0LWFsaWduOmNlbnRlcjsgbWFyZ2luOjE1MHB4IGF1dG8gMTAwcHggYXV0bzsiPgogICAgICAgIDxsYWJlbCBmb3I9ImRlbW8xIj5QbGVhc2UgZW50ZXIgYSBkYXRlIGhlcmUgJmd0OyZndDsgPC9sYWJlbD4KICAgICAgICA8aW5wdXQgdHlwZT0iVGV4dCIgaWQ9ImRlbW8xIiBtYXhsZW5ndGg9IjI1IiBzaXplPSIyNSIvPgogICAgICAgIDxpbWcgc3JjPSJpbWFnZXMvY2FsLmdpZiIgb25jbGljaz0iamF2YXNjcmlwdDpOZXdDc3NDYWwoJ2RlbW8xJywnZGRtbXl5eXknKSIgc3R5bGU9ImN1cnNvcjpwb2ludGVyIi8+CiAgICA8L2Rpdj4KCjwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAQAKIAAKVNSkpNpUpNSqWmpdbT1v///////wAAACH5BAEAAAYALAAAAAAQABAAAANEaLrcNjDKKUa4OExYM95DVRTEWJLmKKLseVZELMdADcSrOwK7OqQsXkEIm8lsN0IOqCssW8Cicar8Qa/P5kvA7Xq/ggQAOw==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_close.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhEAAOAPcAAAAAAEBAQICAgNTQyP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwAAAAAEAAOAAAITwAJCBxIsGAAAgMSKlyoUMBBhhATOkSYEACAhRYlPlSYcUDHARMZWvwIciPGiwtDniSpsiLKjy1JdmwZsaHJmhoJCNjJs2fPAECDCh0KNCAAOw==]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_fastforward.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIVjI8JuBnQXjywVXXrvHJK6j2MQyYFADs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_fastreverse.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIWjI95gJzgAnxTVgNnjrhmdV3NqJRBAQA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_forward.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIQjI95oArc1ovmzWhpuBTqWAA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_minus.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODdhDQAJAIAAAAAAAP///ywAAAAADQAJAAACD4yPqRvgDxaM7LFDr948FAA7]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_plus.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODdhDQAJAIAAAAAAAP///ywAAAAADQAJAAACDoyPqcsNbYB0cqqKoWYFADs=]]></data>
	</file>
	<file>
	  <filename>/datetimepicker/images/cal_reverse.gif</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[R0lGODlhDQAJAIAAAAAAAP///yH5BAEAAGQALAAAAAANAAkAAAIQjI+ZoMttgIRBTmppfJrrVAA7]]></data>
	</file>
	<file>
	  <filename>/examples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/examples/formvalidation.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKLyogCiAqIFRoZXNlIGV4YW1wbGVzIGFyZSBub3QgbWVhbnQgdG8gcnVuIG9uIHRoZWlyIG93biwgYnV0IHRoZXkgd2lsbCBob3BlZnVsbHkKICogZ2l2ZSB5b3Ugc29tZSBpZGVhIG9mIGhvdyB0byB1c2UgdGhlIE5lb01vZHVsZS1mdW5jdGlvbnMgdG8gd3JpdGUgY2xlYW4gY29kZS4KICogCiAqLwoKLyogTkVPX0lOSVQgKi8gZXZhbChORU9fSU5JVCk7IC8qIE5FT19JTklUICovCgokdmFsaWRhdGlvbj1hcnJheSgKICAvL1N0eWxlIHRoZSB2YWxpZGF0aW9uIHBvcHVwcyBhIGJpciBkaWZmZXJlbnRseSB0aGFuIHRoZSBkZWZhdWx0CiAgYXJyYXkoImV4dHJhY3NzIj0+IiNtc2djb250ZW50IHtjb2xvcjpyZWR9OyIpLAogIC8vbWFrZSB0aGUgbmFtZSBmaWVsZCByZXF1aXJlZAogIGFycmF5KCJuYW1lIj0+Im5hbWUiLCJ2YWxpZGF0aW9uIj0+Im5vbmVtcHR5IiwiWW91IG11c3QgcHJvdmlkZSBhIG5hbWUiKSwKICAvL21ha2UgdGhlIGVtYWlsIGZpZWxkIHZhbGlkYXRlIGZvciBwcm9wZXJseSBmb3JtYXR0ZWQgYWRkcmVzcwogIGFycmF5KCJuYW1lIj0+ImVtYWlsIiwidmFsaWRhdGlvbiI9PiJ2YWxpZGVtYWlsIiwiWW91IG11c3QgcHJvdmlkZSBhIHZhbGlkIGVtYWlsIiksCiAgLy9tYWtlIHRoZSBwaG9uZSBmaWVsZCBoYXZlIGF0IGxlYXN0IDggY2hhcmFjdGVycwogIGFycmF5KCJuYW1lIj0+InBob25lIiwidmFsaWRhdGlvbiI9PiJtaW5sZW5ndGgiLCJZb3UgbXVzdCBwcm92aWRlIGEgcGhvbmVudW1lciBvZiBhdCBsZWFzdCA4IGNoYXJzIiksCik7CiR0aGlzLT5TbWFydHlGb3JtU3RhcnQoImZvcm1zdGFydCIsCiAgYXJyYXkoCiAgICAiYWN0aW9uIj0+ImhhbmRsZWRhdGEiLAogICAgInZhbGlkYXRpb24iPT4kdmFsaWRhdGlvbgogICkKKTsKJHRoaXMtPlNtYXJ0eUZvcm1FbmQoImZvcm1lbmQiKTsKJHRoaXMtPlNtYXJ0eUlucHV0VGV4dCgibmFtZSIsYXJyYXkoInNpemUiPT4iNDAiKSk7CiR0aGlzLT5TbWFydHlJbnB1dFRleHQoImVtYWlsIixhcnJheSgic2l6ZSI9PiI0MCIpKTsKJHRoaXMtPlNtYXJ0eUlucHV0VGV4dCgicGhvbmUiLGFycmF5KCJzaXplIj0+IjE2IikpOwoKZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJteXRlbXBsYXRlLnRwbCIpCgo/Pgo=]]></data>
	</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>/formvalidation.inc.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGRpZSgpOwoKJGNvbmZpZyA9IGNtc21zKCktPkdldENvbmZpZygpOwppZiAoISRhbHJlYWR5dXNlZCkgewogICRvdXRwdXQuPSc8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInIC4gJGNvbmZpZ1sicm9vdF91cmwiXSAuICcvbW9kdWxlcy9OZW9Nb2R1bGUvZm9ybW1lc3NhZ2VzL21lc3NhZ2VzLmpzIj48L3NjcmlwdD4KJzsKICAvL2luamVjdENTUygiI21zZyB7ZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDoyMDA7IGJhY2tncm91bmQ6dXJsKCcgLiAkY29uZmlnWyJyb290X3VybCJdIC4gJy9tb2R1bGVzL05lb01vZHVsZS9mb3JtbWVzc2FnZXMvbXNnX2Fycm93LmdpZikgbGVmdCBjZW50ZXIgbm8tcmVwZWF0OyBwYWRkaW5nLWxlZnQ6N3B4fSIpOwoKZm9yZWFjaCAoJGZpZWxkcyBhcyAkZmllbGQpIHsKICBpZiAoaXNzZXQoJGZpZWxkWyJleHRyYWNzcyJdKSkgewogICAgJHRoaXMtPl9leHRyYXZhbGlkYXRpb25jc3MuPSRmaWVsZFsiZXh0cmFjc3MiXTsKICB9Cn0KCiRvdXRwdXQuPScKPHNjcmlwdCB0eXBlPSJ0ZXh0L0phdmFTY3JpcHQiPgogIHZhciBpZ25vcmV2YWxpZGF0aW9uPWZhbHNlOwo8L3NjcmlwdD4KCjxzY3JpcHQgdHlwZT0idGV4dC9KYXZhU2NyaXB0Ij4KZnVuY3Rpb24gaW5qZWN0Q1NTKGNzc0NvZGUpIHsKICB2YXIgc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKICBzdHlsZUVsZW1lbnQudHlwZSA9ICJ0ZXh0L2NzcyI7CiAgaWYgKHN0eWxlRWxlbWVudC5zdHlsZVNoZWV0KSB7CiAgICBzdHlsZUVsZW1lbnQuc3R5bGVTaGVldC5jc3NUZXh0ID0gY3NzQ29kZTsKICB9IGVsc2UgewogICAgc3R5bGVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc0NvZGUpKTsKICB9CiAgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXS5hcHBlbmRDaGlsZChzdHlsZUVsZW1lbnQpOwp9Cjwvc2NyaXB0PgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L0phdmFTY3JpcHQiPgogIGluamVjdENTUygiI21zZyB7ZGlzcGxheTpub25lOyBwb3NpdGlvbjphYnNvbHV0ZTsgei1pbmRleDoyMDA7IHBhZGRpbmctbGVmdDo3cHh9Iik7CiAgaW5qZWN0Q1NTKCIjbXNnY29udGVudCB7ZGlzcGxheTpibG9jazsgYmFja2dyb3VuZDojZjNlNmU2OyBib3JkZXI6MnB4IHNvbGlkICM5OTAwMDA7IHBhZGRpbmc6NXB4OyBtaW4td2lkdGg6MTUwcHg7IG1heC13aWR0aDoyNTBweH0iKTsKPC9zY3JpcHQ+Cic7CgppZiAoJHRoaXMtPl9leHRyYXZhbGlkYXRpb25jc3MhPSIiKSB7CiAkb3V0cHV0Lj0nCgo8c2NyaXB0IHR5cGU9InRleHQvSmF2YVNjcmlwdCI+CiAgaW5qZWN0Q1NTKCInLiR0aGlzLT5fZXh0cmF2YWxpZGF0aW9uY3NzLiciKTsKPC9zY3JpcHQ+CgonOwp9CgoKJG91dHB1dC49JzxzY3JpcHQgdHlwZT0idGV4dC9KYXZhU2NyaXB0Ij4KZnVuY3Rpb24gbmVvdHJpbShzdHIpIHsKICByZXR1cm4gc3RyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCBcJ1wnKTsKfQo8L3NjcmlwdD4KJzsKICAkYWxyZWFkeXVzZWQgPSB0cnVlOwp9Cgokb3V0cHV0Lj0iPHNjcmlwdCB0eXBlPSd0ZXh0L0phdmFTY3JpcHQnPgoiOwokb3V0cHV0Lj0nCmZ1bmN0aW9uIE5lb1ZhbGlkYXRlRm9ybScgLiAkdmFsaWRhdGlvbmNvdW50IC4gJyh0aGlzZm9ybSkgewogIGlmIChpZ25vcmV2YWxpZGF0aW9uKSByZXR1cm4gdHJ1ZTsKICB2YXIgZW1haWxSZWdleCA9IC9eW1x3LVwuXStAKFtcdy1dK1wuKStbXHctXXsyLDR9JC87Cic7CiR2YWxpZGF0aW9uc3RyaW5nID0gInJldHVybiBmYWxzZTsiOwokcmV0dXJuc3RyaW5nID0gInJldHVybiB0cnVlOyI7CmlmICgkdGhpcy0+X2Z1bGx2YWxpZGF0aW9uKSB7CiAgJG91dHB1dC49JwogIHZhciB2YWxpZGF0ZWQgPSB0cnVlOwonOwogICR2YWxpZGF0aW9uc3RyaW5nID0gInZhbGlkYXRlZCA9IGZhbHNlOyI7CiAgJHJldHVybnN0cmluZyA9ICJyZXR1cm4gdmFsaWRhdGVkOyI7Cn0KJG91dHB1dC49JwogIHdpdGggKHRoaXNmb3JtKSB7Cic7CmZvcmVhY2ggKCRmaWVsZHMgYXMgJGZpZWxkKSB7CiAgaWYgKCFpc3NldCgkZmllbGRbIm5hbWUiXSkpIGNvbnRpbnVlOwogICRmaWVsZGlkID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZSJdOwogIHN3aXRjaCAoJGZpZWxkWyJ2YWxpZGF0aW9uIl0pIHsKCiAgICBjYXNlICJub25lbXB0eSIgOiB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSIiKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgInZhbGlkZW1haWwiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmICghJyAuICRmaWVsZGlkIC4gJy52YWx1ZS5tYXRjaChlbWFpbFJlZ2V4KSkgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJtaW5sZW5ndGgiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpLmxlbmd0aDwnIC4gJGZpZWxkWyJsZW5ndGgiXSAuICcpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAibWF4bGVuZ3RoIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKS5sZW5ndGg+JyAuICRmaWVsZFsibGVuZ3RoIl0gLiAnKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgImV4YWN0bGVuZ3RoIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKS5sZW5ndGghPScgLiAkZmllbGRbImxlbmd0aCJdIC4gJykgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJjaGVja2VkIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICAgICAgCiAgICBpZiAoJyAuICRmaWVsZGlkIC4gJy5jaGVja2VkID09IGZhbHNlKSB7CiAgICAvL2FsZXJ0KCJoaSIpOwogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgY2FzZSAidW5jaGVja2VkIiA6IHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoJyAuICRmaWVsZGlkIC4gJy5jaGVja2VkID09IHRydWUpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQoKCiAgICBjYXNlICJkcm9wZG93bl9ub25lbXB0eSIgOiB7CiAgICAgICRvdXRwdXQuPScKICAgIGlmICgnLiRmaWVsZGlkLicoJy4kZmllbGRpZC4nLnNlbGVjdGVkSW5kZXgpLnZhbHVlPT0iIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAiZHJvcGRvd25fbm90Zmlyc3QiIDogewogICAgICAkb3V0cHV0Lj0nCiAgICBpZiAoJy4kZmllbGRpZC4nLnNlbGVjdGVkSW5kZXg9PTApIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSAicmFkaW9fbm9uZXNlbGVjdGVkIiA6IHsKICAgICAgJG91dHB1dC49JwogICAgdmFyIG9uZXNlbGVjdGVkID0gZmFsc2U7CiAgICBmb3IgKHZhciBpPTA7IGk8Jy4kZmllbGRpZC4nLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICgnLiRmaWVsZGlkLidbJy5pLiddLmNoZWNrZWQpIHsKICAgICAgICBvbmVzZWxlY3RlZCA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICghb25lc2VsZWN0ZWQpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnMSIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgIm5vdGVxdWFsIiA6IHsKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWUiXSkpIHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKT09IicuIHRyaW0oJGZpZWxkWyJ2YWx1ZSJdKS4nIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoaXNzZXQoJGZpZWxkWyJ2YWx1ZXMiXSkpIHsKICAgICAgICBmb3JlYWNoKCRmaWVsZFsidmFsdWVzIl0gYXMgJHZhbHVlKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSInIC4gdHJpbSgkdmFsdWUpIC4gJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjYXNlICJlcXVhbCIgOiB7CiAgICAgIGlmIChpc3NldCgkZmllbGRbInZhbHVlIl0pKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSkhPSInLiB0cmltKCRmaWVsZFsidmFsdWUiXSkuJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWVzIl0pKSB7CiAgICAgICAgZm9yZWFjaCgkZmllbGRbInZhbHVlcyJdIGFzICR2YWx1ZSkgewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpIT0iJyAuIHRyaW0oJHZhbHVlKSAuICciKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgY2FzZSAiaWRlbnRpY2FsIiA6IHsKICAgICAgJGZpZWxkaWQyID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZTIiXTsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKSE9bmVvdHJpbSgnIC4gJGZpZWxkaWQyIC4gJy52YWx1ZSkpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQyIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICB9CgoKCgogIH0KfQokb3V0cHV0Lj0iCiAgfQogICIgLiAkcmV0dXJuc3RyaW5nIC4gIgp9Cjwvc2NyaXB0PlxuXG4iOwokZXh0cmEgPSAib25zdWJtaXQ9J3JldHVybiBOZW9WYWxpZGF0ZUZvcm0iIC4gJHZhbGlkYXRpb25jb3VudCAuICIodGhpcyk7JyI7CiRmdW5jdGlvbmNhbGwgPSAiTmVvVmFsaWRhdGVGb3JtIiAuICR2YWxpZGF0aW9uY291bnQgLiAiKHRoaXMpIjsKJHZhbGlkYXRpb25jb3VudCsrOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbIm1vbmRheSJdPSJNb25kYXkiOwokbGFuZ1sidHVlc2RheSJdPSJUdWVzZGF5IjsKJGxhbmdbIndlZG5lc2RheSJdPSJXZWRuZXNkYXkiOwokbGFuZ1sidGh1cnNkYXkiXT0iVGh1cnNkYXkiOwokbGFuZ1siZnJpZGF5Il09IkZyaWRheSI7CiRsYW5nWyJzYXR1cmRheSJdPSJTYXR1cmRheSI7CiRsYW5nWyJzdW5kYXkiXT0iU3VuZGF5IjsKCiRsYW5nWyJqYW51YXJ5Il09IkphbnVhcnkiOwokbGFuZ1siZmVicnVhcnkiXT0iRmVicnVhcnkiOwokbGFuZ1sibWFyY2giXT0iTWFyY2giOwokbGFuZ1siYXByaWwiXT0iQXByaWwiOwokbGFuZ1sibWF5Il09Ik1heSI7CiRsYW5nWyJqdW5lIl09Ikp1bmUiOwokbGFuZ1sianVseSJdPSJKdWx5IjsKJGxhbmdbImF1Z3VzdCJdPSJBdWd1c3QiOwokbGFuZ1sic2VwdGVtYmVyIl09IlNlcHRlbWJlciI7CiRsYW5nWyJvY3RvYmVyIl09Ik9jdG9iZXIiOwokbGFuZ1sibm92ZW1iZXIiXT0iTm92ZW1iZXIiOwokbGFuZ1siZGVjZW1iZXIiXT0iRGVjZW1iZXIiOwoKPz4K]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ21hbmRhZyc7CiRsYW5nWyd0dWVzZGF5J10gPSAndGlyc2RhZyc7CiRsYW5nWyd3ZWRuZXNkYXknXSA9ICdvbnNkYWcnOwokbGFuZ1sndGh1cnNkYXknXSA9ICd0b3JzZGFnJzsKJGxhbmdbJ2ZyaWRheSddID0gJ2ZyZWRhZyc7CiRsYW5nWydzYXR1cmRheSddID0gJ2wmb3NsYXNoO3JkYWcnOwokbGFuZ1snc3VuZGF5J10gPSAncyZvc2xhc2g7bmRhZyc7CiRsYW5nWydqYW51YXJ5J10gPSAnamFudWFyJzsKJGxhbmdbJ2ZlYnJ1YXJ5J10gPSAnZmVicnVhcic7CiRsYW5nWydtYXJjaCddID0gJ21hcnRzJzsKJGxhbmdbJ2FwcmlsJ10gPSAnYXByaWwnOwokbGFuZ1snbWF5J10gPSAnbWFqJzsKJGxhbmdbJ2p1bmUnXSA9ICdqdW5pJzsKJGxhbmdbJ2p1bHknXSA9ICdqdWxpJzsKJGxhbmdbJ2F1Z3VzdCddID0gJ2F1Z3VzdCc7CiRsYW5nWydzZXB0ZW1iZXInXSA9ICdzZXB0ZW1iZXInOwokbGFuZ1snb2N0b2JlciddID0gJ29rdG9iZXInOwokbGFuZ1snbm92ZW1iZXInXSA9ICdub3ZlbWJlcic7CiRsYW5nWydkZWNlbWJlciddID0gJ2RlY2VtYmVyJzsKJGxhbmdbJ3FjYSddID0gJzEyMjk2MDE3OTAtODUyNDMxOTctNDMyNjA3MTMnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zODk2ODQzOTQuMTMwMTE0MjE0MC4xMzAxMTQyMTQwLjEzMDEyNTQ2OTcuMic7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMDExNDIxNDAuMS4xLnV0bWNzcj0oZGlyZWN0KXx1dG1jY249KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ01hbmRhZyc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMDAyMjYzNjkuMzY5Mi44MS51dG1jc3I9ZGV2LmNtc21hZGVzaW1wbGUub3JnfHV0bWNjbj0ocmVmZXJyYWwpfHV0bWNtZD1yZWZlcnJhbHx1dG1jY3Q9L2ZlYXR1cmVfcmVxdWVzdC9saXN0LzYnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNzkwNTI2MjMwODQxMTAxMDAuMTIxMDQyMzU3Ny4xMzAxMjUxMTQxLjEzMDEyNTQ5NTcuMzcxNic7CiRsYW5nWydxY2EnXSA9ICcxMjEwOTcxNjkwLTI3MzA4MDczLTgxOTUyODMyJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMuMi4xMC4xMzAxMjU0OTU3JzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ21vbmRheSddID0gJ01hYW5kYWcnOwokbGFuZ1sndHVlc2RheSddID0gJ0RpbnNkYWcnOwokbGFuZ1snd2VkbmVzZGF5J10gPSAnV29lbnNkYWcnOwokbGFuZ1sndGh1cnNkYXknXSA9ICdEb25kZXJkYWcnOwokbGFuZ1snZnJpZGF5J10gPSAnVnJpamRhZyc7CiRsYW5nWydzYXR1cmRheSddID0gJ1phdGVyZGFnJzsKJGxhbmdbJ3N1bmRheSddID0gJ1pvbmRhZyc7CiRsYW5nWydqYW51YXJ5J10gPSAnSmFudWFyaSc7CiRsYW5nWydmZWJydWFyeSddID0gJ0ZlYnJ1YXJpJzsKJGxhbmdbJ21hcmNoJ10gPSAnTWFhcnQnOwokbGFuZ1snYXByaWwnXSA9ICdBcHJpbCAnOwokbGFuZ1snbWF5J10gPSAnTWVpJzsKJGxhbmdbJ2p1bmUnXSA9ICdKdW5pJzsKJGxhbmdbJ2p1bHknXSA9ICdKdWxpJzsKJGxhbmdbJ2F1Z3VzdCddID0gJ0F1Z3VzdHVzJzsKJGxhbmdbJ3NlcHRlbWJlciddID0gJ1NlcHRlbWJlciAnOwokbGFuZ1snb2N0b2JlciddID0gJ09rdG9iZXInOwokbGFuZ1snbm92ZW1iZXInXSA9ICdOb3ZlbWJlciAnOwokbGFuZ1snZGVjZW1iZXInXSA9ICdEZWNlbWJlciAnOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4zMDk0ODI0MDUuMTI5NTk4NjM2OS4xMzAxMTUzNjk3LjEzMDE1NjQzNzAuMTAwJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTMwMDczNzY0NC45NC4yNi51dG1jc3I9Zm9ydW0uY21zbWFkZXNpbXBsZS5vcmd8dXRtY2NuPShyZWZlcnJhbCl8dXRtY21kPXJlZmVycmFsfHV0bWNjdD0vdmlld3RvcGljLnBocCc7CiRsYW5nWydxY2EnXSA9ICdQMC0xMzQ2MTE5OTUzLTEyOTU5ODYzNjg5MDgnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></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+ICR2KSB7CiAgICAgICAgaWYgKGFycmF5X2tleV9leGlzdHMoJGtleSwgJGFycmF5KSkgewogICAgICAgICAgdW5zZXQoJHJlc3VsdFska2V5XSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9Cn0KCmlmICghZnVuY3Rpb25fZXhpc3RzKCJpc19hc3NvYyIpKSB7CiAgZnVuY3Rpb24gaXNfYXNzb2MoJGFycmF5KSB7CiAgICByZXR1cm4gKGlzX2FycmF5KCRhcnJheSkgJiYgMCAhPT0gY291bnQoYXJyYXlfZGlmZl9rZXkoJGFycmF5LCBhcnJheV9rZXlzKGFycmF5X2tleXMoJGFycmF5KSkpKSk7CiAgfQp9CgpkZWZpbmUoIk5FT19JTklUIiwiCiAgaWYgKCFmdW5jdGlvbl9leGlzdHMoJ2Ntc21zJykpIHtlY2hvICdtaXNzaW5nIGNtc21zKCknO2V4aXQ7fQogIFwkdGhpcy0+TmVvU2V0dXAoXCRpZCwgXCR0aGlzLCBcJHJldHVybmlkLCBcJHBhcmFtcyk7CiAgXCRnQ21zPWNtc21zKCk7CiAgXCR0aGlzLT5TbWFydHlBc3NpZ24oJ21vZHVsZScsXCR0aGlzKTsKIik7CgpjbGFzcyBOZW9Nb2R1bGUgZXh0ZW5kcyBDTVNNb2R1bGUgewogIC8qCiAgICoKICAgKiBBIGNvdXBsZSBvZiB2YXJpYWJsZXMgYW5kIG1ldGhvZHMgZm9yIGludGVybmFsIG1vZHVsZSB1c2FnZQogICAqCiAgICovCiAgdmFyICRfZGF0YXN0b3JhZ2U9ZmFsc2U7CiAgdmFyICRfZGI9ZmFsc2U7CiAgdmFyICRfaWQ9ZmFsc2U7CiAgdmFyICRfcmV0dXJuaWQ9ZmFsc2U7CiAgdmFyICRfZXJyb3JzPSIiOwogIHZhciAkX3RoZW1lb2JqZWN0PWZhbHNlOwogIHZhciAkX3BhcmFtcz1hcnJheSgpOwogIHZhciAkX2Z1bGx2YWxpZGF0aW9uPWZhbHNlOwogIHZhciAkX2V4dHJhdmFsaWRhdGlvbmNzcz0iIjsKICAKICBmdW5jdGlvbiBfZ2V0ZHMoKSB7CiAgICBpZiAoJHRoaXMtPl9kYXRhc3RvcmFnZSE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl9kYXRhc3RvcmFnZTsKICAgICR0aGlzLT5fZGF0YXN0b3JhZ2U9JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCJOZW9EYXRhU3RvcmFnZSIpOwogICAgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgfQoKICBmdW5jdGlvbiBOZW9EYigpIHsKICAgIGlmICgkdGhpcy0+X2RiIT09ZmFsc2UpIHJldHVybiAkdGhpcy0+X2RiOwogICAgJHRoaXMtPl9kYj1jbXNtcygpLT5HZXREQigpOwogICAgcmV0dXJuICR0aGlzLT5fZGI7CiAgfQogIAogIGZ1bmN0aW9uIF9nZXR0aGVtZW9iaigpIHsKICAgICRnQ21zPWNtc21zKCk7CiAgICBpZiAoJHRoaXMtPl90aGVtZW9iamVjdCE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICAgICR0aGlzLT5fdGhlbWVvYmplY3Q9JHRoZW1lT2JqZWN0ID0gJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddOwogICAgcmV0dXJuICR0aGlzLT5fdGhlbWVvYmplY3Q7CiAgfQoKICAvKgogICAqCiAgICogU3RhbmRhcmQgbW9kdWxlLUFQSS1tZXRob2RzIGJlaGF2aW5nIGluIGEgc3RhbmRhcmQgd2F5CiAgICoKICAgKi8KCglmdW5jdGlvbiBHZXROYW1lKCkgewoJCXJldHVybiAnTmVvTW9kdWxlJzsKCX0KCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKICAgIHJldHVybiAiMC41LjAiOwogIH0KCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewoJCXJldHVybiAiTmVvIE1vZHVsZSBiYXNlLWNsYXNzIjsKCX0KCglmdW5jdGlvbiBJc1BsdWdpbk1vZHVsZSgpIHsKCQlyZXR1cm4gZmFsc2U7Cgl9CgoJZnVuY3Rpb24gTWluaW11bUNNU1ZlcnNpb24oKSB7CgkJcmV0dXJuICcxLjknOwoJfQoKCWZ1bmN0aW9uIEdldEFkbWluRGVzY3JpcHRpb24oKSB7CgkJcmV0dXJuICJBbiBleHRlbmRlZCBtb2R1bGUtY2xhc3MsIG1haW5seSBmb3IgdGhlIE5lby1zZXJpZXMgbW9kdWxlcywgYnV0IGFsc28gZm9yIG90aGVycyB0byB1c2UiOwoJfQoKCWZ1bmN0aW9uIEhhc0FkbWluKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3IoKSB7CgkJcmV0dXJuICdNb3J0ZW4gUG91bHNlbic7Cgl9CgoJZnVuY3Rpb24gR2V0QXV0aG9yRW1haWwoKQl7CgkJcmV0dXJuICdtb3J0ZW5AcG91bHNlbi5vcmcnOwoJfQoKICBmdW5jdGlvbiBHZXRIZWxwKCRsYW5nPSdlbl9VUycpIHsKICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdoZWxwLnRwbCcpOwogCX0KCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkJewoJCXJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJjaGFuZ2Vsb2cudHBsIik7Cgl9CgogIC8qCiAgICoKICAgKiBTZXR1cCBmdW5jdGlvbnMKICAgKgogICAqLwogIGZ1bmN0aW9uIE5lb1NldElkKCRpZCkgewogICAgJHRoaXMtPl9pZD0kaWQ7CiAgfQogIGZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkgewogICAgJHRoaXMtPl9yZXR1cm5pZD0kcmV0dXJuaWQ7CiAgfQogIGZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5fcGFyYW1zPSRwYXJhbXM7CiAgfQogIGZ1bmN0aW9uIE5lb1NldHVwKCRpZCwkbW9kdWxlLCRyZXR1cm5pZD0iMCIsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+TmVvU2V0SWQoJGlkKTsKICAgICR0aGlzLT5OZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpOwogICAgJHRoaXMtPk5lb1NldFBhcmFtcygkcGFyYW1zKTsKICAgICR0aGlzLT5TbWFydHlBc3NpZ25DTVMoJG1vZHVsZSk7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCJtb2R1bGVfaWQiLCRpZCk7CiAgfQoKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5HZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkZGVmYXVsdCk7CiAgfQoKICBmdW5jdGlvbiBTZXRQcmVmKCRwcmVmbmFtZSwgJHZhbHVlKSB7CiAgICByZXR1cm4gJHRoaXMtPlNldFByZWZlcmVuY2UoJHByZWZuYW1lLCR2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiBOZW9TZXRQcmVmKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlPWZhbHNlLCAkZGVsZXRlaWZub3RzZXQ9ZmFsc2UpIHsKICAgIC8vaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChpc3NldCgkcGFyYW1zWyRwcmVmbmFtZV0pKSB7ICAgICAgCiAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkcGFyYW1zWyRwcmVmbmFtZV0pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEkZGVsZXRlaWZub3RzZXQpIHsKICAgICAgICBpZiAoJG5vdHNldHZhbHVlIT09ZmFsc2UpIHsKICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJHByZWZuYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIHsKICAgIGlmIChpc19hc3NvYygkcHJlZnMpKSB7CiAgICAgIGZvcmVhY2ggKCRwcmVmcyBhcyAka2V5ID0+ICRub3RzZXR2YWx1ZSkgewogICAgICAgICR0aGlzLT5OZW9TZXRQcmVmKCRrZXksICRub3RzZXR2YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2ggKCRwcmVmcyBhcyAkcHJlZikgewogICAgICAgICR0aGlzLT5OZW9TZXRQcmVmKCRwcmVmKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICAvL2VjaG8gJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIik7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNvbnRlbnQiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YXJubWVzc2FnZSIsJHBhcmFtcywiIiksCiAgICAgIGZhbHNlLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidGFyZ2V0Y29udGVudG9ubHkiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgIiIsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICIiLAogICAgICB0cnVlICwKICAgICAgZmFsc2UsCiAgICAgICIiLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9MaW5rKCR0ZXh0LCRhY3Rpb24sJHBhcmFtcz1hcnJheSgpLCAkd2FybmluZz0iIikgewogICAgcmV0dXJuICR0aGlzLT5OZW9DbXNMaW5rKGFycmF5KCJ0ZXh0Ij0+JHRleHQsImFjdGlvbiI9PiRhY3Rpb24sInBhcmFtcyI9PiRwYXJhbXMsIndhcm5tZXNzYWdlIj0+JHdhcm5pbmcpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1ByZXR0eUxpbmsoJHRleHQsICRwcmV0dHl1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvQ21zTGluayhhcnJheSgidGV4dCI9PiR0ZXh0LCJwcmV0dHl1cmwiPT4kcHJldHR5dXJsKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9VcmwoJGFjdGlvbiwkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvQ21zVXJsKGFycmF5KCJhY3Rpb24iPT4kYWN0aW9uLCJwYXJhbXMiPT4kcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9QcmV0dHlVcmwoJHByZXR0eXVybCkgewogICAgcmV0dXJuICR0aGlzLT5OZW9DbXNVcmwoYXJyYXkoInByZXR0eXVybCI9PiRwcmV0dHl1cmwpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsICRwYXJhbXM9YXJyYXkoKSkgewogICAgaWYgKGlzX2FycmF5KCRhY3Rpb24pKSAkdGhpcy0+TmVvUmVkaXJlY3RGdWxsKCRhY3Rpb24pOwogICAgcmV0dXJuICR0aGlzLT5OZW9SZWRpcmVjdEZ1bGwoCiAgICAgIGFycmF5ICgKICAgICAgICAiYWN0aW9uIiA9PiAkYWN0aW9uLAogICAgICAgICJwYXJhbXMiID0+ICRwYXJhbXMKICAgICAgKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb1JlZGlyZWN0RnVsbCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vUmVkaXJlY3QoJGlkLCAkYWN0aW9uLCAkcmV0dXJuaWQ9JycsICRwYXJhbXM9YXJyYXkoKSwgJGlubGluZT1mYWxzZSkKICAgIHJldHVybiAkdGhpcy0+UmVkaXJlY3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSkKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vJHRoaXMtPlJlZGlyZWN0KCRpZCwgJ2RlZmF1bHRhZG1pbicsICcnLCBhcnJheSgibW9kdWxlX21lc3NhZ2UiPT4kdGhpcy0+TGFuZygic2V0dGluZ3NzYXZlZCIpLCJ0YWIiPT4ic2V0dGluZ3MiKSk7CiAgICAkbWVzc2FnZSA9ICR0aGlzLT5OUFYoIm1lc3NhZ2UiLCAkcGFyYW1zKTsKICAgICRlcnJvciA9ICR0aGlzLT5OUFYoImVycm9yIiwgJHBhcmFtcyk7CiAgICAkdGFiID0gJHRoaXMtPk5QVigidGFiIiwgJHBhcmFtcyk7CgogICAgJHRoaXMtPk5lb1JlZGlyZWN0KCJkZWZhdWx0YWRtaW4iLAogICAgICBhcnJheSgKICAgICAgICAibW9kdWxlX21lc3NhZ2UiID0+ICRtZXNzYWdlLAogICAgICAgICJtb2R1bGVfZXJyb3JzIiA9PiAkZXJyb3IsCiAgICAgICAgInRhYiIgPT4gJHRhYgogICAgICApCiAgICApOwogIH0KCiAgLyoKICAgKgogICAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMsIGluY2x1ZGluZyBzbWFydHkgYXNzaWdubWVudHMKICAgKgogICAqLwogIGZ1bmN0aW9uIE5lb1NldEZ1bGxWYWxpZGF0aW9uKCRmdWxsdmFsaWRhdGlvbj10cnVlKSB7CiAgICAkdGhpcy0+X2Z1bGx2YWxpZGF0aW9uPSRmdWxsdmFsaWRhdGlvbjsKICB9CgogIGZ1bmN0aW9uIE5lb0Zvcm1WYWxpZGF0aW9uKCRmaWVsZHM9YXJyYXkoKSkgewogICAgaWYgKGVtcHR5KCRmaWVsZHMpKSByZXR1cm4gIiI7CiAgICBzdGF0aWMgJGFscmVhZHl1c2VkPWZhbHNlOwogICAgc3RhdGljICR2YWxpZGF0aW9uY291bnQ9MDsKCiAgICAkb3V0cHV0PSIiOwogICAgaW5jbHVkZShkaXJuYW1lKF9fRklMRV9fKS4iL2Zvcm12YWxpZGF0aW9uLmluYy5waHAiKTsKICAgIHJldHVybiBhcnJheSgiZnVuY3Rpb24iPT4kb3V0cHV0LCJleHRyYSI9PiRleHRyYSwgImZ1bmN0aW9uY2FsbCI9PiRmdW5jdGlvbmNhbGwpOwogIH0KCiAgZnVuY3Rpb24gTmVvRm9ybVN0YXJ0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgLy9DcmVhdGVGb3JtU3RhcnQoJGlkLCAkYWN0aW9uPSdkZWZhdWx0JywgJHJldHVybmlkPScnLCAkbWV0aG9kPSdwb3N0JywgJGVuY3R5cGU9JycsICRpbmxpbmU9ZmFsc2UsICRpZHN1ZmZpeD0nJywgJHBhcmFtcyA9IGFycmF5KCksICRleHRyYT0nJykKICAgICR2YWxpZGF0aW9uPSIiOwogICAgJGV4dHJhPSIiOwogICAgaWYgKGlzc2V0KCRwYXJhbXNbInZhbGlkYXRpb24iXSkpIHsKICAgICAgLy9lY2hvICJoaSI7CiAgICAgICR2YWxpZGF0aW9uPSR0aGlzLT5OZW9Gb3JtVmFsaWRhdGlvbigkcGFyYW1zWyJ2YWxpZGF0aW9uIl0pOwogICAgICBpZiAoaXNzZXQoJHBhcmFtc1siZXh0cmF0ZW1wbGF0ZSJdKSkgewogICAgICAgICRleHRyYT0kcGFyYW1zWyJleHRyYXRlbXBsYXRlIl07CiAgICAgICAgJGV4dHJhPXN0cl9yZXBsYWNlKCIldmFsaWRhdGlvbmNhbGwlIiwkdmFsaWRhdGlvblsiZnVuY3Rpb25jYWxsIl0sJGV4dHJhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAkZXh0cmE9JHZhbGlkYXRpb25bImV4dHJhIl07CiAgICAgIH0KICAgICAgJHZhbGlkYXRpb249JHZhbGlkYXRpb25bImZ1bmN0aW9uIl07CiAgICB9CiAgICByZXR1cm4gJHZhbGlkYXRpb24uJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWN0aW9uIiwkcGFyYW1zLCJkZWZhdWx0IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1ldGhvZCIsJHBhcmFtcywicG9zdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgiZW5jdHlwZSIsImVuY29kaW5nIiksJHBhcmFtcywibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkc3VmZml4IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInBhcmFtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImV4dHJhIiwkcGFyYW1zLCRleHRyYSkKICAgICk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Zvcm1TdGFydCgkcGFyYW1zKSk7CiAgfQoKICAvL09ic29sZXRlCiAgZnVuY3Rpb24gU21hcnR5VXBsb2FkRm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgeyAgICAKICAgICR0aGlzLT5TbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcyk7CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtRW5kKCkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtRW5kKCkpOwogIH0KCiAgLypmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0U3VibWl0KGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHRleHQsImNvbmZpcm10ZXh0Ij0+JGNvbmZpcm10ZXh0KSkpOwogIH0qLwoKICAKICAKICBmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbk11bHRpKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkgewogICAgJG91dHB1dD0iXG4iOwogICAgZm9yZWFjaCgkZmllbGRzIGFzICRuYW1lPT4kdmFsdWUpIHsKICAgICAgJG91dHB1dC49JHRoaXMtPk5lb0lucHV0SGlkZGVuKGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHZhbHVlKSkuIlxuIjsKICAgIH0KICAgICRvdXRwdXQuPSJcbiI7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCRvdXRwdXQpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5TGluaygkc21hcnR5bmFtZSwkZmllbGRzPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0Ntc0xpbmsoJGZpZWxkcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRGaWxlKCRwYXJhbXMpIHsKICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dEZpbGUoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWNjZXB0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsIjEwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0RmlsZSgkc21hcnR5bmFtZSwgJHBhcmFtcykgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRGaWxlKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0VGV4dCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsIjEwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtYXhsZW5ndGgiLCRwYXJhbXMsIjI1NSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBEYXRlMlVuaXgoJHRpbWUsICRmb3JtYXQ9ImRkbW15eXl5IikgewoJCSRkdHBhcnRzPWV4cGxvZGUoIi8iLCR0aW1lKTsKICAgICRkYXk9IiI7JG1vbnRoPSIiOyR5ZWFyPSIiOwogICAgc3dpdGNoKCRmb3JtYXQpIHsKICAgICAgY2FzZSAibW1kZHl5eXkiIDogJGRheT0kZHRwYXJ0c1sxXTsgJG1vbnRoPSRkdHBhcnRzWzBdOyAkeWVhcj0kZHRwYXJ0c1syXTsgYnJlYWs7CiAgICAgIGNhc2UgInl5bW1kZCIgOiAkZGF5PSRkdHBhcnRzWzJdOyAkbW9udGg9JGR0cGFydHNbMV07ICR5ZWFyPSRkdHBhcnRzWzBdOyBicmVhazsKICAgICAgY2FzZSAieXl5bW1kZCIgOiAkZGF5PSRkdHBhcnRzWzJdOyAkbW9udGg9JGR0cGFydHNbMV07ICR5ZWFyPSRkdHBhcnRzWzBdOyBicmVhazsKCiAgICAgIGNhc2UgImRkbW15eXl5IiA6IAogICAgICBkZWZhdWx0IDogJGRheT0kZHRwYXJ0c1swXTsgJG1vbnRoPSRkdHBhcnRzWzFdOyR5ZWFyPSRkdHBhcnRzWzJdOwogICAgfQoKCQlyZXR1cm4gbWt0aW1lKDAsMCwwLCRtb250aCwkZGF5LCR5ZWFyKTsKCX0KCgogIC8qCiAgICogCWNhc2UgIkRETU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJERE1NTVlZWVkiOgoJCXJldHVybiAocERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiTU1ERFlZWVkiOgoJCXJldHVybiAoTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NTUREWVlZWSI6CgkJcmV0dXJuICh0aGlzLkdldE1vbnRoTmFtZShmYWxzZSkgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJZWVlZTU1ERCI6CgkJcmV0dXJuICh0aGlzLlllYXIgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTUREIjoKCQlyZXR1cm4gKFN0cmluZyh0aGlzLlllYXIpLnN1YnN0cmluZygyLCA0KSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWU1NTUREIjoKCQlyZXR1cm4gKFN0cmluZyh0aGlzLlllYXIpLnN1YnN0cmluZygyLCA0KSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLkdldE1vbnRoTmFtZShmYWxzZSkgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZWVlNTU1ERCI6CgkJcmV0dXJuICh0aGlzLlllYXIgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKQogICAqLwogIGZ1bmN0aW9uIE5lb0lucHV0RGF0ZXRpbWUoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkcmVzdWx0PSIiOwogICAgc3RhdGljICRqc3NlbnQgPSBmYWxzZTsKICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICBpZiAoISRqc3NlbnQpIHsKICAgICAgJG5lb209JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCJOZW9Nb2R1bGUiKTsKICAgICAgJHJlc3VsdC49IgoKICAgICAgPHNjcmlwdCBzcmM9JyIuJG5lb20tPk5lb0Ntc1VybChhcnJheSgiYWN0aW9uIj0+ImRhdGV0aW1lcGlja2VyIikpLiImc2hvd3RlbXBsYXRlPWZhbHNlJz48L3NjcmlwdD4KCiAgICAgICI7CiAgICAgICRqc3NlbnQ9dHJ1ZTsKICAgIH0KICAgIGlmIChpc3NldCgkcGFyYW1zWyJyZWFkb25seSJdKSAmJiAkcGFyYW1zWyJyZWFkb25seSJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbImFkZHRleHQiXS49IiByZWFkb25seSI7CiAgICB9CiAgICAkZm9ybWF0PSR0aGlzLT5OUFYoImZvcm1hdCIsJHBhcmFtcywiZGRtbXl5eXkiKTsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJ1bml4dmFsdWUiXSkgJiYgJHBhcmFtc1sidW5peHZhbHVlIl0hPSIiKSB7CiAgICAgIHN3aXRjaCAoJGZvcm1hdCkgewogICAgICAgIGNhc2UgImRkbW15eXl5IiA6ICRwYXJhbXNbInZhbHVlIl09ZGF0ZSgiai9uL1kiLCAkcGFyYW1zWyJ1bml4dmFsdWUiXSk7IGJyZWFrOwogICAgICAgIGNhc2UgIm1tZGR5eXl5IiA6ICRwYXJhbXNbInZhbHVlIl09ZGF0ZSgibi9qL1kiLCAkcGFyYW1zWyJ1bml4dmFsdWUiXSk7IGJyZWFrOwogICAgICAgIGNhc2UgInl5bW1kZCIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoInkvbi9qIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgICBjYXNlICJ5eXl5bW1kZCIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoIlkvbi9qIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgfQogICAgfQogICAgJHJlc3VsdC49JHRoaXMtPk5lb0lucHV0VGV4dCgkcGFyYW1zKTsKCiAgICAkcmVzdWx0Lj0iPGltZyBzcmM9JyIuJGNvbmZpZ1sicm9vdF91cmwiXS4iL21vZHVsZXMvTmVvTW9kdWxlL2RhdGV0aW1lcGlja2VyL2ltYWdlcy9jYWwuZ2lmJyBvbmNsaWNrPVwiamF2YXNjcmlwdDpOZXdDc3NDYWwoJyIuJHRoaXMtPl9pZC4kcGFyYW1zWyJuYW1lIl0uIicsJyIuJGZvcm1hdC4iJylcIiAvPiI7CiAgICAvL29uY2xpY2s9ImphdmFzY3JpcHQ6TmV3Q3NzQ2FsKCdkZW1vMScsJ2RkbW15eXl5JykKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRUZXh0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFRleHQoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXREYXRldGltZSgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXREYXRldGltZSgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFBhc3N3b3JkKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFBhc3N3b3JkKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsIjEwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtYXhsZW5ndGgiLCRwYXJhbXMsIjI1NSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0UGFzc3dvcmQoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0UGFzc3dvcmQoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvVGV4dGFyZWEoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZVRleHRBcmVhKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZW5hYmxld3lzaXd5ZyIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoInZhbHVlIiwidGV4dCIsImNvbnRlbnQiKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgiY2xhc3MiLCJjbGFzc25hbWUiKSwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImh0bWxpZCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmNvZGluZyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzdHlsZXNoZWV0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbHMiLCRwYXJhbXMsIjgwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyb3dzIiwkcGFyYW1zLCIxNSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiZm9yY2V3eXNpd3lnIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIndhbnRlZHN5bnRheCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0VGV4dGFyZWEoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb1RleHRhcmVhKCRwYXJhbXMpKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5VGV4dGFyZWEoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb1RleHRhcmVhKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKSB7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1siY2hlY2tlZCJdKSAmJiAkcGFyYW1zWyJjaGVja2VkIl09PXRydWUpIHsKICAgICAgJHBhcmFtc1sic2VsZWN0ZWR2YWx1ZSJdPSRwYXJhbXNbInZhbHVlIl07CiAgICB9CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWR2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0Q2hlY2tib3goJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0Q2hlY2tib3goJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRTdWJtaXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICBpZiAoaXNzZXQoJHBhcmFtc1siaWdub3JldmFsaWRhdGlvbiJdKSAmJiAkcGFyYW1zWyJpZ25vcmV2YWxpZGF0aW9uIl09PSIxIikgewogICAgICAkcGFyYW1zWyJhZGR0ZXh0Il09Im9uQ2xpY2s9J2lnbm9yZXZhbGlkYXRpb249MTsnIjsKICAgIH0KICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbWFnZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJjb25maXJtdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpLCAkdmFsdWU9IiIpIHsKICAgIGlmIChpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRTdWJtaXQoJHBhcmFtcykpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0U3VibWl0KGFycmF5KCJuYW1lIj0+JHBhcmFtcywidmFsdWUiPT4kdmFsdWUpKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFJlc2V0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiUmVzZXQiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0SGlkZGVuKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dEhpZGRlbigKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dEhpZGRlbigkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCksJG9wdHZhbHVlPSIiKSB7CiAgICBpZiAoaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRIaWRkZW4oJHBhcmFtcykpOwogICAgfSBlbHNlIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kcGFyYW1zLCJ2YWx1ZSI9PiRvcHR2YWx1ZSkpKTsKICAgIH0KCiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dERyb3Bkb3duKCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dERyb3Bkb3duKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpbmRleCIsJHBhcmFtcywtMSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXREcm9wZG93bigkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dERyb3Bkb3duKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJkZWxpbWl0ZXIiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCgogIAoKICBmdW5jdGlvbiBOZW9JbnB1dFNlbGVjdExpc3QoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0U2VsZWN0TGlzdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpdGVtcyIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZGl0ZW1zIiwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywzKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibXVsdGlwbGUiLCRwYXJhbXMsdHJ1ZSkKICAgICk7CiAgfQoKCiAgZnVuY3Rpb24gU21hcnR5U2NyYW1ibGVFbWFpbCgkZW1haWwsICRzY3JhbWJsaW5nPSJoZXgiKSB7CiAgICAgJHNtYXJ0eV9kYXRhID0gInttYWlsdG8gYWRkcmVzcz0nIi4kZW1haWwuIicgZW5jb2RlPSciLiRzY3JhbWJsaW5nLiInfSI7CiAgICAgLyokc21hcnR5LT5fY29tcGlsZV9zb3VyY2UoJ3RlbXBvcmFyeSB0ZW1wbGF0ZScsICRzbWFydHlfZGF0YSwgJF9jb21waWxlZCApOwogICAgIEBvYl9zdGFydCgpOwogICAgICRzbWFydHktPl9ldmFsKCc/PicgLiAkX2NvbXBpbGVkKTsKICAgICAkX2NvbnRlbnRzID0gQG9iX2dldF9jb250ZW50cygpOwogICAgIEBvYl9lbmRfY2xlYW4oKTsqLwogICAgICRyZXN1bHQ9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKCRzbWFydHlfZGF0YSk7CiAgICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICAvKioKICAgKgogICAqIExpc3QgaGVscGVyIGZ1bmN0aW9ucwogICAqCiAgICovCiAgIGZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsJHRoaXMtPk5lb1N5c3RlbUljb24oImRlbGV0ZS5naWYiLCR0ZXh0KSwkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgICByZXR1cm4gJGljb247CiAgIH0KCiAgIGZ1bmN0aW9uIE5lb0NvcHlJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiY29weS5naWYiLCR0ZXh0KSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CgogICBmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImVkaXQuZ2lmIiwkdGV4dCksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQogICBmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oInRydWUuZ2lmIiwkdGV4dCksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgIHJldHVybiAkaWNvbjsKICAgfQogICBmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJmYWxzZS5naWYiLCR0ZXh0KSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgcmV0dXJuICRpY29uOwogICB9CgogICBmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIsICRpbmNsdWRldGV4dGxpbmsgPSB0cnVlKSB7CiAgICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwgJHRoaXMtPk5lb1N5c3RlbUljb24oIm5ld29iamVjdC5naWYiLCR0ZXh0KSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgaWYgKCRpbmNsdWRldGV4dGxpbmspIHsKICAgICAgICRpY29uLj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCAkdGV4dCwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICAgfQogICAgIC8vJGljb24uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCAkdGV4dCwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbiwgZmFsc2UsIGZhbHNlLCAnY2xhc3M9InBhZ2VvcHRpb25zIicpOwoKICAgICAvLz0kdGhpcy0+Q3JlYXRlTGluaygkaWQsICdlZGl0dGVtcGxhdGUnLCAwLCAkdGhlbWVPYmplY3QtPkRpc3BsYXlJbWFnZSgnaWNvbnMvc3lzdGVtL25ld29iamVjdC5naWYnLCR0aGlzLT5MYW5nKCJhZGR0ZW1wbGF0ZSIpLCcnLCcnLCdzeXN0ZW1pY29uJyksIGFycmF5KCksICcnLCBmYWxzZSwgZmFsc2UsICcnKSAuJyAnLiAkdGhpcy0+Q3JlYXRlTGluaygkaWQsICdlZGl0dGVtcGxhdGUnLCAkcmV0dXJuaWQsICR0aGlzLT5MYW5nKCJhZGR0ZW1wbGF0ZSIpLCBhcnJheSgidG9kbyI9PiJhZGQiKSwgJycsIGZhbHNlLCBmYWxzZSwgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKTsKICAgIHJldHVybiAkaWNvbjsKICAgfQoKICAgZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikgewogICAgICR0aGVtZW9iaj0kdGhpcy0+X2dldHRoZW1lb2JqKCk7CiAgICAgaWYgKCR0aGVtZW9iaikgewogICAgICAgcmV0dXJuICR0aGVtZW9iai0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vJy4kaWNvbiwgJHRleHQsJycsJycsJ3N5c3RlbWljb24nKTsKICAgICB9IHJldHVybiAiIjsKICAgfQoKICAgZnVuY3Rpb24gTmVvSGlkZGVuQ29udGVudCgkdGV4dCwgJGNvbnRlbnQsICRjbGlja3R5cGU9InRleHQiLCAkc3RhcnRzaG93bj1mYWxzZSkgewogICAgIHJldHVybiAiPHN0cm9uZz4kdGV4dDwvc3Ryb25nPjxici8+JGNvbnRlbnQiOwogICB9CgogICAvKioKICAgKgogICAqIERCIFNob3J0Y3V0cwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb0RCSW5zZXJ0KCR0YWJsZSwgJHZhbHVlcz1hcnJheSgpLCAkdXNlZ2VuaWQ9ZmFsc2UpIHsKICAgICRkYiA9IGNtc21zKCktPkdldERCKCk7CiAgICAkcSA9ICJJTlNFUlQgSU5UTyAiIC4gY21zX2RiX3ByZWZpeCgpIC4gJHRhYmxlOwogICAgJHA9YXJyYXkoKTsKICAgICRmaWVsZHM9IiI7CiAgICAkdmFsPSIiOwogICAgZm9yZWFjaCgkdmFsdWVzIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICBpZiAoJGZpZWxkcz09IiIpICRmaWVsZHM9JGtleTsgZWxzZSAkZmllbGRzLj0iLCIuJGtleTsKICAgICAgaWYgKCR2YWw9PSIiKSAkdmFsPSI/IjsgZWxzZSAkdmFsLj0iLD8iOwogICAgICAkcFtdPSR2YWx1ZTsKICAgIH0KICAgICRxLj0iICgiLiRmaWVsZHMuIikgVkFMVUVTICgiLiR2YWwuIikiOwogICAgLy9lY2hvICRxOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxLCAkcCk7CiAgICByZXR1cm4gKCRkYnJlc3VsdCE9PXRydWUpOwogIH0KCiAgZnVuY3Rpb24gTmVvREJFcnJvckRpZSgpIHsKICAgICRkYiA9IGNtc21zKCktPkdldERCKCk7CiAgICBlY2hvICRkYi0+RXJyb3JNc2coKSAuICI8YnI+PGJyPiIgLiAkZGItPnNxbDsKICAgIGRpZSgpOwogIH0KCiAgZnVuY3Rpb24gTmVvREJVcGRhdGUoJHRhYmxlLCAkdmFsdWVzID0gYXJyYXkoKSwgJGNyaXRlcmlhID0gYXJyYXkoKSkgewogICAgJGRiID0gY21zbXMoKS0+R2V0REIoKTsKICAgICRxID0gIlVQREFURSAiIC4gY21zX2RiX3ByZWZpeCgpIC4gJHRhYmxlIC4gIiBTRVQgIjsKICAgICRwID0gYXJyYXkoKTsKICAgICRmaXJzdCA9IHRydWU7CiAgICBmb3JlYWNoICgkdmFsdWVzIGFzICRmaWVsZCA9PiAkdmFsdWUpIHsKICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICRxIC49ICRmaWVsZCAuICI9PyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHEgLj0gIiwgIiAuICRmaWVsZCAuICI9PyI7CiAgICAgIH0KICAgICAgJHAgPSBhcnJheV9tZXJnZSgkcCwgYXJyYXkoJHZhbHVlKSk7CiAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgfQogICAgaWYgKGNvdW50KCR2YWx1ZXMpPT0yKSB7CgogICAgfQoKICAgICRmaXJzdCA9IHRydWU7CiAgICBmb3JlYWNoICgkY3JpdGVyaWEgYXMgJGZpZWxkID0+ICR2YWx1ZSkgewogICAgICBpZiAoJGZpcnN0KSB7CiAgICAgICAgJHEgLj0gIiBXSEVSRSAiIC4gJGZpZWxkIC4gIj0/IjsKICAgICAgfSBlbHNlIHsKICAgICAgICAkcSAuPSAiIEFORCAiIC4gJGZpZWxkIC4gIj0/IjsKICAgICAgfQogICAgICAkcCA9IGFycmF5X21lcmdlKCRwLCBhcnJheSgkdmFsdWUpKTsKICAgICAgJGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICAvL2VjaG8gJHE7cHJpbnRfcigkcCk7ZGllKCk7CgoKCiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoJHEsICRwKTsKICAgIGlmIChjb3VudCgkdmFsdWVzKT09MikgewogICAgICAvL2VjaG8gJHE7cHJpbnRfcigkcCk7ZGllKCk7CiAgICAgLy8gZWNobyAkZGItPnNxbDtkaWUoKTsKICAgIH0KCiAgICBpZiAoISRkYnJlc3VsdCkgewogICAgICAvL2VjaG8gJGRiLT5FcnJvck1zZygpO2RpZSgpOwogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsvLyRkYnJlc3VsdC0+QWZmZWN0ZWRfUm93cygpOwogIH0KCiAgZnVuY3Rpb24gTmVvREJTZWxlY3QoJHRhYmxlLCAkdmFsdWVzPWFycmF5KCkpIHsKCiAgfQoKICBmdW5jdGlvbiBOZW9EQkRlbGV0ZSgkdGFibGUsICR2YWx1ZXM9YXJyYXkoKSkgewoKICB9CgoKICAvKioKICAgKgogICAqIE5lb0RhdGFTdG9yYWdlIHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gQWRkRW50aXR5KCR0YWJsZSwgJHByb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+QWRkRW50aXR5KCR0aGlzLT5HZXROYW1lKCksJHRhYmxlLCRwcm9wcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBBZGRFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEZWxldGVFbnRpdHkoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0eSgkaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRGVsZXRlRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRGVsZXRlRW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5EZWxldGVFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBEZWxldGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0eSgkaWQsICRvdmVycmlkZXByb3BzPWFycmF5KCksICRmaWxsZmllbGRzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHMsICRmaWxsZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzKCR0YWJsZT0iIiwgJGNyaXRlcmlhPWFycmF5KCksICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldE9uZUVudGl0eSgkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpLCAkZmFpbGlmbXVsdGlwbGU9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0T25lRW50aXR5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhLCAkZmFpbGlmbXVsdGlwbGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0T25lRW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0T25lU29ydGVkRW50aXR5KCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCksICRzb3J0ZmllbGRzPWFycmF5KCksJGZhaWxpZm11bHRpcGxlPWZhbHNlICkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0aWVzRnVsbCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhcj10cnVlKi8pIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyKi8pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcz1hcnJheSgpLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkdmFsdWVzKSkgewogICAgICAkdmFsdWVzPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyLCAkZmlsbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVtb3ZlTW9kdWxlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHMoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5UHJvcHMoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNvcnRFbnRpdGllcygkbGlzdCwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Tb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNvcnRFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0aWVzQ291bnQoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdGllc0NvdW50KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEVudGl0aWVzQ291bnQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhck1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvdW50RW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGVudGl0aWVzPSR0aGlzLT5HZXRFbnRpdGllcygkdGFibGUsICRjcml0ZXJpYSwgdHJ1ZSk7CiAgICByZXR1cm4gY291bnQoJGVudGl0aWVzKTsKICB9CgogIGZ1bmN0aW9uIElzVGFibGVFbXB0eSgkdGFibGUpIHsgICAgCiAgICByZXR1cm4gKCR0aGlzLT5Db3VudEVudGl0aWVzKCR0YWJsZSk9PTApOwogIH0KCiAgLyoKICAgKgogICAqIENvbm5lY3Rpb24gZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb246IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIsICRyZXR1cm52YWx1ZT10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZSwgJHJldHVybnZhbHVlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDI9LTEsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEVudGl0eUNvbm5lY3Rpb25zKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEVudGl0eUNvbm5lY3Rpb25zOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lLCRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQWRkRmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRGaWVsZFNldCgkbmFtZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRGaWVsZFNldCgkdGhpcy0+R2V0TmFtZSgpLCRuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldEZpZWxkU2V0OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gRW50aXR5U2V0VW5zZXRQcm9wcygkZW50aXR5LCRmaWVsZHNldCwkZmlsbHZhbHVlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkVudGl0eVNldFVuc2V0UHJvcHMoJHRoaXMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCkpLCRlbnRpdHksJGZpZWxkc2V0LCRmaWxsdmFsdWU9IiIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKCiAgZnVuY3Rpb24gR2V0RFNFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTaG93RFNFcnJvcnMoJGNsZWFyPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RXJyb3JzKCRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTaG93RFNFcnJvcnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEU0luRXJyb3IoKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkluRXJyb3IoKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERTSW5FcnJvcjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIC8qCiAgICoKICAgKiBVdGlsaXR5IGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIE5lb1NsYXNoZXMoJHVybCkgewoJCSRyZXN1bHQ9c3RyX3JlcGxhY2UoIlxcIiwiLyIsJHVybCk7CiAgICAvL1llcywgcGhwIHVuZGVyIHdpbmRvd3MgcnVucyBwZXJmZWN0bHkgd2l0aCB0aG9zZSBzbGFzaGVzLCBhcyBsb25nIGFzIHlvdQogICAgLy9kb24ndCBtaXggdGhlbSB3aXRoIGJhY2tzbGFzaGVzISEKCQkvLyRyZXN1bHQ9c3RyX3JlcGxhY2UoIi8iLERJUkVDVE9SWV9TRVBBUkFUT1IsJHVybCk7CgkJLy9yZXR1cm4gc3RyX3JlcGxhY2UoIlxcIixESVJFQ1RPUllfU0VQQVJBVE9SLCRyZXN1bHQpOwoJCXJldHVybiAkcmVzdWx0OwoJfQoKICBmdW5jdGlvbiBEZWNvZGVIVE1MRW50aXRpZXMoJHMpIHsKICAgICR0bXA9aHRtbF9lbnRpdHlfZGVjb2RlKCRzKTsKICAgIHdoaWxlICgkdG1wIT1odG1sX2VudGl0eV9kZWNvZGUoJHRtcCkpIHsKICAgICAgJHRtcD1odG1sX2VudGl0eV9kZWNvZGUoJHRtcCk7CiAgICB9CiAgICByZXR1cm4gaHRtbF9lbnRpdHlfZGVjb2RlKCR0bXApOwogIH0KCiAgZnVuY3Rpb24gU2xhc2hlcygkdXJsKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb1NsYXNoZXMoJHVybCk7CiAgfQoKCWZ1bmN0aW9uIFNsYXNoKCRzdHIsJHN0cjI9IiIsJHN0cjM9IiIpIHsKCQlpZiAoJHN0cj09IiIpIHJldHVybiAkc3RyMjsKCQlpZiAoJHN0cjI9PSIiICYmICRzdHIzPT0iIikgcmV0dXJuICRzdHI7CiAgICAkcmVzdWx0PSIiOwoJCWlmICgkc3RyW3N0cmxlbigkc3RyKS0xXSE9Ii8iKSB7CgkJCWlmICgkc3RyMlswXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRzdHIuIi8iLiRzdHIyOwoJCQl9IGVsc2UgewoJCQkJJHJlc3VsdD0kc3RyLiRzdHIyOwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCRzdHIyWzBdIT0iLyIpIHsKCQkJCSRyZXN1bHQ9JHN0ci4kc3RyMjsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHN0ci5zdWJzdHIoJHN0cjIsMSk7IC8vdHJpbSBhd2F5IG9uZSBvZiB0aGUgc2xhc2hlcwoJCQl9CgkJfQogICAgaWYgKCRzdHIzPT0iIikgcmV0dXJuICRyZXN1bHQ7CiAgICBpZiAoJHJlc3VsdFtzdHJsZW4oJHJlc3VsdCktMV0hPSIvIikgewoJCQlpZiAoJHN0cjNbMF0hPSIvIikgewoJCQkJJHJlc3VsdD0kcmVzdWx0LiIvIi4kc3RyMzsKCQkJfSBlbHNlIHsKCQkJCSRyZXN1bHQ9JHJlc3VsdC4kc3RyMzsKCQkJfQoJCX0gZWxzZSB7CgkJCWlmICgkc3RyM1swXSE9Ii8iKSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CgkJCX0gZWxzZSB7CgkJCQkkcmVzdWx0PSRyZXN1bHQuc3Vic3RyKCRzdHIzLDEpOyAvL3RyaW0gYXdheSBvbmUgb2YgdGhlIHNsYXNoZXMKCQkJfQoJCX0KICAgIHJldHVybiAkcmVzdWx0OwoJfQoKICBmdW5jdGlvbiBOZW9EaXJMaXN0KCRyb290LCRyZXR1cm49ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCksJG1heHJlY3Vyc2lvbj0tMSkgewogICAgJGRpcmxpc3Q9YXJyYXkoKTsKICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICAkbW9kZT0iIjsKICAgIHN3aXRjaCgkcmV0dXJuKSB7CiAgICAgIGNhc2UgImZpbGVzIjogJG1vZGU9IkZJTEVTIjticmVhazsKICAgICAgY2FzZSAiZGlycyI6ICRtb2RlPSJESVJTIjticmVhazsKICAgICAgY2FzZSAiYm90aCI6ICRtb2RlPSJGVUxMIjticmVhazsKICAgIH0KICAgICRmdWxscm9vdD0kdGhpcy0+U2xhc2goJGNvbmZpZ1sicm9vdF9wYXRoIl0sJHJvb3QpOwogICAgJGZpbGVyZWM9IGdldF9yZWN1cnNpdmVfZmlsZV9saXN0ICgkZnVsbHJvb3QsICRleGNsdWRlcyAsJG1heHJlY3Vyc2lvbiAsJG1vZGUpOyAvL05vIG1heGRlcHRoIGluIHJlY3Vyc2lvbgogICAgaWYgKCFlbXB0eSgkaW50cm9kdWN0aW9uKSkgewogICAgICAkZGlybGlzdD0kaW50cm9kdWN0aW9uOwogICAgfQogICAgZm9yZWFjaCgkZmlsZXJlYyBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgJHZhbHVlMT0kdGhpcy0+U2xhc2hlcyhzdHJfcmVwbGFjZSgkY29uZmlnWydyb290X3BhdGgnXSwnJywkdmFsdWUpKTsKICAgICAgLy9wcmV2ZW50IGN1cnJlbnQgZGlyIGZyb20gc2hvd2luZyB1cAogICAgICAvL2lmICgkdmFsdWUxPT0oJHByb2ZpbGVbInBhdGgiXS4iLyIpKSBjb250aW51ZTsKICAgICAgLy9DaGVjayBmb3IgaGlkZGVuIGZpbGVzCiAgICAgICRkaXJzPWV4cGxvZGUoIi8iLCR2YWx1ZTEpOwogICAgICAkaGlkZGVuPWZhbHNlOwogICAgICBmb3JlYWNoKCRkaXJzIGFzICRkaXIpIHsKICAgICAgICBpZiAoc3Vic3RyKCRkaXIsMCwxKT09Ii4iKSB7JGhpZGRlbj10cnVlOyBicmVhazt9CiAgICAgIH0KICAgICAgaWYgKCRoaWRkZW4pIGNvbnRpbnVlOwoKICAgICAgLy9ub3QgaGlkZGVuLCBhZGQgdG8gbGlzdAogICAgICAkZGlybGlzdFskdmFsdWUxXT0kdmFsdWUxOwogICAgfQogICAgcmV0dXJuICRkaXJsaXN0OwogIH0KCiAgZnVuY3Rpb24gTmVvR2V0TWltZVR5cGUoJGZpbGVuYW1lLCAkaW5jbHVkZWVuY29kaW5nID0gdHJ1ZSkgewogICAgaWYgKGNsYXNzX2V4aXN0cygiZmluZm8iKSkgewogICAgICAkZmluZm8gPSBhcnJheSgpOwogICAgICBpZiAoJGluY2x1ZGVlbmNvZGluZykgewogICAgICAgICRmaW5mbyA9IG5ldyBmaW5mbyhGSUxFSU5GT19NSU1FKTsgLy8gcmV0dXJuIG1pbWUgdHlwZSBhbGEgbWltZXR5cGUgZXh0ZW5zaW9uCiAgICAgIH0gZWxzZSB7CiAgICAgICAgJGZpbmZvID0gbmV3IGZpbmZvKEZJTEVJTkZPX01JTUVfVFlQRSk7IC8vIHJldHVybiBtaW1lIHR5cGUgYWxhIG1pbWV0eXBlIGV4dGVuc2lvbgogICAgICB9CiAgICAgIGlmICghJGZpbmZvKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHJldHVybiAkZmluZm8tPmZpbGUoJGZpbGVuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChmdW5jdGlvbl9leGlzdHMoIm1pbWVfY29udGVudF90eXBlIikpIHsKICAgICAgICByZXR1cm4gbWltZV9jb250ZW50X3R5cGUoJGZpbGVuYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlX29uY2UoZGlybmFtZShfX0ZJTEVfXykuRElSRUNUT1JZX1NFUEFSQVRPUi4ibWltZXR5cGVzLnBocCIpOwogICAgICAgIHJldHVybiByZXR1cm5NSU1FVHlwZSgkZmlsZW5hbWUpOwogICAgICB9CiAgICB9CiAgfQoKICAvKkNoZWNrcyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBhbiBpbmRleCBpbiBhbiBhcnJheSBhbmQgcmV0dXJuIHRoZSB2YWx1ZSBpZiBpdCdzIHRoZXJlCiAgICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKICAqLwogIGZ1bmN0aW9uIE5lb1BhcmFtVmFsdWUoJG5hbWUsJHBhcmFtcz1hcnJheSgpLCRkZWZhdWx0PSIiKSB7CiAgICAKICAgIGlmICghaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgLy9UaGlzIHdheSAybmQgcGFyYW1ldGVyIGNhbiBhbHNvIGJlIHVzZWQgYXMgZGVmYXVsdCB2YWx1ZQogICAgICBpZiAoJHBhcmFtcyE9IiIgJiYgJGRlZmF1bHQ9PSIiKSB7CiAgICAgICAgJGRlZmF1bHQ9JHBhcmFtczsKICAgICAgfQogICAgICAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgaWYgKCFpc19hcnJheSgkbmFtZSkpIHsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJG5hbWVdKSkgcmV0dXJuICRwYXJhbXNbJG5hbWVdOwogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9IGVsc2UgewogICAgICBmb3JlYWNoICgkbmFtZSBhcyAkc2luZ2xlbmFtZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRzaW5nbGVuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRzaW5nbGVuYW1lXTsKICAgICAgfQogICAgICByZXR1cm4gJGRlZmF1bHQ7CiAgICB9CiAgfQoKICAvL1Nob3J0Y3V0IGZvciB0aGUgYWJvdmUKICBmdW5jdGlvbiBOUFYoJG5hbWUsICRwYXJhbXM9ZmFsc2UsICRkZWZhdWx0PSIiKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb1BhcmFtVmFsdWUoJG5hbWUsICRwYXJhbXMsICRkZWZhdWx0KTsKICB9CgogIEZ1bmN0aW9uIE5lb0FwcGx5UGFyYW1WYWx1ZXMoJHRoaXNhcnJheSwgJHBhcmFtcz1hcnJheSgpLCAkaW5kZXhlcz1hcnJheSgpLCAkYWx3YXlzZmlsbD1mYWxzZSkgewogICAgaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgaWYgKGVtcHR5KCRwYXJhbXMpIHx8IGVtcHR5KCRpbmRleGVzKSkgcmV0dXJuICR0aGlzYXJyYXk7CiAgICBpZiAoaXNfYXNzb2MoJGluZGV4ZXMpKSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4PT4kZGVmYXVsdHZhbHVlKSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kZGVmYXVsdHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCgkaW5kZXhlcyBhcyAkaW5kZXgpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skaW5kZXhdKSkgewogICAgICAgICAgJHRoaXNhcnJheVskaW5kZXhdPSRwYXJhbXNbJGluZGV4XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKCRhbHdheXNmaWxsKSB7CiAgICAgICAgICAgIGlmICghaXNzZXQoJHRoaXNhcnJheVskaW5kZXhdKSkgJHRoaXNhcnJheVskaW5kZXhdPSIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy9wcmludF9yKCR0aGlzYXJyYXkpOwogICAgcmV0dXJuICR0aGlzYXJyYXk7CiAgfQoKICBmdW5jdGlvbiBOZW9BcHBseU5ld1ZhbHVlcygkb2xkdmFsdWVzLCAkbmV3dmFsdWVzLCRpZ25vcmVibGFuaz1mYWxzZSkgewogICAgJHJlc3VsdD0kb2xkdmFsdWVzOwogICAgZm9yZWFjaCgkcmVzdWx0IGFzICRpbmRleD0+JHZhbHVlKSB7CiAgICAgIGlmIChpc3NldCgkbmV3dmFsdWVzWyRpbmRleF0pKSB7CiAgICAgICAgJHJlc3VsdFskaW5kZXhdPSRuZXd2YWx1ZXNbJGluZGV4XTsKICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBNYWtlU2ltcGxlQXJyYXkoJHRhYmxlLCRmaWVsZCwkYXNzb2NpZD10cnVlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VTaW1wbGVBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZCwgJGFzc29jaWQpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE1ha2VBc3NvY0FycmF5KCR0YWJsZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPk1ha2VBc3NvY0FycmF5KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBNYWtlQXNzb2NBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKSB7CgkJJGV4cGxvZGVkZmlsZT1leHBsb2RlKCIuIiwkZmlsZW5hbWUpOwoJCSRleHQ9c3RydG9sb3dlcihhcnJheV9wb3AoJGV4cGxvZGVkZmlsZSkpOwoJCWlmIChpbl9hcnJheSgkZXh0LCRhbGxvd2VkZXh0ZW5zaW9ucykpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVG9vbFRpcCgkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0ZXh0PSR0aGlzLT5OUFYoInRleHQiLCRwYXJhbXMsIj8iKTsKICAgICR1cmw9JHRoaXMtPk5QVigidXJsIiwkcGFyYW1zLCIiKTsKICAgICR0aXRsZT0kdGhpcy0+TlBWKCJ0aXRsZSIsJHBhcmFtcywiIik7CiAgICAkY29udGVudD0kdGhpcy0+TlBWKCJjb250ZW50IiwkcGFyYW1zLCIiKTsKICAgICRzcGFuY2xhc3M9JHRoaXMtPk5QVigic3BhbmNsYXNzIiwkcGFyYW1zLCJuZW90b29sdGlwIik7CiAgICBpZiAoJHVybCE9IiIpIHsKICAgICAgJHJlc3VsdD0nPGEgY2xhc3M9IicuJHNwYW5jbGFzcy4nIiBocmVmPSInLiR1cmwuJyI+JzsKICAgIH0gZWxzZSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgc3R5bGU9ImN1cnNvcjogZGVmYXVsdDsiIGhyZWY9IiMiIG9uY2xpY2s9InJldHVybiBmYWxzZTsiPic7CiAgICB9CiAgICAkcmVzdWx0Lj0kdGV4dDsKICAgICRyZXN1bHQuPSc8c3Bhbj4nOwogICAgaWYgKCR0aXRsZSE9IiIpIHsKICAgICAgJHJlc3VsdC49IjxzdHJvbmc+Ii4kdGl0bGUuIjwvc3Ryb25nPjxici8+IjsKICAgIH0KICAgICRyZXN1bHQuPSRjb250ZW50OwogICAgJHJlc3VsdC49Ijwvc3Bhbj4iOwogICAgJHJlc3VsdC49IjwvYT4iOwogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkgewogICAgaWYgKCFpc19hcnJheSgkZGF0YSkpIHJldHVybiB0cnVlOwogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmIChlbXB0eSgkZGF0YSkpIHJldHVybiB0cnVlOwogICAgaWYgKCRpbmRleD09IiIpIHJldHVybiB0cnVlOwogICAgaWYgKCFpc3NldCgkZGF0YVskaW5kZXhdKSkgcmV0dXJuIHRydWU7CiAgICBpZiAodHJpbSgkZGF0YVskaW5kZXhdKT09IiIpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gTmVvVmFsaWRhdGVFbWFpbCgkZW1haWwsICRhdm9pZG9ubGluZSA9IGZhbHNlKSB7CiAgICBpZiAocHJlZ19tYXRjaCgiL15bYS16QS1aMC05X10rQFthLXpBLVowLTlcLV0rXC5bYS16QS1aMC05XC1cLl0rJF0vaSIsICRlbWFpbCkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGlmICgkYXZvaWRvbmxpbmUpIHJldHVybiB0cnVlOwoKICAgIGxpc3QoJFVzZXJuYW1lLCAkRG9tYWluKSA9IGV4cGxvZGUoIkAiLCAkZW1haWwpOwoKICAgIGlmIChnZXRteHJyKCREb21haW4sICRNWEhvc3QpKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgaWYgKEBmc29ja29wZW4oJERvbWFpbiwgMjUsICRlcnJubywgJGVycnN0ciwgMzApKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBOZW9WYWxpZGF0ZVVSTCgkdXJsKSB7CiAgICAvLyRwYXR0ZXJuID0gJy9eKChbXHddKzopP1wvXC8pPygoW1xkXHddfCVbYS1mQS1mXGRdezIsMn0pKyg6KFtcZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSspP0ApPyhbXGRcd11bLVxkXHddezAsMjUzfVtcZFx3XVwuKStbXHddezIsNH0oOltcZF0rKT8oXC8oWy0rX34uXGRcd118JVthLWZBLWZcZF17MiwyfSkqKSooXD8oJmFtcDs/KFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pPT8pKik/KCMoWy0rX34uXGRcd118JVthLWZBLWZcZF17MiwyfSkqKT8kLyc7CiAgICByZXR1cm4gKCAhIHByZWdfbWF0Y2goJy9eKGh0dHB8aHR0cHN8ZnRwKTpcL1wvKFtBLVowLTldW0EtWjAtOV8tXSooPzpcLltBLVowLTldW0EtWjAtOV8tXSopKyk6PyhcZCspP1wvPy9pJywgJHVybCkpID8gRkFMU0UgOiBUUlVFOwoKCSAgLy9yZXR1cm4gcHJlZ19tYXRjaCgkcGF0dGVybiwgJHVybCk7CiAgfQoKICBmdW5jdGlvbiBOZW9Ob0JyZWFrcygkc3RyaW5nKSB7CiAgICAkc3RyaW5nPXN0cl9yZXBsYWNlKCIgIiwiJm5ic3A7Iiwkc3RyaW5nKTsKICAgIHJldHVybiAkc3RyaW5nOwogIH0KCiAgZnVuY3Rpb24gTmVvUHJpbnRSKCRkYXRhPWFycmF5KCksJHNlbmRvdXQ9dHJ1ZSkgewogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9Im5vIGNvbnRlbnQgZm91bmQiOwogICAgfQogICAgJG91dHB1dD0nPGJyLz48ZGl2IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkIGJsYWNrIj4nOwogICAgJG91dHB1dC49IjxwcmU+IjsKICAgICRvdXRwdXQuPXByaW50X3IoJGRhdGEsdHJ1ZSk7CiAgICAkb3V0cHV0Lj0iPC9wcmU+IjsKICAgICRvdXRwdXQuPSI8L2Rpdj48YnIvPiI7CiAgICBpZiAoJHNlbmRvdXQpIHsKICAgICAgZWNobyAkb3V0cHV0OwogICAgfQogICAgcmV0dXJuICRvdXRwdXQ7CiAgfQoKICBmdW5jdGlvbiBOZW9UcmltQXJyYXkoJGluYXJyYXk9YXJyYXkoKSkgICB7CiAgICAkb3V0YXJyYXk9YXJyYXkoKTsKICAgIGZvcmVhY2ggKCRpbmFycmF5IGFzICRrZXk9PiR2YWx1ZSkgewogICAgICBpZiAodHJpbSgkdmFsdWUpPT0iIikgY29udGludWU7CiAgICAgICRvdXRhcnJheVska2V5XT10cmltKCR2YWx1ZSk7CiAgICB9CiAgICByZXR1cm4gJG91dGFycmF5OwogIH0KCiAgCgogIC8qCiAgICoKICAgKiBTbWFydHkgc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKSB7CiAgICBpZiAoIWlzX2FycmF5KCRzbWFydHlpbmZvKSkgewogICAgICBpZiAoJHNtYXJ0eWluZm8hPSIiKSB7CiAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCRzbWFydHlpbmZvPT0iIikgewogICAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU21hcnR5QXNzaWduOiBzbWFydHktdmFybmFtZSBub3Qgc2V0IixmYWxzZSxhcnJheSgic21hcnR5aW5mbyI9PiRzbWFydHlpbmZvLCJzbWFydHljb250ZW50Ij0+JHNtYXJ0eWNvbnRlbnQpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvL09rIGl0J3MgYW4gYXJyYXkKICAgIGlmIChpc19hc3NvYygkc21hcnR5aW5mbykpIHsKICAgICAgLy9JdCdzIGFuIGFzc29jX2FycmF5LCBzbyB3ZSBhc3NpZ24gZXZlcnkgc2luZ2xlIHBhaXIgb2YgaW5mbwogICAgICBmb3JlYWNoKCRzbWFydHlpbmZvIGFzICRzbWFydHluYW1lPT4kc21hcnR5Y29udGVudCkgewogICAgICAgIGlmIChpc19hcnJheSgkc21hcnR5Y29udGVudCkpIHsKICAgICAgICAgIC8vaXQncyBhIG5lc3RlZCBhcnJheQogICAgICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJHNtYXJ0eWNvbnRlbnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJHNtYXJ0eW5hbWUsICRzbWFydHljb250ZW50KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8vSXQncyBub3QgYW4gYXNzb2NfYXJyYXksIHNvIHdlIHNpbXBseSByZWYtYXNzaWduIGl0LgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudCk7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIE5lb1NtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQ9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUFzc2lnblByZWYoJHNtYXJ0eW5hbWUsICRwcmVmZXJlbmNlbmFtZT0iIikgewogICAgaWYgKCRwcmVmZXJlbmNlbmFtZSE9IiIpIHsKICAgICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPlByZWYoJHByZWZlcmVuY2VuYW1lKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+UHJlZigkc21hcnR5bmFtZSkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHNtYXJ0eW5hbWU9Im1vZHVsZSIpIHsKICAgIGlmIChpc19vYmplY3QoJG1vZHVsZSkpIHsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZigkc21hcnR5bmFtZSwgJG1vZHVsZSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJG1vZHVsZSkpOwogICAgfQogIH0KCiAgLyoKICAgKgogICAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBGaXJlRGVidWcoJGNvbW1hbmQsJG1lc3NhZ2U9IiIsJHZhcmlhYmxlcz1hcnJheSgpKSB7CiAgICAkZmlyZXBocG1vZHVsZT0kdGhpcy0+R2V0TW9kdWxlSW5zdGFuY2UoJ0ZpcmVQSFBEZWJ1ZycpOwogICAgaWYgKCRmaXJlcGhwbW9kdWxlKSB7CiAgICAgIC8vTW9kdWxlIGZvdW5kCiAgICAgICRmaXJlcGhwbW9kdWxlLT5TZXRNb2R1bGVOYW1lKCR0aGlzLT5HZXROYW1lKCkpOwogICAgICAkZmlyZXBocG1vZHVsZS0+Q29tbWFuZCgkY29tbWFuZCwgJG1lc3NhZ2UsICR2YXJpYWJsZXMpOwogICAgfSAvL2Vsc2UgTW9kdWxlIG5vdCBmb3VuZH0KICB9CgoKICAvKgogICAqCiAgICogRXJyb3IgaGFuZGxpbmcKICAgKgogICAqLwogIGZ1bmN0aW9uIEVycm9yKCRlcnJvcnRleHQsJHJldHVybnZhbHVlPWZhbHNlLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPl9lcnJvcnMuPSRlcnJvcnRleHQ7CiAgICBpZiAoIWVtcHR5KCRwYXJhbXMpICYmIGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzLj0iICgiOwogICAgICAkZmlyc3Q9dHJ1ZTsgLy9IYW5kbGluZyB0aGUgY29tbWEKICAgICAgZm9yZWFjaCAoJHBhcmFtcyBhcyAkcGFyYW09PiR2YWx1ZSkgewogICAgICAgIGlmICgkZmlyc3QpICRmaXJzdD1mYWxzZTsgZWxzZSAkdGhpcy0+X2Vycm9ycy49IiwiOwogICAgICAgICR0aGlzLT5fZXJyb3JzLj0kcGFyYW0uIj0+Ii4kdmFsdWU7CiAgICAgIH0KICAgICAgJHRoaXMtPl9lcnJvcnMuPSIpIjsKICAgIH0KICAgICR0aGlzLT5fZXJyb3JzLj0iXG4iOwogICAgcmV0dXJuICRyZXR1cm52YWx1ZTsKICB9CgogIGZ1bmN0aW9uIEdldEVycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgICRlcnJvcnM9JHRoaXMtPl9lcnJvcnM7CiAgICBpZiAoJG5sMmJyKSB7CiAgICAgICRlcnJvcnM9bmwyYnIoJGVycm9ycyk7CiAgICB9CiAgICBpZiAoJGluY2x1ZGVkcykgewogICAgICBpZiAoJHRoaXMtPkRTSW5FcnJvcigpKSB7CiAgICAgICAgJGVycm9ycy49JHRoaXMtPkdldERTRXJyb3JzKCRubDJiciwkY2xlYXIpOwogICAgICB9CiAgICB9CiAgICBpZiAoJGNsZWFyKSB7CiAgICAgICR0aGlzLT5fZXJyb3JzPSIiOwogICAgfQogICAgcmV0dXJuICRlcnJvcnM7CiAgfQoKICBmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKSB7CiAgICBpZiAoJHRoaXMtPkluRXJyb3IoKSkgewogICAgICBlY2hvICJcblxuPGRpdiBzdHlsZT0nYm9yZGVyOjNweCBzb2xpZCByZWQ+XG4iOwogICAgICBlY2hvICR0aGlzLT5HZXRFcnJvcnModHJ1ZSwkY2xlYXIsJGluY2x1ZGVkcyk7CiAgICAgIGVjaG8gIlxuPC9kaXY+XG5cbiI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBJbkVycm9yKCkgewogICAgcmV0dXJuICgkdGhpcy0+X2Vycm9ycyE9IiIpOwogIH0KCgogIC8qCiAgICoKICAgKiBUaGFua3MgdG8gaHR0cDovL3d3dy5waHB0b3lzLmNvbS9lMTA3X3BsdWdpbnMvY29udGVudC9jb250ZW50LnBocD9jb250ZW50LjU4CiAgICogZm9yIHRoZXNlIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIGFycmF5MnN0cmluZygkbXlhcnJheSwgJiRvdXRwdXQsICYkcGFyZW50a2V5KSB7CiAgICBmb3JlYWNoICgkbXlhcnJheSBhcyAka2V5ID0+ICR2YWx1ZSkgewogICAgICBpZiAoaXNfYXJyYXkoJHZhbHVlKSkgewogICAgICAgICRwYXJlbnRrZXkgLj0gJGtleSAuICJeIjsKICAgICAgICBhcnJheTJzdHJpbmcoJHZhbHVlLCAkb3V0cHV0LCAkcGFyZW50a2V5KTsKICAgICAgICAkcGFyZW50a2V5ID0gIiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJG91dHB1dCAuPSAkcGFyZW50a2V5IC4gJGtleSAuICJeIiAuICR2YWx1ZSAuICJcbiI7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHN0cmluZzJhcnJheSgkc3RyaW5nLCAmJG15YXJyYXkpIHsKICAgICRsaW5lcyA9IGV4cGxvZGUoIlxuIiwgJHN0cmluZyk7CiAgICBmb3JlYWNoICgkbGluZXMgYXMgJHZhbHVlKSB7CiAgICAgICRpdGVtcyA9IGV4cGxvZGUoIiYjMTgzOyIsICR2YWx1ZSk7CiAgICAgIGlmIChzaXplb2YoJGl0ZW1zKSA9PSAyKSB7CiAgICAgICAgJG15YXJyYXlbJGl0ZW1zWzBdXSA9ICRpdGVtc1sxXTsKICAgICAgfSBlbHNlIGlmIChzaXplb2YoJGl0ZW1zKSA9PSAzKSB7CiAgICAgICAgJG15YXJyYXlbJGl0ZW1zWzBdXVskaXRlbXNbMV1dID0gJGl0ZW1zWzJdOwogICAgICB9CiAgICB9CiAgfQoKfQo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT52ZXJzaW9uIDAuNS4wPC9saT4KICBGaXhlcywgY2xlYW51cHMsIGFuZCBlbmRpbmcgb2YgdmVyc2lvbiBjb25mdXNpb24KICAKICA8bGk+dmVyc2lvbiAwLjQuMTwvbGk+CiAgQWRkZWQgbW9yZSB2YWxpZGF0aW9ucywgZXF1YWwgYW5kIGlkZW50aWNhbDxici8+CiAgQWRkZWQgZXZlbiBzaG9ydGVyIE5lb1VybCBhbmQgTmVvTGluawogIFByZXBhcmVkIGZvciBjbXNtcyAxLjEwCgogIDxsaT52ZXJzaW9uIDAuNC4wPC9saT4KICBBZGRlZCBkYXRldGltZXBpY2tlciBhbmQgaW50ZWdyYXRlZCBpdAoKICA8bGk+dmVyc2lvbiAwLjMuNTxici8+CiAgTXVsdGlwbGUgYnVnZml4ZXMgZGlzY292ZXJlZCBieSBQaHBTdG9ybQogIDxici8+CgogIDxsaT52ZXJzaW9uIDAuMy40PGJyLz4KICByZXdvcmtlZCBmb3IgY21zbXMoKS1tZXRob2RzCiAgPGJyLz4KCgogIDxsaT52ZXJzaW9uIDAuMy4zPGJyLz4KICBOZXcgZm9ybXZhbGlkYXRpb24gbWV0aG9kcyBmb3IgZHJvcGRvd25zIGFuZCByYWRpb2dyb3VwcwogIDxici8+CiAgCiAgPGxpPnZlcnNpb24gMC4zLjI8YnIvPgogIGFkZGVkIGNzcy1pbmplY3Rpb25zIHN0eWxpbmcgdGhlIGZvcm12YWxpZGF0aW9uLXBvcHVwCiAgPGJyLz4KICBzdGFydGVkIGRvaW5nIHNvbWUgZXhhbXBsZXMgb2YgaG93IHRvIHVzZSB0aGUgbW9kdWxlLWNsYXNzCgogIDxsaT52ZXJzaW9uIDAuMy4xPGJyLz4KICBmaXhlZCB0aGUgdWdseSBjc3MgaW4gYm9keSxpdCdzIG5vdyBqYXZhc2NyaXB0CiAgPGJyLz4KCjxsaT52ZXJzaW9uIDAuMy4wPGJyLz4KICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9TZXRQcmVmcywgc2hvcnRpbmcgdGhlIHNhdmluZyBvZiBwcmVmcyBmb3IgaW5zdGFuY2UKICAgIDxici8+CiAgICBhZGRlZCBlYXN5IGZvcm0tdmFsaWRhdGlvbiBhbmQgbmljZSBtZXNzYWdlcyBsaW5rZWQgdG8gdGhhdAogICAgPGJyLz4KICAgIE9ic29sZXRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQuCiAgICA8YnIvPgogICAgQWRkZWQgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgogIDxsaT52ZXJzaW9uIDAuMi44PGJyLz4KICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZQogICAgCiAgPGxpPnZlcnNpb24gMC4yLjc8YnIvPgogICAgZml4ZWQgTmVvQ21zTGluayBmb3IgcHJldHR5IHVybHMsIG1pc3NlZCB0aGUgdGFyZ2V0Y29udGVudG9ubHkgcGFyYW1ldGVyLi4uCgogIDxsaT52ZXJzaW9uIDAuMi42PGJyLz4KICAgIEFkZGVkIGEgU2V0UHJlZi1zaG9ydGN1dCBhbmQgYSBuaWNlIE5lb1NldFByZWYtbWV0aG9kIChzZWUgaGVscCkKICAgIDxici8+CiAgICBzZXQgZW50aXR5IHByb3BzIGZyb20gYXJyYXkgbm93IHVzZXMgc3RvcmVkIHBhcmFtcy12YWx1ZXMgaXMgb3RoZXIgbm90IHNwZWNpZmllcwogICAgPGJyLz4KICAgIFJld29ya2VkIE5lb1JlZGlyZWN0KEZ1bGwpIHRvIGJlIGZhc3RlciB0byB1c2UKICAgIDxici8+CiAgICBBZGRlZCBOZW9WYWxpZGF0ZVVSTC1tZXRob2QKICAgIDxici8+CiAgICBBZGRlZCBEZWNvZGVIVE1MRW50aXRpZXMKICAgIDxici8+CiAgICBBZGRlZCBOZW9BZG1pblJldHVybgoKCiAgPGxpPnZlcnNpb24gMC4yLjU8YnIvPgogICAgQWRkZWQgYW4gb3B0aW9uIHRvIE5lb0FkZEljb24gdG8gYWxzbyBpbmNsdWRlIHRoZSBmb2xsaW5ncyB0ZXh0IGxpbmsKICAgIDxici8+CiAgICBBZGRlZCBJc1RhYmxlRW1wdHkKICAgIDxici8+CiAgICBVcGRhdGUgRW1haWxWYWxpZGF0aW9uIHRvIG1haWwtY2FwYWJpbGl0aWVzIG9mIGRvbWFpbiBhcyB3ZWxsCiAgICA8YnIvPgogICAgTWFkZSAybmQgcGFyYW0gdG8gTmVvUMOFYXJhbVZhbHVlIGRvdWJsZSBhcyBkZWZhdWx0IHZhbHVlICh3aGVuIG5vdCBhbiBhcnJheSkKCgoKICA8bGk+dmVyc2lvbiAwLjIuNDxici8+CiAgICBBZGRlZCBOZW9FbXB0eS1mdW5jdGlvbiB3aGljaCBjaGVja3MgZm9yIGFuIGluZGV4IGluIGFuIGFycmF5CiAgICA8YnIvPgogICAgTWFkZSBOZW9QcmludFIgb3V0cHV0IGNvbnRlbnQgb2YgJF9wYXJhbXMgaWYgbm8gcGFyYW1ldGVyIHdhcyBnaXZlbgogICAgPGJyLz5BZGRlZCBOZW9WYWxpZGF0ZUVtYWlsLWZ1bmN0aW9uCiAgICA8YnIvPkFkZGVkIE5lb05vQnJlYWtzLWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4zPGJyLz4KICAgIE5vdyBwb3NzaWJsZSB0byByZWdpc3RlciAkcGFyYW1zIGZvciBldmVuIGVhc2llciBzeW50YXggaW4gcmVsZXZhbnQgZnVuY3Rpb25zIGxpa2UgTlBWCiAgICA8YnIvPgogICAgQWRkZWQgQ3JlYXRlSW5wdXRQYXNzd29yZC13cmFwcGVyCiAgICA8YnIvPgogICAgQWRkZWQgZmlsbCBwYXJhbWV0ZXIgdG8gU2V0RW50aXR5UHJvcHNGcm9tQXJyYXkKCgogIDxsaT52ZXJzaW9uIDAuMi4yPGJyLz4KICAgIEFkZGVkIGEgY3VzdG9tIHJldHVybnZhbHVlIHRvIGNoZWNrZW50aXR5Y29ubmVjdGlvbnMKICAgIDxici8+CiAgICBJbXBsZW1lbnRlZCBNYWtlU2ltcGxlQXJyYXkKICAgIDxici8+CiAgICBBZGRlZCBOZW9UcnVlSWNvbiBhbmQgIE5lb1RydWVJY29uCgogIDxsaT52ZXJzaW9uIDAuMi4xPGJyLz4KICAgIGFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgogICAgPGJyLz4KICAgIEFkZGVkICRhbHdheXNyZXR1cm5hcnJheT1mYWxzZSB0byBHZXRFbnRpdGllcyhGdWxsKS1tZXRob2RzCiAgICA8YnIvPgogICAgQWRkZWQgU21hcnRBc3NpZ25QcmVmLW1ldGhvZAogICAgPGJyLz4KICAgIEFkZGVkIFRvb2x0aXAtU3VwcG9ydAogICAgPGJyLz4KICAgIEFkZGVkIE5lb1JlZGlyZWN0LWZ1bmN0aW9uCgogIDxsaT52ZXJzaW9uIDAuMi4wPGJyLz4KICAgIC0gZ2VuZXJhbCBidWdmaXhpbmc8YnIvPgogICAgLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgogICAgLSBGaXhlZCBuYW1lIGVycm9yIG9uIE5lb0lucHV0RHJvcGRvd248YnIvPgogICAgLSBhZGRlZCBzdXBwb3J0IGZvciAzcmQgcGFyYW1ldGVyIHRvIFNsYXNoLWZ1bmN0aW9uPGJyLz4KICAgIC0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+CiAgICAtIGFkZGVkIFNtYXJ0eVVwbG9hZEZvcm1TdGFydDxici8+CiAgICAtIGFkZGVkIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW48YnIvPgoKICA8L2xpPgogIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgIC0gaW5pdGlhbCByZWxlYXNlPC9saT4KPC91bD4=]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
