<?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.5</version>
  <mincmsversion>1.11</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+PGgzPlBhcmFtZXRlcnM8L2gzPjx1bD48bGk+PGVtPihvcHRpb25hbCk8L2VtPiBsYW5nPSJlbl9VUyIgLSBQYXJhbWV0cmV0IGFuZ2l2ZXIgaHZpbGtldCBzcHJvZyBkZXIgc2thbCBicnVnZXMgdGlsIHZpc25pbmcgZm9yIGJlcyZvc2xhc2g7Z2VuZGUuIElra2UgYWxsZSBtb2R1bGVyIHVuZGVyc3Qmb3NsYXNoO3R0ZXIgZWxsZXIgYmVoJm9zbGFzaDt2ZXIgZGV0dGUuPC9saT48L3VsPg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBNb3J0ZW4gUG91bHNlbiAmbHQ7bW9ydGVuQHBvdWxzZW4ub3JnJmd0OzxiciAvPjxiciAvPlZlcnNpb246IDAuNS41PGJyIC8+PGJyIC8+Q2hhbmdlIEhpc3Rvcnk6PGJyIC8+PHVsPgogIAogIDxsaT4KICAgIHZlcnNpb24gMC41LjUKICA8L2xpPgogIEFkZGVkIFNtYXJ0eUlucHV0UmFkaW9Hcm91cC1zaG9ydGN1dAogIDxici8+CiAgQWRkZWQgXyBzaG9ydGN1dCBmb3IgbGFuZy1mdW5jdGlvbgoKICAgIDxsaT52ZXJzaW9uIDAuNS40PC9saT4KICAgIEFkZGVkICJlbXB0eSIgdG8gZm9ybWZpZWxkLXZhbGlkYXRpb24gdHlwZXMKICAgIDxici8+CgogICAgPGJyLz4KCiAgICA8bGk+dmVyc2lvbiAwLjUuMzwvbGk+CiAgICBEYXRlMlVuaXggbm93IHJldHVybnMgZW1wdHkgc3RyaW5nIGlmIHRoYXQgd2FzIHdoYXQgaXQgd2FzIGdpdmVuCiAgICA8YnIvPgogICAgQWRkZWQgTkVPX0lOSVRfSU5TVEFMTCB0byBhdm9pZCBlcnJvcnMgaW4gbWV0aG9kLmluc3RhbGwucGhwCiAgICA8YnIvPgoKCiAgICA8bGk+dmVyc2lvbiAwLjUuMjwvbGk+CiAgICBBZGRlZCAkY29uZmlnPSRnQ21zLT5HZXRDb25maWcoKTsgdG8gTkVPSU5JVAogICAgPGJyLz4KICAgIGFkZGVkIF90ZXh0IGZvciBlYXN5IGludGVybmFsIHRyYW5zbGF0aW9ucyB1c2luZyBAcHJlZml4CiAgICA8YnIvPgogICAgTmVvSWNvbnMgY2FuIG5vdyBiZSB3aXRoIGxpbmsKICAgIDxici8+CiAgICBUaW1lIHNlbGVjdGlvbiBub3cgYWxsb3dlZCBpbiBOZW9EYXRlVGltZQogICAgPGJyLz4KICAgIGZpeGVkICRhbHdheXNyZXR1cm5hcnJheSBpbiBHZXRFbnRpdGllcwoKICAgIDxsaT52ZXJzaW9uIDAuNS4xPC9saT4KICAgIGZpeGVkIGdldGVudGl0aWVzZnVsbCBwYXJhbSBjYWxsZWQgYWx3YXlzcmV0dXJuYXJyYXksIGFkZGVkIHRoZSBhZGR0ZXh0IHBhcmFtIHRvIG5lb3ByZXR0eWxpbmsgdG8gYmUgYWJsZSB0byBhZGQgYWx0LXRleHRzCgogICAgPGxpPnZlcnNpb24gMC41LjA8L2xpPgogICAgRml4ZXMsIGNsZWFudXBzLCBhbmQgZW5kaW5nIG9mIHZlcnNpb24gY29uZnVzaW9uCgogICAgPGxpPnZlcnNpb24gMC40LjE8L2xpPgogICAgQWRkZWQgbW9yZSB2YWxpZGF0aW9ucywgZXF1YWwgYW5kIGlkZW50aWNhbDxici8+CiAgICBBZGRlZCBldmVuIHNob3J0ZXIgTmVvVXJsIGFuZCBOZW9MaW5rCiAgICBQcmVwYXJlZCBmb3IgY21zbXMgMS4xMAoKICAgIDxsaT52ZXJzaW9uIDAuNC4wPC9saT4KICAgIEFkZGVkIGRhdGV0aW1lcGlja2VyIGFuZCBpbnRlZ3JhdGVkIGl0CgogICAgPGxpPnZlcnNpb24gMC4zLjU8YnIvPgogICAgICAgIE11bHRpcGxlIGJ1Z2ZpeGVzIGRpc2NvdmVyZWQgYnkgUGhwU3Rvcm0KICAgICAgICA8YnIvPgoKICAgIDxsaT52ZXJzaW9uIDAuMy40PGJyLz4KICAgICAgICByZXdvcmtlZCBmb3IgY21zbXMoKS1tZXRob2RzCiAgICAgICAgPGJyLz4KCgogICAgPGxpPnZlcnNpb24gMC4zLjM8YnIvPgogICAgICAgIE5ldyBmb3JtdmFsaWRhdGlvbiBtZXRob2RzIGZvciBkcm9wZG93bnMgYW5kIHJhZGlvZ3JvdXBzCiAgICAgICAgPGJyLz4KCiAgICA8bGk+dmVyc2lvbiAwLjMuMjxici8+CiAgICAgICAgYWRkZWQgY3NzLWluamVjdGlvbnMgc3R5bGluZyB0aGUgZm9ybXZhbGlkYXRpb24tcG9wdXAKICAgICAgICA8YnIvPgogICAgICAgIHN0YXJ0ZWQgZG9pbmcgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBtb2R1bGUtY2xhc3MKCiAgICA8bGk+dmVyc2lvbiAwLjMuMTxici8+CiAgICAgICAgZml4ZWQgdGhlIHVnbHkgY3NzIGluIGJvZHksaXQncyBub3cgamF2YXNjcmlwdAogICAgICAgIDxici8+CgogICAgPGxpPnZlcnNpb24gMC4zLjA8YnIvPgogICAgICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9TZXRQcmVmcywgc2hvcnRpbmcgdGhlIHNhdmluZyBvZiBwcmVmcyBmb3IgaW5zdGFuY2UKICAgICAgICA8YnIvPgogICAgICAgIGFkZGVkIGVhc3kgZm9ybS12YWxpZGF0aW9uIGFuZCBuaWNlIG1lc3NhZ2VzIGxpbmtlZCB0byB0aGF0CiAgICAgICAgPGJyLz4KICAgICAgICBPYnNvbGV0ZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0LgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgogICAgPGxpPnZlcnNpb24gMC4yLjg8YnIvPgogICAgICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZQoKICAgIDxsaT52ZXJzaW9uIDAuMi43PGJyLz4KICAgICAgICBmaXhlZCBOZW9DbXNMaW5rIGZvciBwcmV0dHkgdXJscywgbWlzc2VkIHRoZSB0YXJnZXRjb250ZW50b25seSBwYXJhbWV0ZXIuLi4KCiAgICA8bGk+dmVyc2lvbiAwLjIuNjxici8+CiAgICAgICAgQWRkZWQgYSBTZXRQcmVmLXNob3J0Y3V0IGFuZCBhIG5pY2UgTmVvU2V0UHJlZi1tZXRob2QgKHNlZSBoZWxwKQogICAgICAgIDxici8+CiAgICAgICAgc2V0IGVudGl0eSBwcm9wcyBmcm9tIGFycmF5IG5vdyB1c2VzIHN0b3JlZCBwYXJhbXMtdmFsdWVzIGlzIG90aGVyIG5vdCBzcGVjaWZpZXMKICAgICAgICA8YnIvPgogICAgICAgIFJld29ya2VkIE5lb1JlZGlyZWN0KEZ1bGwpIHRvIGJlIGZhc3RlciB0byB1c2UKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIE5lb1ZhbGlkYXRlVVJMLW1ldGhvZAogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgRGVjb2RlSFRNTEVudGl0aWVzCiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBOZW9BZG1pblJldHVybgoKCiAgICA8bGk+dmVyc2lvbiAwLjIuNTxici8+CiAgICAgICAgQWRkZWQgYW4gb3B0aW9uIHRvIE5lb0FkZEljb24gdG8gYWxzbyBpbmNsdWRlIHRoZSBmb2xsaW5ncyB0ZXh0IGxpbmsKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIElzVGFibGVFbXB0eQogICAgICAgIDxici8+CiAgICAgICAgVXBkYXRlIEVtYWlsVmFsaWRhdGlvbiB0byBtYWlsLWNhcGFiaWxpdGllcyBvZiBkb21haW4gYXMgd2VsbAogICAgICAgIDxici8+CiAgICAgICAgTWFkZSAybmQgcGFyYW0gdG8gTmVvUMOFYXJhbVZhbHVlIGRvdWJsZSBhcyBkZWZhdWx0IHZhbHVlICh3aGVuIG5vdCBhbiBhcnJheSkKCgoKICAgIDxsaT52ZXJzaW9uIDAuMi40PGJyLz4KICAgICAgICBBZGRlZCBOZW9FbXB0eS1mdW5jdGlvbiB3aGljaCBjaGVja3MgZm9yIGFuIGluZGV4IGluIGFuIGFycmF5CiAgICAgICAgPGJyLz4KICAgICAgICBNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCiAgICAgICAgPGJyLz5BZGRlZCBOZW9WYWxpZGF0ZUVtYWlsLWZ1bmN0aW9uCiAgICAgICAgPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKICAgIDxsaT52ZXJzaW9uIDAuMi4zPGJyLz4KICAgICAgICBOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgQ3JlYXRlSW5wdXRQYXNzd29yZC13cmFwcGVyCiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCiAgICA8bGk+dmVyc2lvbiAwLjIuMjxici8+CiAgICAgICAgQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwogICAgICAgIDxici8+CiAgICAgICAgSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5CiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBOZW9UcnVlSWNvbiBhbmQgIE5lb1RydWVJY29uCgogICAgPGxpPnZlcnNpb24gMC4yLjE8YnIvPgogICAgICAgIGFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlIHRvIEdldEVudGl0aWVzKEZ1bGwpLW1ldGhvZHMKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIFRvb2x0aXAtU3VwcG9ydAogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgTmVvUmVkaXJlY3QtZnVuY3Rpb24KCiAgICA8bGk+dmVyc2lvbiAwLjIuMDxici8+CiAgICAgICAgLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+CiAgICAgICAgLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgogICAgICAgIC0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgogICAgICAgIC0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+CiAgICAgICAgLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgogICAgICAgIC0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogICAgPC9saT4KICAgIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgICAgICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+PGJyIC8+]]></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[Ly9KYXZhc3JpcHQgbmFtZTogTXkgRGF0ZSBUaW1lIFBpY2tlcgovL0RhdGUgY3JlYXRlZDogMTYtTm92LTIwMDMgMjM6MTkKLy9DcmVhdG9yOiBUZW5nWW9uZyBOZwovL1dlYnNpdGU6IGh0dHA6Ly93d3cucmFpbmZvcmVzdG5ldC5jb20KLy9Db3B5cmlnaHQgKGMpIDIwMDMgVGVuZ1lvbmcgTmcKLy9GaWxlTmFtZTogRGF0ZVRpbWVQaWNrZXJfY3NzLmpzCi8vVmVyc2lvbjogMi4yLjQKLy8gTm90ZTogUGVybWlzc2lvbiBnaXZlbiB0byB1c2UgYW5kIG1vZGlmeSB0aGlzIHNjcmlwdCBpbiBBTlkga2luZCBvZiBhcHBsaWNhdGlvbnMgaWYKLy8gICAgICAgaGVhZGVyIGxpbmVzIGFyZSBsZWZ0IHVuY2hhbmdlZC4KLy9QZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gcmVkaXN0cmlidXRlIGFuZCBtb2RpZnkgdGhpcyBqYXZhc2NyaXB0IHVuZGVyIGEgRnJlZUJTRCBMaWNlbnNlLgovL05ldyBDc3Mgc3R5bGUgdmVyc2lvbiBhZGRlZCBieSBZdmFuIExhdm9pZSAoUXXDqWJlYywgQ2FuYWRhKSAyOS1KYW4tMjAwOQovL0Zvcm1hdHRlZCBmb3IgSlNMaW50IGNvbXBhdGliaWxpdHkgYnkgTGFic21lZGlhLmNvbSAoMzAtRGVjLTIwMTApCgoKLy9HbG9iYWwgdmFyaWFibGVzCgp2YXIgd2luQ2FsOwp2YXIgZHRUb2RheTsKdmFyIENhbDsKdmFyIE1vbnRoTmFtZTsKdmFyIFdlZWtEYXlOYW1lMTsKdmFyIFdlZWtEYXlOYW1lMjsKdmFyIGV4RGF0ZVRpbWU7Ly9FeGlzdGluZyBEYXRlIGFuZCBUaW1lCnZhciBzZWxEYXRlOy8vc2VsZWN0ZWQgZGF0ZS4gdmVyc2lvbiAxLjcKdmFyIGNhbFNwYW5JRCA9ICJjYWxCb3JkZXIiOyAvLyBzcGFuIElECnZhciBkb21TdHlsZSA9IG51bGw7IC8vIHNwYW4gRE9NIG9iamVjdCB3aXRoIHN0eWxlCnZhciBjbkxlZnQgPSAiMCI7Ly9sZWZ0IGNvb3JkaW5hdGUgb2YgY2FsZW5kYXIgc3Bhbgp2YXIgY25Ub3AgPSAiMCI7Ly90b3AgY29vcmRpbmF0ZSBvZiBjYWxlbmRhciBzcGFuCnZhciB4cG9zID0gMDsgLy8gbW91c2UgeCBwb3NpdGlvbgp2YXIgeXBvcyA9IDA7IC8vIG1vdXNlIHkgcG9zaXRpb24KdmFyIGNhbEhlaWdodCA9IDA7IC8vIGNhbGVuZGFyIGhlaWdodAp2YXIgQ2FsV2lkdGggPSAyMDg7Ly8gY2FsZW5kYXIgd2lkdGgKdmFyIENlbGxXaWR0aCA9IDMwOy8vIHdpZHRoIG9mIGRheSBjZWxsLgp2YXIgVGltZU1vZGUgPSAyNDsvLyBUaW1lTW9kZSB2YWx1ZS4gMTIgb3IgMjQKdmFyIFN0YXJ0WWVhciA9IDE5NDA7IC8vRmlyc3QgWWVhciBpbiBkcm9wIGRvd24geWVhciBzZWxlY3Rpb24KdmFyIEVuZFllYXIgPSA1OyAvLyBUaGUgbGFzdCB5ZWFyIG9mIHBpY2thYmxlIGRhdGUuIGlmIGN1cnJlbnQgeWVhciBpcyAyMDExLCB0aGUgbGFzdCB5ZWFyIHRoYXQgc3RpbGwgcGlja2VyIHdpbGwgYmUgMjAxNiAoMjAxMSs1KQp2YXIgQ2FsUG9zT2Zmc2V0WCA9IC0xOyAvL1ggcG9zaXRpb24gb2Zmc2V0IHJlbGF0aXZlIHRvIGNhbGVuZGFyIGljb24sIGNhbiBiZSBuZWdhdGl2ZSB2YWx1ZQp2YXIgQ2FsUG9zT2Zmc2V0WSA9IDA7IC8vWSBwb3NpdGlvbiBvZmZzZXQgcmVsYXRpdmUgdG8gY2FsZW5kYXIgaWNvbiwgY2FuIGJlIG5lZ2F0aXZlIHZhbHVlCgovL0NvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzIHN0YXJ0CnZhciBTcGFuQm9yZGVyQ29sb3IgPSAiIzAwMDAwMCI7Ly9zcGFuIGJvcmRlciBjb2xvcgp2YXIgU3BhbkJnQ29sb3IgPSAiI0ZGRkZGRiI7IC8vc3BhbiBiYWNrZ3JvdW5kIGNvbG9yCnZhciBNb250aFllYXJDb2xvciA9ICIjY2MwMDMzIjsgLy9Gb250IENvbG9yIG9mIE1vbnRoIGFuZCBZZWFyIGluIENhbGVuZGFyIGhlYWRlci4KdmFyIFdlZWtIZWFkQ29sb3IgPSAiIzE4ODYxQiI7IC8vdmFyIFdlZWtIZWFkQ29sb3I9IiMxODg2MUIiOy8vQmFja2dyb3VuZCBDb2xvciBpbiBXZWVrIGhlYWRlci4KdmFyIFN1bmRheUNvbG9yID0gIiNDMEY2NEYiOyAvL3ZhciBTdW5kYXlDb2xvcj0iI0MwRjY0RiI7Ly9CYWNrZ3JvdW5kIGNvbG9yIG9mIFN1bmRheS4KdmFyIFNhdHVyZGF5Q29sb3IgPSAiI0MwRjY0RiI7IC8vQmFja2dyb3VuZCBjb2xvciBvZiBTYXR1cmRheS4KdmFyIFdlZWtEYXlDb2xvciA9ICIjRkZFREE2IjsgLy9CYWNrZ3JvdW5kIGNvbG9yIG9mIHdlZWtkYXlzLgp2YXIgRm9udENvbG9yID0gImJsdWUiOyAvL2NvbG9yIG9mIGZvbnQgaW4gQ2FsZW5kYXIgZGF5IGNlbGwuCnZhciBUb2RheUNvbG9yID0gIiNmZmJkMzUiOyAvL3ZhciBUb2RheUNvbG9yPSIjRkZGRjMzIjsvL0JhY2tncm91bmQgY29sb3Igb2YgdG9kYXkuCnZhciBTZWxEYXRlQ29sb3IgPSAiIzhERDUzQyI7IC8vdmFyIFNlbERhdGVDb2xvciA9ICIjOERENTNDIjsvL0JhY2tncm9uZCBjb2xvciBvZiBzZWxlY3RlZCBkYXRlIGluIHRleHRib3guCnZhciBZclNlbENvbG9yID0gIiNjYzAwMzMiOyAvL2NvbG9yIG9mIGZvbnQgb2YgWWVhciBzZWxlY3Rvci4KdmFyIE10aFNlbENvbG9yID0gIiNjYzAwMzMiOyAvL2NvbG9yIG9mIGZvbnQgb2YgTW9udGggc2VsZWN0b3IgaWYgIk1vbnRoU2VsZWN0b3IiIGlzICJhcnJvdyIuCnZhciBIb3ZlckNvbG9yID0gIiNFMEZGMzgiOyAvL2NvbG9yIHdoZW4gbW91c2UgbW92ZSBvdmVyLgp2YXIgRGlzYWJsZUNvbG9yID0gIiM5OTk5NjYiOyAvL2NvbG9yIG9mIGRpc2FibGVkIGNlbGwuCnZhciBDYWxCZ0NvbG9yID0gIiNmZmZmZmYiOyAvL0JhY2tncm91bmQgY29sb3Igb2YgQ2FsZW5kYXIgd2luZG93LgoKdmFyIFdlZWtDaGFyID0gMjsvL251bWJlciBvZiBjaGFyYWN0ZXIgZm9yIHdlZWsgZGF5LiBpZiAyIHRoZW4gTW8sVHUsV2UuIGlmIDMgdGhlbiBNb24sVHVlLFdlZC4KdmFyIERhdGVTZXBhcmF0b3IgPSAiLSI7Ly9EYXRlIFNlcGFyYXRvciwgeW91IGNhbiBjaGFuZ2UgaXQgdG8gIi0iIGlmIHlvdSB3YW50Lgp2YXIgU2hvd0xvbmdNb250aCA9IHRydWU7Ly9TaG93IGxvbmcgbW9udGggbmFtZSBpbiBDYWxlbmRhciBoZWFkZXIuIGV4YW1wbGU6ICJKYW51YXJ5Ii4KdmFyIFNob3dNb250aFllYXIgPSB0cnVlOy8vU2hvdyBNb250aCBhbmQgWWVhciBpbiBDYWxlbmRhciBoZWFkZXIuCnZhciBUaGVtZUJnID0gIiI7Ly9CYWNrZ3JvdW5kIGltYWdlIG9mIENhbGVuZGFyIHdpbmRvdy4KdmFyIFByZWNlZGVaZXJvID0gdHJ1ZTsvL1ByZWNlZGluZyB6ZXJvIFt0cnVlfGZhbHNlXQp2YXIgTW9uZGF5Rmlyc3REYXkgPSB0cnVlOy8vdHJ1ZTpVc2UgTW9uZGF5IGFzIGZpcnN0IGRheTsgZmFsc2U6U3VuZGF5IGFzIGZpcnN0IGRheS4gW3RydWV8ZmFsc2VdICAvL2FkZGVkIGluIHZlcnNpb24gMS43CnZhciBVc2VJbWFnZUZpbGVzID0gdHJ1ZTsvL1VzZSBpbWFnZSBmaWxlcyB3aXRoICJhcnJvd3MiIGFuZCAiY2xvc2UiIGJ1dHRvbg0KdmFyIGltYWdlRmlsZXNQYXRoID0gImltYWdlczIvIjsKLy9Db25maWd1cmFibGUgcGFyYW1ldGVycyBlbmQKCi8vdXNlIHRoZSBNb250aCBhbmQgV2Vla2RheSBpbiB5b3VyIHByZWZlcnJlZCBsYW5ndWFnZS4KdmFyIE1vbnRoTmFtZSA9IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdOwp2YXIgV2Vla0RheU5hbWUxID0gWyJTdW5kYXkiLCAiTW9uZGF5IiwgIlR1ZXNkYXkiLCAiV2VkbmVzZGF5IiwgIlRodXJzZGF5IiwgIkZyaWRheSIsICJTYXR1cmRheSJdOwp2YXIgV2Vla0RheU5hbWUyID0gWyJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5IiwgIlN1bmRheSJdOwoKCi8vZW5kIENvbmZpZ3VyYWJsZSBwYXJhbWV0ZXJzCgovL2VuZCBHbG9iYWwgdmFyaWFibGUKCgovLyBDYWxlbmRhciBwcm90b3R5cGUKZnVuY3Rpb24gQ2FsZW5kYXIocERhdGUsIHBDdHJsKQp7CgkvL1Byb3BlcnRpZXMKCXRoaXMuRGF0ZSA9IHBEYXRlLmdldERhdGUoKTsvL3NlbGVjdGVkIGRhdGUKCXRoaXMuTW9udGggPSBwRGF0ZS5nZXRNb250aCgpOy8vc2VsZWN0ZWQgbW9udGggbnVtYmVyCgl0aGlzLlllYXIgPSBwRGF0ZS5nZXRGdWxsWWVhcigpOy8vc2VsZWN0ZWQgeWVhciBpbiA0IGRpZ2l0cwoJdGhpcy5Ib3VycyA9IHBEYXRlLmdldEhvdXJzKCk7CgoJaWYgKHBEYXRlLmdldE1pbnV0ZXMoKSA8IDEwKQoJewoJCXRoaXMuTWludXRlcyA9ICIwIiArIHBEYXRlLmdldE1pbnV0ZXMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLk1pbnV0ZXMgPSBwRGF0ZS5nZXRNaW51dGVzKCk7Cgl9CgoJaWYgKHBEYXRlLmdldFNlY29uZHMoKSA8IDEwKQoJewoJCXRoaXMuU2Vjb25kcyA9ICIwIiArIHBEYXRlLmdldFNlY29uZHMoKTsKCX0KCWVsc2UKCXsKCQl0aGlzLlNlY29uZHMgPSBwRGF0ZS5nZXRTZWNvbmRzKCk7Cgl9Cgl0aGlzLk15V2luZG93ID0gd2luQ2FsOwoJdGhpcy5DdHJsID0gcEN0cmw7Cgl0aGlzLkZvcm1hdCA9ICJkZE1NeXl5eSI7Cgl0aGlzLlNlcGFyYXRvciA9IERhdGVTZXBhcmF0b3I7Cgl0aGlzLlNob3dUaW1lID0gZmFsc2U7Cgl0aGlzLlNjcm9sbGVyID0gIkRST1BET1dOIjsKCWlmIChwRGF0ZS5nZXRIb3VycygpIDwgMTIpCgl7CgkJdGhpcy5BTW9yUE0gPSAiQU0iOwoJfQoJZWxzZQoJewoJCXRoaXMuQU1vclBNID0gIlBNIjsKCX0NCgl0aGlzLlNob3dTZWNvbmRzID0gZmFsc2U7DQoJdGhpcy5FbmFibGVEYXRlTW9kZSA9ICIiDQp9CgpDYWxlbmRhci5wcm90b3R5cGUuR2V0TW9udGhJbmRleCA9IGZ1bmN0aW9uIChzaG9ydE1vbnRoTmFtZSkKewoJZm9yICh2YXIgaSA9IDA7IGkgPCAxMjsgaSArPSAxKQoJewoJCWlmIChNb250aE5hbWVbaV0uc3Vic3RyaW5nKDAsIDMpLnRvVXBwZXJDYXNlKCkgPT09IHNob3J0TW9udGhOYW1lLnRvVXBwZXJDYXNlKCkpCgkJewoJCQlyZXR1cm4gaTsKCQl9Cgl9Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuSW5jWWVhciA9IGZ1bmN0aW9uICgpIHsKICAgIGlmIChDYWwuWWVhciA8PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikKCSAgICBDYWwuWWVhciArPSAxOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLkRlY1llYXIgPSBmdW5jdGlvbiAoKSB7CiAgICBpZiAoQ2FsLlllYXIgPiBTdGFydFllYXIpCgkgICAgQ2FsLlllYXIgLT0gMTsKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5JbmNNb250aCA9IGZ1bmN0aW9uKCkgewogICAgaWYgKENhbC5ZZWFyIDw9IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSArIEVuZFllYXIpIHsKICAgICAgICBDYWwuTW9udGggKz0gMTsKICAgICAgICBpZiAoQ2FsLk1vbnRoID49IDEyKSB7CiAgICAgICAgICAgIENhbC5Nb250aCA9IDA7CiAgICAgICAgICAgIENhbC5JbmNZZWFyKCk7CiAgICAgICAgfQogICAgfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLkRlY01vbnRoID0gZnVuY3Rpb24oKSB7CiAgICBpZiAoQ2FsLlllYXIgPj0gU3RhcnRZZWFyKSB7CiAgICAgICAgQ2FsLk1vbnRoIC09IDE7CiAgICAgICAgaWYgKENhbC5Nb250aCA8IDApIHsKICAgICAgICAgICAgQ2FsLk1vbnRoID0gMTE7CiAgICAgICAgICAgIENhbC5EZWNZZWFyKCk7CiAgICAgICAgfQogICAgfQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlN3aXRjaE10aCA9IGZ1bmN0aW9uIChpbnRNdGgpCnsKCUNhbC5Nb250aCA9IHBhcnNlSW50KGludE10aCwgMTApOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLlN3aXRjaFllYXIgPSBmdW5jdGlvbiAoaW50WWVhcikKewoJQ2FsLlllYXIgPSBwYXJzZUludChpbnRZZWFyLCAxMCk7Cn07DQoNCkNhbGVuZGFyLnByb3RvdHlwZS5TZXRIb3VyID0gZnVuY3Rpb24oaW50SG91cikgew0KICAgIHZhciBNYXhIb3VyLA0KCU1pbkhvdXIsDQoJSG91ckV4cCA9IG5ldyBSZWdFeHAoIl5cXGRcXGQiKSwNCglTaW5nbGVEaWdpdCA9IG5ldyBSZWdFeHAoIl5cXGR7MX0kIik7DQoNCiAgICBpZiAoVGltZU1vZGUgPT09IDI0KSB7DQogICAgICAgIE1heEhvdXIgPSAyMzsNCiAgICAgICAgTWluSG91ciA9IDA7DQogICAgfQ0KICAgIGVsc2UgaWYgKFRpbWVNb2RlID09PSAxMikgew0KICAgICAgICBNYXhIb3VyID0gMTI7DQogICAgICAgIE1pbkhvdXIgPSAxOw0KICAgIH0NCiAgICBlbHNlIHsNCiAgICAgICAgYWxlcnQoIlRpbWVNb2RlIGNhbiBvbmx5IGJlIDEyIG9yIDI0Iik7DQogICAgfQ0KDQogICAgaWYgKChIb3VyRXhwLnRlc3QoaW50SG91cikgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRIb3VyKSkgJiYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA+IE1heEhvdXIpKSB7DQogICAgICAgIGludEhvdXIgPSBNaW5Ib3VyOw0KICAgIH0NCg0KICAgIGVsc2UgaWYgKChIb3VyRXhwLnRlc3QoaW50SG91cikgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRIb3VyKSkgJiYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA8IE1pbkhvdXIpKSB7DQogICAgICAgIGludEhvdXIgPSBNYXhIb3VyOw0KICAgIH0NCg0KICAgIGludEhvdXIgPSBwYXJzZUludChpbnRIb3VyLCAxMCk7DQogICAgaWYgKFNpbmdsZURpZ2l0LnRlc3QoaW50SG91cikpIHsNCiAgICAgICAgaW50SG91ciA9ICIwIiArIGludEhvdXI7DQogICAgfQ0KDQogICAgaWYgKEhvdXJFeHAudGVzdChpbnRIb3VyKSAmJiAocGFyc2VJbnQoaW50SG91ciwgMTApIDw9IE1heEhvdXIpICYmIChwYXJzZUludChpbnRIb3VyLCAxMCkgPj0gTWluSG91cikpIHsNCiAgICAgICAgaWYgKChUaW1lTW9kZSA9PT0gMTIpICYmIChDYWwuQU1vclBNID09PSAiUE0iKSkgew0KICAgICAgICAgICAgaWYgKHBhcnNlSW50KGludEhvdXIsIDEwKSA9PT0gMTIpIHsNCiAgICAgICAgICAgICAgICBDYWwuSG91cnMgPSAxMjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIENhbC5Ib3VycyA9IHBhcnNlSW50KGludEhvdXIsIDEwKSArIDEyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZWxzZSBpZiAoKFRpbWVNb2RlID09PSAxMikgJiYgKENhbC5BTW9yUE0gPT09ICJBTSIpKSB7DQogICAgICAgICAgICBpZiAoaW50SG91ciA9PT0gMTIpIHsNCiAgICAgICAgICAgICAgICBpbnRIb3VyIC09IDEyOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBDYWwuSG91cnMgPSBwYXJzZUludChpbnRIb3VyLCAxMCk7DQogICAgICAgIH0NCg0KICAgICAgICBlbHNlIGlmIChUaW1lTW9kZSA9PT0gMjQpIHsNCiAgICAgICAgICAgIENhbC5Ib3VycyA9IHBhcnNlSW50KGludEhvdXIsIDEwKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5TZXRNaW51dGUgPSBmdW5jdGlvbiAoaW50TWluKQp7Cgl2YXIgTWF4TWluID0gNTksCglNaW5NaW4gPSAwLAoKCVNpbmdsZURpZ2l0ID0gbmV3IFJlZ0V4cCgiXFxkIiksCglTaW5nbGVEaWdpdDIgPSBuZXcgUmVnRXhwKCJeXFxkezF9JCIpLAoJTWluRXhwID0gbmV3IFJlZ0V4cCgiXlxcZHsyfSQiKSwKCglzdHJNaW4gPSAwOwoKCWlmICgoTWluRXhwLnRlc3QoaW50TWluKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludE1pbikpICYmIChwYXJzZUludChpbnRNaW4sIDEwKSA+IE1heE1pbikpCgl7CgkJaW50TWluID0gTWluTWluOwoJfQoKCWVsc2UgaWYgKChNaW5FeHAudGVzdChpbnRNaW4pIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50TWluKSkgJiYgKHBhcnNlSW50KGludE1pbiwgMTApIDwgTWluTWluKSkKCXsKCQlpbnRNaW4gPSBNYXhNaW47Cgl9CgoJc3RyTWluID0gaW50TWluICsgIiI7CglpZiAoU2luZ2xlRGlnaXQyLnRlc3QoaW50TWluKSkKCXsKCQlzdHJNaW4gPSAiMCIgKyBzdHJNaW47Cgl9CgoJaWYgKChNaW5FeHAudGVzdChpbnRNaW4pIHx8IFNpbmdsZURpZ2l0LnRlc3QoaW50TWluKSkgJiYgKHBhcnNlSW50KGludE1pbiwgMTApIDw9IDU5KSAmJiAocGFyc2VJbnQoaW50TWluLCAxMCkgPj0gMCkpCgl7CgkJQ2FsLk1pbnV0ZXMgPSBzdHJNaW47Cgl9Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuU2V0U2Vjb25kID0gZnVuY3Rpb24gKGludFNlYykKewoJdmFyIE1heFNlYyA9IDU5LAoJTWluU2VjID0gMCwKCglTaW5nbGVEaWdpdCA9IG5ldyBSZWdFeHAoIlxcZCIpLAoJU2luZ2xlRGlnaXQyID0gbmV3IFJlZ0V4cCgiXlxcZHsxfSQiKSwKCVNlY0V4cCA9IG5ldyBSZWdFeHAoIl5cXGR7Mn0kIiksCgoJc3RyU2VjID0gMDsKCglpZiAoKFNlY0V4cC50ZXN0KGludFNlYykgfHwgU2luZ2xlRGlnaXQudGVzdChpbnRTZWMpKSAmJiAocGFyc2VJbnQoaW50U2VjLCAxMCkgPiBNYXhTZWMpKQoJewoJCWludFNlYyA9IE1pblNlYzsKCX0KCgllbHNlIGlmICgoU2VjRXhwLnRlc3QoaW50U2VjKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludFNlYykpICYmIChwYXJzZUludChpbnRTZWMsIDEwKSA8IE1pblNlYykpCgl7CgkJaW50U2VjID0gTWF4U2VjOwoJfQoKCXN0clNlYyA9IGludFNlYyArICIiOwoJaWYgKFNpbmdsZURpZ2l0Mi50ZXN0KGludFNlYykpCgl7CgkJc3RyU2VjID0gIjAiICsgc3RyU2VjOwoJfQoKCWlmICgoU2VjRXhwLnRlc3QoaW50U2VjKSB8fCBTaW5nbGVEaWdpdC50ZXN0KGludFNlYykpICYmIChwYXJzZUludChpbnRTZWMsIDEwKSA8PSA1OSkgJiYgKHBhcnNlSW50KGludFNlYywgMTApID49IDApKQoJewoJCUNhbC5TZWNvbmRzID0gc3RyU2VjOwoJfQoKfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5TZXRBbVBtID0gZnVuY3Rpb24gKHB2YWx1ZSkKewoJdGhpcy5BTW9yUE0gPSBwdmFsdWU7CglpZiAocHZhbHVlID09PSAiUE0iKQoJewoJCXRoaXMuSG91cnMgPSBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkgKyAxMjsKCQlpZiAodGhpcy5Ib3VycyA9PT0gMjQpCgkJewoJCQl0aGlzLkhvdXJzID0gMTI7CgkJfQoJfQoKCWVsc2UgaWYgKHB2YWx1ZSA9PT0gIkFNIikKCXsKCQl0aGlzLkhvdXJzIC09IDEyOwoJfQp9Ow0KDQpDYWxlbmRhci5wcm90b3R5cGUuZ2V0U2hvd0hvdXIgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgZmluYWxIb3VyOw0KDQogICAgaWYgKFRpbWVNb2RlID09PSAxMikgew0KICAgICAgICBpZiAocGFyc2VJbnQodGhpcy5Ib3VycywgMTApID09PSAwKSB7DQogICAgICAgICAgICB0aGlzLkFNb3JQTSA9ICJBTSI7DQogICAgICAgICAgICBmaW5hbEhvdXIgPSBwYXJzZUludCh0aGlzLkhvdXJzLCAxMCkgKyAxMjsNCiAgICAgICAgfQ0KDQogICAgICAgIGVsc2UgaWYgKHBhcnNlSW50KHRoaXMuSG91cnMsIDEwKSA9PT0gMTIpIHsNCiAgICAgICAgICAgIHRoaXMuQU1vclBNID0gIlBNIjsNCiAgICAgICAgICAgIGZpbmFsSG91ciA9IDEyOw0KICAgICAgICB9DQoNCiAgICAgICAgZWxzZSBpZiAodGhpcy5Ib3VycyA+IDEyKSB7DQogICAgICAgICAgICB0aGlzLkFNb3JQTSA9ICJQTSI7DQogICAgICAgICAgICBpZiAoKHRoaXMuSG91cnMgLSAxMikgPCAxMCkgew0KICAgICAgICAgICAgICAgIGZpbmFsSG91ciA9ICIwIiArICgocGFyc2VJbnQodGhpcy5Ib3VycywgMTApKSAtIDEyKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGZpbmFsSG91ciA9IHBhcnNlSW50KHRoaXMuSG91cnMsIDEwKSAtIDEyOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgdGhpcy5BTW9yUE0gPSAiQU0iOw0KICAgICAgICAgICAgaWYgKHRoaXMuSG91cnMgPCAxMCkgew0KICAgICAgICAgICAgICAgIGZpbmFsSG91ciA9ICIwIiArIHBhcnNlSW50KHRoaXMuSG91cnMsIDEwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgICAgIGZpbmFsSG91ciA9IHRoaXMuSG91cnM7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBlbHNlIGlmIChUaW1lTW9kZSA9PT0gMjQpIHsNCiAgICAgICAgaWYgKHRoaXMuSG91cnMgPCAxMCkgew0KICAgICAgICAgICAgZmluYWxIb3VyID0gIjAiICsgcGFyc2VJbnQodGhpcy5Ib3VycywgMTApOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgZmluYWxIb3VyID0gdGhpcy5Ib3VyczsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHJldHVybiBmaW5hbEhvdXI7DQp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLmdldFNob3dBTW9yUE0gPSBmdW5jdGlvbiAoKQp7CglyZXR1cm4gdGhpcy5BTW9yUE07Cn07CgpDYWxlbmRhci5wcm90b3R5cGUuR2V0TW9udGhOYW1lID0gZnVuY3Rpb24gKElzTG9uZykKewoJdmFyIE1vbnRoID0gTW9udGhOYW1lW3RoaXMuTW9udGhdOwoJaWYgKElzTG9uZykKCXsKCQlyZXR1cm4gTW9udGg7Cgl9CgllbHNlCgl7CgkJcmV0dXJuIE1vbnRoLnN1YnN0cigwLCAzKTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5HZXRNb25EYXlzID0gZnVuY3Rpb24oKSB7IC8vR2V0IG51bWJlciBvZiBkYXlzIGluIGEgbW9udGgKCiAgICB2YXIgRGF5c0luTW9udGggPSBbMzEsIDI4LCAzMSwgMzAsIDMxLCAzMCwgMzEsIDMxLCAzMCwgMzEsIDMwLCAzMV07CiAgICBpZiAoQ2FsLklzTGVhcFllYXIoKSkgewogICAgICAgIERheXNJbk1vbnRoWzFdID0gMjk7CiAgICB9CgogICAgcmV0dXJuIERheXNJbk1vbnRoW3RoaXMuTW9udGhdOwp9OwoKQ2FsZW5kYXIucHJvdG90eXBlLklzTGVhcFllYXIgPSBmdW5jdGlvbiAoKQp7CglpZiAoKHRoaXMuWWVhciAlIDQpID09PSAwKQoJewoJCWlmICgodGhpcy5ZZWFyICUgMTAwID09PSAwKSAmJiAodGhpcy5ZZWFyICUgNDAwKSAhPT0gMCkKCQl7CgkJCXJldHVybiBmYWxzZTsKCQl9CgkJZWxzZQoJCXsKCQkJcmV0dXJuIHRydWU7CgkJfQoJfQoJZWxzZQoJewoJCXJldHVybiBmYWxzZTsKCX0KfTsKCkNhbGVuZGFyLnByb3RvdHlwZS5Gb3JtYXREYXRlID0gZnVuY3Rpb24gKHBEYXRlKQp7Cgl2YXIgTW9udGhEaWdpdCA9IHRoaXMuTW9udGggKyAxOwoJaWYgKFByZWNlZGVaZXJvID09PSB0cnVlKQoJewoJCWlmICgocERhdGUgPCAxMCkgJiYgU3RyaW5nKHBEYXRlKS5sZW5ndGg9PT0xKSAvL2xlbmd0aCBjaGVja2luZyBhZGRlZCBpbiB2ZXJzaW9uIDIuMgoJCXsJCQoJCQlwRGF0ZSA9ICIwIiArIHBEYXRlOwoJCX0KCQlpZiAoTW9udGhEaWdpdCA8IDEwKQoJCXsKCQkJTW9udGhEaWdpdCA9ICIwIiArIE1vbnRoRGlnaXQ7CgkJfQoJfQoKCXN3aXRjaCAodGhpcy5Gb3JtYXQudG9VcHBlckNhc2UoKSkKCXsKCQljYXNlICJERE1NWVlZWSI6CgkJcmV0dXJuIChwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiRERNTU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NRERZWVlZIjoKCQlyZXR1cm4gKE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJNTU1ERFlZWVkiOgoJCXJldHVybiAodGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiWVlZWU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTU1ERCI6CgkJcmV0dXJuIChTdHJpbmcodGhpcy5ZZWFyKS5zdWJzdHJpbmcoMiwgNCkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWVlZTU1NREQiOgoJCXJldHVybiAodGhpcy5ZZWFyICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuR2V0TW9udGhOYW1lKGZhbHNlKSArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJZGVmYXVsdDoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArICh0aGlzLk1vbnRoICsgMSkgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCX0KfTsKCi8vIGVuZCBDYWxlbmRhciBwcm90b3R5cGUKCmZ1bmN0aW9uIEdlbkNlbGwocFZhbHVlLCBwSGlnaExpZ2h0LCBwQ29sb3IsIHBDbGlja2FibGUpCnsgLy9HZW5lcmF0ZSB0YWJsZSBjZWxsIHdpdGggdmFsdWUKCXZhciBQVmFsdWUsCglQQ2VsbFN0ciwKCVBDbGlja2FibGUsCgl2VGltZVN0cjsKCglpZiAoIXBWYWx1ZSkKCXsKCQlQVmFsdWUgPSAiIjsKCX0KCWVsc2UKCXsKCQlQVmFsdWUgPSBwVmFsdWU7Cgl9CgoJaWYgKHBDb2xvciA9PT0gdW5kZWZpbmVkKQoJICAgIHBDb2xvciA9IENhbEJnQ29sb3I7CgkKCWlmIChwQ2xpY2thYmxlICE9PSB1bmRlZmluZWQpewoJCVBDbGlja2FibGUgPSBwQ2xpY2thYmxlOwoJfQoJZWxzZXsKCQlQQ2xpY2thYmxlID0gdHJ1ZTsKCX0KCglpZiAoQ2FsLlNob3dUaW1lKQoJewoJCXZUaW1lU3RyID0gJyAnICsgQ2FsLkhvdXJzICsgJzonICsgQ2FsLk1pbnV0ZXM7CgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJCXZUaW1lU3RyICs9ICc6JyArIENhbC5TZWNvbmRzOwoJCX0KCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJdlRpbWVTdHIgKz0gJyAnICsgQ2FsLkFNb3JQTTsKCQl9Cgl9CgoJZWxzZQoJewoJCXZUaW1lU3RyID0gIiI7Cgl9CgoJaWYgKFBWYWx1ZSAhPT0gIiIpCgl7CgkJaWYgKFBDbGlja2FibGUgPT09IHRydWUpIHsKCQkgICAgaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQkgICAgeyBQQ2VsbFN0ciA9ICI8dGQgaWQ9J2MiICsgUFZhbHVlICsgIicgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBvbm1vdXNlZG93bj0nc2VsZWN0RGF0ZSh0aGlzLCIgKyBQVmFsdWUgKyAiKTsnPiIgKyBQVmFsdWUgKyAiPC90ZD4iOyB9CgkJICAgIGVsc2UgeyBQQ2VsbFN0ciA9ICI8dGQgY2xhc3M9J2NhbFREJyBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiICsgcENvbG9yICsgIicgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKTsnIG9ubW91c2VvdXQ9XCJjaGFuZ2VCb3JkZXIodGhpcywgMSwgJyIgKyBwQ29sb3IgKyAiJyk7XCIgb25DbGljaz1cImphdmFzY3JpcHQ6Y2FsbGJhY2soJyIgKyBDYWwuQ3RybCArICInLCciICsgQ2FsLkZvcm1hdERhdGUoUFZhbHVlKSArICInKTtcIj4iICsgUFZhbHVlICsgIjwvdGQ+IjsgfQoJCX0KCQllbHNlCgkJeyBQQ2VsbFN0ciA9ICI8dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyO2JhY2tncm91bmQtY29sb3I6IitwQ29sb3IrIicgY2xhc3M9J2NhbFREJz4iK1BWYWx1ZSsiPC90ZD4iOyB9Cgl9CgllbHNlCgl7IFBDZWxsU3RyID0gIjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjoiK3BDb2xvcisiJyBjbGFzcz0nY2FsVEQnPiZuYnNwOzwvdGQ+IjsgfQoKCXJldHVybiBQQ2VsbFN0cjsKfQoKZnVuY3Rpb24gUmVuZGVyQ3NzQ2FsKGJOZXdDYWwpCnsKCWlmICh0eXBlb2YgYk5ld0NhbCA9PT0gInVuZGVmaW5lZCIgfHwgYk5ld0NhbCAhPT0gdHJ1ZSkKCXsKCQliTmV3Q2FsID0gZmFsc2U7Cgl9Cgl2YXIgdkNhbEhlYWRlciwKCXZDYWxEYXRhLAoJdkNhbFRpbWUgPSAiIiwKCXZDYWxDbG9zaW5nID0gIiIsCgl3aW5DYWxEYXRhID0gIiIsCglDYWxEYXRlLAoKCWksCglqLAoKCVNlbGVjdFN0ciwKCXZEYXlDb3VudCA9IDAsCgl2Rmlyc3REYXksCgoJV2Vla0RheU5hbWUgPSBbXSwvL0FkZGVkIHZlcnNpb24gMS43CglzdHJDZWxsLAoKCXNob3dIb3VyLAoJU2hvd0Fycm93cyA9IGZhbHNlLAoJSG91ckNlbGxXaWR0aCA9ICIzNXB4IiwgLy9jZWxsIHdpZHRoIHdpdGggc2Vjb25kcy4KCglTZWxlY3RBbSwKCVNlbGVjdFBtLAoKCWZ1bmNDYWxiYWNrLAoKCWhlYWRJRCwKCWUsCgljc3NTdHIsCglzdHlsZSwKCWNzc1RleHQsCglzcGFuOwoKCWNhbEhlaWdodCA9IDA7IC8vIHJlc2V0IHRoZSB3aW5kb3cgaGVpZ2h0IG9uIHJlZnJlc2gKCgkvLyBTZXQgdGhlIGRlZmF1bHQgY3Vyc29yIGZvciB0aGUgY2FsZW5kYXIKCgl3aW5DYWxEYXRhID0gIjxzcGFuIHN0eWxlPSdjdXJzb3I6YXV0bzsnPiI7Cgl2Q2FsSGVhZGVyID0gIjx0YWJsZSBzdHlsZT0nYmFja2dyb3VuZC1jb2xvcjoiK0NhbEJnQ29sb3IrIjt3aWR0aDoyMDBweDtwYWRkaW5nOjA7bWFyZ2luOjVweCBhdXRvIDVweCBhdXRvJz48dGJvZHk+IjsKCgkvL1RhYmxlIGZvciBNb250aCAmIFllYXIgU2VsZWN0b3IKCgl2Q2FsSGVhZGVyICs9ICI8dHI+PHRkIGNvbHNwYW49JzcnPjx0YWJsZSBib3JkZXI9JzAnIHdpZHRoPScyMDBweCcgY2VsbHBhZGRpbmc9JzAnIGNlbGxzcGFjaW5nPScwJz48dHI+IjsKCS8vKioqKioqKioqKioqKioqKioqTW9udGggYW5kIFllYXIgc2VsZWN0b3IgaW4gZHJvcGRvd24gbGlzdCoqKioqKioqKioqKioqKioqKioqKioqKgoKCWlmIChDYWwuU2Nyb2xsZXIgPT09ICJEUk9QRE9XTiIpCgl7CgkgICAgdkNhbEhlYWRlciArPSAiPHRkIGFsaWduPSdjZW50ZXInPjxzZWxlY3QgbmFtZT0nTW9udGhTZWxlY3Rvcicgb25DaGFuZ2U9J2phdmFzY3JpcHQ6Q2FsLlN3aXRjaE10aCh0aGlzLnNlbGVjdGVkSW5kZXgpO1JlbmRlckNzc0NhbCgpOyc+IjsKCQlmb3IgKGkgPSAwOyBpIDwgMTI7IGkgKz0gMSkKCQl7CgkJCWlmIChpID09PSBDYWwuTW9udGgpCgkJCXsKCQkJCVNlbGVjdFN0ciA9ICJTZWxlY3RlZCI7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlTZWxlY3RTdHIgPSAiIjsKCQkJfQoJCQl2Q2FsSGVhZGVyICs9ICI8b3B0aW9uICIgKyBTZWxlY3RTdHIgKyAiIHZhbHVlPSIgKyBpICsgIj4iICsgTW9udGhOYW1lW2ldICsgIjwvb3B0aW9uPiI7CgkJfQoKCQl2Q2FsSGVhZGVyICs9ICI8L3NlbGVjdD48L3RkPiI7CgkJLy9ZZWFyIHNlbGVjdG9yCgoJCXZDYWxIZWFkZXIgKz0gIjx0ZCBhbGlnbj0nY2VudGVyJz48c2VsZWN0IG5hbWU9J1llYXJTZWxlY3Rvcicgc2l6ZT0nMScgb25DaGFuZ2U9J2phdmFzY3JpcHQ6Q2FsLlN3aXRjaFllYXIodGhpcy52YWx1ZSk7UmVuZGVyQ3NzQ2FsKCk7Jz4iOwoJCWZvciAoaSA9IFN0YXJ0WWVhcjsgaSA8PSAoZHRUb2RheS5nZXRGdWxsWWVhcigpICsgRW5kWWVhcik7IGkgKz0gMSkKCQl7CgkJCWlmIChpID09PSBDYWwuWWVhcikKCQkJewoJCQkJU2VsZWN0U3RyID0gJ3NlbGVjdGVkPSJzZWxlY3RlZCInOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJU2VsZWN0U3RyID0gJyc7CgkJCX0KCQkJdkNhbEhlYWRlciArPSAiPG9wdGlvbiAiICsgU2VsZWN0U3RyICsgIiB2YWx1ZT0iICsgaSArICI+IiArIGkgKyAiPC9vcHRpb24+XG4iOwoJCX0KCQl2Q2FsSGVhZGVyICs9ICI8L3NlbGVjdD48L3RkPlxuIjsKCQljYWxIZWlnaHQgKz0gMzA7Cgl9CgoJLy8qKioqKioqKioqKioqKioqKipFbmQgTW9udGggYW5kIFllYXIgc2VsZWN0b3IgaW4gZHJvcGRvd24gbGlzdCoqKioqKioqKioqKioqKioqKioqKgoKCS8vKioqKioqKioqKioqKioqKioqTW9udGggYW5kIFllYXIgc2VsZWN0b3IgaW4gYXJyb3cqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgllbHNlIGlmIChDYWwuU2Nyb2xsZXIgPT09ICJBUlJPVyIpCgl7CgkJaWYgKFVzZUltYWdlRmlsZXMpCgkJewoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuRGVjWWVhcigpO1JlbmRlckNzc0NhbCgpOycgc3JjPSciK2ltYWdlRmlsZXNQYXRoKyJjYWxfZmFzdHJldmVyc2UuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPlxuIjsvL1llYXIgc2Nyb2xsZXIgKGRlY3JlYXNlIDEgeWVhcikKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxpbWcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkRlY01vbnRoKCk7UmVuZGVyQ3NzQ2FsKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfcmV2ZXJzZS5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzknIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+XG4iOyAvL01vbnRoIHNjcm9sbGVyIChkZWNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQgd2lkdGg9JzcwJScgY2xhc3M9J2NhbFInIHN0eWxlPSdjb2xvcjoiK1lyU2VsQ29sb3IrIic+IisgQ2FsLkdldE1vbnRoTmFtZShTaG93TG9uZ01vbnRoKSArICIgIiArIENhbC5ZZWFyICsgIjwvdGQ+IjsgLy9Nb250aCBhbmQgWWVhcgoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PGltZyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jTW9udGgoKTtSZW5kZXJDc3NDYWwoKTsnIHNyYz0nIiArIGltYWdlRmlsZXNQYXRoICsgImNhbF9mb3J3YXJkLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOScgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD5cbiI7IC8vTW9udGggc2Nyb2xsZXIgKGluY3JlYXNlIDEgbW9udGgpCgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48aW1nIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5JbmNZZWFyKCk7UmVuZGVyQ3NzQ2FsKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfZmFzdGZvcndhcmQuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPlxuIjsgLy9ZZWFyIHNjcm9sbGVyIChpbmNyZWFzZSAxIHllYXIpCgkJCWNhbEhlaWdodCArPSAyMjsKCQl9CgkJZWxzZQoJCXsKCQkJdkNhbEhlYWRlciArPSAiPHRkPjxzcGFuIGlkPSdkZWNfeWVhcicgdGl0bGU9J3JldmVyc2UgeWVhcicgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkRlY1llYXIoKTtSZW5kZXJDc3NDYWwoKTsnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGU7IGNvbG9yOiIgKyBZclNlbENvbG9yICsgIic+LTwvc3Bhbj48L3RkPiI7Ly9ZZWFyIHNjcm9sbGVyIChkZWNyZWFzZSAxIHllYXIpCgkJCXZDYWxIZWFkZXIgKz0gIjx0ZD48c3BhbiBpZD0nZGVjX21vbnRoJyB0aXRsZT0ncmV2ZXJzZSBtb250aCcgb25tb3VzZWRvd249J2phdmFzY3JpcHQ6Q2FsLkRlY01vbnRoKCk7UmVuZGVyQ3NzQ2FsKCk7JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz4mbHQ7PC9zcGFuPjwvdGQ+XG4iOy8vTW9udGggc2Nyb2xsZXIgKGRlY3JlYXNlIDEgbW9udGgpCgkJCXZDYWxIZWFkZXIgKz0gIjx0ZCB3aWR0aD0nNzAlJyBjbGFzcz0nY2FsUicgc3R5bGU9J2NvbG9yOiIgKyBZclNlbENvbG9yICsgIic+IiArIENhbC5HZXRNb250aE5hbWUoU2hvd0xvbmdNb250aCkgKyAiICIgKyBDYWwuWWVhciArICI8L3RkPlxuIjsgLy9Nb250aCBhbmQgWWVhcgoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PHNwYW4gaWQ9J2luY19tb250aCcgdGl0bGU9J2ZvcndhcmQgbW9udGgnIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OkNhbC5JbmNNb250aCgpO1JlbmRlckNzc0NhbCgpOycgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+Jmd0Ozwvc3Bhbj48L3RkPlxuIjsvL01vbnRoIHNjcm9sbGVyIChpbmNyZWFzZSAxIG1vbnRoKQoJCQl2Q2FsSGVhZGVyICs9ICI8dGQ+PHNwYW4gaWQ9J2luY195ZWFyJyB0aXRsZT0nZm9yd2FyZCB5ZWFyJyBvbm1vdXNlZG93bj0namF2YXNjcmlwdDpDYWwuSW5jWWVhcigpO1JlbmRlckNzc0NhbCgpOycgIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGU7IGNvbG9yOiIgKyBZclNlbENvbG9yICsgIic+Kzwvc3Bhbj48L3RkPlxuIjsvL1llYXIgc2Nyb2xsZXIgKGluY3JlYXNlIDEgeWVhcikKCQkJY2FsSGVpZ2h0ICs9IDIyOwoJCX0KCX0KCgl2Q2FsSGVhZGVyICs9ICI8L3RyPjwvdGFibGU+PC90ZD48L3RyPiI7CgoJLy8qKioqKioqKioqKioqKioqKipFbmQgTW9udGggYW5kIFllYXIgc2VsZWN0b3IgaW4gYXJyb3cqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgkvL0NhbGVuZGFyIGhlYWRlciBzaG93cyBNb250aCBhbmQgWWVhcgoJaWYgKFNob3dNb250aFllYXIgJiYgQ2FsLlNjcm9sbGVyID09PSAiRFJPUERPV04iKQoJewoJICAgIHZDYWxIZWFkZXIgKz0gIjx0cj48dGQgY29sc3Bhbj0nNycgY2xhc3M9J2NhbFInIHN0eWxlPSdjb2xvcjoiICsgTW9udGhZZWFyQ29sb3IgKyAiJz4iICsgQ2FsLkdldE1vbnRoTmFtZShTaG93TG9uZ01vbnRoKSArICIgIiArIENhbC5ZZWFyICsgIjwvdGQ+PC90cj4iOwoJCWNhbEhlaWdodCArPSAxOTsKCX0KCgkvL1dlZWsgZGF5IGhlYWRlcgoKCXZDYWxIZWFkZXIgKz0gIjx0cj48dGQgY29sc3Bhbj1cIjdcIj48dGFibGUgc3R5bGU9J2JvcmRlci1zcGFjaW5nOjFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGU7Jz48dHI+IjsKCWlmIChNb25kYXlGaXJzdERheSA9PT0gdHJ1ZSkKCXsKCQlXZWVrRGF5TmFtZSA9IFdlZWtEYXlOYW1lMjsKCX0KCWVsc2UKCXsKCQlXZWVrRGF5TmFtZSA9IFdlZWtEYXlOYW1lMTsKCX0KCWZvciAoaSA9IDA7IGkgPCA3OyBpICs9IDEpCgl7CgkgICAgdkNhbEhlYWRlciArPSAiPHRkIHN0eWxlPSdiYWNrZ3JvdW5kLWNvbG9yOiIrV2Vla0hlYWRDb2xvcisiO3dpZHRoOiIrQ2VsbFdpZHRoKyJweDtjb2xvcjojRkZGRkZGJyBjbGFzcz0nY2FsVEQnPiIgKyBXZWVrRGF5TmFtZVtpXS5zdWJzdHIoMCwgV2Vla0NoYXIpICsgIjwvdGQ+IjsKCX0KCgljYWxIZWlnaHQgKz0gMTk7Cgl2Q2FsSGVhZGVyICs9ICI8L3RyPiI7CgkvL0NhbGVuZGFyIGRldGFpbAoJQ2FsRGF0ZSA9IG5ldyBEYXRlKENhbC5ZZWFyLCBDYWwuTW9udGgpOwoJQ2FsRGF0ZS5zZXREYXRlKDEpOwoKCXZGaXJzdERheSA9IENhbERhdGUuZ2V0RGF5KCk7CgoJLy9BZGRlZCB2ZXJzaW9uIDEuNwoJaWYgKE1vbmRheUZpcnN0RGF5ID09PSB0cnVlKQoJewoJCXZGaXJzdERheSAtPSAxOwoJCWlmICh2Rmlyc3REYXkgPT09IC0xKQoJCXsKCQkJdkZpcnN0RGF5ID0gNjsKCQl9Cgl9CgoJLy9BZGRlZCB2ZXJzaW9uIDEuNwoJdkNhbERhdGEgPSAiPHRyPiI7CgljYWxIZWlnaHQgKz0gMTk7Cglmb3IgKGkgPSAwOyBpIDwgdkZpcnN0RGF5OyBpICs9IDEpCgl7CgkJdkNhbERhdGEgPSB2Q2FsRGF0YSArIEdlbkNlbGwoKTsKCQl2RGF5Q291bnQgPSB2RGF5Q291bnQgKyAxOwoJfQoKCS8vQWRkZWQgdmVyc2lvbiAxLjcKCWZvciAoaiA9IDE7IGogPD0gQ2FsLkdldE1vbkRheXMoKTsgaiArPSAxKQoJewoJCWlmICgodkRheUNvdW50ICUgNyA9PT0gMCkgJiYgKGogPiAxKSkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiPHRyPiI7CgkJfQoKCQl2RGF5Q291bnQgPSB2RGF5Q291bnQgKyAxOwoJCS8vYWRkZWQgdmVyc2lvbiAyLjEuMgoJCWlmIChDYWwuRW5hYmxlRGF0ZU1vZGUgPT09ICJmdXR1cmUiICYmICgoaiA8IGR0VG9kYXkuZ2V0RGF0ZSgpKSAmJiAoQ2FsLk1vbnRoID09PSBkdFRvZGF5LmdldE1vbnRoKCkpICYmIChDYWwuWWVhciA9PT0gZHRUb2RheS5nZXRGdWxsWWVhcigpKSB8fCAoQ2FsLk1vbnRoIDwgZHRUb2RheS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkgfHwgKENhbC5ZZWFyIDwgZHRUb2RheS5nZXRGdWxsWWVhcigpKSkpCgkJewoJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgRGlzYWJsZUNvbG9yLCBmYWxzZSk7IC8vQmVmb3JlIHRvZGF5J3MgZGF0ZSBpcyBub3QgY2xpY2thYmxlDQogICAgICAgIH0NCiAgICAgICAgZWxzZSBpZiAoQ2FsLkVuYWJsZURhdGVNb2RlID09PSAicGFzdCIgJiYgKChqID49IGR0VG9kYXkuZ2V0RGF0ZSgpKSAmJiAoQ2FsLk1vbnRoID09PSBkdFRvZGF5LmdldE1vbnRoKCkpICYmIChDYWwuWWVhciA9PT0gZHRUb2RheS5nZXRGdWxsWWVhcigpKSB8fCAoQ2FsLk1vbnRoID4gZHRUb2RheS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkgfHwgKENhbC5ZZWFyID4gZHRUb2RheS5nZXRGdWxsWWVhcigpKSkpIHsNCiAgICAgICAgICAgIHN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBEaXNhYmxlQ29sb3IsIGZhbHNlKTsgLy9BZnRlciB0b2RheSdzIGRhdGUgaXMgbm90IGNsaWNrYWJsZQ0KICAgICAgICB9CgkJLy9pZiBFbmQgWWVhciArIEN1cnJlbnQgWWVhciA9IENhbC5ZZWFyLiBEaXNhYmxlLgoJCWVsc2UgaWYgKENhbC5ZZWFyID4gKGR0VG9kYXkuZ2V0RnVsbFllYXIoKStFbmRZZWFyKSkKCQl7CgkJICAgIHN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBEaXNhYmxlQ29sb3IsIGZhbHNlKTsgCgkJfQoJCWVsc2UgaWYgKChqID09PSBkdFRvZGF5LmdldERhdGUoKSkgJiYgKENhbC5Nb250aCA9PT0gZHRUb2RheS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkpCgkJewoJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCB0cnVlLCBUb2RheUNvbG9yKTsvL0hpZ2hsaWdodCB0b2RheSdzIGRhdGUKCQl9CgkJZWxzZQoJCXsKCQkJaWYgKChqID09PSBzZWxEYXRlLmdldERhdGUoKSkgJiYgKENhbC5Nb250aCA9PT0gc2VsRGF0ZS5nZXRNb250aCgpKSAmJiAoQ2FsLlllYXIgPT09IHNlbERhdGUuZ2V0RnVsbFllYXIoKSkpewoJCQkgICAgIC8vbW9kaWZpZWQgdmVyc2lvbiAxLjcKCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIHRydWUsIFNlbERhdGVDb2xvcik7CiAgICAgICAgICAgIH0KCQkJZWxzZQoJCQl7CgkJCQlpZiAoTW9uZGF5Rmlyc3REYXkgPT09IHRydWUpCgkJCQl7CgkJCQkJaWYgKHZEYXlDb3VudCAlIDcgPT09IDApCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBmYWxzZSwgU3VuZGF5Q29sb3IpOwoJCQkJCX0KCQkJCQllbHNlIGlmICgodkRheUNvdW50ICsgMSkgJSA3ID09PSAwKQoJCQkJCXsKCQkJCQkJc3RyQ2VsbCA9IEdlbkNlbGwoaiwgZmFsc2UsIFNhdHVyZGF5Q29sb3IpOwoJCQkJCX0KCQkJCQllbHNlCgkJCQkJewoJCQkJCQlzdHJDZWxsID0gR2VuQ2VsbChqLCBudWxsLCBXZWVrRGF5Q29sb3IpOwoJCQkJCX0KCQkJCX0KCQkJCWVsc2UKCQkJCXsKCQkJCQlpZiAodkRheUNvdW50ICUgNyA9PT0gMCkKCQkJCQl7CgkJCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBTYXR1cmRheUNvbG9yKTsKCQkJCQl9CgkJCQkJZWxzZSBpZiAoKHZEYXlDb3VudCArIDYpICUgNyA9PT0gMCkKCQkJCQl7CgkJCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIGZhbHNlLCBTdW5kYXlDb2xvcik7CgkJCQkJfQoJCQkJCWVsc2UKCQkJCQl7CgkJCQkJCXN0ckNlbGwgPSBHZW5DZWxsKGosIG51bGwsIFdlZWtEYXlDb2xvcik7CgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoKCQl2Q2FsRGF0YSA9IHZDYWxEYXRhICsgc3RyQ2VsbDsKCgkJaWYgKCh2RGF5Q291bnQgJSA3ID09PSAwKSAmJiAoaiA8IENhbC5HZXRNb25EYXlzKCkpKQoJCXsKCQkJdkNhbERhdGEgPSB2Q2FsRGF0YSArICI8L3RyPiI7CgkJCWNhbEhlaWdodCArPSAxOTsKCQl9Cgl9CgoJLy8gZmluaXNoIHRoZSB0YWJsZSBwcm9wZXIKCglpZiAodkRheUNvdW50ICUgNyAhPT0gMCkKCXsKCQl3aGlsZSAodkRheUNvdW50ICUgNyAhPT0gMCkKCQl7CgkJCXZDYWxEYXRhID0gdkNhbERhdGEgKyBHZW5DZWxsKCk7CgkJCXZEYXlDb3VudCA9IHZEYXlDb3VudCArIDE7CgkJfQoJfQoKCXZDYWxEYXRhID0gdkNhbERhdGEgKyAiPC90YWJsZT48L3RkPjwvdHI+IjsKCgoJLy9UaW1lIHBpY2tlcgoJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCXsKCQlzaG93SG91ciA9IENhbC5nZXRTaG93SG91cigpOwoKCQlpZiAoQ2FsLlNob3dTZWNvbmRzID09PSBmYWxzZSAmJiBUaW1lTW9kZSA9PT0gMjQpCgkJewoJCQlTaG93QXJyb3dzID0gdHJ1ZTsKCQkJSG91ckNlbGxXaWR0aCA9ICIxMHB4IjsKCQl9CgoJCXZDYWxUaW1lID0gIjx0cj48dGQgY29sc3Bhbj0nNycgc3R5bGU9XCJ0ZXh0LWFsaWduOmNlbnRlcjtcIj48dGFibGUgYm9yZGVyPScwJyB3aWR0aD0nMTk5cHgnIGNlbGxwYWRkaW5nPScwJyBjZWxsc3BhY2luZz0nMCc+PHRib2R5Pjx0cj48dGQgaGVpZ2h0PSc1cHgnIHdpZHRoPSciICsgSG91ckNlbGxXaWR0aCArICInPiZuYnNwOzwvdGQ+IjsKCgkJaWYgKFNob3dBcnJvd3MgJiYgVXNlSW1hZ2VGaWxlcykgLy90aGlzIGlzIHdoZXJlIHRoZSB1cCBhbmQgZG93biBhcnJvdyBjb250cm9sIHRoZSBob3VyLgoJCXsKCQkgICAgdkNhbFRpbWUgKz0gIjx0ZCBzdHlsZT0ndmVydGljYWwtYWxpZ246bWlkZGxlOyc+PHRhYmxlIGNlbGxzcGFjaW5nPScwJyBjZWxscGFkZGluZz0nMCcgc3R5bGU9J2xpbmUtaGVpZ2h0OjBwdDt3aWR0aDoxMDAlOyc+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9uY2xpY2s9J25leHRTdGVwKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNlZG93bj0nc3RhcnRTcGluKFwiSG91clwiLCBcInBsdXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfcGx1cy5naWYnIHdpZHRoPScxM3B4JyBoZWlnaHQ9JzlweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKScgb25tb3VzZW91dD0nY2hhbmdlQm9yZGVyKHRoaXMsIDEpJyBzdHlsZT0nYm9yZGVyOjFweCBzb2xpZCB3aGl0ZSc+PC90ZD48L3RyPjx0cj48dGQgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyOyc+PGltZyBvbmNsaWNrPSduZXh0U3RlcChcIkhvdXJcIiwgXCJtaW51c1wiKTsnIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJIb3VyXCIsIFwibWludXNcIik7JyBvbm1vdXNldXA9J3N0b3BTcGluKCk7JyBzcmM9JyIgKyBpbWFnZUZpbGVzUGF0aCArICJjYWxfbWludXMuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+PC90cj48L3RhYmxlPjwvdGQ+XG4iOwoJCX0KCgkJdkNhbFRpbWUgKz0gIjx0ZCB3aWR0aD0nMjJweCc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J2hvdXInIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOjIycHhcIiB2YWx1ZT0iICsgc2hvd0hvdXIgKyAiIG9ua2V5dXA9XCJqYXZhc2NyaXB0OkNhbC5TZXRIb3VyKHRoaXMudmFsdWUpXCI+IjsKCQl2Q2FsVGltZSArPSAiPC90ZD48dGQgc3R5bGU9J2ZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjpjZW50ZXI7Jz46PC90ZD48dGQgd2lkdGg9JzIycHgnPiI7CgkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdtaW51dGUnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5NaW51dGVzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0TWludXRlKHRoaXMudmFsdWUpXCI+IjsKCgkJaWYgKENhbC5TaG93U2Vjb25kcykKCQl7CgkJICAgIHZDYWxUaW1lICs9ICI8L3RkPjx0ZCBzdHlsZT0nZm9udC13ZWlnaHQ6Ym9sZDsnPjo8L3RkPjx0ZCB3aWR0aD0nMjJweCc+IjsKCQkJdkNhbFRpbWUgKz0gIjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdzZWNvbmQnIG1heGxlbmd0aD0yIHNpemU9MSBzdHlsZT1cIldJRFRIOiAyMnB4XCIgdmFsdWU9IiArIENhbC5TZWNvbmRzICsgIiBvbmtleXVwPVwiamF2YXNjcmlwdDpDYWwuU2V0U2Vjb25kKHBhcnNlSW50KHRoaXMudmFsdWUsMTApKVwiPiI7CgkJfQoKCQlpZiAoVGltZU1vZGUgPT09IDEyKQoJCXsKCQkJU2VsZWN0QW0gPSAoQ2FsLkFNb3JQTSA9PT0gIkFNIikgPyAiU2VsZWN0ZWQiIDogIiI7CgkJCVNlbGVjdFBtID0gKENhbC5BTW9yUE0gPT09ICJQTSIpID8gIlNlbGVjdGVkIiA6ICIiOwoKCQkJdkNhbFRpbWUgKz0gIjwvdGQ+PHRkPiI7CgkJCXZDYWxUaW1lICs9ICI8c2VsZWN0IG5hbWU9XCJhbXBtXCIgb25DaGFuZ2U9XCJqYXZhc2NyaXB0OkNhbC5TZXRBbVBtKHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTtcIj5cbiI7CgkJCXZDYWxUaW1lICs9ICI8b3B0aW9uICIgKyBTZWxlY3RBbSArICIgdmFsdWU9XCJBTVwiPkFNPC9vcHRpb24+IjsKCQkJdkNhbFRpbWUgKz0gIjxvcHRpb24gIiArIFNlbGVjdFBtICsgIiB2YWx1ZT1cIlBNXCI+UE08b3B0aW9uPiI7CgkJCXZDYWxUaW1lICs9ICI8L3NlbGVjdD4iOwoJCX0KCgkJaWYgKFNob3dBcnJvd3MgJiYgVXNlSW1hZ2VGaWxlcykgLy90aGlzIGlzIHdoZXJlIHRoZSB1cCBhbmQgZG93biBhcnJvdyB0byBjaGFuZ2UgdGhlICJNaW51dGUiLgoJCXsKCQkgICAgdkNhbFRpbWUgKz0gIjwvdGQ+XG48dGQgc3R5bGU9J3ZlcnRpY2FsLWFsaWduOm1pZGRsZTsnPjx0YWJsZSBjZWxsc3BhY2luZz0nMCcgY2VsbHBhZGRpbmc9JzAnIHN0eWxlPSdsaW5lLWhlaWdodDowcHQ7d2lkdGg6MTAwJSc+PHRyPjx0ZCBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXI7Jz48aW1nIG9uY2xpY2s9J25leHRTdGVwKFwiTWludXRlXCIsIFwicGx1c1wiKTsnIG9ubW91c2Vkb3duPSdzdGFydFNwaW4oXCJNaW51dGVcIiwgXCJwbHVzXCIpOycgb25tb3VzZXVwPSdzdG9wU3BpbigpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX3BsdXMuZ2lmJyB3aWR0aD0nMTNweCcgaGVpZ2h0PSc5cHgnIG9ubW91c2VvdmVyPSdjaGFuZ2VCb3JkZXIodGhpcywgMCknIG9ubW91c2VvdXQ9J2NoYW5nZUJvcmRlcih0aGlzLCAxKScgc3R5bGU9J2JvcmRlcjoxcHggc29saWQgd2hpdGUnPjwvdGQ+PC90cj48dHI+PHRkIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcjsnPjxpbWcgb25tb3VzZWRvd249J3N0YXJ0U3BpbihcIk1pbnV0ZVwiLCBcIm1pbnVzXCIpOycgb25tb3VzZXVwPSdzdG9wU3BpbigpOycgb25jbGljaz0nbmV4dFN0ZXAoXCJNaW51dGVcIixcIm1pbnVzXCIpOycgc3JjPSciICsgaW1hZ2VGaWxlc1BhdGggKyAiY2FsX21pbnVzLmdpZicgd2lkdGg9JzEzcHgnIGhlaWdodD0nOXB4JyBvbm1vdXNlb3Zlcj0nY2hhbmdlQm9yZGVyKHRoaXMsIDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPjwvdHI+PC90YWJsZT4iOwoJCX0KCgkJdkNhbFRpbWUgKz0gIjwvdGQ+XG48dGQgYWxpZ249J3JpZ2h0JyB2YWxpZ249J2JvdHRvbScgd2lkdGg9JyIgKyBIb3VyQ2VsbFdpZHRoICsgInB4Jz48L3RkPjwvdHI+IjsKCQl2Q2FsVGltZSArPSAiPHRyPjx0ZCBjb2xzcGFuPSc4JyBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiPjxpbnB1dCBzdHlsZT0nd2lkdGg6NjBweDtmb250LXNpemU6MTJweDsnIG9uQ2xpY2s9J2phdmFzY3JpcHQ6Y2xvc2V3aW4oXCIiICsgQ2FsLkN0cmwgKyAiXCIpOycgIHR5cGU9XCJidXR0b25cIiB2YWx1ZT1cIk9LXCI+Jm5ic3A7PGlucHV0IHN0eWxlPSd3aWR0aDo2MHB4O2ZvbnQtc2l6ZToxMnB4Oycgb25DbGljaz0namF2YXNjcmlwdDogd2luQ2FsLnN0eWxlLnZpc2liaWxpdHkgPSBcImhpZGRlblwiJyB0eXBlPVwiYnV0dG9uXCIgdmFsdWU9XCJDYW5jZWxcIj48L3RkPjwvdHI+IjsKCX0KCWVsc2UgLy9pZiBub3QgdG8gc2hvdyB0aW1lLgoJewoJICAgIHZDYWxUaW1lICs9ICJcbjx0cj5cbjx0ZCBjb2xzcGFuPSc3JyBzdHlsZT1cInRleHQtYWxpZ246cmlnaHQ7XCI+IjsKCSAgICAvL2Nsb3NlIGJ1dHRvbgoJICAgIGlmIChVc2VJbWFnZUZpbGVzKSB7CgkgICAgICAgIHZDYWxDbG9zaW5nICs9ICI8aW1nIG9ubW91c2Vkb3duPSdqYXZhc2NyaXB0OmNsb3Nld2luKFwiIiArIENhbC5DdHJsICsgIlwiKTsgc3RvcFNwaW4oKTsnIHNyYz0nIitpbWFnZUZpbGVzUGF0aCsiY2FsX2Nsb3NlLmdpZicgd2lkdGg9JzE2cHgnIGhlaWdodD0nMTRweCcgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLDApJyBvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlJz48L3RkPiI7CgkgICAgfQoJICAgIGVsc2UgewoJICAgICAgICB2Q2FsQ2xvc2luZyArPSAiPHNwYW4gaWQ9J2Nsb3NlX2NhbCcgdGl0bGU9J2Nsb3NlJ29ubW91c2Vkb3duPSdqYXZhc2NyaXB0OmNsb3Nld2luKFwiIiArIENhbC5DdHJsICsgIlwiKTtzdG9wU3BpbigpOycgb25tb3VzZW92ZXI9J2NoYW5nZUJvcmRlcih0aGlzLCAwKSdvbm1vdXNlb3V0PSdjaGFuZ2VCb3JkZXIodGhpcywgMSknIHN0eWxlPSdib3JkZXI6MXB4IHNvbGlkIHdoaXRlOyBmb250LWZhbWlseTogQXJpYWw7Zm9udC1zaXplOiAxMHB0Oyc+eDwvc3Bhbj48L3RkPiI7CgkgICAgfQoJICAgIHZDYWxDbG9zaW5nICs9ICI8L3RyPiI7Cgl9Cgl2Q2FsQ2xvc2luZyArPSAiPC90Ym9keT48L3RhYmxlPjwvdGQ+PC90cj4iOwoJY2FsSGVpZ2h0ICs9IDMxOwoJdkNhbENsb3NpbmcgKz0gIjwvdGJvZHk+PC90YWJsZT5cbjwvc3Bhbj4iOwoKCS8vZW5kIHRpbWUgcGlja2VyCglmdW5jQ2FsYmFjayA9ICJmdW5jdGlvbiBjYWxsYmFjayhpZCwgZGF0dW0pIHsiOwoJZnVuY0NhbGJhY2sgKz0gIiB2YXIgQ2FsSWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCk7aWYgKGRhdHVtPT09ICd1bmRlZmluZWQnKSB7IHZhciBkID0gbmV3IERhdGUoKTsgZGF0dW0gPSBkLmdldERhdGUoKSArICcvJyArKGQuZ2V0TW9udGgoKSsxKSArICcvJyArIGQuZ2V0RnVsbFllYXIoKTsgfSB3aW5kb3cuY2FsRGF0dW09ZGF0dW07Q2FsSWQudmFsdWU9ZGF0dW07IjsKCWZ1bmNDYWxiYWNrICs9ICIgaWYoQ2FsLlNob3dUaW1lKXsiOwoJZnVuY0NhbGJhY2sgKz0gIiBDYWxJZC52YWx1ZSs9JyAnK0NhbC5nZXRTaG93SG91cigpKyc6JytDYWwuTWludXRlczsiOwoJZnVuY0NhbGJhY2sgKz0gIiBpZiAoQ2FsLlNob3dTZWNvbmRzKSAgQ2FsSWQudmFsdWUrPSc6JytDYWwuU2Vjb25kczsiOwoJZnVuY0NhbGJhY2sgKz0gIiBpZiAoVGltZU1vZGUgPT09IDEyKSAgQ2FsSWQudmFsdWUrPScnK0NhbC5nZXRTaG93QU1vclBNKCk7IjsKCWZ1bmNDYWxiYWNrICs9ICJ9aWYoQ2FsSWQub25jaGFuZ2UhPXVuZGVmaW5lZCkgQ2FsSWQub25jaGFuZ2UoKTtDYWxJZC5mb2N1cygpO3dpbkNhbC5zdHlsZS52aXNpYmlsaXR5PSdoaWRkZW4nO30iOwoKCgkvLyBkZXRlcm1pbmVzIGlmIHRoZXJlIGlzIGVub3VnaCBzcGFjZSB0byBvcGVuIHRoZSBjYWwgYWJvdmUgdGhlIHBvc2l0aW9uIHdoZXJlIGl0IGlzIGNhbGxlZAoJaWYgKHlwb3MgPiBjYWxIZWlnaHQpCgl7CgkJeXBvcyA9IHlwb3MgLSBjYWxIZWlnaHQ7Cgl9CgoJaWYgKCF3aW5DYWwpCgl7CgkJaGVhZElEID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImhlYWQiKVswXTsKCgkJLy8gYWRkIGphdmFzY3JpcHQgZnVuY3Rpb24gdG8gdGhlIHNwYW4gY2FsCgkJZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwoJCWUudHlwZSA9ICJ0ZXh0L2phdmFzY3JpcHQiOwoJCWUubGFuZ3VhZ2UgPSAiamF2YXNjcmlwdCI7CgkJZS50ZXh0ID0gZnVuY0NhbGJhY2s7CgkJaGVhZElELmFwcGVuZENoaWxkKGUpOwoJCS8vIGFkZCBzdHlsZXNoZWV0IHRvIHRoZSBzcGFuIGNhbAoKCQljc3NTdHIgPSAiLmNhbFREIHtmb250LWZhbWlseTogdmVyZGFuYTsgZm9udC1zaXplOiAxMnB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7IGJvcmRlcjowOyB9XG4iOwoJCWNzc1N0ciArPSAiLmNhbFIge2ZvbnQtZmFtaWx5OiB2ZXJkYW5hOyBmb250LXNpemU6IDEycHg7IHRleHQtYWxpZ246IGNlbnRlcjsgZm9udC13ZWlnaHQ6IGJvbGQ7fSI7CgoJCXN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTsKCQlzdHlsZS50eXBlID0gInRleHQvY3NzIjsKCQlzdHlsZS5yZWwgPSAic3R5bGVzaGVldCI7CgkJaWYgKHN0eWxlLnN0eWxlU2hlZXQpCgkJeyAvLyBJRQoJCQlzdHlsZS5zdHlsZVNoZWV0LmNzc1RleHQgPSBjc3NTdHI7CgkJfQoKCQllbHNlCgkJeyAvLyB3M2MKCQkJY3NzVGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNzc1N0cik7CgkJCXN0eWxlLmFwcGVuZENoaWxkKGNzc1RleHQpOwoJCX0KCgkJaGVhZElELmFwcGVuZENoaWxkKHN0eWxlKTsKCQkvLyBjcmVhdGUgdGhlIG91dGVyIGZyYW1lIHRoYXQgYWxsb3dzIHRoZSBjYWwuIHRvIGJlIG1vdmVkCgkJc3BhbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKCQlzcGFuLmlkID0gY2FsU3BhbklEOwoJCXNwYW4uc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwoJCXNwYW4uc3R5bGUubGVmdCA9ICh4cG9zICsgQ2FsUG9zT2Zmc2V0WCkgKyAncHgnOwoJCXNwYW4uc3R5bGUudG9wID0gKHlwb3MgLSBDYWxQb3NPZmZzZXRZKSArICdweCc7CgkJc3Bhbi5zdHlsZS53aWR0aCA9IENhbFdpZHRoICsgJ3B4JzsKCQlzcGFuLnN0eWxlLmJvcmRlciA9ICJzb2xpZCAxcHQgIiArIFNwYW5Cb3JkZXJDb2xvcjsKCQlzcGFuLnN0eWxlLnBhZGRpbmcgPSAiMCI7CgkJc3Bhbi5zdHlsZS5jdXJzb3IgPSAibW92ZSI7CgkJc3Bhbi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBTcGFuQmdDb2xvcjsKCQlzcGFuLnN0eWxlLnpJbmRleCA9IDEwMDsKCQlkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNwYW4pOwoJCXdpbkNhbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNhbFNwYW5JRCk7Cgl9CgoJZWxzZQoJewoJCXdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwoJCXdpbkNhbC5zdHlsZS5IZWlnaHQgPSBjYWxIZWlnaHQ7CgoJCS8vIHNldCB0aGUgcG9zaXRpb24gZm9yIGEgbmV3IGNhbGVuZGFyIG9ubHkKCQlpZiAoYk5ld0NhbCA9PT0gdHJ1ZSkKCQl7CgkJCXdpbkNhbC5zdHlsZS5sZWZ0ID0gKHhwb3MgKyBDYWxQb3NPZmZzZXRYKSArICdweCc7CgkJCXdpbkNhbC5zdHlsZS50b3AgPSAoeXBvcyAtIENhbFBvc09mZnNldFkpICsgJ3B4JzsKCQl9Cgl9CgoJd2luQ2FsLmlubmVySFRNTCA9IHdpbkNhbERhdGEgKyB2Q2FsSGVhZGVyICsgdkNhbERhdGEgKyB2Q2FsVGltZSArIHZDYWxDbG9zaW5nOwoJcmV0dXJuIHRydWU7Cn0KCgpmdW5jdGlvbiBOZXdDc3NDYWwocEN0cmwsIHBGb3JtYXQsIHBTY3JvbGxlciwgcFNob3dUaW1lLCBwVGltZU1vZGUsIHBTaG93U2Vjb25kcywgcEVuYWJsZURhdGVNb2RlKQp7CgkvLyBnZXQgY3VycmVudCBkYXRlIGFuZCB0aW1lCgoJZHRUb2RheSA9IG5ldyBEYXRlKCk7CglDYWwgPSBuZXcgQ2FsZW5kYXIoZHRUb2RheSk7CgoJaWYgKHBTaG93VGltZSAhPT0gdW5kZWZpbmVkKQoJewoJICAgIGlmIChwU2hvd1RpbWUpIHsKCSAgICAgICAgQ2FsLlNob3dUaW1lID0gdHJ1ZTsKCSAgICB9CgkgICAgZWxzZSB7CgkgICAgICAgIENhbC5TaG93VGltZSA9IGZhbHNlOwoJICAgIH0KCgkJaWYgKHBUaW1lTW9kZSkKCQl7CgkJCXBUaW1lTW9kZSA9IHBhcnNlSW50KHBUaW1lTW9kZSwgMTApOwoJCX0KCQlpZiAocFRpbWVNb2RlID09PSAxMiB8fCBwVGltZU1vZGUgPT09IDI0KQoJCXsKCQkJVGltZU1vZGUgPSBwVGltZU1vZGU7CgkJfQoJCWVsc2UKCQl7CgkJCVRpbWVNb2RlID0gMjQ7CgkJfQoKCQlpZiAocFNob3dTZWNvbmRzICE9PSB1bmRlZmluZWQpCgkJewoJCQlpZiAocFNob3dTZWNvbmRzKQoJCQl7CgkJCQlDYWwuU2hvd1NlY29uZHMgPSB0cnVlOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJQ2FsLlNob3dTZWNvbmRzID0gZmFsc2U7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJQ2FsLlNob3dTZWNvbmRzID0gZmFsc2U7CgkJfQoKCX0KCglpZiAocEN0cmwgIT09IHVuZGVmaW5lZCkKCXsKCQlDYWwuQ3RybCA9IHBDdHJsOwoJfQoKCWlmIChwRm9ybWF0IT09IHVuZGVmaW5lZCAmJiBwRm9ybWF0ICE9PSIiKQoJewoJCUNhbC5Gb3JtYXQgPSBwRm9ybWF0LnRvVXBwZXJDYXNlKCk7Cgl9CgllbHNlCgl7CgkJQ2FsLkZvcm1hdCA9ICJNTUREWVlZWSI7Cgl9CgoJaWYgKHBTY3JvbGxlciE9PSB1bmRlZmluZWQgJiYgcFNjcm9sbGVyIT09IiIpCgl7CgkJaWYgKHBTY3JvbGxlci50b1VwcGVyQ2FzZSgpID09PSAiQVJST1ciKQoJCXsKCQkJQ2FsLlNjcm9sbGVyID0gIkFSUk9XIjsKCQl9CgkJZWxzZQoJCXsKCQkJQ2FsLlNjcm9sbGVyID0gIkRST1BET1dOIjsKCQl9DQogICAgfQ0KDQogICAgaWYgKHBFbmFibGVEYXRlTW9kZSAhPT0gdW5kZWZpbmVkICYmIChwRW5hYmxlRGF0ZU1vZGUgPT09ICJmdXR1cmUiIHx8IHBFbmFibGVEYXRlTW9kZSA9PT0gInBhc3QiKSkgew0KICAgICAgICBDYWwuRW5hYmxlRGF0ZU1vZGU9IHBFbmFibGVEYXRlTW9kZTsNCiAgICB9CgoJZXhEYXRlVGltZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHBDdHJsKS52YWx1ZTsgLy9FeGlzdGluZyBEYXRlIFRpbWUgdmFsdWUgaW4gdGV4dGJveC4KCglpZiAoZXhEYXRlVGltZSkKCXsgLy9QYXJzZSBleGlzdGluZyBEYXRlIFN0cmluZwoJCXZhciBTcDEgPSBleERhdGVUaW1lLmluZGV4T2YoRGF0ZVNlcGFyYXRvciwgMCksLy9JbmRleCBvZiBEYXRlIFNlcGFyYXRvciAxCgkJU3AyID0gZXhEYXRlVGltZS5pbmRleE9mKERhdGVTZXBhcmF0b3IsIHBhcnNlSW50KFNwMSwgMTApICsgMSksLy9JbmRleCBvZiBEYXRlIFNlcGFyYXRvciAyCgkJdFNwMSwvL0luZGV4IG9mIFRpbWUgU2VwYXJhdG9yIDEKCQl0U3AyLC8vSW5kZXggb2YgVGltZSBTZXBhcmF0b3IgMgoJCXN0ck1vbnRoLAoJCXN0ckRhdGUsCgkJc3RyWWVhciwKCQlpbnRNb250aCwKCQlZZWFyUGF0dGVybiwKCQlzdHJIb3VyLAoJCXN0ck1pbnV0ZSwKCQlzdHJTZWNvbmQsCgkJd2luSGVpZ2h0LAoJCW9mZnNldCA9IHBhcnNlSW50KENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKS5sYXN0SW5kZXhPZigiTSIpLCAxMCkgLSBwYXJzZUludChDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkuaW5kZXhPZigiTSIpLCAxMCkgLSAxLAoJCXN0ckFNUE0gPSAiIjsKCQkvL3BhcnNlIG1vbnRoCgoJCWlmIChDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJERE1NWVlZWSIgfHwgQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiRERNTU1ZWVlZIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIikKCQkJewoJCQkJc3RyTW9udGggPSBleERhdGVUaW1lLnN1YnN0cmluZygyLCA0ICsgb2Zmc2V0KTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCAyKTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZyg0ICsgb2Zmc2V0LCA4ICsgb2Zmc2V0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWlmIChleERhdGVUaW1lLmluZGV4T2YoIkQqIikgIT09IC0xKQoJCQkJeyAgIC8vRFRHCgkJCQkJc3RyTW9udGggPSBleERhdGVUaW1lLnN1YnN0cmluZyg4LCAxMSk7CgkJCQkJc3RyRGF0ZSAgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCAyKTsKCQkJCQlzdHJZZWFyICA9ICIyMCIgKyBleERhdGVUaW1lLnN1YnN0cmluZygxMSwgMTMpOyAgLy9IYWNrLCBudXIgZsO8ciBKYWhyZXN6YWhsZW4gYWIgMjAwMAoJCQkJfQoJCQkJZWxzZQoJCQkJewoJCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgNSk7CgkJCQl9CgkJCX0KCQl9CgoJCWVsc2UgaWYgKENhbC5Gb3JtYXQudG9VcHBlckNhc2UoKSA9PT0gIk1NRERZWVlZIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJNTU1ERFlZWVkiKXsKCQkJaWYgKERhdGVTZXBhcmF0b3IgPT09ICIiKXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgMiArIG9mZnNldCk7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMiArIG9mZnNldCwgNCArIG9mZnNldCk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoNCArIG9mZnNldCwgOCArIG9mZnNldCk7CgkJCX0KCQkJZWxzZXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDEgKyAxLCBTcDIpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMiArIDEsIFNwMiArIDUpOwoJCQl9CgkJfQoKCQllbHNlIGlmIChDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWVlZTU1ERCIgfHwgQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIil7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDQsIDYgKyBvZmZzZXQpOwoJCQkJc3RyRGF0ZSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDYgKyBvZmZzZXQsIDggKyBvZmZzZXQpOwoJCQkJc3RyWWVhciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKDAsIDQpOwoJCQl9CgkJCWVsc2V7CgkJCQlzdHJNb250aCA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKFNwMSArIDEsIFNwMik7CgkJCQlzdHJEYXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AyICsgMSwgU3AyICsgMyk7CgkJCQlzdHJZZWFyID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoMCwgU3AxKTsKCQkJfQoJCX0KCgkJZWxzZSBpZiAoQ2FsLkZvcm1hdC50b1VwcGVyQ2FzZSgpID09PSAiWVlNTUREIiB8fCBDYWwuRm9ybWF0LnRvVXBwZXJDYXNlKCkgPT09ICJZWU1NTUREIikKCQl7CgkJCWlmIChEYXRlU2VwYXJhdG9yID09PSAiIikKCQkJewoJCQkJc3RyTW9udGggPSBleERhdGVUaW1lLnN1YnN0cmluZygyLCA0ICsgb2Zmc2V0KTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyg0ICsgb2Zmc2V0LCA2ICsgb2Zmc2V0KTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCAyKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN0ck1vbnRoID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoU3AxICsgMSwgU3AyKTsKCQkJCXN0ckRhdGUgPSBleERhdGVUaW1lLnN1YnN0cmluZyhTcDIgKyAxLCBTcDIgKyAzKTsKCQkJCXN0clllYXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygwLCBTcDEpOwoJCQl9CgkJfQoKCQlpZiAoaXNOYU4oc3RyTW9udGgpKXsKCQkJaW50TW9udGggPSBDYWwuR2V0TW9udGhJbmRleChzdHJNb250aCk7CgkJfQoJCWVsc2V7CgkJCWludE1vbnRoID0gcGFyc2VJbnQoc3RyTW9udGgsIDEwKSAtIDE7CgkJfQoJCWlmICgocGFyc2VJbnQoaW50TW9udGgsIDEwKSA+PSAwKSAmJiAocGFyc2VJbnQoaW50TW9udGgsIDEwKSA8IDEyKSkJewoJCQlDYWwuTW9udGggPSBpbnRNb250aDsKCQl9CgkJLy9lbmQgcGFyc2UgbW9udGgKCgkJLy9wYXJzZSB5ZWFyCgkJWWVhclBhdHRlcm4gPSAvXlxkezR9JC87CgkJaWYgKFllYXJQYXR0ZXJuLnRlc3Qoc3RyWWVhcikpIHsKCQkgICAgaWYgKChwYXJzZUludChzdHJZZWFyLCAxMCk+PVN0YXJ0WWVhcikgJiYgKHBhcnNlSW50KHN0clllYXIsIDEwKTw9IChkdFRvZGF5LmdldEZ1bGxZZWFyKCkrRW5kWWVhcikpKQoJCSAgICAgICAgQ2FsLlllYXIgPSBwYXJzZUludChzdHJZZWFyLCAxMCk7CgkJfQoJCS8vZW5kIHBhcnNlIHllYXIKCQkKCQkvL3BhcnNlIERhdGUKCQlpZiAoKHBhcnNlSW50KHN0ckRhdGUsIDEwKSA8PSBDYWwuR2V0TW9uRGF5cygpKSAmJiAocGFyc2VJbnQoc3RyRGF0ZSwgMTApID49IDEpKSB7CgkJCUNhbC5EYXRlID0gc3RyRGF0ZTsKCQl9CgkJLy9lbmQgcGFyc2UgRGF0ZQoKCQkvL3BhcnNlIHRpbWUKCgkJaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkKCQl7CgkJCS8vcGFyc2UgQU0gb3IgUE0KCQkJaWYgKFRpbWVNb2RlID09PSAxMikKCQkJewoJCQkJc3RyQU1QTSA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKGV4RGF0ZVRpbWUubGVuZ3RoIC0gMiwgZXhEYXRlVGltZS5sZW5ndGgpOwoJCQkJQ2FsLkFNb3JQTSA9IHN0ckFNUE07CgkJCX0KCgkJCXRTcDEgPSBleERhdGVUaW1lLmluZGV4T2YoIjoiLCAwKTsKCQkJdFNwMiA9IGV4RGF0ZVRpbWUuaW5kZXhPZigiOiIsIChwYXJzZUludCh0U3AxLCAxMCkgKyAxKSk7CgkJCWlmICh0U3AxID4gMCkKCQkJewoJCQkJc3RySG91ciA9IGV4RGF0ZVRpbWUuc3Vic3RyaW5nKHRTcDEsIHRTcDEgLSAyKTsNCgkJCQlDYWwuU2V0SG91cihzdHJIb3VyKTsNCgoJCQkJc3RyTWludXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcodFNwMSArIDEsIHRTcDEgKyAzKTsKCQkJCUNhbC5TZXRNaW51dGUoc3RyTWludXRlKTsKCgkJCQlzdHJTZWNvbmQgPSBleERhdGVUaW1lLnN1YnN0cmluZyh0U3AyICsgMSwgdFNwMiArIDMpOwoJCQkJQ2FsLlNldFNlY29uZChzdHJTZWNvbmQpOwoKCQkJfQoJCQllbHNlIGlmIChleERhdGVUaW1lLmluZGV4T2YoIkQqIikgIT09IC0xKQoJCQl7ICAgLy9EVEcKCQkJCXN0ckhvdXIgPSBleERhdGVUaW1lLnN1YnN0cmluZygyLCA0KTsKCQkJCUNhbC5TZXRIb3VyKHN0ckhvdXIpOwoJCQkJc3RyTWludXRlID0gZXhEYXRlVGltZS5zdWJzdHJpbmcoNCwgNik7CgkJCQlDYWwuU2V0TWludXRlKHN0ck1pbnV0ZSk7CgoJCQl9CgkJfQoKCX0KCXNlbERhdGUgPSBuZXcgRGF0ZShDYWwuWWVhciwgQ2FsLk1vbnRoLCBDYWwuRGF0ZSk7Ly92ZXJzaW9uIDEuNwoJUmVuZGVyQ3NzQ2FsKHRydWUpOwp9CgpmdW5jdGlvbiBjbG9zZXdpbihpZCkgewogICAgaWYgKENhbC5TaG93VGltZSA9PT0gdHJ1ZSkgewogICAgICAgIHZhciBNYXhZZWFyID0gZHRUb2RheS5nZXRGdWxsWWVhcigpICsgRW5kWWVhcjsKICAgICAgICB2YXIgYmVmb3JlVG9kYXkgPQogICAgICAgICAgICAgICAgICAgIChDYWwuRGF0ZSA8IGR0VG9kYXkuZ2V0RGF0ZSgpKSAmJgogICAgICAgICAgICAgICAgICAgIChDYWwuTW9udGggPT09IGR0VG9kYXkuZ2V0TW9udGgoKSkgJiYKICAgICAgICAgICAgICAgICAgICAoQ2FsLlllYXIgPT09IGR0VG9kYXkuZ2V0RnVsbFllYXIoKSkKICAgICAgICAgICAgICAgICAgICB8fAogICAgICAgICAgICAgICAgICAgIChDYWwuTW9udGggPCBkdFRvZGF5LmdldE1vbnRoKCkpICYmCiAgICAgICAgICAgICAgICAgICAgKENhbC5ZZWFyID09PSBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoQ2FsLlllYXIgPCBkdFRvZGF5LmdldEZ1bGxZZWFyKCkpOwoKICAgICAgICBpZiAoKENhbC5ZZWFyIDw9IE1heFllYXIpICYmIChDYWwuWWVhciA+PSBTdGFydFllYXIpICYmIChDYWwuTW9udGggPT09IHNlbERhdGUuZ2V0TW9udGgoKSkgJiYgKENhbC5ZZWFyID09PSBzZWxEYXRlLmdldEZ1bGxZZWFyKCkpKSB7DQogICAgICAgICAgICBpZiAoQ2FsLkVuYWJsZURhdGVNb2RlID09PSAiZnV0dXJlIikgewogICAgICAgICAgICAgICAgaWYgKGJlZm9yZVRvZGF5ID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIGNhbGxiYWNrKGlkLCBDYWwuRm9ybWF0RGF0ZShDYWwuRGF0ZSkpOwogICAgICAgIH0KICAgIH0KICAgIAoJdmFyIENhbElkID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOwoJQ2FsSWQuZm9jdXMoKTsKCXdpbkNhbC5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7Cn0KCmZ1bmN0aW9uIGNoYW5nZUJvcmRlcihlbGVtZW50LCBjb2wsIG9sZEJnQ29sb3IpCnsKCWlmIChjb2wgPT09IDApCgl7CgkJZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gSG92ZXJDb2xvcjsKCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gImJsYWNrIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJwb2ludGVyIjsKCX0KCgllbHNlCgl7CgkJaWYgKG9sZEJnQ29sb3IpCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSBvbGRCZ0NvbG9yOwoJCX0KCQllbHNlCgkJewoJCQllbGVtZW50LnN0eWxlLmJhY2tncm91bmQgPSAid2hpdGUiOwoJCX0KCQllbGVtZW50LnN0eWxlLmJvcmRlckNvbG9yID0gIndoaXRlIjsKCQllbGVtZW50LnN0eWxlLmN1cnNvciA9ICJhdXRvIjsKCX0KfQoKZnVuY3Rpb24gc2VsZWN0RGF0ZShlbGVtZW50LCBkYXRlKSB7CiAgICBDYWwuRGF0ZSA9IGRhdGU7CiAgICBzZWxEYXRlID0gbmV3IERhdGUoQ2FsLlllYXIsIENhbC5Nb250aCwgQ2FsLkRhdGUpOwogICAgZWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kID0gU2VsRGF0ZUNvbG9yOwogICAgUmVuZGVyQ3NzQ2FsKCk7Cn0KCmZ1bmN0aW9uIHBpY2tJdChldnQpCnsKCXZhciBvYmplY3RJRCwKCWRvbSwKCWRlLAoJYjsKCS8vIGFjY2Vzc2VzIHRoZSBlbGVtZW50IHRoYXQgZ2VuZXJhdGVzIHRoZSBldmVudCBhbmQgcmV0cmlldmVzIGl0cyBJRAoJaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpCgl7IC8vIHczYwoJCW9iamVjdElEID0gZXZ0LnRhcmdldC5pZDsKCQlpZiAob2JqZWN0SUQuaW5kZXhPZihjYWxTcGFuSUQpICE9PSAtMSkKCQl7CgkJCWRvbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG9iamVjdElEKTsKCQkJY25MZWZ0ID0gZXZ0LnBhZ2VYOwoJCQljblRvcCA9IGV2dC5wYWdlWTsKCgkJCWlmIChkb20ub2Zmc2V0TGVmdCkKCQkJewoJCQkJY25MZWZ0ID0gKGNuTGVmdCAtIGRvbS5vZmZzZXRMZWZ0KTsKCQkJCWNuVG9wID0gKGNuVG9wIC0gZG9tLm9mZnNldFRvcCk7CgkJCX0KCQl9CgoJCS8vIGdldCBtb3VzZSBwb3NpdGlvbiBvbiBjbGljawoJCXhwb3MgPSAoZXZ0LnBhZ2VYKTsKCQl5cG9zID0gKGV2dC5wYWdlWSk7Cgl9CgoJZWxzZQoJeyAvLyBJRQoJCW9iamVjdElEID0gZXZlbnQuc3JjRWxlbWVudC5pZDsKCQljbkxlZnQgPSBldmVudC5vZmZzZXRYOwoJCWNuVG9wID0gKGV2ZW50Lm9mZnNldFkpOwoKCQkvLyBnZXQgbW91c2UgcG9zaXRpb24gb24gY2xpY2sKCQlkZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCQliID0gZG9jdW1lbnQuYm9keTsKCgkJeHBvcyA9IGV2ZW50LmNsaWVudFggKyAoZGUuc2Nyb2xsTGVmdCB8fCBiLnNjcm9sbExlZnQpIC0gKGRlLmNsaWVudExlZnQgfHwgMCk7CgkJeXBvcyA9IGV2ZW50LmNsaWVudFkgKyAoZGUuc2Nyb2xsVG9wIHx8IGIuc2Nyb2xsVG9wKSAtIChkZS5jbGllbnRUb3AgfHwgMCk7Cgl9CgoJLy8gdmVyaWZ5IGlmIHRoaXMgaXMgYSB2YWxpZCBlbGVtZW50IHRvIHBpY2sKCWlmIChvYmplY3RJRC5pbmRleE9mKGNhbFNwYW5JRCkgIT09IC0xKQoJewoJCWRvbVN0eWxlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2JqZWN0SUQpLnN0eWxlOwoJfQoKCWlmIChkb21TdHlsZSkKCXsKCQlkb21TdHlsZS56SW5kZXggPSAxMDA7CgkJcmV0dXJuIGZhbHNlOwoJfQoKCWVsc2UKCXsKCQlkb21TdHlsZSA9IG51bGw7CgkJcmV0dXJuOwoJfQp9CgoKCmZ1bmN0aW9uIGRyYWdJdChldnQpCnsKCWlmIChkb21TdHlsZSkKCXsKCQlpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikKCQl7IC8vZm9yIElFCgkJCWRvbVN0eWxlLmxlZnQgPSAoZXZlbnQuY2xpZW50WCAtIGNuTGVmdCArIGRvY3VtZW50LmJvZHkuc2Nyb2xsTGVmdCkgKyAncHgnOwoJCQlkb21TdHlsZS50b3AgPSAoZXZlbnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9CgkJZWxzZQoJCXsgIC8vRmlyZWZveAoJCQlkb21TdHlsZS5sZWZ0ID0gKGV2dC5jbGllbnRYIC0gY25MZWZ0ICsgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KSArICdweCc7CgkJCWRvbVN0eWxlLnRvcCA9IChldnQuY2xpZW50WSAtIGNuVG9wICsgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApICsgJ3B4JzsKCQl9Cgl9Cn0KCi8vIHBlcmZvcm1zIGEgc2luZ2xlIGluY3JlbWVudCBvciBkZWNyZW1lbnQKZnVuY3Rpb24gbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbikKewoJaWYgKHdoYXRTcGlubmVyID09PSAiSG91ciIpCgl7CgkJaWYgKGRpcmVjdGlvbiA9PT0gInBsdXMiKQoJCXsKCQkJQ2FsLlNldEhvdXIoQ2FsLkhvdXJzICsgMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCQllbHNlIGlmIChkaXJlY3Rpb24gPT09ICJtaW51cyIpCgkJewoJCQlDYWwuU2V0SG91cihDYWwuSG91cnMgLSAxKTsKCQkJUmVuZGVyQ3NzQ2FsKCk7CgkJfQoJfQoJZWxzZSBpZiAod2hhdFNwaW5uZXIgPT09ICJNaW51dGUiKQoJewoJCWlmIChkaXJlY3Rpb24gPT09ICJwbHVzIikKCQl7CgkJCUNhbC5TZXRNaW51dGUocGFyc2VJbnQoQ2FsLk1pbnV0ZXMsIDEwKSArIDEpOwoJCQlSZW5kZXJDc3NDYWwoKTsKCQl9CgkJZWxzZSBpZiAoZGlyZWN0aW9uID09PSAibWludXMiKQoJCXsKCQkJQ2FsLlNldE1pbnV0ZShwYXJzZUludChDYWwuTWludXRlcywgMTApIC0gMSk7CgkJCVJlbmRlckNzc0NhbCgpOwoJCX0KCX0KCn0KCi8vIHN0YXJ0cyB0aGUgdGltZSBzcGlubmVyCmZ1bmN0aW9uIHN0YXJ0U3Bpbih3aGF0U3Bpbm5lciwgZGlyZWN0aW9uKQp7Cglkb2N1bWVudC50aGlzTG9vcCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpCgl7CgkJbmV4dFN0ZXAod2hhdFNwaW5uZXIsIGRpcmVjdGlvbik7Cgl9LCAxMjUpOyAvLzEyNSBtcwp9CgovL3N0b3BzIHRoZSB0aW1lIHNwaW5uZXIKZnVuY3Rpb24gc3RvcFNwaW4oKQp7CgljbGVhckludGVydmFsKGRvY3VtZW50LnRoaXNMb29wKTsKfQoKZnVuY3Rpb24gZHJvcEl0KCkKewoJc3RvcFNwaW4oKTsKCglpZiAoZG9tU3R5bGUpCgl7CgkJZG9tU3R5bGUgPSBudWxsOwoJfQp9CgovLyBEZWZhdWx0IGV2ZW50cyBjb25maWd1cmF0aW9uCgpkb2N1bWVudC5vbm1vdXNlZG93biA9IHBpY2tJdDsKZG9jdW1lbnQub25tb3VzZW1vdmUgPSBkcmFnSXQ7CmRvY3VtZW50Lm9ubW91c2V1cCA9IGRyb3BJdDsK]]></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+X2Z1bGx2YWxpZGF0aW9uKSB7CiAgJG91dHB1dC49JwogIHZhciB2YWxpZGF0ZWQgPSB0cnVlOwonOwogICR2YWxpZGF0aW9uc3RyaW5nID0gInZhbGlkYXRlZCA9IGZhbHNlOyI7CiAgJHJldHVybnN0cmluZyA9ICJyZXR1cm4gdmFsaWRhdGVkOyI7Cn0KJG91dHB1dC49JwogIHdpdGggKHRoaXNmb3JtKSB7Cic7CmZvcmVhY2ggKCRmaWVsZHMgYXMgJGZpZWxkKSB7CiAgaWYgKCFpc3NldCgkZmllbGRbIm5hbWUiXSkpIGNvbnRpbnVlOwogICRmaWVsZGlkID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZSJdOwogIHN3aXRjaCAoJGZpZWxkWyJ2YWxpZGF0aW9uIl0pIHsKCiAgICBjYXNlICJub25lbXB0eSIgOiB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSIiKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgImVtcHR5IiA6IHsKICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSkhPSIiKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgIGJyZWFrOwogICAgfQogICAgY2FzZSAidmFsaWRlbWFpbCIgOiB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKCEnIC4gJGZpZWxkaWQgLiAnLnZhbHVlLm1hdGNoKGVtYWlsUmVnZXgpKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgIm1pbmxlbmd0aCIgOiB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSkubGVuZ3RoPCcgLiAkZmllbGRbImxlbmd0aCJdIC4gJykgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJtYXhsZW5ndGgiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpLmxlbmd0aD4nIC4gJGZpZWxkWyJsZW5ndGgiXSAuICcpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQogICAgY2FzZSAiZXhhY3RsZW5ndGgiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpLmxlbmd0aCE9JyAuICRmaWVsZFsibGVuZ3RoIl0gLiAnKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIGNhc2UgImNoZWNrZWQiIDogewogICAgICAgICRvdXRwdXQuPScKICAgICAgICAKICAgIGlmICgnIC4gJGZpZWxkaWQgLiAnLmNoZWNrZWQgPT0gZmFsc2UpIHsKICAgIC8vYWxlcnQoImhpIik7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICBjYXNlICJ1bmNoZWNrZWQiIDogewogICAgICAgICRvdXRwdXQuPScKICAgIGlmICgnIC4gJGZpZWxkaWQgLiAnLmNoZWNrZWQgPT0gdHJ1ZSkgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgoKICAgIGNhc2UgImRyb3Bkb3duX25vbmVtcHR5IiA6IHsKICAgICAgJG91dHB1dC49JwogICAgaWYgKCcuJGZpZWxkaWQuJygnLiRmaWVsZGlkLicuc2VsZWN0ZWRJbmRleCkudmFsdWU9PSIiKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgIGJyZWFrOwogICAgICB9CiAgICBjYXNlICJkcm9wZG93bl9lbXB0eSIgOiB7CiAgICAgICRvdXRwdXQuPScKICAgIGlmICgnLiRmaWVsZGlkLicoJy4kZmllbGRpZC4nLnNlbGVjdGVkSW5kZXgpLnZhbHVlIT0iIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICBicmVhazsKICAgIH0KICAgIGNhc2UgImRyb3Bkb3duX25vdGZpcnN0IiA6IHsKICAgICAgJG91dHB1dC49JwogICAgaWYgKCcuJGZpZWxkaWQuJy5zZWxlY3RlZEluZGV4PT0wKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgInJhZGlvX25vbmVzZWxlY3RlZCIgOiB7CiAgICAgICRvdXRwdXQuPScKICAgIHZhciBvbmVzZWxlY3RlZCA9IGZhbHNlOwogICAgZm9yICh2YXIgaT0wOyBpPCcuJGZpZWxkaWQuJy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoJy4kZmllbGRpZC4nWycuaS4nXS5jaGVja2VkKSB7CiAgICAgICAgb25lc2VsZWN0ZWQgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoIW9uZXNlbGVjdGVkKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJzEiLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICBicmVhazsKICAgIH0KCiAgICBjYXNlICJub3RlcXVhbCIgOiB7CiAgICAgIGlmIChpc3NldCgkZmllbGRbInZhbHVlIl0pKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSk9PSInLiB0cmltKCRmaWVsZFsidmFsdWUiXSkuJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICBicmVhazsKICAgICAgfQoKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWVzIl0pKSB7CiAgICAgICAgZm9yZWFjaCgkZmllbGRbInZhbHVlcyJdIGFzICR2YWx1ZSkgewogICAgICAgICRvdXRwdXQuPScKICAgIGlmIChuZW90cmltKCcgLiAkZmllbGRpZCAuICcudmFsdWUpPT0iJyAuIHRyaW0oJHZhbHVlKSAuICciKSB7CiAgICAgIGlubGluZU1zZygiJyAuICRmaWVsZGlkIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGNhc2UgImVxdWFsIiA6IHsKICAgICAgaWYgKGlzc2V0KCRmaWVsZFsidmFsdWUiXSkpIHsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKSE9IicuIHRyaW0oJGZpZWxkWyJ2YWx1ZSJdKS4nIikgewogICAgICBpbmxpbmVNc2coIicgLiAkZmllbGRpZCAuICciLCInIC4gJGZpZWxkWyJtZXNzYWdlIl0gLiAnIiwxMCk7CiAgICAgICcgLiAkdmFsaWRhdGlvbnN0cmluZyAuICcKICAgIH0nOwogICAgICAgIGJyZWFrOwogICAgICB9CgogICAgICBpZiAoaXNzZXQoJGZpZWxkWyJ2YWx1ZXMiXSkpIHsKICAgICAgICBmb3JlYWNoKCRmaWVsZFsidmFsdWVzIl0gYXMgJHZhbHVlKSB7CiAgICAgICAgJG91dHB1dC49JwogICAgaWYgKG5lb3RyaW0oJyAuICRmaWVsZGlkIC4gJy52YWx1ZSkhPSInIC4gdHJpbSgkdmFsdWUpIC4gJyIpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQgLiAnIiwiJyAuICRmaWVsZFsibWVzc2FnZSJdIC4gJyIsMTApOwogICAgICAnIC4gJHZhbGlkYXRpb25zdHJpbmcgLiAnCiAgICB9JzsKICAgICAgICB9CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICB9CgogICAgY2FzZSAiaWRlbnRpY2FsIiA6IHsKICAgICAgJGZpZWxkaWQyID0gJHRoaXMtPl9pZCAuICRmaWVsZFsibmFtZTIiXTsKICAgICAgICAkb3V0cHV0Lj0nCiAgICBpZiAobmVvdHJpbSgnIC4gJGZpZWxkaWQgLiAnLnZhbHVlKSE9bmVvdHJpbSgnIC4gJGZpZWxkaWQyIC4gJy52YWx1ZSkpIHsKICAgICAgaW5saW5lTXNnKCInIC4gJGZpZWxkaWQyIC4gJyIsIicgLiAkZmllbGRbIm1lc3NhZ2UiXSAuICciLDEwKTsKICAgICAgJyAuICR2YWxpZGF0aW9uc3RyaW5nIC4gJwogICAgfSc7CiAgICAgICAgYnJlYWs7CiAgICB9CgogIH0KfQokb3V0cHV0Lj0iCiAgfQogICIgLiAkcmV0dXJuc3RyaW5nIC4gIgp9Cjwvc2NyaXB0PlxuXG4iOwokZXh0cmEgPSAib25zdWJtaXQ9J3JldHVybiBOZW9WYWxpZGF0ZUZvcm0iIC4gJHZhbGlkYXRpb25jb3VudCAuICIodGhpcyk7JyI7CiRmdW5jdGlvbmNhbGwgPSAiTmVvVmFsaWRhdGVGb3JtIiAuICR2YWxpZGF0aW9uY291bnQgLiAiKHRoaXMpIjsKJHZhbGlkYXRpb25jb3VudCsrOwo/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[PD9waHAKIyBOZW9Nb2R1bGUuIEFuIGV4dGVuZGVkIG1vZHVsZWNsYXNzIGZvciBDTVMgLSBDTVMgTWFkZSBTaW1wbGUKIyBDb3B5cmlnaHQgKGMpIDIwMDktMTAgYnkgTW9ydGVuIFBvdWxzZW4gPG1vcnRlbkBwb3Vsc2VuLm9yZz4KIwojQ01TIC0gQ01TIE1hZGUgU2ltcGxlCiMoYykyMDA0LTA5IGJ5IFRlZCBLdWxwICh3aXNoeUB1c2Vycy5zZi5uZXQpCiNUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL2Ntc21hZGVzaW1wbGUuc2YubmV0CiMKI1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiNpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQojdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyhhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMKI1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKI01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKI0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiNZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKI0ZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIwoKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJzdHJpcG9zIikpIHsKICBmdW5jdGlvbiBzdHJpcG9zKCRzdHIsJG5lZWRsZSkgewogICAgcmV0dXJuIHN0cnBvcyhzdHJ0b2xvd2VyKCRzdHIpLHN0cnRvbG93ZXIoJG5lZWRsZSkpOwogIH0KfQppZiAoIWZ1bmN0aW9uX2V4aXN0cygiYXJyYXlfZGlmZl9rZXkiKSkgewogIGZ1bmN0aW9uIGFycmF5X2RpZmZfa2V5KCkgewogICAgJGFycnMgPSBmdW5jX2dldF9hcmdzKCk7CiAgICAkcmVzdWx0ID0gYXJyYXlfc2hpZnQoJGFycnMpOwogICAgZm9yZWFjaCAoJGFycnMgYXMgJGFycmF5KSB7CiAgICAgIGZvcmVhY2ggKCRyZXN1bHQgYXMgJGtleSA9PiAkdikgewogICAgICAgIGlmIChhcnJheV9rZXlfZXhpc3RzKCRrZXksICRhcnJheSkpIHsKICAgICAgICAgIHVuc2V0KCRyZXN1bHRbJGtleV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQp9CgppZiAoIWZ1bmN0aW9uX2V4aXN0cygiaXNfYXNzb2MiKSkgewogIGZ1bmN0aW9uIGlzX2Fzc29jKCRhcnJheSkgewogICAgcmV0dXJuIChpc19hcnJheSgkYXJyYXkpICYmIDAgIT09IGNvdW50KGFycmF5X2RpZmZfa2V5KCRhcnJheSwgYXJyYXlfa2V5cyhhcnJheV9rZXlzKCRhcnJheSkpKSkpOwogIH0KfQoKLy9SZW1lbWJlciwgdGhpcyBjYW5ub3QgYmUgdXNlZCBpbiBtYXRob2QuaW5zdGFsbC5waHAKZGVmaW5lKCJORU9fSU5JVCIsIgogIGlmICghZnVuY3Rpb25fZXhpc3RzKCdjbXNtcycpKSB7ZWNobyAnbWlzc2luZyBjbXNtcygpJztleGl0O30KICBcJHRoaXMtPk5lb1NldHVwKFwkaWQsIFwkdGhpcywgXCRyZXR1cm5pZCwgXCRwYXJhbXMpOwogIFwkZ0Ntcz1jbXNtcygpOwogIFwkY29uZmlnPVwkZ0Ntcy0+R2V0Q29uZmlnKCk7CiAgXCR0aGlzLT5TbWFydHlBc3NpZ24oJ21vZHVsZScsXCR0aGlzKTsKIik7CgpkZWZpbmUoIk5FT19JTklUX0lOU1RBTEwiLCIKICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygnY21zbXMnKSkge2VjaG8gJ21pc3NpbmcgY21zbXMoKSc7ZXhpdDsKICBcJGdDbXM9Y21zbXMoKTsKICBcJGNvbmZpZz1cJGdDbXMtPkdldENvbmZpZygpOwoiKTsKCgpjbGFzcyBOZW9Nb2R1bGUgZXh0ZW5kcyBDTVNNb2R1bGUgewogIC8qCiAgICoKICAgKiBBIGNvdXBsZSBvZiB2YXJpYWJsZXMgYW5kIG1ldGhvZHMgZm9yIGludGVybmFsIG1vZHVsZSB1c2FnZQogICAqCiAgICovCiAgdmFyICRfZGF0YXN0b3JhZ2U9ZmFsc2U7CiAgdmFyICRfZGI9ZmFsc2U7CiAgdmFyICRfaWQ9ZmFsc2U7CiAgdmFyICRfcmV0dXJuaWQ9ZmFsc2U7CiAgdmFyICRfZXJyb3JzPSIiOwogIHZhciAkX3RoZW1lb2JqZWN0PWZhbHNlOwogIHZhciAkX3BhcmFtcz1hcnJheSgpOwogIHZhciAkX2Z1bGx2YWxpZGF0aW9uPWZhbHNlOwogIHZhciAkX2V4dHJhdmFsaWRhdGlvbmNzcz0iIjsKCiAgZnVuY3Rpb24gX2dldGRzKCkgewogICAgaWYgKCR0aGlzLT5fZGF0YXN0b3JhZ2UhPT1mYWxzZSkgcmV0dXJuICR0aGlzLT5fZGF0YXN0b3JhZ2U7CiAgICAkdGhpcy0+X2RhdGFzdG9yYWdlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgiTmVvRGF0YVN0b3JhZ2UiKTsKICAgIHJldHVybiAkdGhpcy0+X2RhdGFzdG9yYWdlOwogIH0KCiAgZnVuY3Rpb24gTmVvRGIoKSB7CiAgICBpZiAoJHRoaXMtPl9kYiE9PWZhbHNlKSByZXR1cm4gJHRoaXMtPl9kYjsKICAgICR0aGlzLT5fZGI9Y21zbXMoKS0+R2V0REIoKTsKICAgIHJldHVybiAkdGhpcy0+X2RiOwogIH0KCiAgZnVuY3Rpb24gX2dldHRoZW1lb2JqKCkgewogICAgJGdDbXM9Y21zbXMoKTsKICAgIGlmICgkdGhpcy0+X3RoZW1lb2JqZWN0IT09ZmFsc2UpIHJldHVybiAkdGhpcy0+X3RoZW1lb2JqZWN0OwogICAgJHRoaXMtPl90aGVtZW9iamVjdD0kdGhlbWVPYmplY3QgPSAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ107CiAgICByZXR1cm4gJHRoaXMtPl90aGVtZW9iamVjdDsKICB9CgogIC8qCiAgICoKICAgKiBTdGFuZGFyZCBtb2R1bGUtQVBJLW1ldGhvZHMgYmVoYXZpbmcgaW4gYSBzdGFuZGFyZCB3YXkKICAgKgogICAqLwoKICBmdW5jdGlvbiBHZXROYW1lKCkgewogICAgcmV0dXJuICdOZW9Nb2R1bGUnOwogIH0KCiAgZnVuY3Rpb24gR2V0VmVyc2lvbigpIHsKICAgIHJldHVybiAiMC41LjUiOwogIH0KCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkgewogICAgcmV0dXJuICJOZW8gTW9kdWxlIGJhc2UtY2xhc3MiOwogIH0KCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKICAgIHJldHVybiAnMS4xMSc7CiAgfQoKICBmdW5jdGlvbiBHZXRBZG1pbkRlc2NyaXB0aW9uKCkgewogICAgcmV0dXJuICJBbiBleHRlbmRlZCBtb2R1bGUtY2xhc3MsIG1haW5seSBmb3IgdGhlIE5lby1zZXJpZXMgbW9kdWxlcywgYnV0IGFsc28gZm9yIG90aGVycyB0byB1c2UiOwogIH0KCiAgZnVuY3Rpb24gSGFzQWRtaW4oKSB7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBHZXRBdXRob3IoKSB7CiAgICByZXR1cm4gJ01vcnRlbiBQb3Vsc2VuJzsKICB9CgogIGZ1bmN0aW9uIEdldEF1dGhvckVtYWlsKCkJewogICAgcmV0dXJuICdtb3J0ZW5AcG91bHNlbi5vcmcnOwogIH0KCiAgZnVuY3Rpb24gR2V0SGVscCgkbGFuZz0nZW5fVVMnKSB7CiAgICByZXR1cm4gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnaGVscC50cGwnKTsKICB9CgogIGZ1bmN0aW9uIEdldENoYW5nZUxvZygpCXsKICAgIHJldHVybiAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCJjaGFuZ2Vsb2cudHBsIik7CiAgfQoKICAvKgogICAqCiAgICogU2V0dXAgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRJZCgkaWQpIHsKICAgICR0aGlzLT5faWQ9JGlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRSZXR1cm5JZCgkcmV0dXJuaWQpIHsKICAgICR0aGlzLT5fcmV0dXJuaWQ9JHJldHVybmlkOwogIH0KICBmdW5jdGlvbiBOZW9TZXRQYXJhbXMoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X3BhcmFtcz0kcGFyYW1zOwogIH0KCiAgZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5OZW9TZXRJZCgkaWQpOwogICAgJHRoaXMtPk5lb1NldFJldHVybklkKCRyZXR1cm5pZCk7CiAgICAkdGhpcy0+TmVvU2V0UGFyYW1zKCRwYXJhbXMpOwogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbkNNUygkbW9kdWxlKTsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oIm1vZHVsZV9pZCIsJGlkKTsKICB9CgoKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBQcmVmKCRwcmVmbmFtZSwkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5HZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkZGVmYXVsdCk7CiAgfQoKICBmdW5jdGlvbiBTZXRQcmVmKCRwcmVmbmFtZSwgJHZhbHVlKSB7CiAgICByZXR1cm4gJHRoaXMtPlNldFByZWZlcmVuY2UoJHByZWZuYW1lLCR2YWx1ZSk7CiAgfQoKICBmdW5jdGlvbiBOZW9TZXRQcmVmKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlPWZhbHNlLCAkZGVsZXRlaWZub3RzZXQ9ZmFsc2UpIHsKICAgIC8vaWYgKGVtcHR5KCRwYXJhbXMpKSAkcGFyYW1zPSR0aGlzLT5fcGFyYW1zOwogICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChpc3NldCgkcGFyYW1zWyRwcmVmbmFtZV0pKSB7CiAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwkcGFyYW1zWyRwcmVmbmFtZV0pOwogICAgfSBlbHNlIHsKICAgICAgaWYgKCEkZGVsZXRlaWZub3RzZXQpIHsKICAgICAgICBpZiAoJG5vdHNldHZhbHVlIT09ZmFsc2UpIHsKICAgICAgICAgICR0aGlzLT5TZXRQcmVmZXJlbmNlKCRwcmVmbmFtZSwgJG5vdHNldHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UoJHByZWZuYW1lKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIHsKICAgIGlmIChpc19hc3NvYygkcHJlZnMpKSB7CiAgICAgIGZvcmVhY2ggKCRwcmVmcyBhcyAka2V5ID0+ICRub3RzZXR2YWx1ZSkgewogICAgICAgICR0aGlzLT5OZW9TZXRQcmVmKCRrZXksICRub3RzZXR2YWx1ZSk7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2ggKCRwcmVmcyBhcyAkcHJlZikgewogICAgICAgICR0aGlzLT5OZW9TZXRQcmVmKCRwcmVmKTsKICAgICAgfQogICAgfQogIH0KICAKICBmdW5jdGlvbiBfKCRsYW5nc3RyaW5nKSB7CiAgICAkcmVzdWx0PSR0aGlzLT5MYW5nKCRsYW5nc3RyaW5nKTsKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICAvL2VjaG8gJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIik7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImNvbnRlbnQiLCJ0ZXh0IiksJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ3YXJubWVzc2FnZSIsJHBhcmFtcywiIiksCiAgICAgIGZhbHNlLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaW5saW5lIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidGFyZ2V0Y29udGVudG9ubHkiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicHJldHR5dXJsIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlTGluaygkaWQsICRhY3Rpb24sICRyZXR1cm5pZD0nJywgJGNvbnRlbnRzPScnLCAkcGFyYW1zPWFycmF5KCksICR3YXJuX21lc3NhZ2U9JycsICRvbmx5aHJlZj1mYWxzZSwgJGlubGluZT1mYWxzZSwgJGFkZHR0ZXh0PScnLCAkdGFyZ2V0Y29udGVudG9ubHk9ZmFsc2UsICRwcmV0dHl1cmw9JycpCiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJyZXR1cm5pZCIsJHBhcmFtcywkdGhpcy0+X3JldHVybmlkKSwKICAgICAgIiIsCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICIiLAogICAgICB0cnVlICwKICAgICAgZmFsc2UsCiAgICAgICIiLAogICAgICBmYWxzZSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInByZXR0eXVybCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9MaW5rKCR0ZXh0LCRhY3Rpb24sJHBhcmFtcz1hcnJheSgpLCAkd2FybmluZz0iIikgewogICAgcmV0dXJuICR0aGlzLT5OZW9DbXNMaW5rKGFycmF5KCJ0ZXh0Ij0+JHRleHQsImFjdGlvbiI9PiRhY3Rpb24sInBhcmFtcyI9PiRwYXJhbXMsIndhcm5tZXNzYWdlIj0+JHdhcm5pbmcpKTsKICB9CgogIGZ1bmN0aW9uIE5lb1ByZXR0eUxpbmsoJHRleHQsICRwcmV0dHl1cmwsICRhZGR0ZXh0PSIiKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb0Ntc0xpbmsoYXJyYXkoInRleHQiPT4kdGV4dCwicHJldHR5dXJsIj0+JHByZXR0eXVybCwiYWRkdGV4dCI9PiAkYWRkdGV4dCkpOwogIH0KCiAgZnVuY3Rpb24gTmVvVXJsKCRhY3Rpb24sJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPk5lb0Ntc1VybChhcnJheSgiYWN0aW9uIj0+JGFjdGlvbiwicGFyYW1zIj0+JHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvUHJldHR5VXJsKCRwcmV0dHl1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvQ21zVXJsKGFycmF5KCJwcmV0dHl1cmwiPT4kcHJldHR5dXJsKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdCgkYWN0aW9uPSIiLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc19hcnJheSgkYWN0aW9uKSkgJHRoaXMtPk5lb1JlZGlyZWN0RnVsbCgkYWN0aW9uKTsKICAgIHJldHVybiAkdGhpcy0+TmVvUmVkaXJlY3RGdWxsKAogICAgICBhcnJheSAoCiAgICAgICAgImFjdGlvbiIgPT4gJGFjdGlvbiwKICAgICAgICAicGFyYW1zIiA9PiAkcGFyYW1zCiAgICAgICkKICAgICk7CiAgfQoKICBmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvL1JlZGlyZWN0KCRpZCwgJGFjdGlvbiwgJHJldHVybmlkPScnLCAkcGFyYW1zPWFycmF5KCksICRpbmxpbmU9ZmFsc2UpCiAgICByZXR1cm4gJHRoaXMtPlJlZGlyZWN0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhY3Rpb24iLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpbmxpbmUiLCRwYXJhbXMsZmFsc2UpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvQWRtaW5SZXR1cm4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICAvLyR0aGlzLT5SZWRpcmVjdCgkaWQsICdkZWZhdWx0YWRtaW4nLCAnJywgYXJyYXkoIm1vZHVsZV9tZXNzYWdlIj0+JHRoaXMtPkxhbmcoInNldHRpbmdzc2F2ZWQiKSwidGFiIj0+InNldHRpbmdzIikpOwogICAgJG1lc3NhZ2UgPSAkdGhpcy0+TlBWKCJtZXNzYWdlIiwgJHBhcmFtcyk7CiAgICAkZXJyb3IgPSAkdGhpcy0+TlBWKCJlcnJvciIsICRwYXJhbXMpOwogICAgJHRhYiA9ICR0aGlzLT5OUFYoInRhYiIsICRwYXJhbXMpOwoKICAgICR0aGlzLT5OZW9SZWRpcmVjdCgiZGVmYXVsdGFkbWluIiwKICAgICAgYXJyYXkoCiAgICAgICAgIm1vZHVsZV9tZXNzYWdlIiA9PiAkbWVzc2FnZSwKICAgICAgICAibW9kdWxlX2Vycm9ycyIgPT4gJGVycm9yLAogICAgICAgICJ0YWIiID0+ICR0YWIKICAgICAgKQogICAgKTsKICB9CgogIC8qCiAgICoKICAgKiBGb3JtLWdlbmVyYXRpb24gZnVuY3Rpb25zLCBpbmNsdWRpbmcgc21hcnR5IGFzc2lnbm1lbnRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9TZXRGdWxsVmFsaWRhdGlvbigkZnVsbHZhbGlkYXRpb249dHJ1ZSkgewogICAgJHRoaXMtPl9mdWxsdmFsaWRhdGlvbj0kZnVsbHZhbGlkYXRpb247CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtVmFsaWRhdGlvbigkZmllbGRzPWFycmF5KCkpIHsKICAgIGlmIChlbXB0eSgkZmllbGRzKSkgcmV0dXJuICIiOwogICAgc3RhdGljICRhbHJlYWR5dXNlZD1mYWxzZTsKICAgIHN0YXRpYyAkdmFsaWRhdGlvbmNvdW50PTA7CgogICAgJG91dHB1dD0iIjsKICAgIGluY2x1ZGUoZGlybmFtZShfX0ZJTEVfXykuIi9mb3JtdmFsaWRhdGlvbi5pbmMucGhwIik7CiAgICByZXR1cm4gYXJyYXkoImZ1bmN0aW9uIj0+JG91dHB1dCwiZXh0cmEiPT4kZXh0cmEsICJmdW5jdGlvbmNhbGwiPT4kZnVuY3Rpb25jYWxsKTsKICB9CgogIGZ1bmN0aW9uIE5lb0Zvcm1TdGFydCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIC8vQ3JlYXRlRm9ybVN0YXJ0KCRpZCwgJGFjdGlvbj0nZGVmYXVsdCcsICRyZXR1cm5pZD0nJywgJG1ldGhvZD0ncG9zdCcsICRlbmN0eXBlPScnLCAkaW5saW5lPWZhbHNlLCAkaWRzdWZmaXg9JycsICRwYXJhbXMgPSBhcnJheSgpLCAkZXh0cmE9JycpCiAgICAkdmFsaWRhdGlvbj0iIjsKICAgICRleHRyYT0iIjsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJ2YWxpZGF0aW9uIl0pKSB7CiAgICAgIC8vZWNobyAiaGkiOwogICAgICAkdmFsaWRhdGlvbj0kdGhpcy0+TmVvRm9ybVZhbGlkYXRpb24oJHBhcmFtc1sidmFsaWRhdGlvbiJdKTsKICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbImV4dHJhdGVtcGxhdGUiXSkpIHsKICAgICAgICAkZXh0cmE9JHBhcmFtc1siZXh0cmF0ZW1wbGF0ZSJdOwogICAgICAgICRleHRyYT1zdHJfcmVwbGFjZSgiJXZhbGlkYXRpb25jYWxsJSIsJHZhbGlkYXRpb25bImZ1bmN0aW9uY2FsbCJdLCRleHRyYSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJGV4dHJhPSR2YWxpZGF0aW9uWyJleHRyYSJdOwogICAgICB9CiAgICAgICR2YWxpZGF0aW9uPSR2YWxpZGF0aW9uWyJmdW5jdGlvbiJdOwogICAgfQogICAgcmV0dXJuICR2YWxpZGF0aW9uLiR0aGlzLT5DcmVhdGVGb3JtU3RhcnQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFjdGlvbiIsJHBhcmFtcywiZGVmYXVsdCIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgicmV0dXJuaWQiLCRwYXJhbXMsJHRoaXMtPl9yZXR1cm5pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtZXRob2QiLCRwYXJhbXMsInBvc3QiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoYXJyYXkoImVuY3R5cGUiLCJlbmNvZGluZyIpLCRwYXJhbXMsIm11bHRpcGFydC9mb3JtLWRhdGEiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlubGluZSIsJHBhcmFtcyxmYWxzZSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZHN1ZmZpeCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJwYXJhbXMiLCRwYXJhbXMsYXJyYXkoKSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJleHRyYSIsJHBhcmFtcywkZXh0cmEpCiAgICApOwogIH0KICBmdW5jdGlvbiBTbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtU3RhcnQoJHBhcmFtcykpOwogIH0KCiAgLy9PYnNvbGV0ZQogIGZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlGb3JtU3RhcnQoJHNtYXJ0eW5hbWUsJHBhcmFtcyk7CiAgfQoKICBmdW5jdGlvbiBOZW9Gb3JtRW5kKCkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlGb3JtRW5kKCRzbWFydHluYW1lKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9Gb3JtRW5kKCkpOwogIH0KCiAgLypmdW5jdGlvbiBTbWFydHlJbnB1dFN1Ym1pdCgkc21hcnR5bmFtZSwkbmFtZSwkdGV4dCwkY29uZmlybXRleHQ9IiIpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJHRoaXMtPk5lb0lucHV0U3VibWl0KGFycmF5KCJuYW1lIj0+JG5hbWUsInZhbHVlIj0+JHRleHQsImNvbmZpcm10ZXh0Ij0+JGNvbmZpcm10ZXh0KSkpOwogIH0qLwoKCgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuTXVsdGkoJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKSB7CiAgICAkb3V0cHV0PSJcbiI7CiAgICBmb3JlYWNoKCRmaWVsZHMgYXMgJG5hbWU9PiR2YWx1ZSkgewogICAgICAkb3V0cHV0Lj0kdGhpcy0+TmVvSW5wdXRIaWRkZW4oYXJyYXkoIm5hbWUiPT4kbmFtZSwidmFsdWUiPT4kdmFsdWUpKS4iXG4iOwogICAgfQogICAgJG91dHB1dC49IlxuIjsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsJG91dHB1dCk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlMaW5rKCRzbWFydHluYW1lLCRmaWVsZHM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvQ21zTGluaygkZmllbGRzKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dEZpbGUoJHBhcmFtcykgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dEZpbGUoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWNjZXB0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsIjEwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0RmlsZSgkc21hcnR5bmFtZSwgJHBhcmFtcykgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwkdGhpcy0+TmVvSW5wdXRGaWxlKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0VGV4dCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0KAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsIjEwIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJtYXhsZW5ndGgiLCRwYXJhbXMsIjI1NSIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIikKICAgICk7CiAgfQoKICBmdW5jdGlvbiBEYXRlMlVuaXgoJHRpbWUsICRmb3JtYXQ9ImRkbW15eXl5IikgewogICAgaWYgKHRyaW0oJHRpbWUpPT0iIikgcmV0dXJuICIiOwogICAgJHRpbWU9c3RyX3JlcGxhY2UoIiAiLCIvIiwkdGltZSk7CiAgICAkdGltZT1zdHJfcmVwbGFjZSgiOiIsIi8iLCR0aW1lKTsKICAgICR0aW1lPXN0cl9yZXBsYWNlKCItIiwiLyIsJHRpbWUpOwogICAgJGR0cGFydHM9ZXhwbG9kZSgiLyIsJHRpbWUpOwogICAgJGRheT0iIjskbW9udGg9IiI7JHllYXI9IiI7JGhvdXI9MDskbWludXRlPTA7JHNlY29uZD0wOwogICAgc3dpdGNoKCRmb3JtYXQpIHsKICAgICAgY2FzZSAibW1kZHl5eXkiIDogJGRheT0kZHRwYXJ0c1sxXTsgJG1vbnRoPSRkdHBhcnRzWzBdOyAkeWVhcj0kZHRwYXJ0c1syXTsgYnJlYWs7CiAgICAgIGNhc2UgInl5bW1kZCIgOiAkZGF5PSRkdHBhcnRzWzJdOyAkbW9udGg9JGR0cGFydHNbMV07ICR5ZWFyPSRkdHBhcnRzWzBdOyBicmVhazsKICAgICAgY2FzZSAieXl5bW1kZCIgOiAkZGF5PSRkdHBhcnRzWzJdOyAkbW9udGg9JGR0cGFydHNbMV07ICR5ZWFyPSRkdHBhcnRzWzBdOyBicmVhazsKCiAgICAgIGNhc2UgImRkbW15eXl5aGhtbSIgOiB7CiAgICAgICAgJGRheT0kZHRwYXJ0c1swXTsgJG1vbnRoPSRkdHBhcnRzWzFdOyR5ZWFyPSRkdHBhcnRzWzJdOyRob3VyPSRkdHBhcnRzWzNdOyRtaW51dGU9JGR0cGFydHNbNF07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KCiAgICAgIGNhc2UgImRkbW15eXl5IiA6CiAgICAgIGRlZmF1bHQgOiAkZGF5PSRkdHBhcnRzWzBdOyAkbW9udGg9JGR0cGFydHNbMV07JHllYXI9JGR0cGFydHNbMl07CiAgICB9CgogICAgcmV0dXJuIG1rdGltZSgkaG91ciwkbWludXRlLCRzZWNvbmQsJG1vbnRoLCRkYXksJHllYXIpOwogIH0KCgogIC8qCiAgICogCWNhc2UgIkRETU1ZWVlZIjoKCQlyZXR1cm4gKHBEYXRlICsgRGF0ZVNlcGFyYXRvciArIE1vbnRoRGlnaXQgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJERE1NTVlZWVkiOgoJCXJldHVybiAocERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHRoaXMuWWVhcik7CgkJY2FzZSAiTU1ERFlZWVkiOgoJCXJldHVybiAoTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLlllYXIpOwoJCWNhc2UgIk1NTUREWVlZWSI6CgkJcmV0dXJuICh0aGlzLkdldE1vbnRoTmFtZShmYWxzZSkgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5ZZWFyKTsKCQljYXNlICJZWVlZTU1ERCI6CgkJcmV0dXJuICh0aGlzLlllYXIgKyBEYXRlU2VwYXJhdG9yICsgTW9udGhEaWdpdCArIERhdGVTZXBhcmF0b3IgKyBwRGF0ZSk7CgkJY2FzZSAiWVlNTUREIjoKCQlyZXR1cm4gKFN0cmluZyh0aGlzLlllYXIpLnN1YnN0cmluZygyLCA0KSArIERhdGVTZXBhcmF0b3IgKyBNb250aERpZ2l0ICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKTsKCQljYXNlICJZWU1NTUREIjoKCQlyZXR1cm4gKFN0cmluZyh0aGlzLlllYXIpLnN1YnN0cmluZygyLCA0KSArIERhdGVTZXBhcmF0b3IgKyB0aGlzLkdldE1vbnRoTmFtZShmYWxzZSkgKyBEYXRlU2VwYXJhdG9yICsgcERhdGUpOwoJCWNhc2UgIllZWVlNTU1ERCI6CgkJcmV0dXJuICh0aGlzLlllYXIgKyBEYXRlU2VwYXJhdG9yICsgdGhpcy5HZXRNb250aE5hbWUoZmFsc2UpICsgRGF0ZVNlcGFyYXRvciArIHBEYXRlKQogICAqLwogIGZ1bmN0aW9uIE5lb0lucHV0RGF0ZXRpbWUoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkcmVzdWx0PSIiOwogICAgc3RhdGljICRqc3NlbnQgPSBmYWxzZTsKICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICBpZiAoISRqc3NlbnQpIHsKICAgICAgJG5lb209JHRoaXMtPkdldE1vZHVsZUluc3RhbmNlKCJOZW9Nb2R1bGUiKTsKICAgICAgJHJlc3VsdC49IgoKICAgICAgPHNjcmlwdCBzcmM9JyIuJG5lb20tPk5lb0Ntc1VybChhcnJheSgiYWN0aW9uIj0+ImRhdGV0aW1lcGlja2VyIikpLiImc2hvd3RlbXBsYXRlPWZhbHNlJz48L3NjcmlwdD4KCiAgICAgICI7CiAgICAgICRqc3NlbnQ9dHJ1ZTsKICAgIH0KICAgIGlmIChpc3NldCgkcGFyYW1zWyJyZWFkb25seSJdKSAmJiAkcGFyYW1zWyJyZWFkb25seSJdPT10cnVlKSB7CiAgICAgICRwYXJhbXNbImFkZHRleHQiXS49IiByZWFkb25seSI7CiAgICB9CiAgICAkZm9ybWF0PSR0aGlzLT5OUFYoImZvcm1hdCIsJHBhcmFtcywiZGRtbXl5eXkiKTsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJ1bml4dmFsdWUiXSkgJiYgJHBhcmFtc1sidW5peHZhbHVlIl0hPSIiKSB7CiAgICAgIHN3aXRjaCAoJGZvcm1hdCkgewogICAgICAgIGNhc2UgImRkbW15eXl5IiA6ICRwYXJhbXNbInZhbHVlIl09ZGF0ZSgiai9uL1kiLCAkcGFyYW1zWyJ1bml4dmFsdWUiXSk7IGJyZWFrOwogICAgICAgIGNhc2UgIm1tZGR5eXl5IiA6ICRwYXJhbXNbInZhbHVlIl09ZGF0ZSgibi9qL1kiLCAkcGFyYW1zWyJ1bml4dmFsdWUiXSk7IGJyZWFrOwogICAgICAgIGNhc2UgInl5bW1kZCIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoInkvbi9qIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgICBjYXNlICJ5eXl5bW1kZCIgOiAkcGFyYW1zWyJ2YWx1ZSJdPWRhdGUoIlkvbi9qIiwgJHBhcmFtc1sidW5peHZhbHVlIl0pOyBicmVhazsKICAgICAgfQogICAgfQogICAgJHJlc3VsdC49JHRoaXMtPk5lb0lucHV0VGV4dCgkcGFyYW1zKTsKCiAgICAkc2hvd3RpbWU9ImZhbHNlIjsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJzaG93dGltZSJdKSAmJiAkcGFyYW1zWyJzaG93dGltZSJdPT10cnVlKSB7CiAgICAgICRzaG93dGltZT0idHJ1ZSI7CiAgICB9CgogICAgJHRpbWVmb3JtYXQ9IjI0IjsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJ0aW1lZm9ybWF0Il0pICYmICRwYXJhbXNbInRpbWVmb3JtYXQiXSE9IiIpIHsKICAgICAgJHRpbWVmb3JtYXQ9JHBhcmFtc1sidGltZWZvcm1hdCJdOwogICAgfQoKICAgICRzaG93c2Vjb25kcz0iZmFsc2UiOwogICAgaWYgKGlzc2V0KCRwYXJhbXNbInNob3dzZWNvbmRzIl0pICYmICRwYXJhbXNbInNob3dzZWNvbmRzIl09PXRydWUpIHsKICAgICAgJHNob3dzZWNvbmRzPSJ0cnVlIjsKICAgIH0KCgogICAgJHJlc3VsdC49IjxpbWcgc3JjPSciLiRjb25maWdbInJvb3RfdXJsIl0uIi9tb2R1bGVzL05lb01vZHVsZS9kYXRldGltZXBpY2tlci9pbWFnZXMvY2FsLmdpZicgb25jbGljaz1cImphdmFzY3JpcHQ6TmV3Q3NzQ2FsKCciLiR0aGlzLT5faWQuJHBhcmFtc1sibmFtZSJdLiInLCciLiRmb3JtYXQuIicsJycsIi4kc2hvd3RpbWUuIiwnIi4kdGltZWZvcm1hdC4iJywiLiRzaG93c2Vjb25kcy4iKVwiIC8+IjsKICAgIC8vb25jbGljaz0iamF2YXNjcmlwdDpOZXdDc3NDYWwoJ2RlbW8xJywnZGRtbXl5eXknKQogICAgcmV0dXJuICRyZXN1bHQ7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsICRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0VGV4dCgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBTbWFydHlJbnB1dERhdGV0aW1lKCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dERhdGV0aW1lKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UGFzc3dvcmQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0UGFzc3dvcmQoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgidmFsdWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2l6ZSIsJHBhcmFtcywiMTAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm1heGxlbmd0aCIsJHBhcmFtcywiMjU1IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CiAgZnVuY3Rpb24gU21hcnR5SW5wdXRQYXNzd29yZCgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRQYXNzd29yZCgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlVGV4dEFyZWEoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJlbmFibGV3eXNpd3lnIiwkcGFyYW1zLGZhbHNlKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgidmFsdWUiLCJ0ZXh0IiwiY29udGVudCIpLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKGFycmF5KCJjbGFzcyIsImNsYXNzbmFtZSIpLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaHRtbGlkIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImVuY29kaW5nIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInN0eWxlc2hlZXQiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiY29scyIsJHBhcmFtcywiODAiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInJvd3MiLCRwYXJhbXMsIjE1IiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJmb3JjZXd5c2l3eWciLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgid2FudGVkc3ludGF4IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRUZXh0YXJlYSgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvVGV4dGFyZWEoJHBhcmFtcykpOwogIH0KICBmdW5jdGlvbiBTbWFydHlUZXh0YXJlYSgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvVGV4dGFyZWEoJHBhcmFtcykpOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRDaGVja2JveCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJjaGVja2VkIl0pICYmICRwYXJhbXNbImNoZWNrZWQiXT09dHJ1ZSkgewogICAgICAkcGFyYW1zWyJzZWxlY3RlZHZhbHVlIl09JHBhcmFtc1sidmFsdWUiXTsKICAgIH0KICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRDaGVja2JveCgkc21hcnR5bmFtZSwgJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRDaGVja2JveCgkcGFyYW1zKSk7CiAgfQoKICBmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmIChpc3NldCgkcGFyYW1zWyJpZ25vcmV2YWxpZGF0aW9uIl0pICYmICRwYXJhbXNbImlnbm9yZXZhbGlkYXRpb24iXT09IjEiKSB7CiAgICAgICRwYXJhbXNbImFkZHRleHQiXT0ib25DbGljaz0naWdub3JldmFsaWRhdGlvbj0xOyciOwogICAgfQogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImltYWdlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImNvbmZpcm10ZXh0IiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCAkcGFyYW1zPWFycmF5KCksICR2YWx1ZT0iIikgewogICAgaWYgKGlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dFN1Ym1pdCgkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+TmVvSW5wdXRTdWJtaXQoYXJyYXkoIm5hbWUiPT4kcGFyYW1zLCJ2YWx1ZSI9PiR2YWx1ZSkpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImlkIiwkcGFyYW1zLCR0aGlzLT5faWQpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgibmFtZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJ2YWx1ZSIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCJSZXNldCIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gTmVvSW5wdXRIaWRkZW4oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInZhbHVlIiwkcGFyYW1zLCIiKQogICAgKTsKICB9CgogIGZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSwkb3B0dmFsdWU9IiIpIHsKICAgIGlmIChpc19hcnJheSgkcGFyYW1zKSkgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbigkcGFyYW1zKSk7CiAgICB9IGVsc2UgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCR0aGlzLT5OZW9JbnB1dEhpZGRlbihhcnJheSgibmFtZSI9PiRwYXJhbXMsInZhbHVlIj0+JG9wdHZhbHVlKSkpOwogICAgfQoKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKSB7CiAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZShhcnJheSgiaXRlbXMiLCJ2YWx1ZXMiKSwkcGFyYW1zLGFycmF5KCkpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpbmRleCIsJHBhcmFtcywtMSksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJzZWxlY3RlZHZhbHVlIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoImFkZHRleHQiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXREcm9wZG93bigkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5OZW9JbnB1dERyb3Bkb3duKCRwYXJhbXMpKTsKICB9CgogIGZ1bmN0aW9uIE5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zPWFycmF5KCkpIHsKICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlSW5wdXRSYWRpb0dyb3VwKAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaWQiLCRwYXJhbXMsJHRoaXMtPl9pZCksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJuYW1lIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIml0ZW1zIiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNlbGVjdGVkdmFsdWUiLCRwYXJhbXMsLTEpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiYWRkdGV4dCIsJHBhcmFtcywiIiksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJkZWxpbWl0ZXIiLCRwYXJhbXMsIiIpCiAgICApOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5SW5wdXRSYWRpb0dyb3VwKCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5bmFtZSwgJHRoaXMtPk5lb0lucHV0UmFkaW9Hcm91cCgkcGFyYW1zKSk7CiAgfQoKCiAgZnVuY3Rpb24gTmVvSW5wdXRTZWxlY3RMaXN0KCRwYXJhbXM9YXJyYXkoKSkgewogICAgcmV0dXJuICR0aGlzLT5DcmVhdGVJbnB1dFNlbGVjdExpc3QoCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJpZCIsJHBhcmFtcywkdGhpcy0+X2lkKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm5hbWUiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgiaXRlbXMiLCRwYXJhbXMsIiIpLAogICAgICAkdGhpcy0+TmVvUGFyYW1WYWx1ZSgic2VsZWN0ZWRpdGVtcyIsJHBhcmFtcyxhcnJheSgpKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoInNpemUiLCRwYXJhbXMsMyksCiAgICAgICR0aGlzLT5OZW9QYXJhbVZhbHVlKCJhZGR0ZXh0IiwkcGFyYW1zLCIiKSwKICAgICAgJHRoaXMtPk5lb1BhcmFtVmFsdWUoIm11bHRpcGxlIiwkcGFyYW1zLHRydWUpCiAgICApOwogIH0KCgogIGZ1bmN0aW9uIFNtYXJ0eVNjcmFtYmxlRW1haWwoJGVtYWlsLCAkc2NyYW1ibGluZz0iaGV4IikgewogICAgJHNtYXJ0eV9kYXRhID0gInttYWlsdG8gYWRkcmVzcz0nIi4kZW1haWwuIicgZW5jb2RlPSciLiRzY3JhbWJsaW5nLiInfSI7CiAgICAvKiRzbWFydHktPl9jb21waWxlX3NvdXJjZSgndGVtcG9yYXJ5IHRlbXBsYXRlJywgJHNtYXJ0eV9kYXRhLCAkX2NvbXBpbGVkICk7CiAgICBAb2Jfc3RhcnQoKTsKICAgICRzbWFydHktPl9ldmFsKCc/PicgLiAkX2NvbXBpbGVkKTsKICAgICRfY29udGVudHMgPSBAb2JfZ2V0X2NvbnRlbnRzKCk7CiAgICBAb2JfZW5kX2NsZWFuKCk7Ki8KICAgICRyZXN1bHQ9JHRoaXMtPlByb2Nlc3NUZW1wbGF0ZUZyb21EYXRhKCRzbWFydHlfZGF0YSk7CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIC8qKgogICAqCiAgICogTGlzdCBoZWxwZXIgZnVuY3Rpb25zCiAgICoKICAgKi8KICBmdW5jdGlvbiBOZW9EZWxldGVJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgICRpY29uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsJHRoaXMtPk5lb1N5c3RlbUljb24oImRlbGV0ZS5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpLCRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgcmV0dXJuICRpY29uOwogIH0KCiAgZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgJGljb249JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImNvcHkuZ2lmIiwkdGhpcy0+X3RleHQoJHRleHQpKSwgJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICByZXR1cm4gJGljb247CiAgfQoKICBmdW5jdGlvbiBOZW9FZGl0SWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigiZWRpdC5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgIHJldHVybiAkaWNvbjsKICB9CiAgZnVuY3Rpb24gTmVvVHJ1ZUljb24oJGFjdGlvbj0iIiwkdGV4dD0iIiwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikgewogICAgaWYgKCRhY3Rpb24hPSIiKSB7CiAgICAgIHJldHVybiAkdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLAkkdGhpcy0+TmVvU3lzdGVtSWNvbigidHJ1ZS5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpLAkkcGFyYW1zLCAkY29uZmlybWF0aW9uKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+TmVvU3lzdGVtSWNvbigidHJ1ZS5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpOwogICAgfQoKICB9CiAgZnVuY3Rpb24gTmVvRmFsc2VJY29uKCRhY3Rpb249IiIsJHRleHQ9IiIsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgIGlmICgkYWN0aW9uIT0iIikgewogICAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oImZhbHNlLmdpZiIsJHRoaXMtPl90ZXh0KCR0ZXh0KSksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5OZW9TeXN0ZW1JY29uKCJmYWxzZS5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvQWNjZXB0SWNvbigkYWN0aW9uPSIiLCR0ZXh0PSIiLCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICBpZiAoJGFjdGlvbiE9IiIpIHsKICAgICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJhY2NlcHQuZ2lmIiwkdGhpcy0+X3RleHQoJHRleHQpKSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPk5lb1N5c3RlbUljb24oImFjY2VwdC5naWYiLCR0aGlzLT5fdGV4dCgkdGV4dCkpOwogICAgfQogIH0KICBmdW5jdGlvbiBOZW9TdG9wSWNvbigkYWN0aW9uPSIiLCR0ZXh0PSIiLCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKSB7CiAgICBpZiAoJGFjdGlvbiE9IiIpIHsKICAgICAgcmV0dXJuICR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsCSR0aGlzLT5OZW9TeXN0ZW1JY29uKCJzdG9wLmdpZiIsJHRoaXMtPl90ZXh0KCR0ZXh0KSksCSRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5OZW9TeXN0ZW1JY29uKCJzdG9wLmdpZiIsJHRoaXMtPl90ZXh0KCR0ZXh0KSk7CiAgICB9CiAgfQogIGZ1bmN0aW9uIE5lb1dhcm5pbmdJY29uKCRhY3Rpb249IiIsJHRleHQ9IiIsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIpIHsKICAgIGlmICgkYWN0aW9uIT0iIikgewogICAgICByZXR1cm4gJHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgJGFjdGlvbiwgJHRoaXMtPl9yZXR1cm5pZCwJJHRoaXMtPk5lb1N5c3RlbUljb24oIndhcm5pbmcuZ2lmIiwkdGhpcy0+X3RleHQoJHRleHQpKSwJJHBhcmFtcywgJGNvbmZpcm1hdGlvbik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPk5lb1N5c3RlbUljb24oIndhcm5pbmcuZ2lmIiwkdGhpcy0+X3RleHQoJHRleHQpKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBOZW9BZGRJY29uKCRhY3Rpb24sJHRleHQsJHBhcmFtcz1hcnJheSgpLCRjb25maXJtYXRpb249IiIsICRpbmNsdWRldGV4dGxpbmsgPSB0cnVlKSB7CiAgICAkaWNvbj0kdGhpcy0+Q3JlYXRlTGluaygkdGhpcy0+X2lkLCAkYWN0aW9uLCAkdGhpcy0+X3JldHVybmlkLCAkdGhpcy0+TmVvU3lzdGVtSWNvbigibmV3b2JqZWN0LmdpZiIsJHRoaXMtPl90ZXh0KCR0ZXh0KSksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgaWYgKCRpbmNsdWRldGV4dGxpbmspIHsKICAgICAgJGljb24uPSR0aGlzLT5DcmVhdGVMaW5rKCR0aGlzLT5faWQsICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0aGlzLT5fdGV4dCgkdGV4dCksICRwYXJhbXMsICRjb25maXJtYXRpb24pOwogICAgfQogICAgLy8kaWNvbi49JHRoaXMtPkNyZWF0ZUxpbmsoJHRoaXMtPl9pZCwgICRhY3Rpb24sICR0aGlzLT5fcmV0dXJuaWQsICR0ZXh0LCAkcGFyYW1zLCAkY29uZmlybWF0aW9uLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CgogICAgLy89JHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgMCwgJHRoZW1lT2JqZWN0LT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9uZXdvYmplY3QuZ2lmJywkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwnJywnJywnc3lzdGVtaWNvbicpLCBhcnJheSgpLCAnJywgZmFsc2UsIGZhbHNlLCAnJykgLicgJy4gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnZWRpdHRlbXBsYXRlJywgJHJldHVybmlkLCAkdGhpcy0+TGFuZygiYWRkdGVtcGxhdGUiKSwgYXJyYXkoInRvZG8iPT4iYWRkIiksICcnLCBmYWxzZSwgZmFsc2UsICdjbGFzcz0icGFnZW9wdGlvbnMiJyk7CiAgICByZXR1cm4gJGljb247CiAgfQoKICBmdW5jdGlvbiBOZW9TeXN0ZW1JY29uKCRpY29uLCR0ZXh0PSIiKSB7CiAgICAkdGhlbWVvYmo9JHRoaXMtPl9nZXR0aGVtZW9iaigpOwogICAgaWYgKCR0aGVtZW9iaikgewogICAgICByZXR1cm4gJHRoZW1lb2JqLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS8nLiRpY29uLCAkdGhpcy0+X3RleHQoJHRleHQpLCcnLCcnLCdzeXN0ZW1pY29uJyk7CiAgICB9IHJldHVybiAiIjsKICB9CgogIGZ1bmN0aW9uIE5lb0hpZGRlbkNvbnRlbnQoJHRleHQsICRjb250ZW50LCAkY2xpY2t0eXBlPSJ0ZXh0IiwgJHN0YXJ0c2hvd249ZmFsc2UpIHsKICAgIHJldHVybiAiPHN0cm9uZz4kdGV4dDwvc3Ryb25nPjxici8+JGNvbnRlbnQiOwogIH0KCiAgLyoqCiAgICoKICAgKiBEQiBTaG9ydGN1dHMKICAgKgogICAqLwoKICBmdW5jdGlvbiBOZW9EQkluc2VydCgkdGFibGUsICR2YWx1ZXM9YXJyYXkoKSwgJHVzZWdlbmlkPWZhbHNlKSB7CiAgICAkZGIgPSBjbXNtcygpLT5HZXREQigpOwogICAgJHEgPSAiSU5TRVJUIElOVE8gIiAuIGNtc19kYl9wcmVmaXgoKSAuICR0YWJsZTsKICAgICRwPWFycmF5KCk7CiAgICAkZmllbGRzPSIiOwogICAgJHZhbD0iIjsKICAgIGZvcmVhY2goJHZhbHVlcyBhcyAka2V5PT4kdmFsdWUpIHsKICAgICAgaWYgKCRmaWVsZHM9PSIiKSAkZmllbGRzPSRrZXk7IGVsc2UgJGZpZWxkcy49IiwiLiRrZXk7CiAgICAgIGlmICgkdmFsPT0iIikgJHZhbD0iPyI7IGVsc2UgJHZhbC49Iiw/IjsKICAgICAgJHBbXT0kdmFsdWU7CiAgICB9CiAgICAkcS49IiAoIi4kZmllbGRzLiIpIFZBTFVFUyAoIi4kdmFsLiIpIjsKICAgIC8vZWNobyAkcTsKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSgkcSwgJHApOwogICAgcmV0dXJuICgkZGJyZXN1bHQhPT10cnVlKTsKICB9CgogIGZ1bmN0aW9uIE5lb0RCRXJyb3JEaWUoKSB7CiAgICAkZGIgPSBjbXNtcygpLT5HZXREQigpOwogICAgZWNobyAkZGItPkVycm9yTXNnKCkgLiAiPGJyPjxicj4iIC4gJGRiLT5zcWw7CiAgICBkaWUoKTsKICB9CgogIGZ1bmN0aW9uIE5lb0RCVXBkYXRlKCR0YWJsZSwgJHZhbHVlcyA9IGFycmF5KCksICRjcml0ZXJpYSA9IGFycmF5KCkpIHsKICAgICRkYiA9IGNtc21zKCktPkdldERCKCk7CiAgICAkcSA9ICJVUERBVEUgIiAuIGNtc19kYl9wcmVmaXgoKSAuICR0YWJsZSAuICIgU0VUICI7CiAgICAkcCA9IGFycmF5KCk7CiAgICAkZmlyc3QgPSB0cnVlOwogICAgZm9yZWFjaCAoJHZhbHVlcyBhcyAkZmllbGQgPT4gJHZhbHVlKSB7CiAgICAgIGlmICgkZmlyc3QpIHsKICAgICAgICAkcSAuPSAkZmllbGQgLiAiPT8iOwogICAgICB9IGVsc2UgewogICAgICAgICRxIC49ICIsICIgLiAkZmllbGQgLiAiPT8iOwogICAgICB9CiAgICAgICRwID0gYXJyYXlfbWVyZ2UoJHAsIGFycmF5KCR2YWx1ZSkpOwogICAgICAkZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIGlmIChjb3VudCgkdmFsdWVzKT09MikgewoKICAgIH0KCiAgICAkZmlyc3QgPSB0cnVlOwogICAgZm9yZWFjaCAoJGNyaXRlcmlhIGFzICRmaWVsZCA9PiAkdmFsdWUpIHsKICAgICAgaWYgKCRmaXJzdCkgewogICAgICAgICRxIC49ICIgV0hFUkUgIiAuICRmaWVsZCAuICI9PyI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgJHEgLj0gIiBBTkQgIiAuICRmaWVsZCAuICI9PyI7CiAgICAgIH0KICAgICAgJHAgPSBhcnJheV9tZXJnZSgkcCwgYXJyYXkoJHZhbHVlKSk7CiAgICAgICRmaXJzdCA9IGZhbHNlOwogICAgfQogICAgLy9lY2hvICRxO3ByaW50X3IoJHApO2RpZSgpOwoKCgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCRxLCAkcCk7CiAgICBpZiAoY291bnQoJHZhbHVlcyk9PTIpIHsKICAgICAgLy9lY2hvICRxO3ByaW50X3IoJHApO2RpZSgpOwogICAgICAvLyBlY2hvICRkYi0+c3FsO2RpZSgpOwogICAgfQoKICAgIGlmICghJGRicmVzdWx0KSB7CiAgICAgIC8vZWNobyAkZGItPkVycm9yTXNnKCk7ZGllKCk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOy8vJGRicmVzdWx0LT5BZmZlY3RlZF9Sb3dzKCk7CiAgfQoKICBmdW5jdGlvbiBOZW9EQlNlbGVjdCgkdGFibGUsICR2YWx1ZXM9YXJyYXkoKSkgewoKICB9CgogIGZ1bmN0aW9uIE5lb0RCRGVsZXRlKCR0YWJsZSwgJHZhbHVlcz1hcnJheSgpKSB7CgogIH0KCgogIC8qKgogICAqCiAgICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAgICoKICAgKi8KICBmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5BZGRFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwkdGFibGUsJHByb3BzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEFkZEVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERlbGV0ZUVudGl0eSgkaWQpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RGVsZXRlRW50aXR5KCRpZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBEZWxldGVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBEZWxldGVFbnRpdGllcygkdGFibGUsICRjcml0ZXJpYT1hcnJheSgpKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkRlbGV0ZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIERlbGV0ZUVudGl0aWVzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSwgJGZpbGxmaWVsZHM9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFbnRpdHkoJGlkLCAkb3ZlcnJpZGVwcm9wcywgJGZpbGxmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5OiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRyZXN1bHQ9JGRzLT5HZXRFbnRpdGllcygkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICAgIGlmICghaXNfYXJyYXkoJHJlc3VsdCkpIHsKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgfQogICAgICByZXR1cm4gJHJlc3VsdDsKICAgIH0gZWxzZSB7CiAgICAgIGlmICgkYWx3YXlzcmV0dXJuYXJyYXkpIHsKICAgICAgICByZXR1cm4gYXJyYXkoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0T25lRW50aXR5KCR0YWJsZSwgJGNyaXRlcmlhPWFycmF5KCksICRmYWlsaWZtdWx0aXBsZT1mYWxzZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRPbmVFbnRpdHkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkY3JpdGVyaWEsICRmYWlsaWZtdWx0aXBsZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRPbmVFbnRpdHk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBHZXRPbmVTb3J0ZWRFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJHNvcnRmaWVsZHM9YXJyYXkoKSwkZmFpbGlmbXVsdGlwbGU9ZmFsc2UgKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldE9uZUVudGl0eSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSwgJGZhaWxpZm11bHRpcGxlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEdldE9uZUVudGl0eTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEVudGl0aWVzRnVsbCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpLCAkYWx3YXlzcmV0dXJuYXJyYXk9ZmFsc2UpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJHJlc3VsdD0kZHMtPkdldEVudGl0aWVzRnVsbCgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRjcml0ZXJpYSk7CiAgICAgIGlmICghJHJlc3VsdCkgewogICAgICAgIGlmICgkYWx3YXlzcmV0dXJuYXJyYXkpIHsKICAgICAgICAgICRyZXN1bHQ9YXJyYXkoKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICRyZXN1bHQ7CiAgICB9IGVsc2UgewogICAgICBpZiAoJGFsd2F5c3JldHVybmFycmF5KSB7CiAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXRpZXNGdWxsOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcCgkaWQsJHByb3BuYW1lLCRwcm9wdmFsdWUsJHByb3B0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNldEVudGl0eVByb3A6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhckVudGl0eVByb3AoJGlkLCAkcHJvcG5hbWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlQcm9wKCRpZCwgJHByb3BuYW1lKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNldEVudGl0eVByb3BzKCRpZCwgJHByb3BzLyosICRjbGVhcj10cnVlKi8pIHsKICAgIC8vZWNobyAiaGkxIjtkaWUoKTsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+U2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMvKiwgJGNsZWFyKi8pOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcz1hcnJheSgpLCAkY2xlYXI9dHJ1ZSwgJGZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkdmFsdWVzKSkgewogICAgICAkdmFsdWVzPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgLy9lY2hvICJoaTEiO2RpZSgpOwogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5TZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyLCAkZmlsbCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKCiAgZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhKCR0YWJsZSwgJHByb3BzLCAkY3JpdGVyaWEsICRjcmVhdGU9dHJ1ZSwgJGNsZWFyPWZhbHNlKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eVByb3BzT25Dcml0ZXJpYSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRwcm9wcywgJGNyaXRlcmlhLCAkY3JlYXRlLCAkY2xlYXIpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5UHJvcHNPbkNyaXRlcmlhOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVzZXRFbnRpdHlQcm9wcygkaWQsICRuZXdwcm9wcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOzs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllcygpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+UmVtb3ZlTW9kdWxlRW50aXRpZXMoJHRoaXMtPkdldE5hbWUoKSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBSZW1vdmVNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHMoJGlkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkNsZWFyRW50aXR5UHJvcHMoJGlkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcHM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXMoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgICRkcy0+Q29tcGFyZUVudGl0aWVzKCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZCk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDb21wYXJlRW50aXRpZXM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDb21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Db21wYXJlRW50aXRpZXNDb21wbGV4KCRlbnRpdHkxLCAkZW50aXR5MiwgJHNvcnRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ29tcGFyZUVudGl0aWVzQ29tcGxleDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNvcnRFbnRpdGllcygkbGlzdCwgJHNvcnRmaWVsZHMpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgJGRzLT5Tb3J0RW50aXRpZXMoJGxpc3QsICRzb3J0ZmllbGRzKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNvcnRFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEVudGl0aWVzQ291bnQoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5FbnRpdGllc0NvdW50KCR0aGlzLT5HZXROYW1lKCksICR0YWJsZSwgJGNyaXRlcmlhKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIEVudGl0aWVzQ291bnQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5DbGVhck1vZHVsZUVudGl0aWVzKCR0aGlzLT5HZXROYW1lKCkpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2xlYXJNb2R1bGVFbnRpdGllczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENvdW50RW50aXRpZXMoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSkgewogICAgJGVudGl0aWVzPSR0aGlzLT5HZXRFbnRpdGllcygkdGFibGUsICRjcml0ZXJpYSwgdHJ1ZSk7CiAgICByZXR1cm4gY291bnQoJGVudGl0aWVzKTsKICB9CgogIGZ1bmN0aW9uIElzVGFibGVFbXB0eSgkdGFibGUpIHsKICAgIHJldHVybiAoJHRoaXMtPkNvdW50RW50aXRpZXMoJHRhYmxlKT09MCk7CiAgfQoKICAvKgogICAqCiAgICogQ29ubmVjdGlvbiBmdW5jdGlvbnMKICAgKgogICAqLwoKICBmdW5jdGlvbiBTZXRFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPlNldEVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMj0tMSwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyLCAkdHlwZSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb25zOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCgoKICBmdW5jdGlvbiBDbGVhckVudGl0eUNvbm5lY3Rpb24oJGlkMSwgJGlkMiwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIENsZWFyRW50aXR5Q29ubmVjdGlvbjogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIENoZWNrRW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIiwgJHJldHVybnZhbHVlPXRydWUpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+Q2hlY2tFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlLCAkcmV0dXJudmFsdWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gQ2hlY2tFbnRpdHlDb25uZWN0aW9uOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMj0tMSwgJHR5cGU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+R2V0RW50aXR5Q29ubmVjdGlvbnMoJGlkMSwgJGlkMiwgJHR5cGUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RW50aXR5Q29ubmVjdGlvbnM6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBBZGRGaWVsZFNldCgkbmFtZSwkZmllbGRzKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkFkZEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUsJGZpZWxkcyk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBBZGRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEdldEZpZWxkU2V0KCRuYW1lKSB7CiAgICAkZHM9JHRoaXMtPl9nZXRkcygpOwogICAgaWYgKCRkcyE9PWZhbHNlKSB7CiAgICAgIHJldHVybiAkZHMtPkdldEZpZWxkU2V0KCR0aGlzLT5HZXROYW1lKCksJG5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gR2V0RmllbGRTZXQ6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBFbnRpdHlTZXRVbnNldFByb3BzKCRlbnRpdHksJGZpZWxkc2V0LCRmaWxsdmFsdWU9IiIpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+RW50aXR5U2V0VW5zZXRQcm9wcygkdGhpcy0+R2V0RmllbGRTZXQoJHRoaXMtPkdldE5hbWUoKSksJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJHRoaXMtPkVycm9yKCJmdW5jdGlvbiBHZXRGaWVsZFNldDogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIFNob3dEU0Vycm9ycygkY2xlYXI9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5HZXRFcnJvcnMoJGNsZWFyKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNob3dEU0Vycm9yczogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIERTSW5FcnJvcigpIHsKICAgICRkcz0kdGhpcy0+X2dldGRzKCk7CiAgICBpZiAoJGRzIT09ZmFsc2UpIHsKICAgICAgcmV0dXJuICRkcy0+SW5FcnJvcigpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gRFNJbkVycm9yOiBDYW5ub3QgYWNjZXNzIE5lb0RhdGFTdG9yYWdlIG1vZHVsZSIpOwogICAgfQogIH0KCiAgLyoKICAgKgogICAqIFV0aWxpdHkgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gTmVvU2xhc2hlcygkdXJsKSB7CiAgICAkcmVzdWx0PXN0cl9yZXBsYWNlKCJcXCIsIi8iLCR1cmwpOwogICAgLy9ZZXMsIHBocCB1bmRlciB3aW5kb3dzIHJ1bnMgcGVyZmVjdGx5IHdpdGggdGhvc2Ugc2xhc2hlcywgYXMgbG9uZyBhcyB5b3UKICAgIC8vZG9uJ3QgbWl4IHRoZW0gd2l0aCBiYWNrc2xhc2hlcyEhCiAgICAvLyRyZXN1bHQ9c3RyX3JlcGxhY2UoIi8iLERJUkVDVE9SWV9TRVBBUkFUT1IsJHVybCk7CiAgICAvL3JldHVybiBzdHJfcmVwbGFjZSgiXFwiLERJUkVDVE9SWV9TRVBBUkFUT1IsJHJlc3VsdCk7CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykgewogICAgJHRtcD1odG1sX2VudGl0eV9kZWNvZGUoJHMpOwogICAgd2hpbGUgKCR0bXAhPWh0bWxfZW50aXR5X2RlY29kZSgkdG1wKSkgewogICAgICAkdG1wPWh0bWxfZW50aXR5X2RlY29kZSgkdG1wKTsKICAgIH0KICAgIHJldHVybiBodG1sX2VudGl0eV9kZWNvZGUoJHRtcCk7CiAgfQoKICBmdW5jdGlvbiBTbGFzaGVzKCR1cmwpIHsKICAgIHJldHVybiAkdGhpcy0+TmVvU2xhc2hlcygkdXJsKTsKICB9CgogIGZ1bmN0aW9uIFNsYXNoKCRzdHIsJHN0cjI9IiIsJHN0cjM9IiIpIHsKICAgIGlmICgkc3RyPT0iIikgcmV0dXJuICRzdHIyOwogICAgaWYgKCRzdHIyPT0iIiAmJiAkc3RyMz09IiIpIHJldHVybiAkc3RyOwogICAgJHJlc3VsdD0iIjsKICAgIGlmICgkc3RyW3N0cmxlbigkc3RyKS0xXSE9Ii8iKSB7CiAgICAgIGlmICgkc3RyMlswXSE9Ii8iKSB7CiAgICAgICAgJHJlc3VsdD0kc3RyLiIvIi4kc3RyMjsKICAgICAgfSBlbHNlIHsKICAgICAgICAkcmVzdWx0PSRzdHIuJHN0cjI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICgkc3RyMlswXSE9Ii8iKSB7CiAgICAgICAgJHJlc3VsdD0kc3RyLiRzdHIyOwogICAgICB9IGVsc2UgewogICAgICAgICRyZXN1bHQ9JHN0ci5zdWJzdHIoJHN0cjIsMSk7IC8vdHJpbSBhd2F5IG9uZSBvZiB0aGUgc2xhc2hlcwogICAgICB9CiAgICB9CiAgICBpZiAoJHN0cjM9PSIiKSByZXR1cm4gJHJlc3VsdDsKICAgIGlmICgkcmVzdWx0W3N0cmxlbigkcmVzdWx0KS0xXSE9Ii8iKSB7CiAgICAgIGlmICgkc3RyM1swXSE9Ii8iKSB7CiAgICAgICAgJHJlc3VsdD0kcmVzdWx0LiIvIi4kc3RyMzsKICAgICAgfSBlbHNlIHsKICAgICAgICAkcmVzdWx0PSRyZXN1bHQuJHN0cjM7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGlmICgkc3RyM1swXSE9Ii8iKSB7CiAgICAgICAgJHJlc3VsdD0kcmVzdWx0LiRzdHIzOwogICAgICB9IGVsc2UgewogICAgICAgICRyZXN1bHQ9JHJlc3VsdC5zdWJzdHIoJHN0cjMsMSk7IC8vdHJpbSBhd2F5IG9uZSBvZiB0aGUgc2xhc2hlcwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHJldHVybj0iZmlsZXMiLCRpbnRyb2R1Y3Rpb249YXJyYXkoKSwkZXhjbHVkZXM9YXJyYXkoKSwkbWF4cmVjdXJzaW9uPS0xKSB7CiAgICAkZGlybGlzdD1hcnJheSgpOwogICAgJGNvbmZpZz1jbXNtcygpLT5HZXRDb25maWcoKTsKICAgICRtb2RlPSIiOwogICAgc3dpdGNoKCRyZXR1cm4pIHsKICAgICAgY2FzZSAiZmlsZXMiOiAkbW9kZT0iRklMRVMiO2JyZWFrOwogICAgICBjYXNlICJkaXJzIjogJG1vZGU9IkRJUlMiO2JyZWFrOwogICAgICBjYXNlICJib3RoIjogJG1vZGU9IkZVTEwiO2JyZWFrOwogICAgfQogICAgJGZ1bGxyb290PSR0aGlzLT5TbGFzaCgkY29uZmlnWyJyb290X3BhdGgiXSwkcm9vdCk7CiAgICAkZmlsZXJlYz0gZ2V0X3JlY3Vyc2l2ZV9maWxlX2xpc3QgKCRmdWxscm9vdCwgJGV4Y2x1ZGVzICwkbWF4cmVjdXJzaW9uICwkbW9kZSk7IC8vTm8gbWF4ZGVwdGggaW4gcmVjdXJzaW9uCiAgICBpZiAoIWVtcHR5KCRpbnRyb2R1Y3Rpb24pKSB7CiAgICAgICRkaXJsaXN0PSRpbnRyb2R1Y3Rpb247CiAgICB9CiAgICBmb3JlYWNoKCRmaWxlcmVjIGFzICRrZXk9PiR2YWx1ZSkgewogICAgICAkdmFsdWUxPSR0aGlzLT5TbGFzaGVzKHN0cl9yZXBsYWNlKCRjb25maWdbJ3Jvb3RfcGF0aCddLCcnLCR2YWx1ZSkpOwogICAgICAvL3ByZXZlbnQgY3VycmVudCBkaXIgZnJvbSBzaG93aW5nIHVwCiAgICAgIC8vaWYgKCR2YWx1ZTE9PSgkcHJvZmlsZVsicGF0aCJdLiIvIikpIGNvbnRpbnVlOwogICAgICAvL0NoZWNrIGZvciBoaWRkZW4gZmlsZXMKICAgICAgJGRpcnM9ZXhwbG9kZSgiLyIsJHZhbHVlMSk7CiAgICAgICRoaWRkZW49ZmFsc2U7CiAgICAgIGZvcmVhY2goJGRpcnMgYXMgJGRpcikgewogICAgICAgIGlmIChzdWJzdHIoJGRpciwwLDEpPT0iLiIpIHskaGlkZGVuPXRydWU7IGJyZWFrO30KICAgICAgfQogICAgICBpZiAoJGhpZGRlbikgY29udGludWU7CgogICAgICAvL25vdCBoaWRkZW4sIGFkZCB0byBsaXN0CiAgICAgICRkaXJsaXN0WyR2YWx1ZTFdPSR2YWx1ZTE7CiAgICB9CiAgICByZXR1cm4gJGRpcmxpc3Q7CiAgfQoKICBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZSgkZmlsZW5hbWUsICRpbmNsdWRlZW5jb2RpbmcgPSB0cnVlKSB7CiAgICBpZiAoY2xhc3NfZXhpc3RzKCJmaW5mbyIpKSB7CiAgICAgICRmaW5mbyA9IGFycmF5KCk7CiAgICAgIGlmICgkaW5jbHVkZWVuY29kaW5nKSB7CiAgICAgICAgJGZpbmZvID0gbmV3IGZpbmZvKEZJTEVJTkZPX01JTUUpOyAvLyByZXR1cm4gbWltZSB0eXBlIGFsYSBtaW1ldHlwZSBleHRlbnNpb24KICAgICAgfSBlbHNlIHsKICAgICAgICAkZmluZm8gPSBuZXcgZmluZm8oRklMRUlORk9fTUlNRV9UWVBFKTsgLy8gcmV0dXJuIG1pbWUgdHlwZSBhbGEgbWltZXR5cGUgZXh0ZW5zaW9uCiAgICAgIH0KICAgICAgaWYgKCEkZmluZm8pIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuICRmaW5mby0+ZmlsZSgkZmlsZW5hbWUpOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygibWltZV9jb250ZW50X3R5cGUiKSkgewogICAgICAgIHJldHVybiBtaW1lX2NvbnRlbnRfdHlwZSgkZmlsZW5hbWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJlcXVpcmVfb25jZShkaXJuYW1lKF9fRklMRV9fKS5ESVJFQ1RPUllfU0VQQVJBVE9SLiJtaW1ldHlwZXMucGhwIik7CiAgICAgICAgcmV0dXJuIHJldHVybk1JTUVUeXBlKCRmaWxlbmFtZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICAgKmFuZCB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIG5vdAogICovCiAgZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zPWFycmF5KCksJGRlZmF1bHQ9IiIpIHsKCiAgICBpZiAoIWlzX2FycmF5KCRwYXJhbXMpKSB7CiAgICAgIC8vVGhpcyB3YXkgMm5kIHBhcmFtZXRlciBjYW4gYWxzbyBiZSB1c2VkIGFzIGRlZmF1bHQgdmFsdWUKICAgICAgaWYgKCRwYXJhbXMhPSIiICYmICRkZWZhdWx0PT0iIikgewogICAgICAgICRkZWZhdWx0PSRwYXJhbXM7CiAgICAgIH0KICAgICAgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIH0KICAgIGlmICghaXNfYXJyYXkoJG5hbWUpKSB7CiAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRuYW1lXSkpIHJldHVybiAkcGFyYW1zWyRuYW1lXTsKICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfSBlbHNlIHsKICAgICAgZm9yZWFjaCAoJG5hbWUgYXMgJHNpbmdsZW5hbWUpIHsKICAgICAgICBpZiAoaXNzZXQoJHBhcmFtc1skc2luZ2xlbmFtZV0pKSByZXR1cm4gJHBhcmFtc1skc2luZ2xlbmFtZV07CiAgICAgIH0KICAgICAgcmV0dXJuICRkZWZhdWx0OwogICAgfQogIH0KCiAgLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCiAgZnVuY3Rpb24gTlBWKCRuYW1lLCAkcGFyYW1zPWZhbHNlLCAkZGVmYXVsdD0iIikgewogICAgcmV0dXJuICR0aGlzLT5OZW9QYXJhbVZhbHVlKCRuYW1lLCAkcGFyYW1zLCAkZGVmYXVsdCk7CiAgfQoKICBGdW5jdGlvbiBOZW9BcHBseVBhcmFtVmFsdWVzKCR0aGlzYXJyYXksICRwYXJhbXM9YXJyYXkoKSwgJGluZGV4ZXM9YXJyYXkoKSwgJGFsd2F5c2ZpbGw9ZmFsc2UpIHsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSkgJHBhcmFtcz0kdGhpcy0+X3BhcmFtczsKICAgIGlmIChlbXB0eSgkcGFyYW1zKSB8fCBlbXB0eSgkaW5kZXhlcykpIHJldHVybiAkdGhpc2FycmF5OwogICAgaWYgKGlzX2Fzc29jKCRpbmRleGVzKSkgewogICAgICBmb3JlYWNoKCRpbmRleGVzIGFzICRpbmRleD0+JGRlZmF1bHR2YWx1ZSkgewogICAgICAgIGlmIChpc3NldCgkcGFyYW1zWyRpbmRleF0pKSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JHBhcmFtc1skaW5kZXhdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAkdGhpc2FycmF5WyRpbmRleF09JGRlZmF1bHR2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGZvcmVhY2goJGluZGV4ZXMgYXMgJGluZGV4KSB7CiAgICAgICAgaWYgKGlzc2V0KCRwYXJhbXNbJGluZGV4XSkpIHsKICAgICAgICAgICR0aGlzYXJyYXlbJGluZGV4XT0kcGFyYW1zWyRpbmRleF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICgkYWx3YXlzZmlsbCkgewogICAgICAgICAgICBpZiAoIWlzc2V0KCR0aGlzYXJyYXlbJGluZGV4XSkpICR0aGlzYXJyYXlbJGluZGV4XT0iIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vcHJpbnRfcigkdGhpc2FycmF5KTsKICAgIHJldHVybiAkdGhpc2FycmF5OwogIH0KCiAgZnVuY3Rpb24gTmVvQXBwbHlOZXdWYWx1ZXMoJG9sZHZhbHVlcywgJG5ld3ZhbHVlcywkaWdub3JlYmxhbms9ZmFsc2UpIHsKICAgICRyZXN1bHQ9JG9sZHZhbHVlczsKICAgIGZvcmVhY2goJHJlc3VsdCBhcyAkaW5kZXg9PiR2YWx1ZSkgewogICAgICBpZiAoaXNzZXQoJG5ld3ZhbHVlc1skaW5kZXhdKSkgewogICAgICAgICRyZXN1bHRbJGluZGV4XT0kbmV3dmFsdWVzWyRpbmRleF07CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTWFrZVNpbXBsZUFycmF5KCR0YWJsZSwkZmllbGQsJGFzc29jaWQ9dHJ1ZSkgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlU2ltcGxlQXJyYXkoJHRoaXMtPkdldE5hbWUoKSwgJHRhYmxlLCAkZmllbGQsICRhc3NvY2lkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheTogQ2Fubm90IGFjY2VzcyBOZW9EYXRhU3RvcmFnZSBtb2R1bGUiKTs7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykgewogICAgJGRzPSR0aGlzLT5fZ2V0ZHMoKTsKICAgIGlmICgkZHMhPT1mYWxzZSkgewogICAgICByZXR1cm4gJGRzLT5NYWtlQXNzb2NBcnJheSgkdGhpcy0+R2V0TmFtZSgpLCAkdGFibGUsICRmaWVsZHMpOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICR0aGlzLT5FcnJvcigiZnVuY3Rpb24gTWFrZUFzc29jQXJyYXk6IENhbm5vdCBhY2Nlc3MgTmVvRGF0YVN0b3JhZ2UgbW9kdWxlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBDaGVja0ZpbGVFeHRlbnNpb24oJGZpbGVuYW1lLCAkYWxsb3dlZGV4dGVuc2lvbnM9YXJyYXkoKSkgewogICAgJGV4cGxvZGVkZmlsZT1leHBsb2RlKCIuIiwkZmlsZW5hbWUpOwogICAgJGV4dD1zdHJ0b2xvd2VyKGFycmF5X3BvcCgkZXhwbG9kZWRmaWxlKSk7CiAgICBpZiAoaW5fYXJyYXkoJGV4dCwkYWxsb3dlZGV4dGVuc2lvbnMpKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGV4dD0kdGhpcy0+TlBWKCJ0ZXh0IiwkcGFyYW1zLCI/Iik7CiAgICAkdXJsPSR0aGlzLT5OUFYoInVybCIsJHBhcmFtcywiIik7CiAgICAkdGl0bGU9JHRoaXMtPk5QVigidGl0bGUiLCRwYXJhbXMsIiIpOwogICAgJGNvbnRlbnQ9JHRoaXMtPk5QVigiY29udGVudCIsJHBhcmFtcywiIik7CiAgICAkc3BhbmNsYXNzPSR0aGlzLT5OUFYoInNwYW5jbGFzcyIsJHBhcmFtcywibmVvdG9vbHRpcCIpOwogICAgaWYgKCR1cmwhPSIiKSB7CiAgICAgICRyZXN1bHQ9JzxhIGNsYXNzPSInLiRzcGFuY2xhc3MuJyIgaHJlZj0iJy4kdXJsLiciPic7CiAgICB9IGVsc2UgewogICAgICAkcmVzdWx0PSc8YSBjbGFzcz0iJy4kc3BhbmNsYXNzLiciIHN0eWxlPSJjdXJzb3I6IGRlZmF1bHQ7IiBocmVmPSIjIiBvbmNsaWNrPSJyZXR1cm4gZmFsc2U7Ij4nOwogICAgfQogICAgJHJlc3VsdC49JHRleHQ7CiAgICAkcmVzdWx0Lj0nPHNwYW4+JzsKICAgIGlmICgkdGl0bGUhPSIiKSB7CiAgICAgICRyZXN1bHQuPSI8c3Ryb25nPiIuJHRpdGxlLiI8L3N0cm9uZz48YnIvPiI7CiAgICB9CiAgICAkcmVzdWx0Lj0kY29udGVudDsKICAgICRyZXN1bHQuPSI8L3NwYW4+IjsKICAgICRyZXN1bHQuPSI8L2E+IjsKICAgIHJldHVybiAkcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gTmVvRW1wdHkoJGluZGV4PSIiLCRkYXRhPWFycmF5KCkpIHsKICAgIGlmICghaXNfYXJyYXkoJGRhdGEpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChlbXB0eSgkZGF0YSkpIHsKICAgICAgJGRhdGE9JHRoaXMtPl9wYXJhbXM7CiAgICB9CiAgICBpZiAoZW1wdHkoJGRhdGEpKSByZXR1cm4gdHJ1ZTsKICAgIGlmICgkaW5kZXg9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIGlmICghaXNzZXQoJGRhdGFbJGluZGV4XSkpIHJldHVybiB0cnVlOwogICAgaWYgKHRyaW0oJGRhdGFbJGluZGV4XSk9PSIiKSByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIE5lb1ZhbGlkYXRlRW1haWwoJGVtYWlsLCAkYXZvaWRvbmxpbmUgPSBmYWxzZSkgewogICAgaWYgKHByZWdfbWF0Y2goIi9eW2EtekEtWjAtOV9dK0BbYS16QS1aMC05XC1dK1wuW2EtekEtWjAtOVwtXC5dKyRdL2kiLCAkZW1haWwpKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBpZiAoJGF2b2lkb25saW5lKSByZXR1cm4gdHJ1ZTsKCiAgICBsaXN0KCRVc2VybmFtZSwgJERvbWFpbikgPSBleHBsb2RlKCJAIiwgJGVtYWlsKTsKCiAgICBpZiAoZ2V0bXhycigkRG9tYWluLCAkTVhIb3N0KSkgewogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChAZnNvY2tvcGVuKCREb21haW4sIDI1LCAkZXJybm8sICRlcnJzdHIsIDMwKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewogICAgLy8kcGF0dGVybiA9ICcvXigoW1x3XSs6KT9cL1wvKT8oKFtcZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KSsoOihbXGRcd118JVthLWZBLWZcZF17MiwyfSkrKT9AKT8oW1xkXHddWy1cZFx3XXswLDI1M31bXGRcd11cLikrW1x3XXsyLDR9KDpbXGRdKyk/KFwvKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKikqKFw/KCZhbXA7PyhbLStffi5cZFx3XXwlW2EtZkEtZlxkXXsyLDJ9KT0/KSopPygjKFstK19+LlxkXHddfCVbYS1mQS1mXGRdezIsMn0pKik/JC8nOwogICAgcmV0dXJuICggISBwcmVnX21hdGNoKCcvXihodHRwfGh0dHBzfGZ0cCk6XC9cLyhbQS1aMC05XVtBLVowLTlfLV0qKD86XC5bQS1aMC05XVtBLVowLTlfLV0qKSspOj8oXGQrKT9cLz8vaScsICR1cmwpKSA/IEZBTFNFIDogVFJVRTsKCiAgICAvL3JldHVybiBwcmVnX21hdGNoKCRwYXR0ZXJuLCAkdXJsKTsKICB9CgogIGZ1bmN0aW9uIE5lb05vQnJlYWtzKCRzdHJpbmcpIHsKICAgICRzdHJpbmc9c3RyX3JlcGxhY2UoIiAiLCImbmJzcDsiLCRzdHJpbmcpOwogICAgcmV0dXJuICRzdHJpbmc7CiAgfQoKICBmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKSB7CiAgICBpZiAoZW1wdHkoJGRhdGEpKSB7CiAgICAgICRkYXRhPSR0aGlzLT5fcGFyYW1zOwogICAgfQogICAgaWYgKGVtcHR5KCRkYXRhKSkgewogICAgICAkZGF0YT0ibm8gY29udGVudCBmb3VuZCI7CiAgICB9CiAgICAkb3V0cHV0PSc8YnIvPjxkaXYgc3R5bGU9ImJvcmRlcjoxcHggc29saWQgYmxhY2siPic7CiAgICAkb3V0cHV0Lj0iPHByZT4iOwogICAgJG91dHB1dC49cHJpbnRfcigkZGF0YSx0cnVlKTsKICAgICRvdXRwdXQuPSI8L3ByZT4iOwogICAgJG91dHB1dC49IjwvZGl2Pjxici8+IjsKICAgIGlmICgkc2VuZG91dCkgewogICAgICBlY2hvICRvdXRwdXQ7CiAgICB9CiAgICByZXR1cm4gJG91dHB1dDsKICB9CgogIGZ1bmN0aW9uIE5lb1RyaW1BcnJheSgkaW5hcnJheT1hcnJheSgpKSAgIHsKICAgICRvdXRhcnJheT1hcnJheSgpOwogICAgZm9yZWFjaCAoJGluYXJyYXkgYXMgJGtleT0+JHZhbHVlKSB7CiAgICAgIGlmICh0cmltKCR2YWx1ZSk9PSIiKSBjb250aW51ZTsKICAgICAgJG91dGFycmF5WyRrZXldPXRyaW0oJHZhbHVlKTsKICAgIH0KICAgIHJldHVybiAkb3V0YXJyYXk7CiAgfQoKICAvKgogICAqCiAgICogU21hcnR5IHNob3J0Y3V0cwogICAqCiAgICovCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgaWYgKCFpc19hcnJheSgkc21hcnR5aW5mbykpIHsKICAgICAgaWYgKCRzbWFydHlpbmZvIT0iIikgewogICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICgkc21hcnR5aW5mbz09IiIpIHsKICAgICAgICAgIHJldHVybiAkdGhpcy0+RXJyb3IoImZ1bmN0aW9uIFNtYXJ0eUFzc2lnbjogc21hcnR5LXZhcm5hbWUgbm90IHNldCIsZmFsc2UsYXJyYXkoInNtYXJ0eWluZm8iPT4kc21hcnR5aW5mbywic21hcnR5Y29udGVudCI9PiRzbWFydHljb250ZW50KSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vT2sgaXQncyBhbiBhcnJheQogICAgaWYgKGlzX2Fzc29jKCRzbWFydHlpbmZvKSkgewogICAgICAvL0l0J3MgYW4gYXNzb2NfYXJyYXksIHNvIHdlIGFzc2lnbiBldmVyeSBzaW5nbGUgcGFpciBvZiBpbmZvCiAgICAgIGZvcmVhY2goJHNtYXJ0eWluZm8gYXMgJHNtYXJ0eW5hbWU9PiRzbWFydHljb250ZW50KSB7CiAgICAgICAgaWYgKGlzX2FycmF5KCRzbWFydHljb250ZW50KSkgewogICAgICAgICAgLy9pdCdzIGEgbmVzdGVkIGFycmF5CiAgICAgICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkc21hcnR5Y29udGVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbigkc21hcnR5bmFtZSwgJHNtYXJ0eWNvbnRlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy9JdCdzIG5vdCBhbiBhc3NvY19hcnJheSwgc28gd2Ugc2ltcGx5IHJlZi1hc3NpZ24gaXQuCiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50KTsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gTmVvU21hcnR5QXNzaWduKCRzbWFydHlpbmZvLCAkc21hcnR5Y29udGVudD0iIikgewogICAgJHRoaXMtPlNtYXJ0eUFzc2lnbigkc21hcnR5aW5mbywgJHNtYXJ0eWNvbnRlbnQpOwogIH0KCiAgZnVuY3Rpb24gU21hcnR5QXNzaWduUHJlZigkc21hcnR5bmFtZSwgJHByZWZlcmVuY2VuYW1lPSIiKSB7CiAgICBpZiAoJHByZWZlcmVuY2VuYW1lIT0iIikgewogICAgICAkdGhpcy0+U21hcnR5QXNzaWduKCRzbWFydHluYW1lLCAkdGhpcy0+UHJlZigkcHJlZmVyZW5jZW5hbWUpKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5TbWFydHlBc3NpZ24oJHNtYXJ0eW5hbWUsICR0aGlzLT5QcmVmKCRzbWFydHluYW1lKSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBTbWFydHlBc3NpZ25DTVMoJG1vZHVsZSwkc21hcnR5bmFtZT0ibW9kdWxlIikgewogICAgaWYgKGlzX29iamVjdCgkbW9kdWxlKSkgewogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCRzbWFydHluYW1lLCAkbW9kdWxlKTsKICAgIH0gZWxzZSB7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJHNtYXJ0eW5hbWUsICR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgkbW9kdWxlKSk7CiAgICB9CiAgfQoKICAvKgogICAqCiAgICogRGVidWdnaW5nIGZ1bmN0aW9ucwogICAqCiAgICovCgogIGZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpIHsKICAgICRmaXJlcGhwbW9kdWxlPSR0aGlzLT5HZXRNb2R1bGVJbnN0YW5jZSgnRmlyZVBIUERlYnVnJyk7CiAgICBpZiAoJGZpcmVwaHBtb2R1bGUpIHsKICAgICAgLy9Nb2R1bGUgZm91bmQKICAgICAgJGZpcmVwaHBtb2R1bGUtPlNldE1vZHVsZU5hbWUoJHRoaXMtPkdldE5hbWUoKSk7CiAgICAgICRmaXJlcGhwbW9kdWxlLT5Db21tYW5kKCRjb21tYW5kLCAkbWVzc2FnZSwgJHZhcmlhYmxlcyk7CiAgICB9IC8vZWxzZSBNb2R1bGUgbm90IGZvdW5kfQogIH0KCgogIC8qCiAgICoKICAgKiBFcnJvciBoYW5kbGluZwogICAqCiAgICovCiAgZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKSB7CiAgICAkdGhpcy0+X2Vycm9ycy49JGVycm9ydGV4dDsKICAgIGlmICghZW1wdHkoJHBhcmFtcykgJiYgaXNfYXJyYXkoJHBhcmFtcykpIHsKICAgICAgJHRoaXMtPl9lcnJvcnMuPSIgKCI7CiAgICAgICRmaXJzdD10cnVlOyAvL0hhbmRsaW5nIHRoZSBjb21tYQogICAgICBmb3JlYWNoICgkcGFyYW1zIGFzICRwYXJhbT0+JHZhbHVlKSB7CiAgICAgICAgaWYgKCRmaXJzdCkgJGZpcnN0PWZhbHNlOyBlbHNlICR0aGlzLT5fZXJyb3JzLj0iLCI7CiAgICAgICAgJHRoaXMtPl9lcnJvcnMuPSRwYXJhbS4iPT4iLiR2YWx1ZTsKICAgICAgfQogICAgICAkdGhpcy0+X2Vycm9ycy49IikiOwogICAgfQogICAgJHRoaXMtPl9lcnJvcnMuPSJcbiI7CiAgICByZXR1cm4gJHJldHVybnZhbHVlOwogIH0KCiAgZnVuY3Rpb24gR2V0RXJyb3JzKCRubDJicj10cnVlLCRjbGVhcj10cnVlLCRpbmNsdWRlZHM9dHJ1ZSkgewogICAgJGVycm9ycz0kdGhpcy0+X2Vycm9yczsKICAgIGlmICgkbmwyYnIpIHsKICAgICAgJGVycm9ycz1ubDJicigkZXJyb3JzKTsKICAgIH0KICAgIGlmICgkaW5jbHVkZWRzKSB7CiAgICAgIGlmICgkdGhpcy0+RFNJbkVycm9yKCkpIHsKICAgICAgICAkZXJyb3JzLj0kdGhpcy0+R2V0RFNFcnJvcnMoJG5sMmJyLCRjbGVhcik7CiAgICAgIH0KICAgIH0KICAgIGlmICgkY2xlYXIpIHsKICAgICAgJHRoaXMtPl9lcnJvcnM9IiI7CiAgICB9CiAgICByZXR1cm4gJGVycm9yczsKICB9CgogIGZ1bmN0aW9uIE91dHB1dEVycm9ycygkY2xlYXI9dHJ1ZSwkaW5jbHVkZWRzPXRydWUpIHsKICAgIGlmICgkdGhpcy0+SW5FcnJvcigpKSB7CiAgICAgIGVjaG8gIlxuXG48ZGl2IHN0eWxlPSdib3JkZXI6M3B4IHNvbGlkIHJlZD5cbiI7CiAgICAgIGVjaG8gJHRoaXMtPkdldEVycm9ycyh0cnVlLCRjbGVhciwkaW5jbHVkZWRzKTsKICAgICAgZWNobyAiXG48L2Rpdj5cblxuIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIEluRXJyb3IoKSB7CiAgICByZXR1cm4gKCR0aGlzLT5fZXJyb3JzIT0iIik7CiAgfQoKCiAgLyoKICAgKgogICAqIFRoYW5rcyB0byBodHRwOi8vd3d3LnBocHRveXMuY29tL2UxMDdfcGx1Z2lucy9jb250ZW50L2NvbnRlbnQucGhwP2NvbnRlbnQuNTgKICAgKiBmb3IgdGhlc2UgZnVuY3Rpb25zCiAgICoKICAgKi8KCiAgZnVuY3Rpb24gYXJyYXkyc3RyaW5nKCRteWFycmF5LCAmJG91dHB1dCwgJiRwYXJlbnRrZXkpIHsKICAgIGZvcmVhY2ggKCRteWFycmF5IGFzICRrZXkgPT4gJHZhbHVlKSB7CiAgICAgIGlmIChpc19hcnJheSgkdmFsdWUpKSB7CiAgICAgICAgJHBhcmVudGtleSAuPSAka2V5IC4gIl4iOwogICAgICAgIGFycmF5MnN0cmluZygkdmFsdWUsICRvdXRwdXQsICRwYXJlbnRrZXkpOwogICAgICAgICRwYXJlbnRrZXkgPSAiIjsKICAgICAgfSBlbHNlIHsKICAgICAgICAkb3V0cHV0IC49ICRwYXJlbnRrZXkgLiAka2V5IC4gIl4iIC4gJHZhbHVlIC4gIlxuIjsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gc3RyaW5nMmFycmF5KCRzdHJpbmcsICYkbXlhcnJheSkgewogICAgJGxpbmVzID0gZXhwbG9kZSgiXG4iLCAkc3RyaW5nKTsKICAgIGZvcmVhY2ggKCRsaW5lcyBhcyAkdmFsdWUpIHsKICAgICAgJGl0ZW1zID0gZXhwbG9kZSgiJiMxODM7IiwgJHZhbHVlKTsKICAgICAgaWYgKHNpemVvZigkaXRlbXMpID09IDIpIHsKICAgICAgICAkbXlhcnJheVskaXRlbXNbMF1dID0gJGl0ZW1zWzFdOwogICAgICB9IGVsc2UgaWYgKHNpemVvZigkaXRlbXMpID09IDMpIHsKICAgICAgICAkbXlhcnJheVskaXRlbXNbMF1dWyRpdGVtc1sxXV0gPSAkaXRlbXNbMl07CiAgICAgIH0KICAgIH0KICB9CgoKCgoKICAvKgogICAqCiAgICogSW50ZXJuYXQgaGVscGVyIGZ1bmN0aW9ucwogICAqCiAgICovCgogIHByaXZhdGUgZnVuY3Rpb24gX3RleHQoJHRleHQpIHsKICAgIGlmICgkdGV4dFswXT09IkAiKSByZXR1cm4gJHRoaXMtPkxhbmcoc3Vic3RyKCR0ZXh0LDEpKTsKCiAgICByZXR1cm4gJHRleHQ7CiAgfQoKCn0KPz4K]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIAogIDxsaT4KICAgIHZlcnNpb24gMC41LjUKICA8L2xpPgogIEFkZGVkIFNtYXJ0eUlucHV0UmFkaW9Hcm91cC1zaG9ydGN1dAogIDxici8+CiAgQWRkZWQgXyBzaG9ydGN1dCBmb3IgbGFuZy1mdW5jdGlvbgoKICAgIDxsaT52ZXJzaW9uIDAuNS40PC9saT4KICAgIEFkZGVkICJlbXB0eSIgdG8gZm9ybWZpZWxkLXZhbGlkYXRpb24gdHlwZXMKICAgIDxici8+CgogICAgPGJyLz4KCiAgICA8bGk+dmVyc2lvbiAwLjUuMzwvbGk+CiAgICBEYXRlMlVuaXggbm93IHJldHVybnMgZW1wdHkgc3RyaW5nIGlmIHRoYXQgd2FzIHdoYXQgaXQgd2FzIGdpdmVuCiAgICA8YnIvPgogICAgQWRkZWQgTkVPX0lOSVRfSU5TVEFMTCB0byBhdm9pZCBlcnJvcnMgaW4gbWV0aG9kLmluc3RhbGwucGhwCiAgICA8YnIvPgoKCiAgICA8bGk+dmVyc2lvbiAwLjUuMjwvbGk+CiAgICBBZGRlZCAkY29uZmlnPSRnQ21zLT5HZXRDb25maWcoKTsgdG8gTkVPSU5JVAogICAgPGJyLz4KICAgIGFkZGVkIF90ZXh0IGZvciBlYXN5IGludGVybmFsIHRyYW5zbGF0aW9ucyB1c2luZyBAcHJlZml4CiAgICA8YnIvPgogICAgTmVvSWNvbnMgY2FuIG5vdyBiZSB3aXRoIGxpbmsKICAgIDxici8+CiAgICBUaW1lIHNlbGVjdGlvbiBub3cgYWxsb3dlZCBpbiBOZW9EYXRlVGltZQogICAgPGJyLz4KICAgIGZpeGVkICRhbHdheXNyZXR1cm5hcnJheSBpbiBHZXRFbnRpdGllcwoKICAgIDxsaT52ZXJzaW9uIDAuNS4xPC9saT4KICAgIGZpeGVkIGdldGVudGl0aWVzZnVsbCBwYXJhbSBjYWxsZWQgYWx3YXlzcmV0dXJuYXJyYXksIGFkZGVkIHRoZSBhZGR0ZXh0IHBhcmFtIHRvIG5lb3ByZXR0eWxpbmsgdG8gYmUgYWJsZSB0byBhZGQgYWx0LXRleHRzCgogICAgPGxpPnZlcnNpb24gMC41LjA8L2xpPgogICAgRml4ZXMsIGNsZWFudXBzLCBhbmQgZW5kaW5nIG9mIHZlcnNpb24gY29uZnVzaW9uCgogICAgPGxpPnZlcnNpb24gMC40LjE8L2xpPgogICAgQWRkZWQgbW9yZSB2YWxpZGF0aW9ucywgZXF1YWwgYW5kIGlkZW50aWNhbDxici8+CiAgICBBZGRlZCBldmVuIHNob3J0ZXIgTmVvVXJsIGFuZCBOZW9MaW5rCiAgICBQcmVwYXJlZCBmb3IgY21zbXMgMS4xMAoKICAgIDxsaT52ZXJzaW9uIDAuNC4wPC9saT4KICAgIEFkZGVkIGRhdGV0aW1lcGlja2VyIGFuZCBpbnRlZ3JhdGVkIGl0CgogICAgPGxpPnZlcnNpb24gMC4zLjU8YnIvPgogICAgICAgIE11bHRpcGxlIGJ1Z2ZpeGVzIGRpc2NvdmVyZWQgYnkgUGhwU3Rvcm0KICAgICAgICA8YnIvPgoKICAgIDxsaT52ZXJzaW9uIDAuMy40PGJyLz4KICAgICAgICByZXdvcmtlZCBmb3IgY21zbXMoKS1tZXRob2RzCiAgICAgICAgPGJyLz4KCgogICAgPGxpPnZlcnNpb24gMC4zLjM8YnIvPgogICAgICAgIE5ldyBmb3JtdmFsaWRhdGlvbiBtZXRob2RzIGZvciBkcm9wZG93bnMgYW5kIHJhZGlvZ3JvdXBzCiAgICAgICAgPGJyLz4KCiAgICA8bGk+dmVyc2lvbiAwLjMuMjxici8+CiAgICAgICAgYWRkZWQgY3NzLWluamVjdGlvbnMgc3R5bGluZyB0aGUgZm9ybXZhbGlkYXRpb24tcG9wdXAKICAgICAgICA8YnIvPgogICAgICAgIHN0YXJ0ZWQgZG9pbmcgc29tZSBleGFtcGxlcyBvZiBob3cgdG8gdXNlIHRoZSBtb2R1bGUtY2xhc3MKCiAgICA8bGk+dmVyc2lvbiAwLjMuMTxici8+CiAgICAgICAgZml4ZWQgdGhlIHVnbHkgY3NzIGluIGJvZHksaXQncyBub3cgamF2YXNjcmlwdAogICAgICAgIDxici8+CgogICAgPGxpPnZlcnNpb24gMC4zLjA8YnIvPgogICAgICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9TZXRQcmVmcywgc2hvcnRpbmcgdGhlIHNhdmluZyBvZiBwcmVmcyBmb3IgaW5zdGFuY2UKICAgICAgICA8YnIvPgogICAgICAgIGFkZGVkIGVhc3kgZm9ybS12YWxpZGF0aW9uIGFuZCBuaWNlIG1lc3NhZ2VzIGxpbmtlZCB0byB0aGF0CiAgICAgICAgPGJyLz4KICAgICAgICBPYnNvbGV0ZWQgU21hcnR5VXBsb2FkRm9ybVN0YXJ0LgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgogICAgPGxpPnZlcnNpb24gMC4yLjg8YnIvPgogICAgICAgIGFkZGVkIG5ldyBmdW5jdGlvbiBOZW9HZXRNaW1lVHlwZQoKICAgIDxsaT52ZXJzaW9uIDAuMi43PGJyLz4KICAgICAgICBmaXhlZCBOZW9DbXNMaW5rIGZvciBwcmV0dHkgdXJscywgbWlzc2VkIHRoZSB0YXJnZXRjb250ZW50b25seSBwYXJhbWV0ZXIuLi4KCiAgICA8bGk+dmVyc2lvbiAwLjIuNjxici8+CiAgICAgICAgQWRkZWQgYSBTZXRQcmVmLXNob3J0Y3V0IGFuZCBhIG5pY2UgTmVvU2V0UHJlZi1tZXRob2QgKHNlZSBoZWxwKQogICAgICAgIDxici8+CiAgICAgICAgc2V0IGVudGl0eSBwcm9wcyBmcm9tIGFycmF5IG5vdyB1c2VzIHN0b3JlZCBwYXJhbXMtdmFsdWVzIGlzIG90aGVyIG5vdCBzcGVjaWZpZXMKICAgICAgICA8YnIvPgogICAgICAgIFJld29ya2VkIE5lb1JlZGlyZWN0KEZ1bGwpIHRvIGJlIGZhc3RlciB0byB1c2UKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIE5lb1ZhbGlkYXRlVVJMLW1ldGhvZAogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgRGVjb2RlSFRNTEVudGl0aWVzCiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBOZW9BZG1pblJldHVybgoKCiAgICA8bGk+dmVyc2lvbiAwLjIuNTxici8+CiAgICAgICAgQWRkZWQgYW4gb3B0aW9uIHRvIE5lb0FkZEljb24gdG8gYWxzbyBpbmNsdWRlIHRoZSBmb2xsaW5ncyB0ZXh0IGxpbmsKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIElzVGFibGVFbXB0eQogICAgICAgIDxici8+CiAgICAgICAgVXBkYXRlIEVtYWlsVmFsaWRhdGlvbiB0byBtYWlsLWNhcGFiaWxpdGllcyBvZiBkb21haW4gYXMgd2VsbAogICAgICAgIDxici8+CiAgICAgICAgTWFkZSAybmQgcGFyYW0gdG8gTmVvUMOFYXJhbVZhbHVlIGRvdWJsZSBhcyBkZWZhdWx0IHZhbHVlICh3aGVuIG5vdCBhbiBhcnJheSkKCgoKICAgIDxsaT52ZXJzaW9uIDAuMi40PGJyLz4KICAgICAgICBBZGRlZCBOZW9FbXB0eS1mdW5jdGlvbiB3aGljaCBjaGVja3MgZm9yIGFuIGluZGV4IGluIGFuIGFycmF5CiAgICAgICAgPGJyLz4KICAgICAgICBNYWRlIE5lb1ByaW50UiBvdXRwdXQgY29udGVudCBvZiAkX3BhcmFtcyBpZiBubyBwYXJhbWV0ZXIgd2FzIGdpdmVuCiAgICAgICAgPGJyLz5BZGRlZCBOZW9WYWxpZGF0ZUVtYWlsLWZ1bmN0aW9uCiAgICAgICAgPGJyLz5BZGRlZCBOZW9Ob0JyZWFrcy1mdW5jdGlvbgoKICAgIDxsaT52ZXJzaW9uIDAuMi4zPGJyLz4KICAgICAgICBOb3cgcG9zc2libGUgdG8gcmVnaXN0ZXIgJHBhcmFtcyBmb3IgZXZlbiBlYXNpZXIgc3ludGF4IGluIHJlbGV2YW50IGZ1bmN0aW9ucyBsaWtlIE5QVgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgQ3JlYXRlSW5wdXRQYXNzd29yZC13cmFwcGVyCiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBmaWxsIHBhcmFtZXRlciB0byBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheQoKCiAgICA8bGk+dmVyc2lvbiAwLjIuMjxici8+CiAgICAgICAgQWRkZWQgYSBjdXN0b20gcmV0dXJudmFsdWUgdG8gY2hlY2tlbnRpdHljb25uZWN0aW9ucwogICAgICAgIDxici8+CiAgICAgICAgSW1wbGVtZW50ZWQgTWFrZVNpbXBsZUFycmF5CiAgICAgICAgPGJyLz4KICAgICAgICBBZGRlZCBOZW9UcnVlSWNvbiBhbmQgIE5lb1RydWVJY29uCgogICAgPGxpPnZlcnNpb24gMC4yLjE8YnIvPgogICAgICAgIGFkZGVkIGFycmF5X2RpZmZfa2V5IGltcGxlbWVudGF0aW9uIGZvciBwcmUtNS4xLjAgdmVyc2lvbgogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlIHRvIEdldEVudGl0aWVzKEZ1bGwpLW1ldGhvZHMKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIFNtYXJ0QXNzaWduUHJlZi1tZXRob2QKICAgICAgICA8YnIvPgogICAgICAgIEFkZGVkIFRvb2x0aXAtU3VwcG9ydAogICAgICAgIDxici8+CiAgICAgICAgQWRkZWQgTmVvUmVkaXJlY3QtZnVuY3Rpb24KCiAgICA8bGk+dmVyc2lvbiAwLjIuMDxici8+CiAgICAgICAgLSBnZW5lcmFsIGJ1Z2ZpeGluZzxici8+CiAgICAgICAgLSBBZGRlZCBhIE5lb0Rpckxpc3QtZnVuY3Rpb248YnIvPgogICAgICAgIC0gRml4ZWQgbmFtZSBlcnJvciBvbiBOZW9JbnB1dERyb3Bkb3duPGJyLz4KICAgICAgICAtIGFkZGVkIHN1cHBvcnQgZm9yIDNyZCBwYXJhbWV0ZXIgdG8gU2xhc2gtZnVuY3Rpb248YnIvPgogICAgICAgIC0gYWRkZWQgTmVvQ21zTGluayBhbmQgTmVvQ21zVXJsIHNob3J0Y3V0czxici8+CiAgICAgICAgLSBhZGRlZCBTbWFydHlVcGxvYWRGb3JtU3RhcnQ8YnIvPgogICAgICAgIC0gYWRkZWQgU21hcnR5SW5wdXRNdWx0aUhpZGRlbjxici8+CgogICAgPC9saT4KICAgIDxsaT52ZXJzaW9uIDAuMS4wPGJyLz4KICAgICAgICAtIGluaXRpYWwgcmVsZWFzZTwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/help.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHN0cm9uZz5Ob3RpY2UhIFRoaXMgaXMgYSBtb2R1bGUtZGV2ZWxvcGVyLW9ubHkgbW9kdWxlLiBJZiB5b3UgYXJlIG5vdCBhIGRldmVsb3Blcgp5b3UnbGwgcHJvYmFibHkganVzdCB3YW50IHRvIHNraXAgdGhlIGdvcnkgZGV0YWlscyBvZiB0aGlzIHBhZ2UgYW5kIHJlbHkgb24gdGhhdAp0aGUgbW9kdWxlIGp1c3QgZG9lcyBpdCdzIHdvcmsuPC9zdHJvbmc+CjxoMz5QdXJwb3NlIG9mIHRoZSBtb2R1bGU8L2gzPgpUaGUgcHVycG9zZSBvZiB0aGlzIG1vZHVsZSBpcyB0byBjdXQgb2ZmIG9uIGRldmVsb3BtZW50dGltZSBwcm92aWRpbmcgc29tZQplYXN5IHRvIHVzZSBmdW5jdGlvbnMgZXh0ZW5kaW5nIHRoZSBtb2R1bGUtQVBJIG9mIENNUyBNYWRlIFNpbXBsZS4gVGhpcyBpbmNsdWRlcywKYnV0IGlzIG5vIGxpbWl0ZWQgdG8sIHNob3J0Y3V0cyB0byBOZW9EYXRhU3RvcmFnZS1mdW5jaW9uYWxpdHksIGEgY291cGxlIG9mIG5pY2UKU21hcnR5LXNob3J0Y3V0cywgRmlyZVBIUC1pbnRlZ3JhdGlvbiBldGMuCjxoMz5Vc2FnZSBvZiB0aGUgbW9kdWxlPC9oMz4KVG8gdXNlIHRoaXMgZXh0ZW5kZWQgbW9kdWxlLWNsYXNzIHlvdSBzaG91bGQgaW5oZXJpdCBmcm9tIE5lb01vZHVsZS1jbGFzcyBpbnN0ZWFkCm9mIHRoZSB1c3VhbCBDTVNNb2R1bGUtY2xhc3MuIFRoaXMgY2FuIGJlIGRvbmUgbGlrZSB0aGlzOgo8cHJlPgpyZXF1aXJlX29uY2UoZGlybmFtZShkaXJuYW1lKF9fRklMRV9fKSkuIi9OZW9Nb2R1bGUvTmVvTW9kdWxlLm1vZHVsZS5waHAiKTsKY2xhc3MgTXlNb2R1bGUgZXh0ZW5kcyBOZW9Nb2R1bGUgewo8L3ByZT4KSWYgeW91IHdpc2ggdG8gdXNlIHRoZSBOZXdEYXRhU3RvcmFnZSBmdW5jdGlvbmFsaXR5LCB5b3Ugc2hvdWxkIG9mIGNvdXJzZSBhbHNvCmluc3RhbGwgdGhhdCBtb2R1bGUuCjxoMz5Ib3cgdG8gZ2V0IGhlbHA8L2gzPgpJIHdpbGwgcmVwZWF0LCB0aGlzIG1vZHVsZSBpcyBmb3IgZGV2ZWxvcGVycyBvbmx5LiBJZiB5b3UgY2Fubm90IHJlYWQgcGhwLXNvdXJjZSBjb2RlLAp5b3Ugc2hvdWxkIHVzZSBpdCBmb3IgZGV2ZWxvcG1lbnQgYW55d2F5LiBJZiB5b3UgY2FuLCBhbHdheXMgY2hlY2sgb3V0IHRoZSBjb2RlIApmb3IgaGludHMgb24gaG93IHRvIG1ha2UgaXQgd29yay4gSWYgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIG9yIHN1Z2dlc3Rpb25zIGZvcgpmaXhlcy9pbXByb3ZlbWVudHMsIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2F0Y2ggbWUgKFNpbG1hcmlsbGlvbikgaW4gdGhlIGZvcnVtIG9nICNpcmMuCgo8aDM+TGlzdCBvZiBtZXRob2RzPC9oMz4KSSB3aWxsIHRyeSB0byBrZWVwIHRoaXMgbGlzdCB1cHRvZGF0ZSwgYnV0IGZvciBtb3N0IHJlY2VudCBsaXN0LCBwbGVhc2UKY2hlY2sgdGhlIE5lb01vZHVsZS5tb2R1bGUucGhwLWZpbGUgaXRzZWxmLiBTb21lIGRvY3VtZW50YXRpb24gb2YgdGhlIG1ldGhvZHMKbWF5IGV2ZW4gc25lYWsgaW4gdGhlcmUgc29tIGRheS4KPHByZT4KLyoKICoKICogU2V0dXAgZnVuY3Rpb25zCiAqCiAqLwoKZnVuY3Rpb24gU2V0SWQoJGlkKQpmdW5jdGlvbiBOZW9TZXRJZCgkaWQpCmZ1bmN0aW9uIE5lb1NldFJldHVybklkKCRyZXR1cm5pZCkKZnVuY3Rpb24gTmVvU2V0dXAoJGlkLCRtb2R1bGUsJHJldHVybmlkPSIwIiwkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1NldFBhcmFtcygkcGFyYW1zKTsKCiAgLyoKICAgKgogICAqIEdlbmVyYWwgc2hvcnRjdXQgZnVuY3Rpb25zCiAgICoKICAgKi8KZnVuY3Rpb24gUHJlZigkcHJlZm5hbWUsJGRlZmF1bHQ9IiIpCmZ1bmN0aW9uIFNldFByZWYoJHByZWZuYW1lLCAkdmFsdWUpIHsKCi8vU2V0cyBhIHByZWZlcmVuY2UgdG8gdGhlIHZhbHVlIG9mIHRoZSBzYW1lIG5hbWUgaW4gdGhlICRwYXJhbXMtYXJyYXkgc2V0IGJ5IE5lb1NldFVwLgovL09wdGlvbmFsbHkgZGVsZXRpbmcgYXNzaWduaW5nIGEgdmFsdWUgb3IgZGVsZXRpbmcgdGhlIHByZWZlcmVuY2UgaWYgbm90IHNldCBpbiB0aGlzIGFycmF5CmZ1bmN0aW9uIE5lb1NldFByZWYoJHByZWZuYW1lLCAkbm90c2V0dmFsdWU9IiIsICRkZWxldGVpZm5vdHNldD1mYWxzZSkKZnVuY3Rpb24gTmVvU2V0UHJlZnMoJHByZWZzPWFycmF5KCkpIC8vcmVxdWlyZXMgYW4gYXNzb2NpYXRlZCBhcnJheSBvZiAkcHJlZm5hbWVzPT4kbm90c2V0dmFsdWUKZnVuY3Rpb24gTmVvQ21zTGluaygkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0Ntc1VybCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb1JlZGlyZWN0KCRhY3Rpb249IiIsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9SZWRpcmVjdEZ1bGwoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9BZG1pblJldHVybigkcGFyYW1zPWFycmF5KCkpCi8qCiAqCiAqIEZvcm0tZ2VuZXJhdGlvbiBmdW5jdGlvbnMKICoKICovCgpmdW5jdGlvbiBOZW9Gb3JtU3RhcnQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9Gb3JtRW5kKCRwYXJhbXM9YXJyYXkoKSkKZnVuY3Rpb24gTmVvSW5wdXRUZXh0KCRwYXJhbXM9YXJyYXkoKQpmdW5jdGlvbiBOZW9UZXh0YXJlYSgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0Q2hlY2tib3goJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dFN1Ym1pdCgkcGFyYW1zPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0lucHV0UmVzZXQoJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBOZW9JbnB1dElucHV0RHJvcGRvd24oJHBhcmFtcz1hcnJheSgpKQoKLyogZnVuY3Rpb24gYmVsb3cgaW5jbHVkZSBzbWFydHlhc3NpZ25tZW50LCBkb2VzIG5vdCByZXR1cm4gYW55dGhpbmcgKi8KZnVuY3Rpb24gU21hcnR5Rm9ybVN0YXJ0KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUZvcm1FbmQoJHNtYXJ0eW5hbWUpCmZ1bmN0aW9uIFNtYXJ0eUlucHV0U3VibWl0KCRzbWFydHluYW1lLCRwYXJhbXMpCgpmdW5jdGlvbiBTbWFydHlJbnB1dFRleHQoJHNtYXJ0eW5hbWUsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBTbWFydHlJbnB1dENoZWNrYm94KCRzbWFydHluYW1lLCRwYXJhbXM9YXJyYXkoKSkKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0SGlkZGVuKCRzbWFydHluYW1lLCRuYW1lLCR2YWx1ZSkKb3IKZnVuY3Rpb24gU21hcnR5SW5wdXRIaWRkZW4oJHNtYXJ0eW5hbWUsJHBhcmFtcykKCmZ1bmN0aW9uIFNtYXJ0eUlucHV0TXVsdGlIaWRkZW4oJHNtYXJ0eW5hbWUsJGZpZWxkcz1hcnJheSgpKQoKLyoKICoKICogTmVvRGF0YVN0b3JhZ2Ugc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBBZGRFbnRpdHkoJHRhYmxlLCAkcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gRGVsZXRlRW50aXR5KCRpZCkKZnVuY3Rpb24gR2V0RW50aXR5KCRpZCwgJG92ZXJyaWRlcHJvcHM9YXJyYXkoKSkKZnVuY3Rpb24gR2V0RW50aXRpZXMoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBHZXRPbmVFbnRpdHkoJHRhYmxlLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGZhaWxpZm11bHRpcGxlPWZhbHNlKQpmdW5jdGlvbiBHZXRFbnRpdGllc0Z1bGwoJHRhYmxlPSIiLCAkY3JpdGVyaWE9YXJyYXkoKSwgJGFsd2F5c3JldHVybmFycmF5PWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wKCRpZCwkcHJvcG5hbWUsJHByb3B2YWx1ZSwkcHJvcHR5cGU9InVuZGVmaW5lZCIpCmZ1bmN0aW9uIENsZWFyRW50aXR5UHJvcCgkaWQsICRwcm9wbmFtZSkKZnVuY3Rpb24gU2V0RW50aXR5UHJvcHMoJGlkLCAkcHJvcHMsICRjbGVhcj10cnVlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc0Zyb21BcnJheSgkaWQsICRwcm9wcywgJHZhbHVlcywgJGNsZWFyPXRydWUsICRmaWxsPWZhbHNlKQpmdW5jdGlvbiBTZXRFbnRpdHlQcm9wc09uQ3JpdGVyaWEoJHRhYmxlLCAkcHJvcHMsICRjcml0ZXJpYSwgJGNyZWF0ZT10cnVlLCAkY2xlYXI9ZmFsc2UpIC8vRG9lcyBub3Qgd29yawpmdW5jdGlvbiBSZXNldEVudGl0eVByb3BzKCRpZCwgJG5ld3Byb3BzPWFycmF5KCkpCmZ1bmN0aW9uIFJlbW92ZU1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gQ2xlYXJFbnRpdHlQcm9wcygkaWQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllcygkZW50aXR5MSwgJGVudGl0eTIsICRzb3J0ZmllbGQpCmZ1bmN0aW9uIENvbXBhcmVFbnRpdGllc0NvbXBsZXgoJGVudGl0eTEsICRlbnRpdHkyLCAkc29ydGZpZWxkcykKZnVuY3Rpb24gU29ydEVudGl0aWVzKCRsaXN0LCAkc29ydGZpZWxkcykKZnVuY3Rpb24gRW50aXRpZXNDb3VudCgkdGFibGU9IiIsICRjcml0ZXJpYT1hcnJheSgpKQpmdW5jdGlvbiBDbGVhck1vZHVsZUVudGl0aWVzKCkKZnVuY3Rpb24gU2V0RW50aXR5Q29ubmVjdGlvbigkaWQxLCAkaWQyLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQ2xlYXJFbnRpdHlDb25uZWN0aW9uKCRpZDEsICRpZDIsICR0eXBlPSIiKQpmdW5jdGlvbiBDaGVja0VudGl0eUNvbm5lY3Rpb24oJGlkMSwkaWQyLCR0eXBlPSIiLCRyZXR1cm52YWx1ZT10cnVlKQpmdW5jdGlvbiBHZXRFbnRpdHlDb25uZWN0aW9ucygkaWQxLCAkaWQyPS0xLCAkdHlwZT0iIikKZnVuY3Rpb24gQWRkRmllbGRTZXQoJG5hbWUsJGZpZWxkcykKZnVuY3Rpb24gR2V0RmllbGRTZXQoJG5hbWUpCmZ1bmN0aW9uIEVudGl0eVNldFVuc2V0UHJvcHMoJGVudGl0eSwkZmllbGRzZXQsJGZpbGx2YWx1ZT0iIikgewpmdW5jdGlvbiBHZXREU0Vycm9ycygkbmwyYnI9dHJ1ZSwkY2xlYXI9dHJ1ZSkKZnVuY3Rpb24gT3V0cHV0RFNFcnJvcnMoJGNsZWFyPXRydWUpCmZ1bmN0aW9uIERTSW5FcnJvcigpCmZ1bmN0aW9uIE1ha2VTaW1wbGVBcnJheSgkdGFibGUsJGZpZWxkKQpmdW5jdGlvbiBNYWtlQXNzb2NBcnJheSgkdGFibGUsJGZpZWxkcykKCgovKgogKgogKiBMaW5rIGFuZCBpY29uIGZ1bmN0aW9ucwogKgogKi8KCmZ1bmN0aW9uIE5lb0RlbGV0ZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQ29weUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvRWRpdEljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvQWRkSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9UcnVlSWNvbigkYWN0aW9uLCR0ZXh0LCRwYXJhbXM9YXJyYXkoKSwkY29uZmlybWF0aW9uPSIiKQpmdW5jdGlvbiBOZW9GYWxzZUljb24oJGFjdGlvbiwkdGV4dCwkcGFyYW1zPWFycmF5KCksJGNvbmZpcm1hdGlvbj0iIikKZnVuY3Rpb24gTmVvU3lzdGVtSWNvbigkaWNvbiwkdGV4dD0iIikKCi8qCiAqCiAqIFV0aWxpdHkgZnVuY3Rpb25zCiAqCiAqLwpmdW5jdGlvbiBOZW9TbGFzaGVzKCR1cmwpCmZ1bmN0aW9uIERlY29kZUhUTUxFbnRpdGllcygkcykKZnVuY3Rpb24gU2xhc2goJHN0ciwkc3RyMj0iIiwkc3RyMz0iIikKZnVuY3Rpb24gU2xhc2hlcygkdXJsKQpmdW5jdGlvbiBpc19hc3NvYygkYXJyYXkpCmZ1bmN0aW9uIE5lb0Rpckxpc3QoJHJvb3QsJHdoYXQ9ImZpbGVzIiwkaW50cm9kdWN0aW9uPWFycmF5KCksJGV4Y2x1ZGVzPWFycmF5KCkpCmZ1bmN0aW9uIE5lb0dldE1pbWVUeXBlKCRmaWxlbmFtZSkKCi8qQ2hlY2tzIGZvciB0aGUgZXhpc3RlbmNlIG9mIGFuIGluZGV4IGluIGFuIGFycmF5IGFuZCByZXR1cm4gdGhlIHZhbHVlIGlmIGl0J3MgdGhlcmUKICphbmQgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQncyBub3QKKi8KZnVuY3Rpb24gTmVvUGFyYW1WYWx1ZSgkbmFtZSwkcGFyYW1zLCRkZWZhdWx0PSIiKQoKLy9TaG9ydGN1dCBmb3IgdGhlIGFib3ZlCmZ1bmN0aW9uIE5QVigkbmFtZSwgJHBhcmFtcykKZnVuY3Rpb24gTmVvQXBwbHlQYXJhbVZhbHVlcygkdGhpc2FycmF5LCAkcGFyYW1zLCAkaW5kZXhlcywgJGFsd2F5c2ZpbGw9ZmFsc2UpCmZ1bmN0aW9uIENoZWNrRmlsZUV4dGVuc2lvbigkZmlsZW5hbWUsICRhbGxvd2VkZXh0ZW5zaW9ucz1hcnJheSgpKQoKLy9Gb3Igbm93LCByZWFkIHNvdXJjZSB0byB1bmRlcnN0YW5kCmZ1bmN0aW9uIE5lb1Rvb2xUaXAoJHBhcmFtcz1hcnJheSgpKSAvL3JlcXVpcmVzIDIgY3NzLWNsYXNzZXMgdG8gYmUgc2V0IHVwCgovL0NoZWNrcyBib3RoIHdoZXRoZXIgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgYXJyYXkgYW5kIHdoZXRoZXIgaXQgaGFzIGEgdmFsdWUgZGlmZmVyZW50IGZvbXIgbm90aGluZyBvdCBvbmx5IHNwYWNlcwpmdW5jdGlvbiBOZW9FbXB0eSgkaW5kZXg9IiIsJGRhdGE9YXJyYXkoKSkKCi8vVmFsaWRhdGVzIGFuIGVtYWlsYWRyZXNzLCBvcHRpb25hbGx5IGF2b2lkaW5nIGNoZWNraW5nIHRoZSBteC1hdmFpbGFiaWxpdHkgb2YgdGhlIGRvbWFpbgpmdW5jdGlvbiBOZW9WYWxpZGF0ZUVtYWlsKCRlbWFpbCwgJGF2b2lkb25saW5lID0gZmFsc2UpCgovL1ZhbGlkYXRlcyBhbiB1cmwKZnVuY3Rpb24gTmVvVmFsaWRhdGVVUkwoJHVybCkgewoKLy9SZXR1cm5zIGEgdmVyc2lvbiBvZiB0aGUgc3RyaW5nIHdoaWNoIGNhbm5vdCAocGVyaGFwcykgYmUgbGluZS1icm9rZW4KZnVuY3Rpb24gTmVvTm9CcmVha3MoJHN0cmluZykKCi8vc2FtZSBhcyBwcmludF9yLCBidXQgd3JhcHMgaW4gPHByZT4ncyBhbmQgaW4gYSBkaXYgdHJ5aW5nIHRvIG1ha2UgaXQgbW9yZSByZWFkYWJsZQpmdW5jdGlvbiBOZW9QcmludFIoJGRhdGE9YXJyYXkoKSwkc2VuZG91dD10cnVlKQoKLy9yZW1vdmVkIGtleS92YWx1ZXMgd2hlcmUgdHJpbSh2YWx1ZSkgaXMgZW1wdHkgYW5kIHRyaW1zIHZhbHVlcyBpZiBub3QKZnVuY3Rpb24gTmVvVHJpbUFycmF5KCRpbmFycmF5PWFycmF5KCkpCgovKgogKgogKiBTbWFydHkgc2hvcnRjdXRzCiAqCiAqLwpmdW5jdGlvbiBTbWFydHlBc3NpZ24oJHNtYXJ0eWluZm8sICRzbWFydHljb250ZW50PSIiKQpmdW5jdGlvbiBTbWFydHlBc3NpZ25QcmVmKCRzbWFydHluYW1lLCAkcHJlZmVyZW5jZW5hbWU9IiIpIHsKZnVuY3Rpb24gU21hcnR5QXNzaWduQ01TKCRtb2R1bGUsJHZhcm5hbWU9ImNtcyIpCmZ1bmN0aW9uIFNtYXJ0eVVwbG9hZEZvcm1TdGFydCgkc21hcnR5bmFtZSwkcGFyYW1zPWFycmF5KCkpIHsKCi8qCiAqCiAqIERlYnVnZ2luZyBmdW5jdGlvbnMKICoKICovCmZ1bmN0aW9uIEZpcmVEZWJ1ZygkY29tbWFuZCwkbWVzc2FnZT0iIiwkdmFyaWFibGVzPWFycmF5KCkpCgovKgogKgogKiBFcnJvciBoYW5kbGluZwogKgogKi8KZnVuY3Rpb24gRXJyb3IoJGVycm9ydGV4dCwkcmV0dXJudmFsdWU9ZmFsc2UsJHBhcmFtcz1hcnJheSgpKQpmdW5jdGlvbiBHZXRFcnJvcnMoJG5sMmJyPXRydWUsJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBPdXRwdXRFcnJvcnMoJGNsZWFyPXRydWUsJGluY2x1ZGVkcz10cnVlKQpmdW5jdGlvbiBJbkVycm9yKCkKPC9wcmU+]]></data>
	</file>
</module>
