<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (name,version,description*,requires*,file+)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
  <name>Banners</name>
  <version>2.0.5</version>
  <description></description>
  <file>
    <filename>Banners.module.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyBNb2R1bGU6IEJhbm5lcnMgLSBBIGJhbm5lciBhZG1pbmlzdHJhdGlvbiBtb2R1bGUKIyBWZXJzaW9uOiAyLjAuNSwgQ2FsZ3V5MTAwMAojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgQ01TIC0gQ01TIE1hZGUgU2ltcGxlIGlzIChjKSAyMDA1IGJ5IFRlZCBLdWxwICh3aXNoeUBjbXNtYWRlc2ltcGxlLm9yZykKIyBUaGlzIHByb2plY3QncyBob21lcGFnZSBpczogaHR0cDovL3d3dy5jbXNtYWRlc2ltcGxlLm9yZwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMKIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiMgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKIyBPciByZWFkIGl0IG9ubGluZTogaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWwjR1BMCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCgojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjbGFzcyBCYW5uZXJzIGV4dGVuZHMgQ01TTW9kdWxlCnsKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfdGVzdGlwKCRyYW5nZSwkaXApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBUaGlzIGlzIGEgZnVuY3Rpb24gdG8gbWF0Y2ggYW4gSVAgYWRkcmVzcyBhZ2FpbnN0IGFuIAogICBhZGRyZXNzIHJhbmdlIHNwZWNpZmljYXRpb24uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX3Rlc3RpcCgkcmFuZ2UsJGlwKSAKICB7CiAgICAkcmVzdWx0ID0gMTsKCiAgICAjIElQIFBhdHRlcm4gTWF0Y2hlcgogICAgIyBKLkFkYW1zIDxqbmFAcmV0aW5hLm5ldD4KICAgICMKICAgICMgTWF0Y2hlczoKICAgICMKICAgICMgeHh4Lnh4eC54eHgueHh4ICAgICAgICAoZXhhY3QpCiAgICAjIHh4eC54eHgueHh4Llt5eXktenp6XSAgKHJhbmdlKQogICAgIyB4eHgueHh4Lnh4eC54eHgvbm4gICAgKG5uID0gIyBiaXRzLCBjaXNjbyBzdHlsZSAtLSBpLmUuIC8yNCA9IGNsYXNzIEMpCiAgICAjCiAgICAjIERvZXMgbm90IG1hdGNoOgogICAgIyB4eHgueHh4Lnh4eC54eFt5eXktenp6XSAgKHJhbmdlLCBwYXJ0aWFsIG9jdGV0cyBub3Qgc3VwcG9ydGVkKQoKICAgIGlmIChlcmVnKCIoWzAtOV0rKVwuKFswLTldKylcLihbMC05XSspXC4oWzAtOV0rKS8oWzAtOV0rKSIsJHJhbmdlLCRyZWdzKSkgewoKICAgICAgIyBwZXJmb3JtIGEgbWFzayBtYXRjaAogICAgICAkaXBsID0gaXAybG9uZygkaXApOwogICAgICAkcmFuZ2VsID0gaXAybG9uZygkcmVnc1sxXSAuICIuIiAuICRyZWdzWzJdIC4gIi4iIC4gJHJlZ3NbM10gLiAiLiIgLiAkcmVnc1s0XSk7CiAgICAgIAogICAgICAkbWFza2wgPSAwOwogICAgICAKICAgICAgZm9yICgkaSA9IDA7ICRpPCAzMTsgJGkrKykgewoJaWYgKCRpIDwgJHJlZ3NbNV0tMSkgewoJICAkbWFza2wgPSAkbWFza2wgKyBwb3coMiwoMzAtJGkpKTsKCX0KICAgICAgfQogICAgICAKICAgICAgaWYgKCgkbWFza2wgJiAkcmFuZ2VsKSA9PSAoJG1hc2tsICYgJGlwbCkpIHsKCXJldHVybiAxOwogICAgICB9IGVsc2UgewoJcmV0dXJuIDA7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIAogICAgICAjIHJhbmdlIGJhc2VkCiAgICAgICRtYXNrb2N0cyA9IHNwbGl0KCJcLiIsJHJhbmdlKTsKICAgICAgJGlwb2N0cyA9IHNwbGl0KCJcLiIsJGlwKTsKICAgICAgCiAgICAgICMgcGVyZm9ybSBhIHJhbmdlIG1hdGNoCiAgICAgIGZvciAoJGk9MDsgJGk8NDsgJGkrKykgewoJaWYgKGVyZWcoIlxbKFswLTldKylcLShbMC05XSspXF0iLCRtYXNrb2N0c1skaV0sJHJlZ3MpKSB7CgkgIGlmICggKCRpcG9jdHNbJGldID4gJHJlZ3NbMl0pIHx8ICgkaXBvY3RzWyRpXSA8ICRyZWdzWzFdKSkgewoJICAgICRyZXN1bHQgPSAwOwoJICB9Cgl9CgllbHNlCgkgIHsKCSAgICBpZiAoJG1hc2tvY3RzWyRpXSA8PiAkaXBvY3RzWyRpXSkgewoJICAgICAgJHJlc3VsdCA9IDA7CgkgICAgfQoJICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAkcmVzdWx0OwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkFkZEJhbm5lciggJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQgKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgUHJvdmlkZSBhIGZvcm0gdG8gYWxsb3cgdXNlcnMgdG8gYWRkIGEgYmFubmVyIHRvIGEgY2F0ZWdvcnkKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5BZGRCYW5uZXIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYoICFpc3NldCgkcGFyYW1zWydjYXRlZ29yeV9pZCddKSApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3RpdGxlJywgJHRoaXMtPkxhbmcgKCdhZGRiYW5uZXInKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnc3RhcnRmb3JtJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCAoJGlkLAoJCQkJCQkJICAnZG9fYWRkYmFubmVyJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJ1N1Ym1pdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJ0NhbmNlbCcpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2Jhbm5lcm5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9iYW5uZXJuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYmFubmVybmFtZScsCgkJCQkJCSAgICIiLCAyMCwgODApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9iYW5uZXJkZXNjJywKCQkJICAgJHRoaXMtPkxhbmcgKCdkZXNjcmlwdGlvbicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2Jhbm5lcmRlc2MnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9iYW5uZXJkZXNjJywKCQkJCQkJICAgIiIsIDgwLCAyNTUpKTsKCiAgICAvLyB3ZSdyZSBnb25uYSBxdWVyeSB0aGUgdXBsb2FkcyBtb2R1bGUgKG9wdGlvbmFsbHkpIHRvIHByb3ZpZGUgYSBsaXN0IG9mCiAgICAvLyBiYW5uZXJzLCByYXRoZXIgdGhhbiBoYXZlIHRoZSB1c2VyIHR5cGUgaW4gYSBmaWxlCiAgICAkbW9kdWxlID0gJHRoaXMtPl9nZXRVcGxvYWRzTW9kdWxlKCk7CiAgICBpZiggJG1vZHVsZSApCiAgICAgIHsKCS8vIHRvZG8KICAgICAgfQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2ltYWdlJywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbWFnZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2ltYWdlJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfaW1hZ2UnLAoJCQkJCQkgICAiIiwgNTAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19pbWFnZScsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZScpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfdXJsJywKCQkJICAgJHRoaXMtPkxhbmcgKCd1cmwnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cmwnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF91cmwnLAoJCQkJCQkgICAiIiwgNTAsIDI1NSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ocmVmX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2hyZWZfdGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2hyZWZfdGV4dCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2hyZWZfdGV4dCcsCgkJCQkJCSAgICcnLCA4MCwgMjU1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX2hyZWZfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19ocmVmX3RleHQnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2ltYWdlX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2ltYWdlX3RleHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZV90ZXh0JywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfaW1hZ2VfdGV4dCcsCgkJCQkJCSAgICIiLCA4MCwgMjU1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX2ltYWdlX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2luZm9faW1hZ2VfdGV4dCcpKTsKCgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X21heF9pbXByZXNzaW9ucycsCgkJCSAgICR0aGlzLT5MYW5nICgnbWF4X2ltcHJlc3Npb25zJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfbWF4X2ltcHJlc3Npb25zJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfbWF4X2ltcHJlc3Npb25zJywKCQkJCQkJICAgIjAiLCAzLCA1KSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX21heF9pbXByZXNzaW9ucycsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19tYXhfaW1wcmVzc2lvbnMnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2V4cGlyZXMnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2V4cGlyZXMnKSk7CiAgICAkZXhwaXJlc2RhdGUgPSBzdHJ0b3RpbWUoJys2IG1vbnRocycsIHRpbWUoKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzZGF0ZXByZWZpeCcsICRpZC4nZXhwaXJlc2RhdGVfJyk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdleHBpcmVzZGF0ZScsICRleHBpcmVzZGF0ZSApOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignbmV2ZXJleHBpcmVzJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsJ2lucHV0X25ldmVyZXhwaXJlcycsMCwxKS4kdGhpcy0+TGFuZygnbmV2ZXInKSk7CgogICAgJG1vZHVsZSA9ICR0aGlzLT5fZ2V0VXBsb2Fkc01vZHVsZSgpOwogICAgaWYoICRtb2R1bGUgKQogICAgICB7CgkvLyBnZXQgdGhlIGNhdGVnb3J5IGluZm8sIGFuZCBmaW5kIHRoZSB1cGxvYWQgY2F0ZWdvcnkgaWQKCSRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMgIi4KCSAgIldIRVJFIGNhdGVnb3J5X2lkID0gPyI7CgkkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gKSApOwoJJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKCWlmKCBpc3NldCgkcm93Wyd1cGxvYWRzX2NhdGVnb3J5X2lkJ10pICkgewoJICAvLyBub3cgZ2V0IGEgbGlzdCBvZiBhbGwgb2YgdGhlIGZpbGVzIGluIHRoYXQgY2F0ZWdvcnkKCSAgJGZpbGVsaXN0ID0gJG1vZHVsZS0+Z2V0RmlsZUxpc3QoICRyb3dbJ3VwbG9hZHNfY2F0ZWdvcnlfaWQnXSApOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Byb21wdF91cGxvYWRfZmlsZScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdXBsb2FkX2ZpbGUnKSk7CgkgICR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXBsb2FkX2ZpbGUnLAoJCQkJJHRoaXMtPkNyZWF0ZUlucHV0RHJvcERvd24gKCRpZCwgImlucHV0X3VwbG9hZF9maWxlIiwgJGZpbGVsaXN0LCAtMSkpOwoJfQogICAgICB9CiAgICAKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbignaGlkZGVuJywKCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4oJGlkLCdpbnB1dF9jYXRlZ29yeV9pZCcsJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkpOwoKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkYmFubmVyLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkFkZENhdGVnb3J5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBQcm92aWRlIGEgZm9ybSB0byBhbGxvdyB1c2VycyB0byBhZGQgYSBjYXRlZ29yeQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkFkZENhdGVnb3J5KCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgndGl0bGUnLCAkdGhpcy0+TGFuZyAoJ2FkZGNhdGVnb3J5JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N0YXJ0Zm9ybScsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgJ2RvX2FkZGNhdGVnb3J5JywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJ1N1Ym1pdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJ0NhbmNlbCcpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5bmFtZScsCgkJCSAgICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5bmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5bmFtZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5bmFtZScsCgkJCQkJCSAgICIiLCAyMCwgODApKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9jYXRlZ29yeWRlc2MnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9jYXRlZ29yeWRlc2MnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeWRlc2MnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9jYXRlZ29yeWRlc2MnLAoJCQkJCQkgICAiIiwgODAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2ltYWdld2lkdGgnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ3Byb21wdF9pbWFnZXdpZHRoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2V3aWR0aCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdld2lkdGgnLAoJCQkJCQkgICAiIiwgMywgNSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2ltYWdlaGVpZ2h0JywKCQkJICAgJHRoaXMtPkxhbmcgKCdwcm9tcHRfaW1hZ2VoZWlnaHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZWhlaWdodCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlaGVpZ2h0JywKCQkJCQkJICAgIiIsIDMsIDUpKTsKCiAgICAkbW9kdWxlID0gJHRoaXMtPl9nZXRVcGxvYWRzTW9kdWxlKCk7CiAgICBpZiggJG1vZHVsZSApCiAgICAgIHsKIAkkY2F0ZWdvcnlsaXN0ID0gJG1vZHVsZS0+Z2V0Q2F0ZWdvcnlMaXN0KCk7CiAgICAJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXBsb2FkX2NhdGVnb3J5JywKCQkJICAgICAgJHRoaXMtPkxhbmcoJ3Byb21wdF91cGxvYWRfY2F0ZWdvcnknKSk7CiAgICAJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbnB1dF91cGxvYWRfY2F0ZWdvcnknLAoJCSR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duICgkaWQsICJpbnB1dF91cGxvYWRfY2F0ZWdvcnkiLCAkY2F0ZWdvcnlsaXN0LCAtMSkpOwogICAgICB9CiAgICAvLyBEaXNwbGF5IHRoZSBwb3B1bGF0ZWQgdGVtcGxhdGUKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkRvQWRkQmFubmVyKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEFjdHVhbGx5IHBlcmZvcm0gdGhlIHdvcmsgb2YgYWRkaW5nIGEgYmFubmVyIHRvIHRoZQogICBkYXRhYmFzZSBhbmQgdG8gdGhlIGZpbGVzeXN0ZW0KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfQWRtaW5Eb0FkZEJhbm5lciAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgIC8vIGFyZSB3ZSBjYW5jZWxsaW5nCiAgICBpZiAoaXNzZXQgKCRwYXJhbXNbJ2NhbmNlbCddKSkKICAgIHsKICAgICAgJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwogICAgfQoKICAgICRlcnJvciA9IGZhbHNlOwoKICAgICRtb2R1bGUgPSAkdGhpcy0+X2dldFVwbG9hZHNNb2R1bGUoKTsKICAgICRpbWFnZSA9ICRwYXJhbXNbJ2lucHV0X2ltYWdlJ107CiAgICBpZiggJG1vZHVsZSAmJiB0cmltKCRpbWFnZSkgPT0gJycpCiAgICAgIHsKCS8vIGhhdmUgdG8gZ2V0IHRoZSBmaWxlIG5hbWUgZnJvbSAKCS8vIHRoZSB1cGxvYWRzIHB1bGxkb3duIHRoaW5neQoJaWYoIGlzc2V0KCAkcGFyYW1zWydpbnB1dF91cGxvYWRfZmlsZSddICkgKQoJICB7CgkgICAgJGltYWdlID0gJG1vZHVsZS0+Z2V0Q2F0ZWdvcnlQYXRoRnJvbUZpbGVJRCgkcGFyYW1zWydpbnB1dF91cGxvYWRfZmlsZSddKTsKCSAgICAkaW1hZ2UgLj0gRElSRUNUT1JZX1NFUEFSQVRPUi4kbW9kdWxlLT5nZXRGaWxlTmFtZSgkcGFyYW1zWydpbnB1dF91cGxvYWRfZmlsZSddKTsKCSAgfQogICAgICB9CgogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfYmFubmVybmFtZSddKQoJfHwgJHBhcmFtc1snaW5wdXRfYmFubmVybmFtZSddID09ICIiKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9lbXB0eWJhbm5lcm5hbWUiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF91cmwnXSkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBpZiAoJGltYWdlID09ICcnKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlIGlmKCAhaXNzZXQoJHBhcmFtc1snaW5wdXRfbmV2ZXJleHBpcmVzJ10pICYmICFpc3NldCgkcGFyYW1zWydleHBpcmVzZGF0ZV9Nb250aCddKSApCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2luc3VmZmljaWVudHBhcmFtcyIpKTsKCSRlcnJvciA9IHRydWU7CiAgICAgIH0KICAgIGVsc2UgaWYoICFpc3NldCgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeV9pZCddKSApIAogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCS8vIGNoZWNrIGlmIHRoZSBiYW5uZXJzIGRvZXNuJ3QgYWxyZWFkeSBleGlzdAoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkcXVlcnkgPQoJICAiU0VMRUNUICogZnJvbSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICJtb2R1bGVfYmFubmVycyBXSEVSRSBuYW1lID0gPyI7CgkkZGJyZXN1bHQgPQoJICAkZGItPkV4ZWN1dGUgKCRxdWVyeSwgYXJyYXkgKCRwYXJhbXNbJ2lucHV0X2Jhbm5lcm5hbWUnXSkpOwoJCglpZiAoJGRicmVzdWx0ICYmICRkYnJlc3VsdC0+RmV0Y2hSb3cgKCkpCgkgIHsKCSAgICAvLyB5ZXAgaXQgZG9lcwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywKCQkJCSAgICR0aGlzLT5MYW5nICgiZXJyb3JfYmFubmVyZXhpc3RzIikpOwoJICAgICRlcnJvciA9IHRydWU7CgkgIH0KCWVsc2UKCSAgewoJICAgIC8vIHdlJ3JlIGNsZWFyIHRvIGFkZCAoeWFob28pCgkgICAgJGV4cGlyZXMgPSBzdHJ0b3RpbWUoJysgNSB5ZWFycycsIHRpbWUoKSk7CgkgICAgaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfbmV2ZXJleHBpcmVzJ10gKSB8fCAkcGFyYW1zWydpbnB1dF9uZXZlcmV4cGlyZXMnXSA9PSAwICkgCgkgICAgICB7CgkJJGV4cGlyZXMgPSBta3RpbWUoJHBhcmFtc1snZXhwaXJlc2RhdGVfSG91ciddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9NaW51dGUnXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfU2Vjb25kJ10sCgkJCQkgICRwYXJhbXNbJ2V4cGlyZXNkYXRlX01vbnRoJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX0RheSddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9ZZWFyJ10pOwoJICAgICAgfQoJICAgICRiYW5uZXJpZCA9CgkgICAgICAkZGItPkdlbklEIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfYmFubmVyc19zZXEiKTsKCSAgICAkcXVlcnkgPQoJICAgICAgIklOU0VSVCBJTlRPICIuY21zX2RiX3ByZWZpeCAoKS4KCSAgICAgICJtb2R1bGVfYmFubmVycyBWQUxVRVMgKD8sPyw/LD8sPyw/LD8sPyw/LD8sPyw/KSI7CgkgICAgJGRicmVzdWx0ID0KCSAgICAgICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LAoJCQkgICAgYXJyYXkgKCRiYW5uZXJpZCwKCQkJCSAgICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5X2lkJ10sCgkJCQkgICAkcGFyYW1zWyJpbnB1dF9iYW5uZXJuYW1lIl0sCgkJCQkgICAkcGFyYW1zWyJpbnB1dF9iYW5uZXJkZXNjIl0sCgkJCQkgICAkaW1hZ2UsCgkJCQkgICAkcGFyYW1zWyJpbnB1dF91cmwiXSwKCQkJCSAgICRwYXJhbXNbJ2lucHV0X2ltYWdlX3RleHQnXSwKCQkJCSAgICRkYi0+REJUaW1lU3RhbXAodGltZSgpKSwKCQkJCSAgICRkYi0+REJUaW1lU3RhbXAoJGV4cGlyZXMpLAoJCQkJICAgJHBhcmFtc1snaW5wdXRfbWF4X2ltcHJlc3Npb25zJ10sCgkJCQkgICAwLAoJCQkJICAgJHBhcmFtc1snaW5wdXRfaHJlZl90ZXh0J10KCQkJCSAgICkpOwoJICAgIGlmICghJGRicmVzdWx0KQoJICAgICAgewoJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywKCQkJCSAgICAgICAkdGhpcy0+TGFuZyAoImVycm9yX2RiZXJyb3IiKSk7CgkJJGVycm9yID0gdHJ1ZTsKCSAgICAgIH0KCSAgfQogICAgICB9CiAgICAKICAgIGlmICgkZXJyb3IpCiAgICAgIHsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGJhbm5lci50cGwnKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5Eb0FkZENhdGVnb3J5KCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEFjdHVhbGx5IHBlcmZvcm0gdGhlIHdvcmsgb2YgYWRkaW5nIGEgY2F0ZWdvcnkgdG8gdGhlCiAgIGRhdGFiYXNlIGFuZCB0byB0aGUgZmlsZXN5c3RlbQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvQWRkQ2F0ZWdvcnkgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAvLyBhcmUgd2UgY2FuY2VsbGluZwogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICAgIH0KCiAgICAkZXJyb3IgPSBmYWxzZTsKICAgIAogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnluYW1lJ10pCgl8fCAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZW1wdHljYXRlZ29yeSIpKTsKCSRlcnJvciA9IHRydWU7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJLy8gY2hlY2sgaWYgdGhlIGNhdGVnb3J5IGRvZXNuJ3QgYWxyZWFkeSBleGlzdAoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkcXVlcnkgPQoJICAiU0VMRUNUICogZnJvbSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzIFdIRVJFIG5hbWUgPSA/IjsKCSRkYnJlc3VsdCA9CgkgICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LCBhcnJheSAoJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnluYW1lJ10pKTsKCQoJLy8geWVwIGl0IGRvZXMKCWlmICgkZGJyZXN1bHQtPkZldGNoUm93ICgpKQoJICB7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLAoJCQkJICAgJHRoaXMtPkxhbmcgKCJlcnJvcl9jYXRlZ29yeWV4aXN0cyIpKTsKCSAgICAkZXJyb3IgPSB0cnVlOwoJICB9CgllbHNlCgkgIHsKCSAgICAvLyB3ZSdyZSBjbGVhciB0byBhZGQgKHlhaG9vKQoJICAgICRjYXRpZCA9CgkgICAgICAkZGItPkdlbklEIChjbXNfZGJfcHJlZml4ICgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzX3NlcSIpOwoJICAgICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10gPSAkY2F0aWQ7CgkgICAgJHF1ZXJ5ID0KCSAgICAgICJJTlNFUlQgSU5UTyAiLmNtc19kYl9wcmVmaXggKCkuCgkgICAgICAibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyBWQUxVRVMgKD8sPyw/LD8sPyw/KSI7CgkgICAgJGRicmVzdWx0ID0KCSAgICAgICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LAoJCQkgICAgYXJyYXkgKCRjYXRpZCwKCQkJCSAgICRwYXJhbXNbImlucHV0X2NhdGVnb3J5bmFtZSJdLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfY2F0ZWdvcnlkZXNjIl0sCgkJCQkgICAkcGFyYW1zWyJpbnB1dF9pbWFnZXdpZHRoIl0sCgkJCQkgICAkcGFyYW1zWyJpbnB1dF9pbWFnZWhlaWdodCJdLAoJCQkJICAgJHBhcmFtc1siaW5wdXRfdXBsb2FkX2NhdGVnb3J5Il0pKTsKCSAgICBpZiAoISRkYnJlc3VsdCkKCSAgICAgIHsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsCgkJCQkgICAgICAgJHRoaXMtPkxhbmcgKCJlcnJvcl9kYmVycm9yIikpOwoJCSRlcnJvciA9IHRydWU7CgkgICAgICB9CgkgIH0KICAgICAgfQogICAgCiAgICBpZiAoJGVycm9yKQogICAgICB7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRjYXRlZ29yeS50cGwnKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5EZWxldGVDYXRlZ29yeSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEZ1bmN0aW9uIHRoYXQgcHJvdmlkZXMgYSBmb3JtIHRvIGFsbG93IHRoZSB1c2VyIHRvIGRlbGV0ZQogICBhIGNhdGVnb3J5IGZyb20gdGhlIGRhdGFiYXNlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRlbGV0ZUNhdGVnb3J5ICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgaWYoICFpc3NldCggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApICkKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyB0ZXN0IHRvIHNlZSBpZiB0aGVyZSBhcmUgc3RpbGwgaXRlbXMgbGVmdCBpbiB0aGlzIGNhdGVnb3J5LCBpZiB0aGVyZSBhcmUsIHRoZW4gcHVrZQogICAgLy8gb3RoZXJ3aXNlIGRlbGV0ZSB0aGUgZGlyZWN0b3J5IHRvbyAobWF5YmUpCiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKTsKICAgICRjID0gJGRicmVzdWx0LT5SZWNvcmRDb3VudCgpOwogICAgaWYoICRkYnJlc3VsdC0+UmVjb3JkQ291bnQoKSApCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfY2F0ZWdvcnlub3RlbXB0eScpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHdlIGFyZSBmcmVlIHRvIGRlbGV0ZSB0aGUgY2F0ZWdvcnkKICAgICRxdWVyeSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyBXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwoKICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5LCBhcnJheSggJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSApICk7CiAgICBpZiggISAkZGJyZXN1bHQgKSB7CiAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCSAgICAgICAkdGhpcy0+TGFuZygnZXJyb3JfZGJlcnJvcicpKTsKICAgIH0KCiAgICAkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0FkbWluRG9EZWxldGVCYW5uZXIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgQWN0dWFsbHkgZGVsZXRlIGEgYmFubmVyLgogICBBbHNvIGRlbGV0ZXMgdGhlIGVudHJpZXMgZnJvbSB0aGUgaGl0cyBkYXRhYmFzZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkRvRGVsZXRlQmFubmVyICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkgfHwgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMnKSk7CglyZXR1cm47CiAgICAgIH0KICAgIGVsc2UgaWYgKCFpc3NldCAoJHBhcmFtc1snYmFubmVyX2lkJ10pIHx8ICRwYXJhbXNbJ2Jhbm5lcl9pZCddID09ICIiKQogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQogICAgCiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRxdWVyeSA9ICJERUxFVEUgRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfaGl0cyBXSEVSRQogICAgICAgIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICk7CgogICAgJHF1ZXJ5ID0gIkRFTEVURSBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBXSEVSRQogICAgICAgIGNhdGVnb3J5X2lkID0gPyBBTkQgYmFubmVyX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10sICRwYXJhbXNbJ2Jhbm5lcl9pZCddICkgKTsKICAgIGlmKCAhJGRicmVzdWx0ICkgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgfQoKICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5Eb0VkaXRCYW5uZXIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgQWN0dWFsbHkgZWRpdCBhIGJhbm5lciBnaXZlbiB0aGUgaW5mb3JtYXRpb24gZ2l2ZW4KICAgaW4gdGhlIGVkaXQgYmFubmVyIGZvcm0uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0FkbWluRG9FZGl0QmFubmVyICgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICAgIH0KICAgIAogICAgJG1vZHVsZSA9ICR0aGlzLT5fZ2V0VXBsb2Fkc01vZHVsZSgpOwogICAgJGltYWdlID0gJHBhcmFtc1snaW5wdXRfaW1hZ2UnXTsKICAgIGlmKCAkbW9kdWxlICYmIHRyaW0oJGltYWdlKSA9PSAnJykKICAgICAgewoJLy8gaGF2ZSB0byBnZXQgdGhlIGZpbGUgbmFtZSBmcm9tIAoJLy8gdGhlIHVwbG9hZHMgcHVsbGRpd24gdGhpbmd5CgkkaW1hZ2UgPSAkbW9kdWxlLT5nZXRDYXRlZ29yeVBhdGhGcm9tRmlsZUlEKCRwYXJhbXNbJ2lucHV0X3VwbG9hZF9maWxlJ10pOwoJJGltYWdlIC49IERJUkVDVE9SWV9TRVBBUkFUT1I7CgkkaW1hZ2UgLj0gJG1vZHVsZS0+Z2V0RmlsZU5hbWUoJHBhcmFtc1snaW5wdXRfdXBsb2FkX2ZpbGUnXSk7CiAgICAgIH0KCiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd29yayB3aXRoCiAgICAvLyBtYWtlIHN1cmUgd2UgaGF2ZSBzb21ldGhpbmcgdG8gd29yayB3aXRoCiAgICBpZiAoIWlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeV9pZCddKSB8fCAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeV9pZCddID09ICIiKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CiAgICAgIH0KICAgIGVsc2UgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfYmFubmVyX2lkJ10pIHx8ICRwYXJhbXNbJ2lucHV0X2Jhbm5lcl9pZCddID09ICIiKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CiAgICAgIH0KICAgIGVsc2UgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfYmFubmVybmFtZSddKQoJfHwgJHBhcmFtc1snaW5wdXRfYmFubmVybmFtZSddID09ICIiKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9lbXB0eWJhbm5lcm5hbWUiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlIGlmICgkaW1hZ2UgPT0gJycpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgIjEiKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoImVycm9yX2luc3VmZmljaWVudHBhcmFtcyIpKTsKCSRlcnJvciA9IHRydWU7CiAgICAgIH0KICAgIGVsc2UgaWYgKCFpc3NldCAoJHBhcmFtc1snaW5wdXRfdXJsJ10pICkKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zIikpOwoJJGVycm9yID0gdHJ1ZTsKICAgICAgfQogICAgZWxzZSBpZiggIWlzc2V0KCRwYXJhbXNbJ2lucHV0X25ldmVyZXhwaXJlcyddKSAmJiAhaXNzZXQoJHBhcmFtc1snZXhwaXJlc2RhdGVfTW9udGgnXSkgKQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCJlcnJvcl9pbnN1ZmZpY2llbnRwYXJhbXMiKSk7CgkkZXJyb3IgPSB0cnVlOwogICAgICB9CiAgICBlbHNlCiAgICAgIHsKCSRleHBpcmVzID0gc3RydG90aW1lKCcrIDUgeWVhcnMnLCB0aW1lKCkpOwoJaWYoICFpc3NldCggJHBhcmFtc1snaW5wdXRfbmV2ZXJleHBpcmVzJ10gKSApCgkgIHsKCSAgICAkZXhwaXJlcyA9IG1rdGltZSgkcGFyYW1zWydleHBpcmVzZGF0ZV9Ib3VyJ10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX01pbnV0ZSddLCAkcGFyYW1zWydleHBpcmVzZGF0ZV9TZWNvbmQnXSwKCQkJICAgICAgJHBhcmFtc1snZXhwaXJlc2RhdGVfTW9udGgnXSwgJHBhcmFtc1snZXhwaXJlc2RhdGVfRGF5J10sICRwYXJhbXNbJ2V4cGlyZXNkYXRlX1llYXInXSk7CgkgIH0KCgkkcXVlcnkgPSAiVVBEQVRFICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycwogICAgICAgICAgICBTRVQgbmFtZSA9ID8sIGRlc2NyaXB0aW9uID0gPywgaW1hZ2UgPSA/LCB1cmwgPSA/LAogICAgICAgICAgICB0ZXh0ID0gPywgZXhwaXJlcyA9ID8sIG1heF9pbXByZXNzaW9ucyA9ID8sCiAgICAgICAgICAgIGhyZWZfdGV4dCA9ID8gCiAgICAgICAgICAgIFdIRVJFIGNhdGVnb3J5X2lkID0gPyBhbmQgYmFubmVyX2lkID0gPyI7CgkgICAgJGRicmVzdWx0ID0KCSAgICAgICRkYi0+RXhlY3V0ZSAoJHF1ZXJ5LAoJCQkgICAgYXJyYXkgKCAkcGFyYW1zWyJpbnB1dF9iYW5uZXJuYW1lIl0sCgkJCQkgICAgJHBhcmFtc1siaW5wdXRfYmFubmVyZGVzYyJdLAoJCQkJICAgICRpbWFnZSwKCQkJCSAgICAkcGFyYW1zWyJpbnB1dF91cmwiXSwKCQkJCSAgICAkcGFyYW1zWydpbnB1dF9pbWFnZV90ZXh0J10sCgkJCQkgICAgJGRiLT5EQlRpbWVTdGFtcCgkZXhwaXJlcyksCgkJCQkgICAgJHBhcmFtc1snaW5wdXRfbWF4X2ltcHJlc3Npb25zJ10sCgkJCQkgICAgJHBhcmFtc1snaW5wdXRfaHJlZl90ZXh0J10sCgkJCQkgICAgJHBhcmFtc1snaW5wdXRfY2F0ZWdvcnlfaWQnXSwKCQkJCSAgICAkcGFyYW1zWydpbnB1dF9iYW5uZXJfaWQnXQoJCQkJICAgKSk7CgkgICAgaWYgKCEkZGJyZXN1bHQpCgkgICAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLAogCQkJCSAgICAgICAkdGhpcy0+TGFuZyAoImVycm9yX2RiZXJyb3IiKSk7CgkJJGVycm9yID0gdHJ1ZTsKCSAgICAgIH0KICAgICAgfQoKICAgIGlmICgkZXJyb3IpCiAgICAgIHsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGJhbm5lci50cGwnKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5Eb0VkaXRDYXRlZ29yeSgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBBY3R1YWxseSBlZGl0IGEgY2F0ZWdvcnkgZ2l2ZW4gdGhlIGluZm9ybWF0aW9uIGdpdmVuCiAgIGluIHRoZSBlZGl0IGNhdGVnb3J5IGZvcm0uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0FkbWluRG9FZGl0Q2F0ZWdvcnkgKCRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgIAogICAgLy8gYXJlIHdlIGNhbmNlbGxpbmcKICAgIGlmIChpc3NldCAoJHBhcmFtc1snY2FuY2VsJ10pKQogICAgICB7CgkkdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicsICRyZXR1cm5pZCk7CiAgICAgIH0KICAgIAogICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdvcmsgd2l0aAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkgfHwgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3Jfbm9jYXRlZ29yeWlkIikpOwogICAgICB9CiAgICBlbHNlIGlmICghaXNzZXQgKCRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5bmFtZSddKQoJICAgICB8fCAkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSA9PSAiIikKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAiMSIpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZW1wdHljYXRlZ29yeSIpKTsKICAgICAgfQogICAgZWxzZQogICAgICB7CgkvLyBub3cgcHJlcGFyZSB0byB1cGRhdGUgdGhlIHJlY29yZAoJJHF1ZXJ5ID0KCSAgIlVQREFURSAiLmNtc19kYl9wcmVmaXggKCkuCgkgICJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzIFNFVCBuYW1lID0gPywiLgoJICAiZGVzY3JpcHRpb24gPSA/LCBpbWFnZV93aWR0aCA9ID8sIGltYWdlX2hlaWdodCA9ID8sIi4KCSAgInVwbG9hZHNfY2F0ZWdvcnlfaWQgPSA/ICIuCgkgICJXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwoJJGRicmVzdWx0ID0KCSAgJGRiLT5FeGVjdXRlICgkcXVlcnksCgkJCWFycmF5ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeW5hbWUnXSwKCQkJICAgICAgICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5ZGVzYyddLAoJCQkgICAgICAgJHBhcmFtc1snaW5wdXRfaW1hZ2V3aWR0aCddLAoJCQkgICAgICAgJHBhcmFtc1snaW5wdXRfaW1hZ2VoZWlnaHQnXSwKCQkJICAgICAgICRwYXJhbXNbJ2lucHV0X3VwbG9hZF9jYXRlZ29yeSddLAoJCQkgICAgICAgJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkpOwoJaWYgKCEkZGJyZXN1bHQpCgkgIHsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsICIxIik7CgkgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgiZXJyb3JfZGJlcnJvciIpKTsKCSAgfQoJZWxzZQoJICB7CgkgICAgJHRoaXMtPlJlZGlyZWN0ICgkaWQsICdkZWZhdWx0YWRtaW4nLCAkcmV0dXJuaWQpOwoJICAgIHJldHVybjsKCSAgfQogICAgICB9CiAgICAKICAgICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCJhZGRjYXRlZ29yeS50cGwiKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfQWRtaW5FZGl0QmFubmVyKCAkaWQsICRwYXJhbXMsICRyZXR1cm5pZCApCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBQcm92aWRlIGEgZm9ybSB0byBhbGxvdyB1c2VycyB0byBlZGl0IGEgYmFubmVyCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0FkbWluRWRpdEJhbm5lciggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwoJcmV0dXJuOwogICAgICB9CiAgICBpZiggIWlzc2V0KCRwYXJhbXNbJ2Jhbm5lcl9pZCddKSApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIGdldCB0aGUgYmFubmVyIGluZm8KICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzCiAgICAgICAgIFdIRVJFIGNhdGVnb3J5X2lkID0gPyBBTkQgYmFubmVyX2lkID0gPyI7CiAgICAkZGJyZXN1bHQgPSAkZGItPkV4ZWN1dGUoICRxdWVyeSwgYXJyYXkoICRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10sCgkJCQkJICAgICAkcGFyYW1zWydiYW5uZXJfaWQnXSApICk7CiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CglyZXR1cm47CiAgICAgIH0KICAgICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRyb3cgKSAKICAgICAgewoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgndGl0bGUnLCAkdGhpcy0+TGFuZyAoJ2FkZGJhbm5lcicpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdGFydGZvcm0nLAoJCQkJICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsCgkJCQkJCQkgICdkb19lZGl0YmFubmVyJywKCQkJCQkJCSAgJHJldHVybmlkKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdzdWJtaXQnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ3N1Ym1pdCcsCgkJCQkJCQkgICAgJ1N1Ym1pdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsCgkJCQkJCQkgICAgJ0NhbmNlbCcpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2Jhbm5lcm5hbWUnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ25hbWUnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9iYW5uZXJuYW1lJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYmFubmVybmFtZScsCgkJCQkJCSAgICRyb3dbJ25hbWUnXSwgMjAsIDgwKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfYmFubmVyZGVzYycsCgkJCSAgICR0aGlzLT5MYW5nICgnZGVzY3JpcHRpb24nKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9iYW5uZXJkZXNjJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCAoJGlkLCAnaW5wdXRfYmFubmVyZGVzYycsCgkJCQkJCSAgICRyb3dbJ2Rlc2NyaXB0aW9uJ10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZScsCgkJCSAgICR0aGlzLT5MYW5nICgnaW1hZ2UnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZScsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlJywKCQkJCQkJICAgJHJvd1snaW1hZ2UnXSwgNTAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19pbWFnZScsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZScpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfdXJsJywKCQkJICAgJHRoaXMtPkxhbmcgKCd1cmwnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF91cmwnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF91cmwnLAoJCQkJCQkgICAkcm93Wyd1cmwnXSwgNTAsIDI1NSkpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9ocmVmX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2hyZWZfdGV4dCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2hyZWZfdGV4dCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2hyZWZfdGV4dCcsCgkJCQkJCSAgICRyb3dbJ3RleHQnXSwgODAsIDI1NSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5mb19ocmVmX3RleHQnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2luZm9faHJlZl90ZXh0JykpOwoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZV90ZXh0JywKCQkJICAgJHRoaXMtPkxhbmcgKCdpbWFnZV90ZXh0JykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlX3RleHQnLAoJCQkJCQkgICAkcm93Wyd0ZXh0J10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2luZm9faW1hZ2VfdGV4dCcsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19pbWFnZV90ZXh0JykpOwoKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfaW1wcmVzc2lvbnMnLAoJCQkgICAkdGhpcy0+TGFuZygnaW1wcmVzc2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd2YWx1ZV9pbXByZXNzaW9ucycsCgkJCSAgICRyb3dbJ251bV9pbXByZXNzaW9ucyddICk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdwcm9tcHRfbWF4X2ltcHJlc3Npb25zJywKCQkJICAgJHRoaXMtPkxhbmcgKCdtYXhfaW1wcmVzc2lvbnMnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkgICAkdGhpcy0+Q3JlYXRlSW5wdXRUZXh0ICgkaWQsICdpbnB1dF9tYXhfaW1wcmVzc2lvbnMnLAoJCQkJCQkgICAkcm93WydtYXhfaW1wcmVzc2lvbnMnXSwgMywgNSkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbWFnZScsCgkJCSAgIjxpbWcgc3JjPVwiIi4iL3VwbG9hZHMiLkRJUkVDVE9SWV9TRVBBUkFUT1IuJHJvd1snaW1hZ2UnXS4iXCI+Iik7CgkJCQkgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbmZvX21heF9pbXByZXNzaW9ucycsCgkJCSAgICR0aGlzLT5MYW5nICgnaW5mb19tYXhfaW1wcmVzc2lvbnMnKSk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2V4cGlyZXMnLAoJCQkgICAkdGhpcy0+TGFuZyAoJ2V4cGlyZXMnKSk7CiAgICAkZXhwaXJlc2RhdGUgPSBzdHJ0b3RpbWUoJHJvd1snZXhwaXJlcyddKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlcHJlZml4JywgJGlkLidleHBpcmVzZGF0ZV8nKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2V4cGlyZXNkYXRlJywgJGV4cGlyZXNkYXRlICk7CgogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCduZXZlcmV4cGlyZXMnLAoJCQkgICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwnaW5wdXRfbmV2ZXJleHBpcmVzJywwLDEpLiR0aGlzLT5MYW5nKCduZXZlcicpKTsKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpZGRlbicsCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfYmFubmVyX2lkJywkcGFyYW1zWydiYW5uZXJfaWQnXSkuCgkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuKCRpZCwnaW5wdXRfY2F0ZWdvcnlfaWQnLCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKCiAgICAvLyBub3cgZG8gdGhlIGhpdHMKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19oaXRzIFdIRVJFIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICk7CiAgICAkcm93Y2xhc3MgPSAncm93MSc7CiAgICAkcm93YXJyYXkgPSBhcnJheSgpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpcHRleHQnLCR0aGlzLT5MYW5nKCdpcGFkZHJlc3MnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2RhdGV0ZXh0JywkdGhpcy0+TGFuZygnZGF0ZScpKTsKICAgIHdoaWxlKCAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpICkKICAgICAgewoJJG9uZXJvdyA9IG5ldyBzdGRDbGFzcygpOwoJJG9uZXJvdy0+cm93Y2xhc3MgPSAkcm93Y2xhc3M7Cgkkb25lcm93LT5pcCA9ICRyb3dbJ2lwX2FkZHJlc3MnXTsKCSRvbmVyb3ctPmRhdGUgPSAkcm93Wyd0aW1lJ107CglhcnJheV9wdXNoKCAkcm93YXJyYXksICRvbmVyb3cgKTsKCSgkcm93Y2xhc3MgPT0gInJvdzEiID8gJHJvd2NsYXNzID0gInJvdzIiIDogJHJvd2NsYXNzID0gInJvdzEiKTsKICAgICAgfQoKICAgICRtb2R1bGUgPSAkdGhpcy0+X2dldFVwbG9hZHNNb2R1bGUoKTsKICAgIGlmKCAkbW9kdWxlICkKICAgICAgewoJLy8gZ2V0IHRoZSBjYXRlZ29yeSBpbmZvLCBhbmQgZmluZCB0aGUgdXBsb2FkIGNhdGVnb3J5IGlkCgkkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCSRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzICIuCgkgICJXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKTsKCSRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CglpZiggaXNzZXQoJHJvd1sndXBsb2Fkc19jYXRlZ29yeV9pZCddKSApIHsKCSAgLy8gbm93IGdldCBhIGxpc3Qgb2YgYWxsIG9mIHRoZSBmaWxlcyBpbiB0aGF0IGNhdGVnb3J5CgkgICRmaWxlbGlzdCA9ICRtb2R1bGUtPmdldEZpbGVMaXN0KCAkcm93Wyd1cGxvYWRzX2NhdGVnb3J5X2lkJ10gKTsKCSAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdwcm9tcHRfdXBsb2FkX2ZpbGUnLAoJCQkgICAgICAkdGhpcy0+TGFuZygncHJvbXB0X3VwbG9hZF9maWxlJykpOwoJICAkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2lucHV0X3VwbG9hZF9maWxlJywKCQkJCSR0aGlzLT5DcmVhdGVJbnB1dERyb3BEb3duICgkaWQsICJpbnB1dF91cGxvYWRfZmlsZSIsICRmaWxlbGlzdCwgLTEpKTsKCX0KICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ2l0ZW1zJywkcm93YXJyYXkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZignaXRlbWNvdW50JywgY291bnQoJHJvd2FycmF5KSk7CgogICAgLy8gRGlzcGxheSB0aGUgcG9wdWxhdGVkIHRlbXBsYXRlCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdlZGl0YmFubmVyLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9BZG1pbkVkaXRDYXRlZ29yeSggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIEEgZnVuY3Rpb24gdGhhdCBwcm92aWRlcyB0aGUgZm9ybSBmb3IgdGhlIHVzZXIgdG8gZWRpdAogICBjYXRlZ29yeSBkZXRhaWxzLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9BZG1pbkVkaXRDYXRlZ29yeSAoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgndGl0bGUnLCAkdGhpcy0+TGFuZyAoJ2VkaXRjYXRlZ29yeScpKTsKICAgIAogICAgLy8gY2hlY2sgdGhpbmdzIG91dAogICAgaWYgKCFpc3NldCAoJHBhcmFtc1snY2F0ZWdvcnlfaWQnXSkpCiAgICAgIHsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZyAoJ2Vycm9yX25vY2F0ZWdvcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlcnJvcicsIDEpOwoJZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlICgnYWRkY2F0ZWdvcnkudHBsJyk7CglyZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGNhdGVnb3J5IGluZm8gZnJvbSB0aGUgZGF0YWJhc2UgKGZvciB0aGlzIGNhdGVnb3J5KQogICAgJHF1ZXJ5ID0KICAgICAgIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4ICgpLgogICAgICAibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyBXSEVSRSBjYXRlZ29yeV9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlICgkcXVlcnksIGFycmF5KCRwYXJhbXNbJ2NhdGVnb3J5X2lkJ10pKTsKICAgIGlmICghJGRicmVzdWx0KQogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdtZXNzYWdlJywgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZXJyb3InLCAxKTsKCWVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdyAoKTsKICAgIGlmICghJHJvdykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnbWVzc2FnZScsICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2Vycm9yJywgMSk7CgllY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZGRjYXRlZ29yeS50cGwnKTsKCXJldHVybjsKICAgICAgfQoKICAgIC8vIHBvcHVsYXRlIHRoZSB0ZW1wbGF0ZQogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoInN0YXJ0Zm9ybSIsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwgJ2RvX2VkaXRjYXRlZ29yeScsICRyZXR1cm5pZCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywgJ1N1Ym1pdCcpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdjYW5jZWwnLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQgKCRpZCwgJ2NhbmNlbCcsICdDYW5jZWwnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnZW5kZm9ybScsICR0aGlzLT5DcmVhdGVGb3JtRW5kICgpKTsKICAgIAogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5bmFtZScsICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5bmFtZScpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5bmFtZScsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5bmFtZScsCgkJCQkJCQkJCSAkcm93WyduYW1lJ10sIDIwLCA4MCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgncHJvbXB0X2NhdGVnb3J5ZGVzYycsICR0aGlzLT5MYW5nICgncHJvbXB0X2NhdGVnb3J5ZGVzYycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ2lucHV0X2NhdGVnb3J5ZGVzYycsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2NhdGVnb3J5ZGVzYycsCgkJCQkJCSAgICRyb3dbJ2Rlc2NyaXB0aW9uJ10sIDgwLCAyNTUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZXdpZHRoJywkdGhpcy0+TGFuZyAoJ3Byb21wdF9pbWFnZXdpZHRoJykpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfaW1hZ2V3aWR0aCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdld2lkdGgnLCRyb3dbJ2ltYWdlX3dpZHRoJ10sCgkJCQkJCSAgIDMsIDUpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3Byb21wdF9pbWFnZWhlaWdodCcsJHRoaXMtPkxhbmcgKCdwcm9tcHRfaW1hZ2VoZWlnaHQnKSk7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9pbWFnZWhlaWdodCcsCgkJCSAgICR0aGlzLT5DcmVhdGVJbnB1dFRleHQgKCRpZCwgJ2lucHV0X2ltYWdlaGVpZ2h0Jywkcm93WydpbWFnZV9oZWlnaHQnXSwKCQkJCQkJICAgMywgNSkpOwogICAgJG1vZHVsZSA9ICR0aGlzLT5fZ2V0VXBsb2Fkc01vZHVsZSgpOwogICAgaWYoICRtb2R1bGUgKQogICAgICB7CiAJJGNhdGVnb3J5bGlzdCA9ICRtb2R1bGUtPmdldENhdGVnb3J5TGlzdCgpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbigncHJvbXB0X3VwbG9hZF9jYXRlZ29yeScsCgkJCSAgICAgICR0aGlzLT5MYW5nKCdwcm9tcHRfdXBsb2FkX2NhdGVnb3J5JykpOwogICAgCSR0aGlzLT5zbWFydHktPmFzc2lnbignaW5wdXRfdXBsb2FkX2NhdGVnb3J5JywKCQkkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfdXBsb2FkX2NhdGVnb3J5IiwgJGNhdGVnb3J5bGlzdCwgLTEpKTsKICAgICAgfQoKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdoaWRkZW4nLAoJCQkJICAkdGhpcy0+Q3JlYXRlSW5wdXRIaWRkZW4gKCRpZCwgJ2NhdGVnb3J5X2lkJywKCQkJCQkJCSAgICAkcGFyYW1zWydjYXRlZ29yeV9pZCddKSk7CiAgICAKICAgIGVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSAoJ2FkZGNhdGVnb3J5LnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldE5hbWUoKQogICBtdXN0IHJldHVybiB0aGUgZXhhY3QgY2xhc3MgbmFtZSBvZiB0aGUgbW9kdWxlLgogICBJZiB0aGVzZSBkbyBub3QgbWF0Y2gsIGJhZCB0aGluZ3MgaGFwcGVuLgogICAKICAgVGhpcyBpcyB0aGUgbmFtZSB0aGF0J3Mgc2hvd24gaW4gdGhlIG1haW4gTW9kdWxlcwogICBwYWdlIGluIHRoZSBBZG1pbi4KICAgCiAgIElmIHlvdSB3YW50IHRvIGJlIHNhZmUsIHlvdSBjYW4ganVzdCByZXBsYWNlIHRoZSBib2R5CiAgIG9mIHRoaXMgZnVuY3Rpb24gd2l0aDoKICAgcmV0dXJuIGdldF9jbGFzcygkdGhpcyk7IAogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldE5hbWUoKQogIHsKICAgIHJldHVybiAnQmFubmVycyc7CiAgfQogIAoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRGcmllbmRseU5hbWUoKQogICBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZywgcHJlZmVyYWJseSBhIGxvY2FsaXplZCBuYW1lCiAgIG9mIHRoZSBtb2R1bGUuIFRoaXMgaXMgdGhlIG5hbWUgdGhhdCdzIHNob3duIGluIHRoZQogICBBZG1pbiBNZW51cyBhbmQgc2VjdGlvbiBwYWdlcyAoaWYgdGhlIG1vZHVsZSBoYXMgYW4gYWRtaW4KICAgY29tcG9uZW50KS4KICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0RnJpZW5kbHlOYW1lKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2ZyaWVuZGx5bmFtZScpOwogIH0KICAKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldFZlcnNpb24oKQogICBUaGlzIGNhbiByZXR1cm4gYW55IHN0cmluZywgcHJlZmVyYWJseSBhIG51bWJlciBvcgogICBzb21ldGhpbmcgdGhhdCBtYWtlcyBzZW5zZSBmb3IgZGVzaWduYXRpbmcgYSB2ZXJzaW9uLgogICBUaGUgQ01TIHdpbGwgdXNlIHRoaXMgdG8gaWRlbnRpZnkgd2hldGhlciBvciBub3QKICAgdGhlIGluc3RhbGxlZCB2ZXJzaW9uIG9mIHRoZSBtb2R1bGUgaXMgY3VycmVudCwgYW5kCiAgIHRoZSBtb2R1bGUgd2lsbCB1c2UgaXQgdG8gZmlndXJlIG91dCBob3cgdG8gdXBncmFkZQogICBpdHNlbGYgaWYgcmVxdWVzdGVkLgkgICAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRWZXJzaW9uKCkKICB7CiAgICByZXR1cm4gJzIuMC41JzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRIZWxwKCkKICAgVGhpcyByZXR1cm5zIEhUTUwgaW5mb3JtYXRpb24gb24gdGhlIG1vZHVsZS4KICAgVHlwaWNhbGx5LCB5b3UnbGwgd2FudCB0byBpbmNsdWRlIGluZm9ybWF0aW9uIG9uIGhvdyB0bwogICB1c2UgdGhlIG1vZHVsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRIZWxwKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2hlbHAnKTsKICB9CiAgCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEdldEF1dGhvcigpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEdldEF1dGhvcigpCiAgewogICAgcmV0dXJuICdjYWxndXkxMDAwJzsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBdXRob3JFbWFpbCgpCiAgIFRoaXMgcmV0dXJucyBhIHN0cmluZyB0aGF0IGlzIHByZXNlbnRlZCBpbiB0aGUgTW9kdWxlCiAgIEFkbWluIGlmIHlvdSBjbGljayBvbiB0aGUgIkFib3V0IiBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBvZiB5b3VyIG1vZHVsZSBnZXQgaW4gdG91Y2ggd2l0aCB5b3UgdG8gc2VuZCBidWcgcmVwb3J0cywKICAgcXVlc3Rpb25zLCBjYXNlcyBvZiBiZWVyLCBhbmQvb3IgbGFyZ2Ugc3VtcyBvZiBtb25leS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpCiAgewogICAgcmV0dXJuICdyb2JAdGVjaGNvbS5keW5kbnMub3JnJzsKICB9CiAgCiAgCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgR2V0Q2hhbmdlTG9nKCkKICAgVGhpcyByZXR1cm5zIGEgc3RyaW5nIHRoYXQgaXMgcHJlc2VudGVkIGluIHRoZSBtb2R1bGUKICAgQWRtaW4gaWYgeW91IGNsaWNrIG9uIHRoZSBBYm91dCBsaW5rLiBJdCBoZWxwcyB1c2VycwogICBmaWd1cmUgb3V0IHdoYXQncyBjaGFuZ2VkIGJldHdlZW4gcmVsZWFzZXMuCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0Q2hhbmdlTG9nKCkKICB7CiAgICByZXR1cm4gJHRoaXMtPkxhbmcoJ2NoYW5nZWxvZycpOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBJc1BsdWdpbk1vZHVsZSgpCiAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIG9yIGZhbHNlLCBkZXBlbmRpbmcgdXBvbgogICB3aGV0aGVyIHVzZXJzIGNhbiBpbmNsdWRlIHRoZSBtb2R1bGUgaW4gYSBwYWdlIG9yCiAgIHRlbXBsYXRlIHVzaW5nIGEgc21hcnR5IHRhZyBvZiB0aGUgZm9ybQogICB7Y21zX21vZHVsZSBtb2R1bGU9J0Jhbm5lcnMnIHBhcmFtMT12YWwgcGFyYW0yPXZhbC4uLn0KICAgCiAgIElmIHlvdXIgbW9kdWxlIGRvZXMgbm90IGdldCBpbmNsdWRlZCBpbiBwYWdlcyBvcgogICB0ZW1wbGF0ZXMsIHJldHVybiAiZmFsc2UiIGhlcmUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSXNQbHVnaW5Nb2R1bGUoKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBIYXNBZG1pbigpCiAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJvb2xlYW4gdmFsdWUsIGRlcGVuZGluZyBvbgogICB3aGV0aGVyIHlvdXIgbW9kdWxlIGFkZHMgYW55dGhpbmcgdG8gdGhlIEFkbWluIGFyZWEgb2YKICAgdGhlIHNpdGUuIEZvciB0aGUgcmVzdCBvZiB0aGVzZSBjb21tZW50cywgSSdsbCBiZSBjYWxsaW5nCiAgIHRoZSBhZG1pbiBwYXJ0IG9mIHlvdXIgbW9kdWxlIHRoZSAiQWRtaW4gUGFuZWwiIGZvcgogICB3YW50IG9mIGEgYmV0dGVyIHRlcm0uCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gSGFzQWRtaW4oKQogIHsKICAgIHJldHVybiB0cnVlOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pblNlY3Rpb24oKQogICBJZiB5b3VyIG1vZHVsZSBoYXMgYW4gQWRtaW4gUGFuZWwsIHlvdSBjYW4gc3BlY2lmeQogICB3aGljaCBBZG1pbiBTZWN0aW9uIChvciB0b3AtbGV2ZWwgQWRtaW4gTWVudSkgaXQgc2hvd3MKICAgdXAgaW4uIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgdG8gc3BlY2lmeSB0aGF0CiAgIHNlY3Rpb24uIFZhbGlkIHJldHVybiB2YWx1ZXMgYXJlOgogICAKICAgbWFpbiAgICAgICAgLSB0aGUgTWFpbiBtZW51IHRhYi4KICAgY29udGVudCAgICAgLSB0aGUgQ29udGVudCBtZW51CiAgIGxheW91dCAgICAgIC0gdGhlIExheW91dCBtZW51CiAgIHVzZXJzZ3JvdXBzIC0gdGhlIFVzZXJzIGFuZCBHcm91cHMgbWVudQogICBleHRlbnNpb25zICAtIHRoZSBFeHRlbnNpb25zIG1lbnUgKHRoaXMgaXMgdGhlIGRlZmF1bHQpCiAgIHNpdGVhZG1pbiAgIC0gdGhlIFNpdGUgQWRtaW4gbWVudQogICB2aWV3c2l0ZSAgICAtIHRoZSBWaWV3IFNpdGUgbWVudSB0YWIKICAgbG9nb3V0ICAgICAgLSB0aGUgTG9nb3V0IG1lbnUgdGFiCiAgIAogICBOb3RlIHRoYXQgaWYgeW91IHBsYWNlIHlvdXIgbW9kdWxlIGluIHRoZSBtYWluLAogICB2aWV3c2l0ZSwgb3IgbG9nb3V0IHNlY3Rpb25zLCBpdCB3aWxsIHNob3cgdXAgaW4gdGhlCiAgIG1lbnVzLCBidXQgd2lsbCBub3QgYmUgdmlzaWJsZSBpbiBhbnkgdG9wLWxldmVsCiAgIHNlY3Rpb24gcGFnZXMuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5TZWN0aW9uKCkKICB7CiAgICByZXR1cm4gJ2NvbnRlbnQnOwogIH0KICAKICAKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXRBZG1pbkRlc2NyaXB0aW9uKCkKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBoYXZlIGFuIEFkbWluIFBhbmVsLCB5b3UKICAgY2FuIGhhdmUgaXQgcmV0dXJuIGEgZGVzY3JpcHRpb24gc3RyaW5nIHRoYXQgZ2V0cyBzaG93bgogICBpbiB0aGUgQWRtaW4gU2VjdGlvbiBwYWdlIHRoYXQgY29udGFpbnMgdGhlIG1vZHVsZS4KICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gR2V0QWRtaW5EZXNjcmlwdGlvbigpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdtb2RkZXNjcmlwdGlvbicpOwogIH0KICAKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgVmlzaWJsZVRvQWRtaW5Vc2VyKCkKICAgSWYgeW91ciBtb2R1bGUgZG9lcyBoYXZlIGFuIEFkbWluIFBhbmVsLCB5b3UKICAgY2FuIGNvbnRyb2wgd2hldGhlciBvciBub3QgaXQncyBkaXNwbGF5ZWQgYnkgdGhlIGJvb2xlYW4KICAgdGhhdCBpcyByZXR1cm5lZCBieSB0aGlzIG1ldGhvZC4gVGhpcyBpcyBwcmltYXJpbHkgdXNlZAogICB0byBoaWRlIG1vZHVsZXMgZnJvbSBhZG1pbnMgd2hvIGxhY2sgcGVybWlzc2lvbiB0byB1c2UKICAgdGhlbS4KICAgSW4gdGhpcyBjYXNlLCB0aGUgbW9kdWxlIHdpbGwgb25seSBiZSB2aXNpYmxlIHRvIGFkbWlucwogICB3aG8gaGF2ZSAiTWFuYWdlIEJhbm5lcnMiIHBlcm1pc3Npb25zLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpCiAgewogICAgcmV0dXJuICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBCYW5uZXJzJyk7CiAgfQoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBHZXREZXBlbmRlbmNpZXMoKQogICBZb3VyIG1vZHVsZSBtYXkgbmVlZCBhbm90aGVyIG1vZHVsZSB0byBhbHJlYWR5IGJlIGluc3RhbGxlZAogICBiZWZvcmUgeW91IGNhbiBpbnN0YWxsIGl0LgogICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbGlzdCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYW5kCiAgIG1pbmltdW0gdmVyc2lvbiBudW1iZXJzIHRoYXQgdGhpcyBtb2R1bGUgcmVxdWlyZXMuCgkgICAKICAgSXQgc2hvdWxkIHJldHVybiBhbiBoYXNoLCBlZy4KICAgcmV0dXJuIGFycmF5KCdzb21lbW9kdWxlJz0+JzEuMCcsICdvdGhlcm1vZHVsZSc9PicxLjEnKTsKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBHZXREZXBlbmRlbmNpZXMoKQogIHsKICAgIHJldHVybiBhcnJheSgpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIEluc3RhbGwoKQogICBXaGVuIHlvdXIgbW9kdWxlIGlzIGluc3RhbGxlZCwgeW91IG1heSBuZWVkIHRvIGRvIHNvbWUKICAgc2V0dXAuIFR5cGljYWwgdGhpbmdzIHRoYXQgaGFwcGVuIGhlcmUgYXJlIHRoZSBjcmVhdGlvbgogICBhbmQgcHJlcG9wdWxhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsIGRhdGFiYXNlIHNlcXVlbmNlcywKICAgcGVybWlzc2lvbnMsIHByZWZlcmVuY2VzLCBldGMuCgkgICAKICAgVGhpcyBleGFtcGxlIGNyZWF0ZXMgYSBCYW5uZXJzIGRhdGFiYXNlIHRhYmxlIGFuZAogICBzZXF1ZW5jZSwgaXQgY3JlYXRlcyB0aGUgIk1hbmFnZSBCYW5uZXJzIiBwZXJtaXNzaW9uLAogICBhbmQgc2V0cyB0aGUgIlNpbmcgTG91ZGx5IiBwcmVmZXJlbmNlLgoJICAgCiAgIFRoZSBkYXRhYmFzZSBpcyBub3QgYWN0dWFsbHkgdXNlZCBpbiB0aGlzIGV4YW1wbGU7CiAgIGNoZWNrIGFueSBvbmUgb2YgdGhlIG90aGVyIG1vZHVsZXMgaWYgeW91IHdhbnQgdG8gc2VlCiAgIG1ldGhvZCBjb2RlIHRoYXQgdXNlcyB0aGUgZGF0YWJhc2UuCgkgICAKICAgRm9yIGluZm9ybWF0aW9uIG9uIHRoZSBjcmVhdGlvbiBvZiBkYXRhYmFzZSB0YWJsZXMsCiAgIGNoZWNrIG91dCB0aGUgQURPREIgRGF0YSBEaWN0aW9uYXJ5IHBhZ2UgYXQKICAgaHR0cDovL3BocGxlbnMuY29tL2xlbnMvYWRvZGIvZG9jcy1kYXRhZGljdC5odG0KCSAgIAogICBUaGlzIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSAiZmFsc2UiIGluIGNhc2Ugb2YgYW55IGVycm9yLAogICBhbmQgQ01TIHdpbGwgbm90IGNvbnNpZGVyIHRoZSBtb2R1bGUgaW5zdGFsbGVkLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGwoKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJICAKICAgIC8vIG15c3FsLXNwZWNpZmljLCBidXQgaWdub3JlZCBieSBvdGhlciBkYXRhYmFzZQogICAgJHRhYm9wdGFycmF5ID0gYXJyYXkoJ215c3FsJyA9PiAnVFlQRT1NeUlTQU0nKTsKCSAgCiAgICAkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7CgkgIAogICAgLy8gdGFibGUgc2NoZW1hIGRlc2NyaXB0aW9uCiAgICAvLyBpZiB1cmwgYW5kIGltYWdlIGFyZSBOVUxMLCB0ZXh0IGNhbm5vdCBiZS4KICAgICRmbGRzID0gIgogICAgICAgICAgICAgICAgICAgYmFubmVyX2lkIEkgS0VZLAogICAgICAgICAgICAgICAgICAgY2F0ZWdvcnlfaWQgSSBOT1ROVUxMLAogICAgICAgICAgICAgICAgICAgbmFtZSBDKDgwKSBOT1ROVUxMLAogICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gQygyNTUpLAogICAgICAgICAgICAgICAgICAgaW1hZ2UgIEMoMjU1KSwgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgIHVybCAgICBDKDI1NSksCiAgICAgICAgICAgICAgICAgICB0ZXh0ICAgWCwgCiAgICAgICAgICAgICAgICAgICBjcmVhdGVkIFQgTk9UTlVMTCwKICAgICAgICAgICAgICAgICAgIGV4cGlyZXMgVCwKICAgICAgICAgICAgICAgICAgIG1heF9pbXByZXNzaW9ucyBJNCwKICAgICAgICAgICAgICAgICAgIG51bV9pbXByZXNzaW9ucyBJNCBERUZBVUxUIDAgTk9UTlVMTCwKICAgICAgICAgICAgICAgICAgIGhyZWZfdGV4dCBDKDI1NSkgCgkJIjsKCSAgCiAgICAvLyBjcmVhdGUgaXQuIFRoaXMgc2hvdWxkIGRvIGVycm9yIGNoZWNraW5nLCBidXQgSSdtIGEgbGF6eSBzb2QuCiAgICAkc3FsYXJyYXkgPSAkZGljdC0+Q3JlYXRlVGFibGVTUUwoY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCSAgCiAgICAvLyBjcmVhdGUgYSBzZXF1ZW5jZSBmb3IgdGhpcyB0YWJsZQogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZShjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX3NlcSIpOwoKICAgIC8vIGNyZWF0ZSBhIHRhYmxlIGZvciB0aGUgY2F0ZWdvcmllcwogICAgJGZsZHMgPSAiCiAgICAgICAgICAgICBjYXRlZ29yeV9pZCAgSSBLRVksCiAgICAgICAgICAgICBuYW1lICAgICAgICAgQyg4MCkgTk9UTlVMTCwKICAgICAgICAgICAgIGRlc2NyaXB0aW9uICBDKDI1NSksCiAgICAgICAgICAgICBpbWFnZV93aWR0aCAgSSwKICAgICAgICAgICAgIGltYWdlX2hlaWdodCBJLAoJICAgICB1cGxvYWRzX2NhdGVnb3J5X2lkIEkKICAgICAgICAgICAgIjsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5DcmVhdGVUYWJsZVNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMiLAoJCQkJICAgICAgJGZsZHMsICR0YWJvcHRhcnJheSk7CiAgICAkZGljdC0+RXhlY3V0ZVNRTEFycmF5KCRzcWxhcnJheSk7CgogICAgLy8gYW5kIGEgc2VxdWVuY2UgZm9yIHRoaXMgb25lIHRvbwogICAgJGRiLT5DcmVhdGVTZXF1ZW5jZShjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXNfc2VxIik7CgkgIAogICAgLy8gYW5kIGEgdGFibGUgc28gd2UgY2FuIGtlZXAgdHJhY2sgb2YgaGl0cy9jbGlja3RocnVzCiAgICAkZmxkcyA9ICIKICAgICAgICAgICAgICAgICAgIGJhbm5lcl9pZCAgSSBLRVksCiAgICAgICAgICAgICAgICAgICB0aW1lICAgICAgIFQgS0VZLAogICAgICAgICAgICAgICAgICAgaXBfYWRkcmVzcyBDKDE2KSBOT1ROVUxMIEtFWQogICAgICAgICAgICAgICAgICAiOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkNyZWF0ZVRhYmxlU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfaGl0cyIsCgkJCQkgICAgICAkZmxkcywgJHRhYm9wdGFycmF5KTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCiAgICAvLyBjcmVhdGUgYSBwZXJtaXNzaW9uCiAgICAkdGhpcy0+Q3JlYXRlUGVybWlzc2lvbignTWFuYWdlIEJhbm5lcnMnLCAnTWFuYWdlIEJhbm5lcnMnKTsKCiAgICAvLyBhbmQgc29tZSBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlNldFByZWZlcmVuY2UoInN1Ym5ldF9leGNsdXNpb25zIiwgIiIpOwoKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCdpbnN0YWxsZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgoJCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgSW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgQWZ0ZXIgaW5zdGFsbGF0aW9uLCB0aGVyZSBtYXkgYmUgdGhpbmdzIHlvdSB3YW50IHRvCiAgIGNvbW11bmljYXRlIHRvIHlvdXIgYWRtaW4uIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhCiAgIHN0cmluZyB3aGljaCB3aWxsIGJlIGRpc3BsYXllZC4KCSAgIAogICBTZWUgdGhlIG5vdGUgb24gbG9jYWxpemF0aW9uIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIEluc3RhbGxQb3N0TWVzc2FnZSgpCiAgewogICAgcmV0dXJuICR0aGlzLT5MYW5nKCdwb3N0aW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbFBvc3RNZXNzYWdlKCkKICAgQWZ0ZXIgcmVtb3ZpbmcgYSBtb2R1bGUsIHRoZXJlIG1heSBiZSB0aGluZ3MgeW91IHdhbnQgdG8KICAgY29tbXVuaWNhdGUgdG8geW91ciBhZG1pbi4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEKICAgc3RyaW5nIHdoaWNoIHdpbGwgYmUgZGlzcGxheWVkLgoJICAgCiAgIFNlZSB0aGUgbm90ZSBvbiBsb2NhbGl6YXRpb24gYXQgdGhlIHRvcCBvZiB0aGlzIGZpbGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gVW5pbnN0YWxsUG9zdE1lc3NhZ2UoKQogIHsKICAgIHJldHVybiAkdGhpcy0+TGFuZygncG9zdHVuaW5zdGFsbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVwZ3JhZGUoKQogICBJZiB5b3VyIG1vZHVsZSB2ZXJzaW9uIG51bWJlciBkb2VzIG5vdCBtYXRjaCB0aGUgdmVyc2lvbgogICBudW1iZXIgb2YgdGhlIGluc3RhbGxlZCBtb2R1bGUsIHRoZSBDTVMgQWRtaW4gd2lsbCBnaXZlCiAgIHlvdSBhIGNoYW5jZSB0byB1cGdyYWRlIHRoZSBtb2R1bGUuIFRoaXMgaXMgdGhlIGZ1bmN0aW9uCiAgIHRoYXQgYWN0dWFsbHkgaGFuZGxlcyB0aGUgdXBncmFkZS4KICAgSWRlYWxseSwgdGhpcyBmdW5jdGlvbiBzaG91bGQgaGFuZGxlIHVwZ3JhZGVzIGluY3JlbWVudGFsbHksCiAgIHNvIHlvdSBjb3VsZCB1cGdyYWRlIGZyb20gdmVyc2lvbiAwLjAuMSB0byAxMC41Ljcgd2l0aAogICBhIHNpbmdsZSBjYWxsLiBGb3IgYSBncmVhdCBleGFtcGxlIG9mIHRoaXMsIHNlZSB0aGUgTmV3cwogICBtb2R1bGUgaW4gdGhlIHN0YW5kYXJkIENNUyBpbnN0YWxsLgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIFVwZ3JhZGUoJG9sZHZlcnNpb24sICRuZXd2ZXJzaW9uKQogIHsKICAgICRjdXJyZW50X3ZlcnNpb24gPSAkb2xkdmVyc2lvbjsKICAgIHN3aXRjaCgkY3VycmVudF92ZXJzaW9uKQogICAgICB7CiAgICAgIGNhc2UgIjEuMCI6CgkvLyBkb24ndCBkbyBhbnl0aGluZy4uLiB3ZSBjYW4ndCB1cGdyYWRlIHRoaXMKCWJyZWFrOwogICAgICBjYXNlICIyLjAiOgoJLy8gd2UgbmVlZCB0byBhZGQgYSBjb2x1bW4gdG8gdGhlIGJhbm5lcnMgdGFibGUKCSRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJJGRpY3QgPSBOZXdEYXRhRGljdGlvbmFyeSgkZGIpOwoJJHNxbGFycmF5ID0gJGRpY3QtPkFkZENvbHVtblNRTChjbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzIiwgImhyZWZfdGV4dCBDKDI1NSkiKTsKCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCSRjdXJyZW50X3ZlcnNpb24gPSAiMi4wLjEiOwoJYnJlYWs7CiAgICAgIGNhc2UgIjIuMC4xIjoKICAgICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhIGNvbHVtbiB0byB0aGUgY2F0ZWdvcmllcyB0YWJsZQoJJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgkkZGljdCA9IE5ld0RhdGFEaWN0aW9uYXJ5KCRkYik7Cgkkc3FsYXJyYXkgPSAkZGljdC0+QWRkQ29sdW1uU1FMKGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyIsICJ1cGxvYWRzX2NhdGVnb3J5X2lkIEkiKTsKCSRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCWJyZWFrOwogICAgICB9CgkgIAogICAgLy8gcHV0IG1lbnRpb24gaW50byB0aGUgYWRtaW4gbG9nCiAgICAkdGhpcy0+QXVkaXQoIDAsICR0aGlzLT5MYW5nKCdmcmllbmRseW5hbWUnKSwgCgkJICAkdGhpcy0+TGFuZygndXBncmFkZWQnLCR0aGlzLT5HZXRWZXJzaW9uKCkpKTsKICB9CgkKCQogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIFVuaW5zdGFsbCgpCiAgIFNvbWV0aW1lcywgYW4gZXhjZXB0aW9uYWxseSB1bmVubGlnaHRlbmVkIG9yIGlnbm9yYW50CiAgIGFkbWluIHdpbGwgd2lzaCB0byB1bmluc3RhbGwgeW91ciBtb2R1bGUuIFdoaWxlIGl0CiAgIHdvdWxkIGJlIGJlc3QgdG8gbGF5IGludG8gdGhlc2UgaWRpb3RzIHdpdGggYSBjbHVlc3RpY2ssCiAgIHdlIHdpbGwgZG8gdGhlIG1hZ25hbmltb3VzIHRoaW5nIGFuZCByZW1vdmUgdGhlIG1vZHVsZQogICBhbmQgY2xlYW4gdXAgdGhlIGRhdGFiYXNlLCBwZXJtaXNzaW9ucywgYW5kIHByZWZlcmVuY2VzCiAgIHRoYXQgYXJlIHNwZWNpZmljIHRvIGl0LgogICBUaGlzIGlzIHRoZSBtZXRob2Qgd2hlcmUgd2UgZG8gdGhpcy4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBVbmluc3RhbGwoKQogIHsKICAgICRkYiA9ICR0aGlzLT5jbXMtPmRiOwoJICAKICAgIC8vIHJlbW92ZSB0aGUgZGF0YWJhc2UgdGFibGUKICAgICRkaWN0ID0gTmV3RGF0YURpY3Rpb25hcnkoICRkYiApOwogICAgJHNxbGFycmF5ID0gJGRpY3QtPkRyb3BUYWJsZVNRTCggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfY2F0ZWdvcmllcyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKICAgICRzcWxhcnJheSA9ICRkaWN0LT5Ecm9wVGFibGVTUUwoIGNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnNfaGl0cyIgKTsKICAgICRkaWN0LT5FeGVjdXRlU1FMQXJyYXkoJHNxbGFycmF5KTsKCSAgCiAgICAvLyByZW1vdmUgdGhlIHNlcXVlbmNlCiAgICAkZGItPkRyb3BTZXF1ZW5jZSggY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfY29uc3VsdGFudF9zZXEiICk7CgkgIAogICAgLy8gcmVtb3ZlIHRoZSBwZXJtaXNzaW9ucwogICAgJHRoaXMtPlJlbW92ZVBlcm1pc3Npb24oJ01hbmFnZSBCYW5uZXJzJyk7CgogICAgLy8gYW5kIHRoZSBwcmVmZXJlbmNlcwogICAgJHRoaXMtPlJlbW92ZVByZWZlcmVuY2UgKCJzdWJuZXRfZXhjbHVzaW9ucyIpOwoJICAKICAgIC8vIHB1dCBtZW50aW9uIGludG8gdGhlIGFkbWluIGxvZwogICAgJHRoaXMtPkF1ZGl0KCAwLCAkdGhpcy0+TGFuZygnZnJpZW5kbHluYW1lJyksICR0aGlzLT5MYW5nKCd1bmluc3RhbGxlZCcpKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpCiAgIFRoaXMgaXMgdGhlIG1haW4gZnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBpZiB5b3VyIG1vZHVsZQogICBpcyBhIHBsdWctaW4gdHlwZSBtb2R1bGUuCgkgICAKICAgSW4gZ2VuZXJhbCwgeW91J2xsIHdhbnQgdG8gY2FsbCB2YXJpb3VzIGRpZmZlcmVudAogICBtZXRob2RzLCBkZXBlbmRpbmcgdXBvbiB0aGUgcmVxdWVzdGVkICJhY3Rpb24uIgoJICAgCiAgIFRoZXJlIGFyZSB0d28gYnVpbHQtaW4gYWN0aW9uczogImRlZmF1bHQiIHdoaWNoIGdldHMKICAgY2FsbGVkIGlmIHRoZSBtb2R1bGUgaXMgYWNjZXNzZWQgZnJvbSBhIHBhZ2Ugb3IgdGVtcGxhdGUsCiAgIGFuZCAiZGVmYXVsdGFkbWluIiB3aGljaCBnZXRzIGNhbGxlZCBmcm9tIHRoZSBBZG1pbgogICBwYW5lbC4KCSAgIAogICBUaGUgQWN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHBhc3NpbmcgYSBkaWZmZXJlbnQKICAgYWN0aW9uIGVpdGhlciBpbiB5b3VyIHRhZywgZS5nLiwKICAge2Ntc19tb2R1bGUgbW9kdWxlPSdCYW5uZXJzJyBhY3Rpb249J3NvbWV0aGluZyd9CiAgIG9yIGJ5IHBhc3NpbmcgaXQgaW4gYSBsaW5rIGNyZWF0ZSBieSB0aGUgQ3JlYXRlTGluawogICBtZXRob2QuIE1vcmUgb24gdGhhdCBjYW4gYmUgc2VlbiBiZWxvdyBpbiB0aGUKICAgRGlzcGxheUFkbWluTmF2IG1ldGhvZC4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBEb0FjdGlvbigkYWN0aW9uLCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQ9LTEpCiAgewogICAgc3dpdGNoICgkYWN0aW9uKQogICAgICB7CiAgICAgIGNhc2UgJ2FkZGJhbm5lcic6Cgl7CgkgIGlmKCAkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5BZGRCYW5uZXIoICRpZCwgJHBhcmFtcywgJHJldHVybl9pZCApOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2FkZGNhdGVnb3J5JzoKCXsKCSAgaWYoICR0aGlzLT5DaGVja1Blcm1pc3Npb24oJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkFkZENhdGVnb3J5KCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQgKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkZWZhdWx0JzoKCXsKCSAgLy8gdGhpcyBpcyB0aGUgcGx1Zy1pbiBzaWRlLCBpLmUuLCBub24tQWRtaW4KCSAgJHRoaXMtPl9EaXNwbGF5TW9kdWxlT3V0cHV0KCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkZWZhdWx0YWRtaW4nOgoJewoJICAvLyBvbmx5IGxldCBwZW9wbGUgYWNjZXNzIG1vZHVsZSBwcmVmZXJlbmNlcyBpZiB0aGV5IGhhdmUgcGVybWlzc2lvbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0Rpc3BsYXlBZG1pblBhbmVsKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgICAgICR0aGlzLT5MYW5nKCdhY2Nlc3NkZW5pZWQnKSk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZGVsZXRlY2F0ZWdvcnknOgoJewoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRlbGV0ZUNhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2RvX2FkZGJhbm5lcic6Cgl7CgkgIC8vIGNoZWNrIHBlcm1pc3Npb25zIGFnYWluCgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRG9BZGRCYW5uZXIgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZG9fYWRkY2F0ZWdvcnknOgoJewoJICAvLyBjaGVjayBwZXJtaXNzaW9ucyBhZ2FpbgoJICBpZiAoJHRoaXMtPkNoZWNrUGVybWlzc2lvbiAoJ01hbmFnZSBCYW5uZXJzJykpCgkgICAgewoJICAgICAgJHRoaXMtPl9BZG1pbkRvQWRkQ2F0ZWdvcnkgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZG9fZGVsZXRlYmFubmVyJzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5Eb0RlbGV0ZUJhbm5lciAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdkb19lZGl0YmFubmVyJzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5Eb0VkaXRCYW5uZXIgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCk7CgkgICAgfQoJICBicmVhazsKCX0KICAgICAgY2FzZSAnZG9fZWRpdGNhdGVnb3J5JzoKCXsKCSAgLy8gY2hlY2sgcGVybWlzc2lvbnMgYWdhaW4KCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5Eb0VkaXRDYXRlZ29yeSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkKTsKCSAgICB9CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdlZGl0YmFubmVyJzoKCXsKCSAgaWYgKCR0aGlzLT5DaGVja1Blcm1pc3Npb24gKCdNYW5hZ2UgQmFubmVycycpKQoJICAgIHsKCSAgICAgICR0aGlzLT5fQWRtaW5FZGl0QmFubmVyICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2VkaXRjYXRlZ29yeSc6Cgl7CgkgIGlmICgkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uICgnTWFuYWdlIEJhbm5lcnMnKSkKCSAgICB7CgkgICAgICAkdGhpcy0+X0FkbWluRWRpdENhdGVnb3J5ICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQpOwoJICAgIH0KCSAgYnJlYWs7Cgl9CiAgICAgIGNhc2UgJ2xpbmsnOgoJewoJICAkdGhpcy0+X0RvTGlua0FjdGlvbiggJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkICk7CgkgIGJyZWFrOwoJfQogICAgICBjYXNlICdzYXZlX2FkbWluX3ByZWZzJzoKCXsKCSAgJHRoaXMtPl9Eb1NhdmVBZG1pblByZWZzKCAkaWQsICRwYXJhbXMsICRyZXR1cm5faWQgKTsKCSAgYnJlYWs7Cgl9CiAgICAgIH0KICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheU1vZHVsZU91dHB1dCgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgVGhpcyBpcyBhbiBleGFtcGxlIG9mIGEgc2ltcGxlIG1ldGhvZCB0byBkaXNwbGF5CiAgIHNvbWV0aGluZyB3aGVyZSBhIHBhZ2Ugb3IgdGVtcGxhdGUgaGFzIGEgdGFnIGNhbGxpbmcKICAgdGhpcyBtb2R1bGUuCgkgICAKICAgTm90ZSB0aGF0IGl0IHVzZXMgYSB0ZW1wbGF0ZSwgYW5kIGlzIHRodXMgdmVyeSBwb3dlcmZ1bCwKICAgZXZlbiBpZiBpdCdzIHNpbXBsZS4KICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheU1vZHVsZU91dHB1dCgkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQpCiAgewogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CgogICAgLy8gdGVzdCBpZiB3ZSBhcmUgZXhjbHVkaW5nIHRoaXMgSVAgZnJvbSB0aGUgY291bnRpbmcKICAgICRleGNsdWRlID0gMDsKICAgICRzdWJuZXRzID0gc3BsaXQoIiwiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJzdWJuZXRfZXhjbHVzaW9ucyIpKTsKICAgICR0ZXN0ID0gMDsKICAgIGZvcmVhY2goJHN1Ym5ldHMgYXMgJHN1Ym5ldCkKICAgIHsKICAgICAgJHRlc3QgPSAkdGhpcy0+X3Rlc3RpcCggJHN1Ym5ldCwgZ2V0ZW52KCJSRU1PVEVfQUREUiIgKSApOwogICAgICBpZiggJHRlc3QgKQoJewoJICAvLyBkb24ndCBhbGxvdyBhbnkgbW9yZSBwcm9jZXNzaW5nCgkgICRleGNsdWRlID0gMTsKCX0KICAgIH0KICAgIAoKICAgIC8vIHRlc3QgaWYgd2UgYXJlIGV4Y2x1ZGluZyB0aGUgUkVNT1RFX0FERFIgZnJvbSBzdGF0aXN0aWNzIGdhdGhlcmluZwogICAgaWYoICFpc3NldCggJHBhcmFtc1snY2F0ZWdvcnknXSApICkgCiAgICAgIHsKCSR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAoJCQkJICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKCXJldHVybjsKICAgICAgfQoKICAgICRjYXRlZ29yeV9pZD0tMTsKICAgICRjYXRlZ29yeT0iIjsKICAgIHsKICAgICAgLy8gbG9va3VwIHRoZSBjYXRlZ29yeSBuYW1lIGFuZCBnZXQgdGhlIGlkCiAgICAgICRxMiA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzIFdIRVJFIAogICAgICAgICAgIG5hbWUgPSA/IjsKICAgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcTIsIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeSddICkgKTsKICAgICAgaWYoICEkZGJyZXN1bHQgKSAKCXsKCSAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJICByZXR1cm47Cgl9CiAgICAgICRjYXRlZ29yeSA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKTsKICAgICAgaWYoICEkY2F0ZWdvcnkgKSAKCXsKCSAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJICByZXR1cm47Cgl9CiAgICAgICRjYXRlZ29yeV9pZCA9ICRjYXRlZ29yeVsnY2F0ZWdvcnlfaWQnXTsKICAgIH0KCiAgICAkZnJvbSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBXSEVSRSAoY2F0ZWdvcnlfaWQgPSBcIiRjYXRlZ29yeV9pZFwiKSBBTkQiOwogICAgJHdoZXJlIC49ICIoZXhwaXJlcyA+IFwiIi4kZGItPkRCVGltZVN0YW1wKHRpbWUoKSkuIlwiKQogICAgICAgQU5EIChtYXhfaW1wcmVzc2lvbnMgPSAwIE9SIG51bV9pbXByZXNzaW9ucyA8IG1heF9pbXByZXNzaW9ucykiOwogICAgJG9yZGVyID0gIk9SREVSIEJZIFJBTkQoKSBMSU1JVCAwLDEiOwoKICAgIC8vIGRvIHdlIHdhbnQgYSBzcGVjaWZpYyBiYW5uZXIKICAgIGlmKCBpc3NldCggJHBhcmFtc1snbmFtZSddICkgKQogICAgICB7Cgkkd2hlcmUgLj0gIkFORCBOQU1FID0gXCIiLiRwYXJhbXNbJ25hbWUnXS4iXCIiOwogICAgICB9CgogICAgJHF1ZXJ5ID0gJGZyb20gLiAiICIgLiAkd2hlcmUgLiAiICIgLiAkb3JkZXI7CgogICAgJGRicmVzdWx0ID0gJGRiLT5xdWVyeSggJHF1ZXJ5ICk7CiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CgkkdGhpcy0+X0Rpc3BsYXlFcnJvclBhZ2UgKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwKCQkJCSAgJHRoaXMtPkxhbmcgKCdlcnJvcl9kYmVycm9yJykpOwoJcmV0dXJuOwogICAgICB9CiAgICAkcm93ID0gJGRicmVzdWx0LT5GZXRjaFJvdygpOwogICAgaWYoICEkcm93ICkgCiAgICAgIHsKCS8vIHF1ZXJ5IHdvcmtlZCwgYnV0IG5vIHJlc3VsdHMsIG5vdyB3aGF0IGRvIHdlIGRvCgkvLyBmb3IgZGVidWcgcHVycG9zZXMsIHJldHVybiBhbiBlcnJvcgoJJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCgkJCQkgICR0aGlzLT5MYW5nICgnZXJyb3Jfbm9yZXN1bHRzJykpOwoJcmV0dXJuOwogICAgICB9CgogICAgLy8gaW1hZ2UsdXJsIG9yIHRleHQgbWF5IGJlIHNldCBoZXJlLgogICAgLy8gZ290dGEgZmlndXJlIG91dCB3aGljaAogICAgZWNobyAnPCEtLSBCZWdpbiBCYW5uZXIgT3V0cHV0IC0tPic7CiAgICAkdHh0ID0gIiI7CiAgICBpZiggaXNzZXQoICRyb3dbJ2ltYWdlJ10gKSAmJiBpc3NldCggJHJvd1sndXJsJ10gKSApIAogICAgICB7CgkkaW1hZ2UgPSAiPGltZyBzcmM9XCIiLiJ1cGxvYWRzIi5ESVJFQ1RPUllfU0VQQVJBVE9SLiRyb3dbJ2ltYWdlJ10uIlwiIjsKICAgICAgICBpZiggJGNhdGVnb3J5WydpbWFnZV93aWR0aCddICkKCSAgewoJICAgICRpbWFnZSAuPSAiIHdpZHRoPVwiIi4kY2F0ZWdvcnlbJ2ltYWdlX3dpZHRoJ10uIlwiICI7CgkgIH0KICAgICAgICBpZiggJGNhdGVnb3J5WydpbWFnZV9oZWlnaHQnXSApCgkgIHsKCSAgICAkaW1hZ2UgLj0gIiBoZWlnaHQ9XCIiLiRjYXRlZ29yeVsnaW1hZ2VfaGVpZ2h0J10uIlwiICI7CgkgIH0KCWlmKCAkcm93Wyd0ZXh0J10gKQoJICB7CgkgICAgJGltYWdlIC49ICRyb3dbJ3RleHQnXTsKCSAgfQoJJGltYWdlIC49ICI+IjsKCWVjaG8gJHRoaXMtPkNyZWF0ZUxpbmsoJGlkLCAnbGluaycsICRyZXR1cm5pZCwgJGltYWdlLAoJCQkgICAgICAgYXJyYXkoJ2Jhbm5lcl9pZCc9PiRyb3dbJ2Jhbm5lcl9pZCddLAoJCQkJICAgICAnY2F0ZWdvcnlfaWQnPT4kY2F0ZWdvcnlfaWQpLAoJCQkgICAgICAgJycsIGZhbHNlLCBmYWxzZSwgJHJvd1snaHJlZl90ZXh0J10pOwogICAgICAgIGVjaG8gJzwhLS0gRW5kIEJhbm5lciBPdXRwdXQgLS0+JzsKICAgIH0KICAgIAogICAgLy8gdXBkYXRlIHRoZSBleHByZXNzaW9ucwogICAgaWYoICRleGNsdWRlID09IDAgKSB7CiAgICAgICRpbXByZXNzaW9ucyA9ICRyb3dbIm51bV9pbXByZXNzaW9ucyJdICsgMTsKICAgICAgJHF1ZXJ5ID0gIlVQREFURSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMgU0VUIG51bV9pbXByZXNzaW9ucyA9ICRpbXByZXNzaW9ucyBXSEVSRSBiYW5uZXJfaWQ9Ii4kcm93WyJiYW5uZXJfaWQiXTsgCiAgICAgICRkYnJlc3VsdCA9ICRkYi0+RXhlY3V0ZSggJHF1ZXJ5ICk7IAogICAgfQogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5RXJyb3JQYWdlKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBUaGlzIGlzIGFuIGV4YW1wbGUgb2YgYSBzaW1wbGUgbWV0aG9kIHRvIGRpc3BsYXkKICAgZXJyb3IgaW5mb3JtYXRpb24gb24gdGhlIGFkbWluIHNpZGUuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0Rpc3BsYXlFcnJvclBhZ2UoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZT0nJykKICB7CiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCd0aXRsZV9lcnJvcicsICR0aGlzLT5MYW5nKCdlcnJvcicpKTsKICAgIGlmICgkbWVzc2FnZSAhPSAnJykKICAgICAgewoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZignbWVzc2FnZScsICRtZXNzYWdlKTsKICAgICAgfQogICAgICAKICAgIC8vIERpc3BsYXkgdGhlIHBvcHVsYXRlZCB0ZW1wbGF0ZQogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdlcnJvci50cGwnKTsKICB9CgoKICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgaXMgYW4gZXhhbXBsZSBvZiBhIHNpbXBsZSBtZXRob2QgdG8gcHJlc2VudCBhbiBBZG1pbgogICBwYW5lbC4KCSAgIAogICBJdCBzZXRzIHNtYXJ0eSB0YWcgdmFsdWVzLCBhbmQgdGhlbiBjYWxscyB0aGUKICAgY29kZSBuZWNlc3NhcnkgdG8gcmVuZGVyIHRoZSB0ZW1wbGF0ZS4gICAKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KICBmdW5jdGlvbiBfRGlzcGxheUFkbWluUGFuZWwoJGlkLCAmJHBhcmFtcywgJHJldHVybmlkLCAkbWVzc2FnZT0nJykKICB7CiAgICBlY2hvICR0aGlzLT5TdGFydFRhYkhlYWRlcnMoKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcignYmFubmVycycsICR0aGlzLT5MYW5nKCdiYW5uZXJzJykpOwogICAgZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyICgnY2F0ZWdvcmllcycsICR0aGlzLT5MYW5nICgnY2F0ZWdvcmllcycpKTsKICAgIGVjaG8gJHRoaXMtPlNldFRhYkhlYWRlciAoJ3ByZWZlcmVuY2VzJywgJHRoaXMtPkxhbmcoJ3ByZWZlcmVuY2VzJykpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiSGVhZGVycygpOwoKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiQ29udGVudCgpOwogICAgICAKICAgIC8vIHRoZSBiYW5uZXJzIHRhYgogICAgZWNobyAkdGhpcy0+U3RhcnRUYWIoJ2Jhbm5lcnMnKTsKICAgICR0aGlzLT5fRGlzcGxheUJhbm5lcnNUYWIoJGlkLCAkcGFyYW1zLCRyZXR1cm5pZCk7CiAgICBlY2hvICR0aGlzLT5FbmRUYWIoKTsKCiAgICAvLyB0aGUgY2F0ZWdvcmllcyB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdjYXRlZ29yaWVzJyk7CiAgICAkdGhpcy0+X0Rpc3BsYXlDYXRlZ29yaWVzVGFiKCRpZCwgJHBhcmFtcywgJHJldHVybmlkKTsKICAgIGVjaG8gJHRoaXMtPkVuZFRhYigpOwoKICAgIC8vIHRoZSBwcmVmZXJlbmNlcyB0YWIKICAgIGVjaG8gJHRoaXMtPlN0YXJ0VGFiKCdwcmVmZXJlbmNlcycpOwogICAgJHRoaXMtPl9EaXNwbGF5UHJlZnNUYWIoJGlkLCAkcGFyYW1zLCAkcmV0dXJuaWQpOwogICAgZWNobyAkdGhpcy0+RW5kVGFiKCk7CgogICAgLy8gZG9uZSB0YWJzCiAgICBlY2hvICR0aGlzLT5FbmRUYWJDb250ZW50KCk7CiAgICByZXR1cm47CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlCYW5uZXJzVGFiKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0Rpc3BsYXlCYW5uZXJzVGFiKCAkaWQsICYkcGFyYW1zLCAkcmV0dXJuaWQgKQogIHsKICAgIGdsb2JhbCAkZ0NtczsKCiAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY2F0ZWdvcnkgZm9yIHRoZSBmaWx0ZXIKICAgICRjdXJjYXRlZ29yeSA9IAogICAgICAoaXNzZXQoJHBhcmFtc1snY3VyY2F0ZWdvcnknXSkgPyAkcGFyYW1zWydjdXJjYXRlZ29yeSddIDogJycpOwogICAgaWYoIGlzc2V0KCRwYXJhbXNbJ3N1Ym1pdGNhdGVnb3J5J10pICkKICAgICAgewoJJGN1cmNhdGVnb3J5ID0KCSAgKGlzc2V0ICgkcGFyYW1zWydpbnB1dF9jYXRlZ29yeSddKSA/ICRwYXJhbXNbJ2lucHV0X2NhdGVnb3J5J10gOgoJICAgJycpOwogICAgICB9CgogICAgLy8gZ2V0IGEgY2F0ZWdvcnkgbGlzdCBmb3IgdGhlIGZpbHRlcgogICAgJGRiID0gJHRoaXMtPmNtcy0+ZGI7CiAgICAkY2F0ZWdvcnlsaXN0ID0gYXJyYXkoKTsKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVyc19jYXRlZ29yaWVzCiAgICAgICAgICBPUkRFUiBCWSBuYW1lIEFTQyI7CgogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKCiAgICBpZiggISRkYnJlc3VsdCApIAogICAgICB7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywxKTsKCSR0aGlzLT5zbWFydHktPmFzc2lnbignbWVzc2FnZScsICR0aGlzLT5MYW5nKCdlcnJvcl9ub2NhdGVnb3JpZXMnKSk7CiAgICAgIH0KICAgIGVsc2UKICAgICAgewoJd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQoJICB7CgkgICAgaWYoICRjdXJjYXRlZ29yeSA9PSAnJyApCgkgICAgICB7CgkJJGN1cmNhdGVnb3J5ID0gJHJvd1snY2F0ZWdvcnlfaWQnXTsKCSAgICAgIH0KCSAgICAkY2F0ZWdvcnlsaXN0WyRyb3dbJ25hbWUnXV0gPSAkcm93WydjYXRlZ29yeV9pZCddOwoJICB9CgoJLy8gc2V0dXAgdGhlIGZvcm0gcGFydCBvZiB0aGUgdGVtcGxhdGUKCSR0aGlzLT5zbWFydHktPmFzc2lnbiAoJ3N0YXJ0Zm9ybScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlRm9ybVN0YXJ0ICgkaWQsICdkZWZhdWx0YWRtaW4nKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYXRlZ29yeScsICR0aGlzLT5MYW5nICgnY2F0ZWdvcnknKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9jYXRlZ29yeScsCgkJCSAgICAgICAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wRG93biAoJGlkLCAiaW5wdXRfY2F0ZWdvcnkiLCAkY2F0ZWdvcnlsaXN0LCAtMSwKCQkJCQkJCSAgICRjdXJjYXRlZ29yeSkpOwoJJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnaW5wdXRfc2VsZWN0JywKCQkJICAgICAgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0Y2F0ZWdvcnknLAoJCQkJCQkJICR0aGlzLT5MYW5nKCdzZWxlY3RjYXRlZ29yeScpKSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdpbnB1dF9oaWRkZW4nLAoJCQkgICAgICAgJHRoaXMtPkNyZWF0ZUlucHV0SGlkZGVuICgkaWQsICdjdXJjYXRlZ29yeScsCgkJCQkJCQkgJGN1cmNhdGVnb3J5KSk7CgkkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwoKCWlmKCAkY3VyY2F0ZWdvcnkgIT0gJycgKSAKCSAgewoJICAgIC8vIGZpbGwgaW4gdGhlIGJhbm5lcnMgcGFydCBvZiB0aGUgcmVwb3J0CgkgICAgJGRicmVzdWx0ID0gJyc7CgkgICAgJHJvd2FycmF5ID0gYXJyYXkoKTsKCSAgICAkcXVlcnkgPSAiU0VMRUNUICogRlJPTSAiLmNtc19kYl9wcmVmaXgoKS4ibW9kdWxlX2Jhbm5lcnMgV0hFUkUgY2F0ZWdvcnlfaWQgPSA/CiAgICAgICAgICAgICAgICAgICAgT1JERVIgQlkgY3JlYXRlZCI7CgkgICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCRjdXJjYXRlZ29yeSkpOwoKCSAgICAkcm93Y2xhc3MgPSAncm93MSc7CgkgICAgaWYoICEgJGRicmVzdWx0ICkKCSAgICAgIHsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Vycm9yJywxKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ21lc3NhZ2UnLCAkdGhpcy0+TGFuZygnZXJyb3JfYmFubmVycycpKTsKCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICB7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpZHRleHQnLCR0aGlzLT5MYW5nKCdpZCcpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ25hbWV0ZXh0JywkdGhpcy0+TGFuZygnbmFtZScpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Rlc2N0ZXh0JywkdGhpcy0+TGFuZygnZGVzY3JpcHRpb24nKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjcmVhdGVkdGV4dCcsJHRoaXMtPkxhbmcoJ2NyZWF0ZWQnKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdleHBpcmVzdGV4dCcsJHRoaXMtPkxhbmcoJ2V4cGlyZXMnKSk7CgkJJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdpbXByZXNzaW9uc3RleHQnLCR0aGlzLT5MYW5nKCdpbXByZXNzaW9ucycpKTsKCQkkdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2hpdHN0ZXh0JywkdGhpcy0+TGFuZygnaGl0cycpKTsKCQl3aGlsZSggJHJvdyA9ICRkYnJlc3VsdC0+RmV0Y2hSb3coKSApCgkJICB7CgkJICAgICRvbmVyb3cgPSBuZXcgc3RkQ2xhc3MoKTsKCiAgICAgICAgICAgICAgICAgICAgJHEzID0gIlNFTEVDVCBDT1VOVChiYW5uZXJfaWQpIEFTIGNvdW50IEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2hpdHMKICAgICAgICAgICAgICAgICAgICAgIFdIRVJFIGJhbm5lcl9pZCA9ID8iOwogICAgICAgICAgICAgICAgICAgICRkYnJlc3VsdDIgPSAkZGItPkV4ZWN1dGUoICRxMywgYXJyYXkoICRyb3dbJ2Jhbm5lcl9pZCddICkgKTsKCQkgICAgaWYoICRkYnJlc3VsdDIgKSB7CgkJICAgICAgJHIyID0gJGRicmVzdWx0Mi0+RmV0Y2hSb3coKTsKCQkgICAgICBpZiggJHIyICkgewoJCSAgICAgICAgJG9uZXJvdy0+aGl0cyA9ICRyMlsnY291bnQnXTsKICAgICAgICAgICAgICAgICAgICAgIH0KCQkgICAgfQoKCQkgICAgJG9uZXJvdy0+aWQgPSAkcm93WydiYW5uZXJfaWQnXTsKCQkgICAgJG9uZXJvdy0+bmFtZSA9ICRyb3dbJ25hbWUnXTsKCQkgICAgJG9uZXJvdy0+ZGVzY3JpcHRpb24gPSAkcm93WydkZXNjcmlwdGlvbiddOwoJCSAgICAkb25lcm93LT5jcmVhdGVkID0gJHJvd1snY3JlYXRlZCddOwoJCSAgICAkb25lcm93LT5leHBpcmVzID0gJHJvd1snZXhwaXJlcyddOwoJCSAgICAkb25lcm93LT5pbXByZXNzaW9ucyA9ICRyb3dbJ251bV9pbXByZXNzaW9ucyddOwoJCSAgICAkb25lcm93LT5tYXhfaW1wcmVzc2lvbnMgPSAoJHJvd1snbWF4X2ltcHJlc3Npb25zJ10gPT0gJycpID8gMCA6ICRyb3dbJ21heF9pbXByZXNzaW9ucyddOwoJCSAgICAkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCQkgICAgCgkJICAgICRvbmVyb3ctPmVkaXRsaW5rID0KCQkgICAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZWRpdGJhbm5lcicsICRyZXR1cm5pZCwKCQkJCQkgJGdDbXMtPnZhcmlhYmxlc1snYWRtaW50aGVtZSddLT5EaXNwbGF5SW1hZ2UoJ2ljb25zL3N5c3RlbS9lZGl0LmdpZicsCgkJCQkJCQkJCQkgICAgICAkdGhpcy0+TGFuZyAoJ2VkaXQnKSwgJycsICcnLCAnc3lzdGVtaWNvbicpLAoJCQkJCSBhcnJheSAoJ2Jhbm5lcl9pZCcgPT4gJHJvd1snYmFubmVyX2lkJ10sCgkJCQkJCSdjYXRlZ29yeV9pZCcgPT4gJGN1cmNhdGVnb3J5KSk7CgkJICAgIAoJCSAgICAkb25lcm93LT5kZWxldGVsaW5rID0gCgkJICAgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwnZG9fZGVsZXRlYmFubmVyJywkcmV0dXJuaWQsCgkJCQkJICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlKCdpY29ucy9zeXN0ZW0vZGVsZXRlLmdpZicsCgkJCQkJCQkJCQkgICAgICAkdGhpcy0+TGFuZyAoJ2RlbGV0ZScpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCQkJIGFycmF5ICgnYmFubmVyX2lkJyA9PiAkcm93WydiYW5uZXJfaWQnXSwKCQkJCQkJJ2NhdGVnb3J5X2lkJyA9PiAkY3VyY2F0ZWdvcnkpLAoJCQkJCSAkdGhpcy0+TGFuZyAoJ2FyZXlvdXN1cmUnKSk7CgkJICAgIAoJCSAgICBhcnJheV9wdXNoICgkcm93YXJyYXksICRvbmVyb3cpOwoJCSAgICAoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CgkJICAgIAoJCSAgfSAvLyB3aGlsZQoJICAgICAgfSAvLyBpZgoKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdpdGVtcycsJHJvd2FycmF5KTsKCSAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmKCdpdGVtY291bnQnLCBjb3VudCgkcm93YXJyYXkpKTsKCSAgfSAvLyBpZgogICAgICB9IC8vIGVsc2UKCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnYWRkbGluaycsCgkJCQkgICR0aGlzLT5DcmVhdGVMaW5rICgkaWQsICdhZGRiYW5uZXInLAoJCQkJCQkgICAgICRyZXR1cm5pZCwKCQkJCQkJICAgICAkdGhpcy0+TGFuZyAoJ2FkZGJhbm5lcicpLAoJCQkJCQkgICAgIGFycmF5ICgnY2F0ZWdvcnlfaWQnID0+ICRjdXJjYXRlZ29yeSksICcnLCBmYWxzZSwKCQkJCQkJICAgICBmYWxzZSwKCQkJCQkJICAgICAnY2xhc3M9InBhZ2VvcHRpb25zIicpKTsKICAgIAogICAgZWNobyAkdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdiYW5uZXJsaXN0LnRwbCcpOwogICAgcmV0dXJuOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9EaXNwbGF5Q2F0ZWdvcmllc1RhYigkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5Q2F0ZWdvcmllc1RhYiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKICAgICRyb3dhcnJheSA9IGFycmF5KCk7CiAgICAkZGJyZXN1bHQgPSAnJzsKICAgIAogICAgJHF1ZXJ5ID0gIlNFTEVDVCAqIEZST00gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2NhdGVnb3JpZXMiOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnkgKTsKICAgICRyb3djbGFzcyA9ICdyb3cxJzsKCiAgICBnbG9iYWwgJGdDbXM7CgogICAgd2hpbGUoICRyb3cgPSAkZGJyZXN1bHQtPkZldGNoUm93KCkgKQogICAgICB7Cgkkb25lcm93ID0gbmV3IHN0ZENsYXNzKCk7Cgkkb25lcm93LT5pZCA9ICRyb3dbJ2NhdGVnb3J5X2lkJ107Cgkkb25lcm93LT5uYW1lID0gJHJvd1snbmFtZSddOwoJJG9uZXJvdy0+ZGVzY3JpcHRpb24gPSAkcm93WydkZXNjcmlwdGlvbiddOwoJJG9uZXJvdy0+d2lkdGggPSAkcm93WydpbWFnZV93aWR0aCddOwoJJG9uZXJvdy0+aGVpZ2h0ID0gJHJvd1snaW1hZ2VfaGVpZ2h0J107Cgkkb25lcm93LT5yb3djbGFzcyA9ICRyb3djbGFzczsKCgkkb25lcm93LT5lZGl0bGluayA9CgkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2VkaXRjYXRlZ29yeScsICRyZXR1cm5pZCwKCQkJICAgICAgICRnQ21zLT52YXJpYWJsZXNbJ2FkbWludGhlbWUnXS0+RGlzcGxheUltYWdlICgnaWNvbnMvc3lzdGVtL2VkaXQuZ2lmJywKCQkJCQkgICAgICR0aGlzLT5MYW5nICgnZWRpdCcpLCAnJywgJycsICdzeXN0ZW1pY29uJyksCgkJCSAgICAgICBhcnJheSAoJ2NhdGVnb3J5X2lkJyA9PiAkcm93WydjYXRlZ29yeV9pZCddKSk7Cgkkb25lcm93LT5kZWxldGVsaW5rID0KCSAgICAkdGhpcy0+Q3JlYXRlTGluayAoJGlkLCAnZGVsZXRlY2F0ZWdvcnknLCAkcmV0dXJuaWQsCgkJCSAgICAgICAkZ0Ntcy0+dmFyaWFibGVzWydhZG1pbnRoZW1lJ10tPkRpc3BsYXlJbWFnZSAoJ2ljb25zL3N5c3RlbS9kZWxldGUuZ2lmJywKCQkJCQkgICAgICR0aGlzLT5MYW5nICgnZGVsZXRlJyksICcnLCAnJywgJ3N5c3RlbWljb24nKSwKCQkJICAgICAgIGFycmF5ICgnY2F0ZWdvcnlfaWQnID0+ICRyb3dbJ2NhdGVnb3J5X2lkJ10pLAoJCQkgICAgICAgJHRoaXMtPkxhbmcgKCdhcmV5b3VzdXJlJykpOwoKCWFycmF5X3B1c2ggKCRyb3dhcnJheSwgJG9uZXJvdyk7CgkoJHJvd2NsYXNzID09ICJyb3cxIiA/ICRyb3djbGFzcyA9ICJyb3cyIiA6ICRyb3djbGFzcyA9ICJyb3cxIik7CiAgICAgIH0KCgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdjYXRlZ29yeXRleHQnLCAkdGhpcy0+TGFuZyAoJ2NhdGVnb3J5JykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCduYW1ldGV4dCcsICR0aGlzLT5MYW5nICgnbmFtZScpKTsKICAgICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduICgnZGVzY3RleHQnLCAkdGhpcy0+TGFuZyAoJ2Rlc2NyaXB0aW9uJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCd3aWR0aHRleHQnLCAkdGhpcy0+TGFuZyAoJ3dpZHRoJykpOwogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ24gKCdoZWlnaHR0ZXh0JywgJHRoaXMtPkxhbmcgKCdoZWlnaHQnKSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtcycsICRyb3dhcnJheSk7CiAgICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdpdGVtY291bnQnLCBjb3VudCAoJHJvd2FycmF5KSk7CgogICAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnYWRkbGluaycsCgkJCQkgICAgJHRoaXMtPkNyZWF0ZUxpbmsgKCRpZCwgJ2FkZGNhdGVnb3J5JywKCQkJCQkJICAgICAgICRyZXR1cm5pZCwKCQkJCQkJICAgICAgICR0aGlzLT4KCQkJCQkJICAgICAgIExhbmcgKCdhZGRjYXRlZ29yeScpLAoJCQkJCQkgICAgICAgYXJyYXkgKCksICcnLCBmYWxzZSwKCQkJCQkJICAgICAgIGZhbHNlLAoJCQkJCQkgICAgICAgJ2NsYXNzPSJwYWdlb3B0aW9ucyInKSk7CgogICAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdjYXRlZ29yeWxpc3QudHBsJyk7CiAgfQoKCiAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgX0Rpc3BsYXlQcmVmc1RhYigkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsICRtZXNzYWdlKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9EaXNwbGF5UHJlZnNUYWIoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N0YXJ0Zm9ybScsCgkJCQkgICR0aGlzLT5DcmVhdGVGb3JtU3RhcnQgKCRpZCwKCQkJCQkJCSAgJ3NhdmVfYWRtaW5fcHJlZnMnLAoJCQkJCQkJICAkcmV0dXJuaWQpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYgKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQgKCkpOwogICAgJHRoaXMtPnNtYXJ0eS0+YXNzaWduX2J5X3JlZiAoJ3N1Ym1pdCcsCgkJCQkgICR0aGlzLT5DcmVhdGVJbnB1dFN1Ym1pdCAoJGlkLCAnc3VibWl0JywKCQkJCQkJCSAgICAkdGhpcy0+TGFuZygnc3VibWl0JykpKTsgICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgnY2FuY2VsJywKCQkJCSAgJHRoaXMtPkNyZWF0ZUlucHV0U3VibWl0ICgkaWQsICdjYW5jZWwnLCAkdGhpcy0+TGFuZygnY2FuY2VsJykpKTsgICAgCiAgICAgICAgCiAgICAkdGhpcy0+c21hcnR5LT5hc3NpZ25fYnlfcmVmICgncHJvbXB0X3N1Ym5ldF9leGNsdXNpb25zJywKCQkJCSAgJHRoaXMtPkxhbmcoJ3Byb21wdF9zdWJuZXRfZXhjbHVzaW9ucycpKTsKICAgICR0aGlzLT5zbWFydHktPmFzc2lnbl9ieV9yZWYoJ2lucHV0X3N1Ym5ldF9leGNsdXNpb25zJywKCQkJICAgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCggJGlkLCAnc3VibmV0X2V4Y2x1c2lvbnMnLAoJCQkJCQkgICAkdGhpcy0+R2V0UHJlZmVyZW5jZSgnc3VibmV0X2V4Y2x1c2lvbnMnLCIiKSw1MCwyNTUpKTsKCiAgICBlY2hvICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUgKCdhZG1pbnByZWZzLnRwbCcpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9Eb0xpbmtBY3Rpb24oJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLCAkbWVzc2FnZSkKICAgTk9UIFBBUlQgT0YgVEhFIE1PRFVMRSBBUEkKCiAgIFRoaXMgZG9lcyB0aGUgYWN0dWFsIHVwZGF0aW5nIGFuZCBmb3J3YXJkaW5nIHRvIHRoZSAKICAgcmVxdWVzdGVkIHBhZ2UuCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0RvTGlua0FjdGlvbiggJGlkLCAmJHBhcmFtcywgJHJldHVybmlkICkKICB7CiAgICAkZGIgPSAkdGhpcy0+Y21zLT5kYjsKCiAgICBpZiggIWlzc2V0KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddICkgKQogICAgICB7CiAgICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJykpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgZWxzZSBpZiggIWlzc2V0KCAkcGFyYW1zWydiYW5uZXJfaWQnXSApICkKICAgICAgewogICAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2luc3VmZmljaWVudHBhcmFtcycpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAvLyBnZXQgdGhlIGRldGFpbHMgYWJvdXQgdGhpcyBiYW5uZXIKICAgICRxdWVyeSA9ICJTRUxFQ1QgKiBGUk9NICIuY21zX2RiX3ByZWZpeCgpLiJtb2R1bGVfYmFubmVycyBXSEVSRSAKICAgICAgICBjYXRlZ29yeV9pZCA9ID8gQU5EIGJhbm5lcl9pZCA9ID8iOwogICAgJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydjYXRlZ29yeV9pZCddLAoJCQkJCSAgICAgJHBhcmFtc1snYmFubmVyX2lkJ10gKSApOwogICAgaWYoICEkZGJyZXN1bHQgKQogICAgICB7CiAgICAgICAgJHRoaXMtPl9EaXNwbGF5RXJyb3JQYWdlICgkaWQsICRwYXJhbXMsICRyZXR1cm5faWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLT5MYW5nICgnZXJyb3JfZGJlcnJvcicpKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICRiYW5uZXIgPSAkZGJyZXN1bHQtPkZldGNoUm93KCk7CiAgICBpZiggISRiYW5uZXIgKSAKICAgICAgewogICAgICAgICR0aGlzLT5fRGlzcGxheUVycm9yUGFnZSAoJGlkLCAkcGFyYW1zLCAkcmV0dXJuX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy0+TGFuZyAoJ2Vycm9yX2RiZXJyb3InKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgLy8gYWRkIHRoZSBoaXQKICAgIC8vIHRlc3QgaWYgd2UgYXJlIGV4Y2x1ZGluZyB0aGlzIElQIGZyb20gdGhlIGNvdW50aW5nCiAgICAkZXhjbHVkZSA9IDA7CiAgICAkc3VibmV0cyA9IHNwbGl0KCIsIiwkdGhpcy0+R2V0UHJlZmVyZW5jZSgic3VibmV0X2V4Y2x1c2lvbiIpKTsKICAgICR0ZXN0ID0gMDsKICAgIGZvcmVhY2goJHN1Ym5ldHMgYXMgJHN1Ym5ldCkKICAgIHsKICAgICAgJHRlc3QgPSAkdGhpcy0+X3Rlc3RpcCggJHN1Ym5ldCwgZ2V0ZW52KCJSRU1PVEVfQUREUiIgKSApOwogICAgICBpZiggJHRlc3QgKQoJewoJICAvLyBkb24ndCBhbGxvdyBhbnkgbW9yZSBwcm9jZXNzaW5nCgkgICRleGNsdWRlID0gMTsKCX0KICAgIH0KICAgIAogICAgaWYoICRleGNsdWRlID09IDAgKQogICAgICB7CgkkcXVlcnkgPSAiSU5TRVJUIElOVE8gIi5jbXNfZGJfcHJlZml4KCkuIm1vZHVsZV9iYW5uZXJzX2hpdHMgdmFsdWVzICg/LD8sPykiOwoJJGRicmVzdWx0ID0gJGRiLT5FeGVjdXRlKCAkcXVlcnksIGFycmF5KCAkcGFyYW1zWydiYW5uZXJfaWQnXSwKCQkJCQkJICRkYi0+REJUaW1lU3RhbXAodGltZSgpKSwKCQkJCQkJIGdldGVudignUkVNT1RFX0FEZFInKSApICk7CiAgICAgIH0KCiAgICAvLyByZWRpcmVjdCB0byB0byB0aGUgZGVzdGluYXRpb24KICAgIHJlZGlyZWN0KCAkYmFubmVyWyd1cmwnXSApOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9Eb1NhdmVBZG1pblByZWZzKCRpZCwgJHBhcmFtcywgJHJldHVybl9pZCwgJG1lc3NhZ2UpCiAgIE5PVCBQQVJUIE9GIFRIRSBNT0RVTEUgQVBJCgogICBTYXZlIHRoZSBhZG1pbidzIHByZWZlcmVuY2VzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgZnVuY3Rpb24gX0RvU2F2ZUFkbWluUHJlZnMoICRpZCwgJiRwYXJhbXMsICRyZXR1cm5pZCApCiAgewogICAgaWYgKGlzc2V0ICgkcGFyYW1zWydjYW5jZWwnXSkpCiAgICB7CiAgICAgICR0aGlzLT5SZWRpcmVjdCAoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkKTsKICAgIH0KCiAgICAkdGhpcy0+U2V0UHJlZmVyZW5jZSAoJ3N1Ym5ldF9leGNsdXNpb25zJywKCQkJICBpc3NldCAoJHBhcmFtc1snc3VibmV0X2V4Y2x1c2lvbnMnXSkgPwoJCQkgICRwYXJhbXNbJ3N1Ym5ldF9leGNsdXNpb25zJ10gOiAnMCcpOwogICAgLy8kdGhpcy0+UmVkaXJlY3QgKCRpZCwgJ2RlZmF1bHRhZG1pbicpOwogIH0KCgogIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIF9HZXRVc2VySURNb2R1bGUoKQogICBOT1QgUEFSVCBPRiBUSEUgTU9EVUxFIEFQSQoKICAgR2V0IHRoZSB1c2VyIGlkIG1vZHVsZQogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogIGZ1bmN0aW9uIF9nZXRVcGxvYWRzTW9kdWxlKCkKICB7CiAgICAkbW9kdWxlID0gJHRoaXMtPmdldE1vZHVsZUluc3RhbmNlKCJVcGxvYWRzIik7CiAgICBpZiggJG1vZHVsZSApCiAgICAgIHsKCSR2ZXIgPSAkbW9kdWxlLT5HZXRWZXJzaW9uKCk7CglpZiggdmVyc2lvbl9jb21wYXJlKCAiMS4wLjYiLCAkdmVyICkgKQoJICB7CgkgICAgcmV0dXJuICRtb2R1bGU7CgkgIH0KICAgICAgfQogICAgcmV0dXJuOwogIH0KCn0gLy8gZW5kIG9mIGNsYXNzCgo/Pgo=]]></data>
  </file>
  <file>
    <filename>index.html</filename>
    <isdir>0</isdir>
    <data><![CDATA[]]></data>
  </file>
  <file>
    <filename>lang/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>lang/en_US.php</filename>
    <isdir>0</isdir>
    <data><![CDATA[PD9waHAKJGxhbmdbJ2FjY2Vzc2RlbmllZCddID0gJ0FjY2VzcyBEZW5pZWQuIFBsZWFzZSBjaGVjayB5b3VyIHBlcm1pc3Npb25zLic7CiRsYW5nWydhZGRiYW5uZXInXSA9ICdBZGQgQmFubmVyJzsKJGxhbmdbJ2FkZGNhdGVnb3J5J10gPSAnQWRkIENhdGVnb3J5JzsKJGxhbmdbJ2FyZXlvdXN1cmUnXSA9ICdBcmUgWW91IFN1cmU/JzsKJGxhbmdbJ2Jhbm5lcnMnXSA9ICdCYW5uZXJzJzsKJGxhbmdbJ2NhbmNlbCddID0gJ0NhbmNlbCc7CiRsYW5nWydjYXRlZ29yaWVzJ10gPSAnQ2F0ZWdvcmllcyc7CiRsYW5nWydjYXRlZ29yeSddID0gJ0NhdGVnb3J5JzsKJGxhbmdbJ2NyZWF0ZWQnXSA9ICdDcmVhdGVkJzsKJGxhbmdbJ2RhdGUnXSA9ICdEYXRlJzsKJGxhbmdbJ2RlbGV0ZSddID0gJ0RlbGV0ZSc7CiRsYW5nWydkZXNjcmlwdGlvbiddID0gJ0Rlc2NyaXB0aW9uJzsKJGxhbmdbJ2VkaXQnXSA9ICdFZGl0JzsKJGxhbmdbJ2VkaXRjYXRlZ29yeSddID0gJ0VkaXQgQ2F0ZWdvcnknOwokbGFuZ1snZXJyb3InXSA9ICdFcnJvciEnOwokbGFuZ1snZXJyb3JfYmFuZXJleGlzdHMnXSA9ICdCYW5uZXIgd2l0aCB0aGF0IG5hbWUgYWxyZWFkeSBleGlzdHMnOwokbGFuZ1snZXJyb3JfY2F0ZWdvcnlub3RlbXB0eSddID0gJ0Vycm9yOiBDYXRlZ29yeSBOb3QgRW1wdHkhJzsKJGxhbmdbJ2Vycm9yX2RiZXJyb3InXSA9ICdFcnJvcjogRGF0YWJhc2UgRXJyb3IhJzsKJGxhbmdbJ2Vycm9yX2VtcHR5YmFubmVybmFtZSddID0gJ0Vycm9yOiBFbXB0eSBiYW5uZXIgbmFtZSEnOwokbGFuZ1snZXJyb3JfZW1wdHljYXRlZ29yeSddID0gJ0Vycm9yOiBFbXB0eSBDYXRlZ29yeSEnOwokbGFuZ1snZXJyb3JfaW5zdWZmaWNpZW50cGFyYW1zJ10gPSAnRXJyb3I6IEluc3VmZmljaWVudCBJbnB1dCc7CiRsYW5nWydlcnJvcl9ub3Jlc3VsdHMnXSA9ICdObyBiYW5uZXJzIG1hdGNoZWQgdGhlIHF1ZXJ5JzsKJGxhbmdbJ2Vycm9yX3RleHRvcmltYWdlJ10gPSAnU3BlY2lmeSBVUkwgYW5kIElNQUdFIG9yIFRFWFQsIG5vdCBib3RoJzsKJGxhbmdbJ2V4cGlyZXMnXSA9ICdFeHBpcmVzJzsKJGxhbmdbJ2V4cGlyZXMnXSA9ICdFeHBpcmVzJzsKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ01hbmFnZSBCYW5uZXJzJzsKJGxhbmdbJ2hlaWdodCddID0gJ0hlaWdodCc7CiRsYW5nWydoaXRzJ10gPSAnSGl0cyc7CiRsYW5nWydocmVmX3RleHQnXSA9ICdMaW5rIFRleHQnOwokbGFuZ1snaWQnXSA9ICdJRCc7CiRsYW5nWydpbWFnZSddID0gJ0ltYWdlJzsKJGxhbmdbJ2ltYWdlX3RleHQnXSA9ICdJbWFnZSBUZXh0JzsKJGxhbmdbJ2ltcHJlc3Npb25zJ10gPSAnSW1wcmVzc2lvbnMnOwokbGFuZ1snaW5mb19ocmVmX3RleHQnXSA9ICdBZGRpdGlvbmFsIHRleHQgZm9yIHRoZSBsaW5rIHRhZyc7CiRsYW5nWydpbmZvX2ltYWdlJ10gPSAnU3BlY2lmeSBhIGZpbGUgcmVsYXRpdmUgdG8geW91ciB1cGxvYWRzIGRpcmVjdG9yeSc7CiRsYW5nWydpbmZvX2ltYWdlX3RleHQnXSA9ICdBZGRpdGlvbmFsIHRleHQgZm9yIHRoZSBpbWFnZSB0YWcnOwokbGFuZ1snaW5mb19tYXhfaGl0cyddID0gJ1VzZSAwIGZvciB1bmxpbWl0ZWQgaGl0cyc7CiRsYW5nWydpbmZvX21heF9pbXByZXNzaW9ucyddID0gJ1VzZSAwIGZvciB1bmxpbWl0ZWQgaW1wcmVzc2lvbnMnOwokbGFuZ1snaW5zdGFsbGVkJ10gPSAnTW9kdWxlIHZlcnNpb24gJXMgaW5zdGFsbGVkLic7CiRsYW5nWydpcGFkZHJlc3MnXSA9ICdJUCBBZGRyZXNzJzsKJGxhbmdbJ21heF9oaXRzJ10gPSAnTWF4aW11bSBIaXRzJzsKJGxhbmdbJ21heF9pbXByZXNzaW9ucyddID0gJ01heGltdW0gSW1wcmVzc2lvbnMnOwokbGFuZ1snbmFtZSddID0gJ05hbWUnOwokbGFuZ1snbmV2ZXInXSA9ICdOZXZlcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1Bvc3QgSW5zdGFsbCBNZXNzYWdlLCBlLmcuLCBCZSBzdXJlIHRvIHNldCAiTWFuYWdlIEJhbm5lcnMiIHBlcm1pc3Npb25zIHRvIHVzZSB0aGlzIG1vZHVsZSEnOyAgCiRsYW5nWydwb3N0dW5pbnN0YWxsJ10gPSAnUG9zdCBVbmluc3RhbGwgTWVzc2FnZSwgZS5nLiwgIkN1cnNlcyEgRm9pbGVkIEFnYWluISInOwokbGFuZ1sncHJlZmVyZW5jZXMnXSA9ICdQcmVmZXJlbmNlcyc7CiRsYW5nWydwcmVmc3VwZGF0ZWQnXSA9ICdNb2R1bGUgcHJlZmVyZW5jZXMgdXBkYXRlZC4nOwokbGFuZ1sncHJvbXB0X2NhdGVnb3J5ZGVzYyddID0gJ0NhdGVnb3J5IERlc2NyaXB0aW9uJzsKJGxhbmdbJ3Byb21wdF9jYXRlZ29yeW5hbWUnXSA9ICdDYXRlZ29yeSBOYW1lJzsKJGxhbmdbJ3Byb21wdF9pbWFnZWhlaWdodCddID0gJ0ltYWdlIEhlaWdodCc7CiRsYW5nWydwcm9tcHRfaW1hZ2V3aWR0aCddID0gJ0ltYWdlIFdpZHRoJzsKJGxhbmdbJ3Byb21wdF9zdWJuZXRfZXhjbHVzaW9ucyddID0gJ0V4Y2x1ZGUgdGhlc2Ugc3VibmV0cyBmcm9tIGFueSBzdGF0aXN0aWNzIGdhdGhlcmluZyc7CiRsYW5nWydwcm9tcHRfdXBsb2FkX2NhdGVnb3J5J10gPSAnQ2F0ZWdvcnkgKFVwbG9hZHMgTW9kdWxlKSc7CiRsYW5nWydwcm9tcHRfdXBsb2FkX2ZpbGUnXSA9ICdJbWFnZSAoVXBsb2FkcyBNb2R1bGUpJzsKJGxhbmdbJ3NlbGVjdGNhdGVnb3J5J10gPSAnU2VsZWN0IENhdGVnb3J5JzsKJGxhbmdbJ3N1Ym1pdCddID0gJ1N1Ym1pdCc7CiRsYW5nWyd0ZXh0J10gPSAnVGV4dCc7CiRsYW5nWyd0aXRsZV9tb2RfYWRtaW4nXSA9ICdNb2R1bGUgQWRtaW4gUGFuZWwnOwokbGFuZ1sndGl0bGVfbW9kX3ByZWZzJ10gPSAnTW9kdWxlIFByZWZlcmVuY2VzJzsKJGxhbmdbJ3RpdGxlX3NpbmdfbG91ZGx5J10gPSAnU2luZyBMb3VkbHk/JzsKJGxhbmdbJ3VuaW5zdGFsbGVkJ10gPSAnTW9kdWxlIFVuaW5zdGFsbGVkLic7CiRsYW5nWyd1cGdyYWRlZCddID0gJ01vZHVsZSB1cGdyYWRlZCB0byB2ZXJzaW9uICVzLic7CiRsYW5nWyd1cmwnXSA9ICdVUkwnOwokbGFuZ1snd2lkdGgnXSA9ICdXaWR0aCc7CiRsYW5nWyd0aXRsZV9hZG1pbl9wYW5lbCddID0gJ0Jhbm5lcnMgTW9kdWxlJzsKJGxhbmdbJ21vZGRlc2NyaXB0aW9uJ10gPSAnQSBtb2R1bGUgdG8gbWFuYWdlIHJvdGF0aW5nIGJhbm5lcnMnOwokbGFuZ1snd2VsY29tZV90ZXh0J10gPSAnPHA+V2VsY29tZSB0byB0aGUgQmFubmVyIE1hbmFnZW1lbnQgTW9kdWxlIGFkbWluIHNlY3Rpb24uIFNvbWV0aGluZyBlbHNlIHdvdWxkIHByb2JhYmx5IGdvIGhlcmUgaWYgdGhlIG1vZHVsZSBhY3R1YWxseSBkaWQgc29tZXRoaW5nLjwvcD4nOyAKJGxhbmdbJ2NoYW5nZWxvZyddID0gJzx1bD4KPGxpPlZlcnNpb24gMS4wLiA2IEF1Z3VzdCAyMDA1LiBJbml0aWFsIFJlbGVhc2UuPC9saT4KPGxpPlZlcnNpb24gMi4wLiBTZXB0ZW1iZXIgMjAwNS4gSW5pdGlhbCBSZWxlYXNlIGZvciAwLjEuLjwvbGk+CjxsaT5WZXJzaW9uIDIuMC4xLiBTZXB0ZW1iZXIgMjAwNS4gRGlzcGxheSBzYW1wbGUgYmFubmVyIGluIHRoZSBlZGl0IGJhbm5lciBwYWdlLCBhZGRlZCBuYW1lPSBwYXJhbWV0ZXIsIGFuZCBtYWRlIHN1Ym5ldCBleGNsdXNpb25zIHdvcmsuICBBbHNvIGNoYW5nZWQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGRhdGFiYXNlIHRvIGFsbG93IGZvciBhZGRpdGlvbmFsIHRleHQgaW4gdGhlIGxpbmsgYW5kIGltYWdlIHRhZ3MuPC9saT4KPGxpPlZlcnNpb24gMi4wLjIuIFNlcHRlbWJlciAyMDA1LiBBZGRlZCBpbnRlZ3JhdGlvbiB3aXRoIHRoZSB1cGxvYWRzIG1vZHVsZSAoMS4wLjYpIHNvIHRoYXQgd2UgY2FuIGdldCBsaXRzIG9mIGZpbGVzIGZvciBiYW5uZXJzLCBldGMuICBUaGUgYmFubmVycyBtb2R1bGUgaXMgc3RpbGwgb3B0aW9uYWwgdGhvdWdoLjwvbGk+CjxsaT5WZXJzaW9uIDIuMC4zLiBTZXB0ZW1iZXIgMjAwNS4gRml4ZWQgYSB2ZXJ5IG1pbm9yIGlzc3VlIHdpdGggbmV2ZXIgZXhwaXJlcy4uPC9saT4KPGxpPlZlcnNpb24gMi4wLjQuIFNlcHRlbWJlciAyMDA1LiBGaXhlZCBhIHZlcnkgbWlub3IgaXNzdWUgd2l0aCBtb2R1bGUgZGVwZW5kZW5jaWVzLCBhbmQgYSBiaWcgYnVnIGluIHRoZSBkYXRhYmFzZSBzcGVjIGlmIHlvdSBkaWQgYSBzY3JhdGNoIGluc3RhbGwuPC9saT4KPGxpPlZlcnNpb24gMi4wLjUuIE9jdG9iZXIgMjAwNS4gQWRkIGNvbWVudHMgYXJvdW5kIHRoZSBvdXRwdXQ8L2xpPgo8L3VsPic7CiRsYW5nWydoZWxwJ10gPSAnPGgzPldoYXQgRG9lcyBUaGlzIERvPzwvaDM+CjxwPlRoaXMgYmFubmVyIG1hbmFnZXMgbnVtZXJvdXMgY2F0ZWdvcmllcyBvZiBiYW5uZXJzLCB0cmFja3MgaGl0cywgaW1wcmVzc2lvbnMsIGFuZCBleHBpcnkgZGF0ZXMsIGFuZCByYW5kb21seSBzZWxlY3RzIGZyb20gYWxsIGF2YWlsYWJsZSBhbmQgdmFsaWQgYmFubmVycyBmb3Igb25lIHRvIGRpc3BsYXk8L3A+CjxoMz5Ib3cgRG8gSSBVc2UgSXQ8L2gzPgo8cD5UbyB1c2UgdGhpcyBtb2R1bGUsIHBsYWNlIHRoZSBtb2R1bGUgY29kZSBpbiBhIHBhZ2Ugb3IgdGVtcGxhdGUgdXNpbmcgdGhlIHNtYXJ0eSB0YWcgJiMxMjM7Y21zX21vZHVsZSBtb2R1bGU9XCdCYW5uZXJzXCcgY2F0ZWdvcnk9IjxjYXRlZ29yeT4ifTwvcD4gCjxwPllvdSBtdXN0IGFsc28gdXBsb2FkIGJhbm5lcnMgdG8gYSBzdWl0YWJsZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSB1cGxvYWRzIGRpcmVjdG9yeSBhbmQgbXVzdCB1c2UgdGhlIGFkbWluIHBhbmVsIGludGVyZmFjZSB0byBhZGQgYmFubmVycyB0byB0aGUgZGF0YWJhc2UuPC9wCjxoMz5QYXJhbWV0ZXJzPC9oMz4KPHVsPgo8bGk+PGVtPihSRVFVSVJFRCk8L2VtPiBjYXRlZ29yeT0iY2F0ZWdvcnkiID0gcmFuZG9tbHkgc2VsZWN0IGZyb20gYWxsIGF2YWlsYWJsZSBpbiB0aGlzIGNhdGVnb3J5PC9saT4KPGxpPjxlbT4ob3B0aW9uYWwpPC9lbT4gbmFtZT0ibmFtZSIgPSBzZWxlY3Qgb25seSB0aGUgYmFubmVyIHdpdGggdGhpcyBuYW1lPC9saT4KPC91bD4KPGg0PkhpbnQ8L2g0Pgo8cD5UaGUgdXBsb2FkcyBtb2R1bGUgYW5kIHRoZSBiYW5uZXJzIG1vZHVsZSB3b3JrIHdlbGwgdG9nZXRoZXIuICBZb3UgY2FuIGNyZWF0ZSBhICJiYW5uZXJzIiBjYXRlZ29yeSBpbiB0aGUgdXBsb2FkcyBtb2R1bGUsIGFuZCB1cGxvYWQgeW91ciBiYW5uZXIgaW1hZ2VzIHRoZXJlLCB0aGVuIHNwZWNpZnkgImJhbm5lcnMvPGZpbGVuYW1lPiIgd2hlbiBhZGRpbmcgYSBiYW5uZXIgaW4gdGhlIGJhbm5lcnMgbW9kdWxlLjwvcD4nOwo/Pgo=]]></data>
  </file>
  <file>
    <filename>templates/</filename>
    <isdir>1</isdir>
  </file>
  <file>
    <filename>templates/addbanner.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2Jhbm5lcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iYW5uZXJuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iYW5uZXJkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYmFubmVyZGVzY308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2V9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZX0mbmJzcDt7JGluZm9faW1hZ2V9PC9wPgogIDwvZGl2Pgp7aWYgJGlucHV0X3VwbG9hZF9maWxlfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9maWxlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdXBsb2FkX2ZpbGV9PC9wPgogIDwvZGl2Pgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VybH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VybH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaHJlZl90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaHJlZl90ZXh0fSZuYnNwO3skaW5mb19ocmVmdF90ZXh0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbWFnZV90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW1hZ2VfdGV4dH0mbmJzcDt7JGluZm9faW1hZ2VfdGV4dH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfbWF4X2ltcHJlc3Npb25zfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfbWF4X2ltcHJlc3Npb25zfSZuYnNwO3skaW5mb19tYXhfaW1wcmVzc2lvbnN9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2V4cGlyZXN9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+e2h0bWxfc2VsZWN0X2RhdGUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZSBzdGFydF95ZWFyPTIwMDAgZW5kX3llYXI9MjAxMH0ge2h0bWxfc2VsZWN0X3RpbWUgcHJlZml4PSRleHBpcmVzZGF0ZXByZWZpeCB0aW1lPSRleHBpcmVzZGF0ZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JG5ldmVyZXhwaXJlc308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19CnsvaWZ9Cg==]]></data>
  </file>
  <file>
    <filename>templates/addcategory.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2NhdGVnb3J5bmFtZX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X2NhdGVnb3J5bmFtZX08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfY2F0ZWdvcnlkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfY2F0ZWdvcnlkZXNjfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbWFnZXdpZHRofTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaW1hZ2V3aWR0aH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2VoZWlnaHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZWhlaWdodH08L3A+CiAgPC9kaXY+CntpZiAkaW5wdXRfdXBsb2FkX2NhdGVnb3J5fQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9jYXRlZ29yeX08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VwbG9hZF9jYXRlZ29yeX08L3A+CiAgPC9kaXY+CnsvaWZ9CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+Jm5ic3A7PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRoaWRkZW59eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgogIDwvZGl2Pgp7JGVuZGZvcm19CnsvaWZ9Cg==]]></data>
  </file>
  <file>
    <filename>templates/adminprefs.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[e2lmICRtZXNzYWdlIT0nJ308cD57JG1lc3NhZ2V9PC9wPnsvaWZ9Cnskc3RhcnRmb3JtfQoJPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3N1Ym5ldF9leGNsdXNpb25zfTo8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9zdWJuZXRfZXhjbHVzaW9uc308L3A+Cgk8L2Rpdj4KCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9eyRjYW5jZWx9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
  </file>
  <file>
    <filename>templates/bannerlist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRpdGVtY291bnR9IEJhbm5lcnMgRm91bmQ8L3A+PC9kaXY+Cnskc3RhcnRmb3JtfQogPHA+eyRjYXRlZ29yeX0mbmJzcDt7JGlucHV0X2NhdGVnb3J5fXskaW5wdXRfc2VsZWN0fXskaW5wdXRfaGlkZGVufTwvcD4KeyRlbmRmb3JtfQp7aWYgJGl0ZW1jb3VudCA+IDB9Cjx0YWJsZSBjZWxsc3BhY2luZz0iMCIgY2xhc3M9InBhZ2V0YWJsZSI+Cgk8dGhlYWQ+CgkJPHRyPgoJCQk8dGggd2lkdGg9IjUlIj57JGlkdGV4dH08L3RoPgoJCQk8dGg+eyRuYW1ldGV4dH08L3RoPgoJCQk8dGg+eyRkZXNjdGV4dH08L3RoPgoJCQk8dGg+eyRjcmVhdGVkdGV4dH08L3RoPgoJCQk8dGg+eyRleHBpcmVzdGV4dH08L3RoPgoJCQk8dGg+eyRpbXByZXNzaW9uc3RleHR9PC90aD4KCQkJPHRoPnskaGl0c3RleHR9PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQkJPHRoIGNsYXNzPSJwYWdlaWNvbiI+Jm5ic3A7PC90aD4KCQk8L3RyPgoJPC90aGVhZD4KCTx0Ym9keT4Ke2ZvcmVhY2ggZnJvbT0kaXRlbXMgaXRlbT1lbnRyeX0KCQk8dHIgY2xhc3M9InskZW50cnktPnJvd2NsYXNzfSI+CgkJCTx0ZD57JGVudHJ5LT5pZH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+bmFtZX08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZGVzY3JpcHRpb259PC90ZD4KCQkJPHRkPnskZW50cnktPmNyZWF0ZWR9PC90ZD4KCQkJPHRkPnskZW50cnktPmV4cGlyZXN9PC90ZD4KCQkJPHRkPnskZW50cnktPmltcHJlc3Npb25zfS97JGVudHJ5LT5tYXhfaW1wcmVzc2lvbnN9PC90ZD4KCQkJPHRkPnskZW50cnktPmhpdHN9PC90ZD4KCQkJPHRkPnskZW50cnktPmVkaXRsaW5rfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZWxldGVsaW5rfTwvdGQ+CgkJPC90cj4KCSAKey9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0KPGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRhZGRsaW5rfTwvcD48L2Rpdj4K]]></data>
  </file>
  <file>
    <filename>templates/categorylist.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGRpdiBjbGFzcz0icGFnZW9wdGlvbnMiPjxwIGNsYXNzPSJwYWdlb3B0aW9ucyI+eyRpdGVtY291bnR9IENhdGVnb3JpZXMgRm91bmQ8L3A+PC9kaXY+CntpZiAkaXRlbWNvdW50ID4gMH0KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aCB3aWR0aD0iNSUiPnskY2F0ZWdvcnl0ZXh0fTwvdGg+CgkJCTx0aD57JG5hbWV0ZXh0fTwvdGg+CgkJCTx0aD57JGRlc2N0ZXh0fTwvdGg+CgkJCTx0aCB3aWR0aD0iNSUiPnskd2lkdGh0ZXh0fTwvdGg+CgkJCTx0aCB3aWR0aD0iNSUiPnskaGVpZ2h0dGV4dH08L3RoPgoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJCQk8dGggY2xhc3M9InBhZ2VpY29uIj4mbmJzcDs8L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPmlkfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5uYW1lfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kZXNjcmlwdGlvbn08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+d2lkdGh9PC90ZD4KCQkJPHRkPnskZW50cnktPmhlaWdodH08L3RkPgoJCQk8dGQ+eyRlbnRyeS0+ZWRpdGxpbmt9PC90ZD4KCQkJPHRkPnskZW50cnktPmRlbGV0ZWxpbmt9PC90ZD4KCQk8L3RyPgp7L2ZvcmVhY2h9Cgk8L3Rib2R5Pgo8L3RhYmxlPgp7L2lmfQo8ZGl2IGNsYXNzPSJwYWdlb3B0aW9ucyI+PHAgY2xhc3M9InBhZ2VvcHRpb25zIj57JGFkZGxpbmt9PC9wPjwvZGl2Pgo=]]></data>
  </file>
  <file>
    <filename>templates/editbanner.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[eyR0aXRsZX0Ke2lmICRtZXNzYWdlICE9ICcnfQogIHtpZiAkZXJyb3IgIT0gJyd9CiAgICA8cD48Zm9udCBjb2xvcj0icmVkIj57JG1lc3NhZ2V9PC9mb250PjwvcD4KICB7ZWxzZX0KICAgIDxwPnskbWVzc2FnZX08L3A+CiAgey9pZn0Ke2Vsc2V9Cnskc3RhcnRmb3JtfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2Jhbm5lcm5hbWV9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9iYW5uZXJuYW1lfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9iYW5uZXJkZXNjfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfYmFubmVyZGVzY308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaW1hZ2V9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZX0mbmJzcDt7JGluZm9faW1hZ2V9PC9wPgogIDwvZGl2Pgp7aWYgJGlucHV0X3VwbG9hZF9maWxlfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VwbG9hZF9maWxlfTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfdXBsb2FkX2ZpbGV9PC9wPgogIDwvZGl2Pgp7L2lmfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X3VybH08L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGlucHV0X3VybH08L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfaHJlZl90ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskaW5wdXRfaHJlZl90ZXh0fSZuYnNwO3skaW5mb19ocmVmX3RleHR9PC9wPgogIDwvZGl2PgogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CiAgICA8cCBjbGFzcz0icGFnZXRleHQiPnskcHJvbXB0X2ltYWdlX3RleHR9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9pbWFnZV90ZXh0fSZuYnNwO3skaW5mb19pbWFnZV90ZXh0fTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9pbXByZXNzaW9uc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JHZhbHVlX2ltcHJlc3Npb25zfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHByb21wdF9tYXhfaW1wcmVzc2lvbnN9PC9wPgogICAgPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRpbnB1dF9tYXhfaW1wcmVzc2lvbnN9Jm5ic3A7eyRpbmZvX21heF9pbXByZXNzaW9uc308L3A+CiAgPC9kaXY+CiAgPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KICAgIDxwIGNsYXNzPSJwYWdldGV4dCI+eyRwcm9tcHRfZXhwaXJlc308L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57aHRtbF9zZWxlY3RfZGF0ZSBwcmVmaXg9JGV4cGlyZXNkYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlIHN0YXJ0X3llYXI9MjAwMCBlbmRfeWVhcj0yMDEwfSB7aHRtbF9zZWxlY3RfdGltZSBwcmVmaXg9JGV4cGlyZXNkYXRlcHJlZml4IHRpbWU9JGV4cGlyZXNkYXRlfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskbmV2ZXJleHBpcmVzfTwvcD4KICA8L2Rpdj4KICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CiAgICA8cCBjbGFzcz0icGFnZWlucHV0Ij57JGhpZGRlbn17JHN1Ym1pdH17JGNhbmNlbH08L3A+CiAgPC9kaXY+CnskZW5kZm9ybX0KPGJyLz57JGltYWdlfTxici8+CntpZiAkaXRlbWNvdW50ID4gMH0KPGJyLz4KPHRhYmxlIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0icGFnZXRhYmxlIj4KCTx0aGVhZD4KCQk8dHI+CgkJCTx0aD57JGlwdGV4dH08L3RoPgoJCQk8dGg+eyRkYXRldGV4dH08L3RoPgoJCTwvdHI+Cgk8L3RoZWFkPgoJPHRib2R5Pgp7Zm9yZWFjaCBmcm9tPSRpdGVtcyBpdGVtPWVudHJ5fQoJCTx0ciBjbGFzcz0ieyRlbnRyeS0+cm93Y2xhc3N9Ij4KCQkJPHRkPnskZW50cnktPmlwfTwvdGQ+CgkJCTx0ZD57JGVudHJ5LT5kYXRlfTwvdGQ+CgkJPC90cj4Key9mb3JlYWNofQoJPC90Ym9keT4KPC90YWJsZT4Key9pZn0Key9pZn0K]]></data>
  </file>
  <file>
    <filename>templates/error.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskdGl0bGVfZXJyb3J9PC9oMz4KPHA+eyRhZG1pbl9uYXZ9PC9wPgp7aWYgJG1lc3NhZ2UhPScnfTxwPnskbWVzc2FnZX08L3A+ey9pZn0=]]></data>
  </file>
  <file>
    <filename>templates/plugin.tpl</filename>
    <isdir>0</isdir>
    <data><![CDATA[PGgzPnskbG91ZG5lc3N9PC9oMz4=]]></data>
  </file>
</module>
