Skip to content

Instantly share code, notes, and snippets.

@tlrobinson
Created January 14, 2009 03:11
Show Gist options
  • Save tlrobinson/46760 to your computer and use it in GitHub Desktop.
Save tlrobinson/46760 to your computer and use it in GitHub Desktop.
javascript:(function()%20{data='PGh0bWw+CjxoZWFkPgoJPHRpdGxlPkNvbnNvbGU8L3RpdGxlPgoJPHN0eWxlIHR5cGU9InRleHQvY3NzIiBtZWRpYT0ic2NyZWVuIj4KCSAgICAvKiBUaGVtZWFibGUgY29tcG9uZW50cyAqLwoJICAgIGJvZHkgewoJICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKCSAgICB9CgkJLmNvbnNvbGUgewoJCSAgICBjb2xvcjogd2hpdGU7CgkJCWZvbnQtc2l6ZTogMTBweDsKCQkJZm9udC1mYW1pbHk6IE1vbmFjbywgQ291cmllciwgbW9ub3NwYWNlOwoJCX0KCQkKCQkjY3Vyc29yIHsKICAgIAkgICAgLypib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMjU1LDI1NSwyNTUsMCk7Ki8KCSAgICB9CgkJI2N1cnNvcltzaG93PSJ5ZXMiXSB7CgkJICAgIGJhY2tncm91bmQtY29sb3I6IHJlZDsKCQkgICAgLypib3JkZXItbGVmdDogMXB4IHNvbGlkIHJlZDsqLwoJCX0KCQkvKiBPdGhlciAqLwoJCS5jb25zb2xlIHsKICAgIAkgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgIAkgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgCQltYXJnaW46IDBweDsKICAgIAkJcGFkZGluZzogMHB4OwoJICAgIH0KCQkjYXV0b2NvbXBsZXRlLXJlc3VsdHMgewoJCSAgICBtYXJnaW46IDIwcHg7CgkJCWZvbnQtc2l6ZTogMTBwdDsKCQl9CgkJI2F1dG9jb21wbGV0ZS1saXN0IHsKCQkJZGlzcGxheTogaW5saW5lLWJsb2NrOwoJCQltYXJnaW46IDA7CgkJCXBhZGRpbmc6IDEwcHg7CgkJCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKCQkJYmFja2dyb3VuZC1jb2xvcjogI0VFRUVFRTsKICAgICAgICAJLW1vei1ib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAgIAktd2Via2l0LWJvcmRlci1yYWRpdXM6IDEwcHg7CgkJfQoJCSNhdXRvY29tcGxldGUtbGlzdCA+IGxpOmhvdmVyIHsKCQkJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CgkJfQoJCSNoaWRkZW4taW5wdXQgewoJCQlwb3NpdGlvbjogYWJzb2x1dGU7CgkJCXRvcDogLTEwMHB4OwoJCQlyaWdodDogMHB4OwoJCX0KCQkuZG9tbGluazpob3ZlciB7CgkJICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJCX0KCQlib2R5IHsKCQkJcGFkZGluZy1ib3R0b206IDEwMHB4OwoJCX0KCTwvc3R5bGU+Cgk8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii9jc3MvbWFzdGVyLmNzcyIgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iIHRpdGxlPSJubyB0aXRsZSIgY2hhcnNldD0idXRmLTgiPgoJPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIGNoYXJzZXQ9InV0Zi04Ij4KCQoJKGZ1bmN0aW9uKCkgewoJICAgIHZhciB3aW5kb3dfY29udGV4dCwgaW5wdXQsIGlucHV0X3NhdmVkLCBpbnB1dF9tdWx0aSwgaGlzdCwgZmxhZ3MsIGN1cnNvcl9sb2NhdGlvbiwgaGlzdF9udW0sIGNvbnNvbGVfaGlzdG9yeSwgY29uc29sZV9pbnB1dCwgYXV0b2NvbXBsZXRlX3Jlc3VsdHMsIGN1cnNvciwgaGlkZGVuX2lucHV0LCBoaWdobGlnaHQsIGhlbHA7CgkgICAgICAgICAgCgkJZnVuY3Rpb24gJChpZCkgeyByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpOyB9CgkJCgkJZnVuY3Rpb24gZXZhbEluQ29udGV4dChjb2RlKQoJCXsKCQkJd2l0aCAod2luZG93X2NvbnRleHQpIHsKCQkJCWlmICh0eXBlb2Yob2Jqal9wcmVwcm9jZXNzKSAhPSAidW5kZWZpbmVkIikKCQkJCQljb2RlID0gb2Jqal9wcmVwcm9jZXNzKGNvZGUpWzBdLmluZm87CgkJCQlyZXR1cm4gZXZhbChjb2RlKTsKCQkJfQoJCX0KCQkKCQlmdW5jdGlvbiBpbml0KCkKCQl7ICAgCgkJCXdpbmRvd19jb250ZXh0ID0gd2luZG93Lm9wZW5lciB8fCB3aW5kb3c7CgkJCQkJCQoJCQl3aXRoICh3aW5kb3dfY29udGV4dCkgewogICAgICAgIAkgICAgaWYgKHR5cGVvZihvYmpqX21zZ1NlbmQpICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc2EgPyBvYmpqX21zZ1NlbmQodGhpcywgImRlc2NyaXB0aW9uIikgOiB0b1N0cmluZy5hcHBseSh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgCSAgICB9CgkJCX0KCQkJCgkJCWlucHV0ID0gIiI7CgkJCWlucHV0X3NhdmVkID0gIiI7CgkJCWlucHV0X211bHRpID0gIiI7CgkJCWhpc3QgPSBbXTsKCQkJZmxhZ3MgPSBbXTsKCQkJY3Vyc29yX2xvY2F0aW9uID0gMDsKCQkJaGlzdF9udW0gPSAwOwoKCQkJY29uc29sZV9oaXN0b3J5CQkJPSAkKCJjb25zb2xlLWhpc3RvcnkiKTsKCQkJY29uc29sZV9pbnB1dCAJCQk9ICQoImNvbnNvbGUtaW5wdXQiKTsKCQkJYXV0b2NvbXBsZXRlX3Jlc3VsdHMgCT0gJCgiYXV0b2NvbXBsZXRlLXJlc3VsdHMiKTsKCQkJCiAgICAgICAgICAgIGJlZ2lubmluZyAgICAgICAgICAgICAgID0gJCgiaW5wdXQtYmVnaW5uaW5nIik7CiAgICAgICAgICAgIGN1cnNvciAgICAgICAgICAgICAgICAgID0gJCgiY3Vyc29yIik7CiAgICAgICAgICAgIGVuZCAgICAgICAgICAgICAgICAgICAgID0gJCgiaW5wdXQtZW5kIik7CgkJCQoJCQloaWRkZW5faW5wdXQgICAgICAgICAgICA9ICQoImhpZGRlbi1pbnB1dCIpOwoJCQkKCQkJaGlkZGVuX2lucHV0LnZhbHVlID0gIiI7CgkJCQoJCQl3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsIGtleWhhbmRsZXIsIGZhbHNlKTsKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImtleXByZXNzIiwga2V5aGFuZGxlciwgZmFsc2UpOwoJCQkKCQkJaGlnaGxpZ2h0ID0gd2luZG93X2NvbnRleHQuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CgkJCQogICAgCQl3aW5kb3dfY29udGV4dC5kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhpZ2hsaWdodCk7CgkJCWhpZ2hsaWdodC5zdHlsZS5wb3NpdGlvbiAgICAgICAgPSAiYWJzb2x1dGUiOwogICAgCQloaWdobGlnaHQuc3R5bGUudG9wICAgICAgICAgICAgID0gIi0xMDBweCI7CiAgICAJCWhpZ2hsaWdodC5zdHlsZS5yaWdodCAgICAgICAgICAgPSAiMHB4IjsKICAgIAkJaGlnaGxpZ2h0LnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICJyZ2JhKDI1NSwgMCwgMCwgMC4yNSkiOwogICAgCQloaWdobGlnaHQuc3R5bGUuekluZGV4ICAgICAgICAgID0gIjEwMDAiOwoJCQkKCQkJLy8gSGlzdG9yeSBjb29raWUgc3RvcmFnZQoJCQl0cnkgewkKCQkJICAgIGhpc3QgPSBldmFsKGRlY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5jb29raWUubWF0Y2goL2NvbnNvbGVoaXN0b3J5PShbXjtdKikvKVsxXSkpOwoJCSAgICB9IGNhdGNoIChlKSB7CgkJICAgICAgICBoaXN0ID0gW107CgkJICAgIH0KCQkgICAgaWYgKCFoaXN0IHx8IGhpc3QuY29uc3RydWN0b3IgIT0gQXJyYXkpCgkJICAgICAgICBoaXN0ID0gW107CgkJICAgICAgICAKCQkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInVubG9hZCIsIGZ1bmN0aW9uKCkgewoJCQkgICAgdmFyIGpzb24gPSAnWyc7CgkJCSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhpc3QubGVuZ3RoICYmIGpzb24ubGVuZ3RoIDwgMjA0ODsgaSsrKSB7CgkJCSAgICAgICAganNvbiArPSAnIicgKyBoaXN0W2ldLnJlcGxhY2UoLyIvZywgJ1xcIicpLnJlcGxhY2UoL1xcL2csICdcXFxcJykgKyAnIiwnOwoJCQkgICAgfQoJCQkgICAganNvbi5zdWJzdHJpbmcoMCwganNvbi5sZW5ndGgtMik7CgkJCSAgICBqc29uICs9ICddJzsKCQkJICAgIAoJCQkgICAgZG9jdW1lbnQuY29va2llID0gImNvbnNvbGVoaXN0b3J5PSIrZW5jb2RlVVJJQ29tcG9uZW50KGpzb24pKyI7IjsJCQkgICAgCgkJCX0sIGZhbHNlKTsKCQkJCgkJCWxhc3Rfa2V5cHJlc3MgPSBuZXcgRGF0ZSgpOwoJCQkKCQkJLy8gQmxpbmsgY3Vyc29yCgkJCWN1cnNvci5zZXRBdHRyaWJ1dGUoInNob3ciLCAieWVzIik7CgkJCXdpbmRvdy5zZXRJbnRlcnZhbChmdW5jdGlvbigpIHsKCQkJCWN1cnNvci5zZXRBdHRyaWJ1dGUoInNob3ciLCAoY3Vyc29yLmdldEF0dHJpYnV0ZSgic2hvdyIpID09ICJ5ZXMiICYmIChuZXcgRGF0ZSgpIC0gbGFzdF9rZXlwcmVzcykgPiA3NTApID8gIm5vIiA6ICJ5ZXMiKTsKCQkJfSwgNTAwKTsKCQkJCgkJCWhlbHAgPSAiXG4gICAgICAgIEphdmFzY3JpcHQgSW50ZXJhY3RpdmUgQ29uc29sZVxuXG4iICsKCQkJCQkiICAgIC0gdGhlIHJpZ2h0LCBsZWZ0LCBhbmQgYmFja3NwYWNlIGtleXMgYXJlIHVzZWQgdG8gZWRpdCB0aGUgY3VycmVudCBsaW5lXG4iICsKCQkJCQkiICAgIC0gdGhlIHVwIGFuZCBkb3duIGFycm93IGtleXMgbmF2aWdhdGUgdGhyb3VnaCB0aGUgcHJldmlvdXMgY29tbWFuZCBoaXN0b3J5XG4iICsKCQkJCQkiICAgIC0gXCJhbnNcIiBnaXZlcyB0aGUgcmVzdWx0IG9mIHRoZSBwcmV2aW91c2x5IGV2YWx1dGVkIGV4cHJlc3Npb25cbiIgKwoJCQkJCSIgICAgLSBcInByaW50bG4oc3RyaW5nKVwiIGFuZCBcInByaW50KHN0cmluZylcIiBwcmludCBhIHN0cmluZyB3aXRoIG9yIHdpdGhvdXQgYSBuZXdsaW5lIGFwcGVuZGVkLCByZXNwZWN0aXZlbHlcbiIgKwoJCQkJCSIgICAgLSBcImNsZWFyKClcIiBjbGVhcnMgdGhlIHNjcmVlblxuIiArCgkJCQkJIiAgICAtIFwiaGVscFwiIGRpc3BsYXlzIHRoaXMgbWVzc2FnZVxuXG4iOwoJCX0KCQkKCQlmdW5jdGlvbiBjbGVhcigpCgkJewoJCSAgICB3aGlsZSAoY29uc29sZV9oaXN0b3J5LmZpcnN0Q2hpbGQpCgkJICAgICAgICBjb25zb2xlX2hpc3RvcnkucmVtb3ZlQ2hpbGQoY29uc29sZV9oaXN0b3J5LmZpcnN0Q2hpbGQpOwoJCX0KCQkKCQlmdW5jdGlvbiBtYXRjaGluZ19jaGFycyhtYXRjaGVzKQoJCXsKCQkJLy8gbWF0Y2ggYXMgbWFueSBjaGFyYWN0ZXJzIGFzIHBvc3NpYmxlCgkJCS8vIGRvbid0IHdvcnJ5IGFib3V0IG1hdGNoaW5nIHRoZSBpbnB1dCBzdHJpbmcsIHNpbmNlIHRoZXkgYWxsIHNob3VsZAoJCQl2YXIgZG9uZSA9IGZhbHNlLCBjdXJDaGFyTnVtID0gMCwgbGFzdE1hdGNoZWQ7CgoJCQkvLyBjaGVjayBlYWNoIGNoYXJhY3RlciBzZXF1ZW50aWFsbHkuLi4KCQkJd2hpbGUgKCFkb25lICYmIG1hdGNoZXMubGVuZ3RoID4gMCkgewoJCQkJdmFyIGN1ckNoYXI7CgkJCQkvLyBvZiBldmVyeSBwb3RlbnRpYWwgbWF0Y2guLi4KCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgewoJCQkJCS8vIHVudGlsIGVpdGhlciBvbmUgb2YgdGhlIG1hdGNoZXMgaXNuJ3QgbG9uZyBlbm91Z2guLi4KCQkJCQlpZiAobWF0Y2hlc1tpXS5uYW1lLmxlbmd0aC0xIDwgY3VyQ2hhck51bSkgewoJCQkJCQlkb25lID0gdHJ1ZTsKCQkJCQkJbGFzdE1hdGNoZWQgPSBjdXJDaGFyTnVtLTE7CgkJCQkJfQoJCQkJCS8vICh1c2UgZmlyc3QgbWF0Y2ggYXMgYSByZWZlcmVuY2UpCgkJCQkJaWYgKGkgPT0gMCkgewoJCQkJCQljdXJDaGFyID0gbWF0Y2hlc1tpXS5uYW1lLmNoYXJBdChjdXJDaGFyTnVtKTsKCQkJCQl9CgkJCQkJLy8gb3IgdGhlIGNoYXJhY3RlciBkb2Vzbid0IG1hdGNoLgoJCQkJCWVsc2UgaWYgKGN1ckNoYXIgIT0gbWF0Y2hlc1tpXS5uYW1lLmNoYXJBdChjdXJDaGFyTnVtKSkgewoJCQkJCQlkb25lID0gdHJ1ZTsKCQkJCQkJbGFzdE1hdGNoZWQgPSBjdXJDaGFyTnVtLTE7CgkJCQkJfQoJCQkJfQoJCQkJY3VyQ2hhck51bSsrOwoJCQl9CgkJCXJldHVybiBsYXN0TWF0Y2hlZDsKCQl9CgoJCWZ1bmN0aW9uIHJlcGxhY2VfbWF0Y2goaW5wdXQsIG1hdGNoZWQsIHJlcGxhY2VtZW50LCB0eXBlKQoJCXsJCgkJCS8vIGdsb2JhbHM6IGN1cnNvcl9sb2NhdGlvbgoJCQl2YXIgaW4xID0gaW5wdXQuc3Vic3RyaW5nKDAsIGN1cnNvcl9sb2NhdGlvbiAtIG1hdGNoZWQubGVuZ3RoKTsKCQkJdmFyIGluMiA9IGlucHV0LnN1YnN0cmluZyhjdXJzb3JfbG9jYXRpb24gLSBtYXRjaGVkLmxlbmd0aCk7CgkJCgkJCXZhciBleHRyYSA9ICIiOwoJCQl2YXIgZXh0cmFfbGVuID0gMDsKCQkJaWYgKHR5cGUpIHsKCQkJCWlmICh0eXBlID09ICJmdW5jdGlvbiIpIHsKCQkJCQlleHRyYSA9ICIoKSI7CgkJCQkJZXh0cmFfbGVuID0gMTsKCQkJCX0gZWxzZSBpZiAodHlwZSA9PSAiQXJyYXkiKSB7CgkJCQkJZXh0cmEgPSAiW10iOwoJCQkJCWV4dHJhX2xlbiA9IDE7CgkJCQl9CgkJCX0KCQkJCgkJCWN1cnNvcl9sb2NhdGlvbiArPSAocmVwbGFjZW1lbnQubGVuZ3RoIC0gbWF0Y2hlZC5sZW5ndGgpICsgZXh0cmFfbGVuOwoJCQlyZXR1cm4gaW4xICsgaW4yLnJlcGxhY2UobWF0Y2hlZCwgcmVwbGFjZW1lbnQgKyBleHRyYSk7CgkJfQoJCQoJCWZ1bmN0aW9uIGNsZWFyX2F1dG9jb21wbGV0ZSgpCgkJewoJCQlpZiAoYXV0b2NvbXBsZXRlX3Jlc3VsdHMuZmlyc3RDaGlsZCkKCQkJCWF1dG9jb21wbGV0ZV9yZXN1bHRzLnJlbW92ZUNoaWxkKGF1dG9jb21wbGV0ZV9yZXN1bHRzLmZpcnN0Q2hpbGQpOwoJCX0KCQkKCQlmdW5jdGlvbiBkZWVwX3R5cGVvZihvYmopCgkJewoJCQl2YXIgdHlwZSA9IHR5cGVvZiBvYmo7CgkJCWlmICh0eXBlID09ICJvYmplY3QiICYmIG9iaiAmJiBvYmouY29uc3RydWN0b3IpIHsKCQkJCXN3aXRjaCAob2JqLmNvbnN0cnVjdG9yKSB7CgkJCQkJY2FzZSBBcnJheTogIHJldHVybiAiQXJyYXkiOwoJCQkJCWNhc2UgU3RyaW5nOiByZXR1cm4gIlN0cmluZyI7CgkJCQkJY2FzZSBOdW1iZXI6IHJldHVybiAiTnVtYmVyIjsKCQkJCQljYXNlIERhdGU6ICAgcmV0dXJuICJEYXRlIjsKCQkJCQljYXNlIFJlZ0V4cDogcmV0dXJuICJSZWdFeHAiOwoJCQkJfQoJCQl9CgkJCXJldHVybiB0eXBlOwoJCX0KCQkKCQlmdW5jdGlvbiBwYXN0ZSgpCgkJewoJCQloaWRkZW5faW5wdXQudmFsdWUgPSAiIjsKCQkJaGlkZGVuX2lucHV0LmZvY3VzKCk7CgkJCQoJCQkvLyAid2FpdCIgZm9yIHRoZSBwYXN0ZSB0byBvY2N1ciAoYnkgcGVyZm9ybWluZyBhIHRpbWVvdXQpCgkJCQoJCQl3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsKCQkJICAgIC8vIHdlIGRvbid0IGhhdmUgbXVsdGlsaW5lIGlucHV0IHlldCwgc28gY29sbGFwc2UgbmV3bGluZXMgYW5kIGhvcGUgYWxsIGxpbmVzIGFyZSBzZW1pY29sb24gdGVybWluYXRlZC4uLgoJCSAgICAgICAgdmFyIHBhc3RlZCA9IGhpZGRlbl9pbnB1dC52YWx1ZS5yZXBsYWNlKC9cbi9nLCAiICIpOwogICAgCQkgICAgaGlkZGVuX2lucHV0LnZhbHVlID0gIiI7CgogICAgCQkJaW5wdXQgPSBpbnB1dC5zdWJzdHJpbmcoMCwgY3Vyc29yX2xvY2F0aW9uKSArIHBhc3RlZCArIGlucHV0LnN1YnN0cmluZyhjdXJzb3JfbG9jYXRpb24pOwogICAgCQkJY3Vyc29yX2xvY2F0aW9uICs9IHBhc3RlZC5sZW5ndGg7CgogICAgCQkgICAgdXBkYXRlX2lucHV0KCk7CgogICAgCQkJaGlkZGVuX2lucHV0LmJsdXIoKTsKICAgIAkJfSwgMCk7CgkJfQoKCQlmdW5jdGlvbiBrZXloYW5kbGVyKGUpIAoJCXsKCQkgICAgdmFyIGUgPSBlIHx8IHdpbmRvdy5ldmVudDsKCQkgICAgCgkJICAgIGxhc3Rfa2V5cHJlc3MgPSBuZXcgRGF0ZSgpOwoJCQkKCQkJLy8gSEFDSyB0byBwcmV2ZW50IHRoZSBzZWNvbmQgdGFiIGV2ZW50IGZyb20gY2xlYXJpbmcgYXV0b2NvbXBsZXRpb24KCQkJaWYgKGUua2V5Q29kZSAhPSA5KQoJCQkgICAgY2xlYXJfYXV0b2NvbXBsZXRlKCk7CgkJCQoJCQlpZiAoZS50eXBlID09ICJrZXlwcmVzcyIpIHsKCQkJICAgIGlmIChlLm1ldGFLZXkpIHsKCQkJICAgICAgICBpZiAoZS5jaGFyQ29kZSA9PSAxMDcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbW1hbmQgSwoJCQkgICAgICAgICAgICBjbGVhcigpOwoJCQkgICAgICAgICAgICByZXR1cm47CgkJCSAgICAgICAgfQogICAgCQkJICAgIGlmIChlLmNoYXJDb2RlID09IDExOCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbWFuZCBWCiAgICAJCQkgICAgICAgIHBhc3RlKCk7CiAgICAgICAgCQkJCXJldHVybjsKICAgIAkJCSAgICB9IGVsc2UgewogICAgICAgIAkJCQlyZXR1cm47CiAgICAJCQkgICAgfQogICAgCQkJfQogICAgCQkJZWxzZSBpZiAoZS5jdHJsS2V5KSB7CiAgICAJCQkJaWYgKGUuY2hhckNvZGUgPT0gMSB8fCBlLmNoYXJDb2RlID09IDk3KSB7CQkJICAgIC8vIGNvbnRyb2wgQQogICAgCQkJCQljdXJzb3JfbG9jYXRpb24gPSAwOwogICAgCQkJCX0gZWxzZSBpZiAoZS5jaGFyQ29kZSA9PSAzIHx8IGUuY2hhckNvZGUgPT0gOTkpIHsJICAgIC8vIGNvbnRyb2wgQwogICAgCQkJCQlpbnB1dCA9ICIiOwogICAgCQkJCX0gZWxzZSBpZiAoZS5jaGFyQ29kZSA9PSA1IHx8IGUuY2hhckNvZGUgPT0gMTAxKSB7CSAgICAvLyBjb250cm9sIEUKICAgIAkJCQkJY3Vyc29yX2xvY2F0aW9uID0gaW5wdXQubGVuZ3RoOwogICAgCQkJCX0gZWxzZSBpZiAoZS5jaGFyQ29kZSA9PSAyMikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udHJvbCBWCiAgICAgICAgICAgIAkJCXBhc3RlKCk7CiAgICAgICAgCQkJCXJldHVybjsKICAgICAgICAgICAgCQl9IGVsc2UgewogICAgICAgICAgICAJCSAgICByZXR1cm47CiAgICAgICAgICAgIAkJfQogICAgCQkJfQogICAgCQkJLy8gcHJpbnRhYmxlIGNoYXJhY3RlcnMgbXVzdCBjb21lIGZpcnN0IHNpbmNlIHNvbWUga2V5IGNvZGVzIGNvbmZsaWN0IGJldHdlZW4gU2FmYXJpIGFuZCBGaXJlZm94CiAgICAJCQllbHNlIGlmIChlLmNoYXJDb2RlID49IDMyICYmIGUuY2hhckNvZGUgPD0gMTI2KSB7IC8vIHByaW50YWJsZQogICAgCQkJCWlucHV0ID0gaW5wdXQuc3Vic3RyaW5nKDAsIGN1cnNvcl9sb2NhdGlvbikgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUpICsgaW5wdXQuc3Vic3RyaW5nKGN1cnNvcl9sb2NhdGlvbik7CiAgICAJCQkJY3Vyc29yX2xvY2F0aW9uKys7CiAgICAJCQkJdXBkYXRlX2F1dG9jb21wbGV0ZShmYWxzZSk7CiAgICAJCQl9CiAgICAJCQllbHNlIGlmIChlLmtleUNvZGUgPT0gOCB8fCBlLmtleUNvZGUgPT0gOTIpIHsgLy8gYmFja3NwYWNlCiAgICAJCQkJaWYgKGN1cnNvcl9sb2NhdGlvbiA+IDApIHsKICAgIAkJCQkJLy8gZ2V0IHRoZSBpbnB1dCBzdHJpbmcgd2l0aCB0aGUgY2hhcmFjdGVyIGF0IGN1cnNvcl9sb2NhdGlvbiByZW1vdmVkIGFuZCBtb3ZlIGN1cnNvcl9sb2NhdGlvbgogICAgCQkJCQlpbnB1dCA9IGlucHV0LnN1YnN0cmluZygwLCBjdXJzb3JfbG9jYXRpb24tMSkgKyBpbnB1dC5zdWJzdHJpbmcoY3Vyc29yX2xvY2F0aW9uKTsKICAgIAkJCQkJY3Vyc29yX2xvY2F0aW9uLS07CiAgICAJCQkJfQogICAgCQkJCXVwZGF0ZV9hdXRvY29tcGxldGUoZmFsc2UpOwogICAgCQkJfQogICAgCQkJZWxzZSBpZiAoZS5rZXlDb2RlID09IDMgfHwgZS5rZXlDb2RlID09IDEzKSB7IC8vIGVudGVyLCByZXR1cm4KICAgIAkJCQlleGVjdXRlX2lucHV0KCk7CiAgICAJCQl9CiAgICAJCQllbHNlIHsKICAgIAkJCQlyZXR1cm47CiAgICAJCQl9CiAgICAJCX0JCiAgICAJCWVsc2UgaWYgKGUudHlwZSA9PSAia2V5ZG93biIpIHsKICAgIAkJICAgIAoJICAgIAkgICAgaWYgKGUubWV0YUtleSkgewoJICAgIAkgICAgICAgIHJldHVybjsKICAgIAkJCX0KICAgIAkJCWVsc2UgaWYgKGUuY3RybEtleSkgewogICAgCQkJICAgIHJldHVybjsKCQkJICAgIH0KICAgIAkJICAgIGVsc2UgaWYgKChlLmtleUNvZGUgPT0gNjMyMzIgfHwgZS5rZXlDb2RlID09IDM4KSAmJiBoaXN0X251bSA8IGhpc3QubGVuZ3RoKSB7IC8vIHVwIGFycm93CiAgICAJCQkJaWYgKGhpc3RfbnVtID09IDApIGlucHV0X3NhdmVkID0gaW5wdXQ7CiAgICAJCQkJaGlzdF9udW0rKzsKICAgIAkJCQlpbnB1dCA9IGhpc3RbaGlzdC5sZW5ndGgtaGlzdF9udW1dOwogICAgCQkJCWN1cnNvcl9sb2NhdGlvbiA9IGlucHV0Lmxlbmd0aDsKICAgIAkJCX0KICAgIAkJCWVsc2UgaWYgKChlLmtleUNvZGUgPT0gNjMyMzMgfHwgZS5rZXlDb2RlID09IDQwKSAmJiBoaXN0X251bSA+IDApIHsgLy8gZG93biBhcnJvdwogICAgCQkJCWhpc3RfbnVtLS07CiAgICAJCQkJaW5wdXQgPSBoaXN0X251bSA/IGhpc3RbaGlzdC5sZW5ndGgtaGlzdF9udW1dIDogaW5wdXRfc2F2ZWQKICAgIAkJCQljdXJzb3JfbG9jYXRpb24gPSBpbnB1dC5sZW5ndGg7CiAgICAJCQl9CiAgICAJCQllbHNlIGlmICgoZS5rZXlDb2RlID09IDYzMjM0IHx8IGUua2V5Q29kZSA9PSAzNykgJiYgY3Vyc29yX2xvY2F0aW9uID4gMCkgeyAvLyBsZWZ0IGFycm93CiAgICAJCQkJY3Vyc29yX2xvY2F0aW9uLS07CiAgICAJCQl9CiAgICAJCQllbHNlIGlmICgoZS5rZXlDb2RlID09IDYzMjM1IHx8IGUua2V5Q29kZSA9PSAzOSkgJiYgY3Vyc29yX2xvY2F0aW9uIDwgaW5wdXQubGVuZ3RoKSB7IC8vIHJpZ2h0IGFycm93CiAgICAJCQkJY3Vyc29yX2xvY2F0aW9uKys7CiAgICAJCQl9CiAgICAJCSAgICBlbHNlIGlmIChlLmtleUNvZGUgPT0gOSkgeyAvLyB0YWIKICAgIAkJCQl1cGRhdGVfYXV0b2NvbXBsZXRlKHRydWUpOwogICAgCQkJfQogICAgCQkJZWxzZSB7CiAgICAJCQkgICAgcmV0dXJuOwogICAgCQkJfQogICAgCQl9CgoJCQllLnByZXZlbnREZWZhdWx0KCk7CgkJCWUuc3RvcFByb3BhZ2F0aW9uKCk7CgkJCQkKCQkJdXBkYXRlX2lucHV0KCk7CgkJfQoJCQoJCWZ1bmN0aW9uIGVtaXRFbGVtZW50KGVsZW1lbnQpIHsKCQkgICAgb3V0cHV0KG91dHB1dEZvck9iamVjdChlbGVtZW50KSk7CiAgICAJCWFucyA9IGVsZW1lbnQ7CgkJfQoKCQlmdW5jdGlvbiBnZXRSZWN0KG9iaikgewogICAgICAgIAl2YXIgdyA9IGggPSB4ID0geSA9IDA7CgkJICAgIGlmIChvYmoub2Zmc2V0UGFyZW50KSB7CiAgICAgICAgCSAgICB3ID0gb2JqLm9mZnNldFdpZHRoOwogICAgICAgIAkgICAgaCA9IG9iai5vZmZzZXRIZWlnaHQ7CgkJICAgICAgICBkbyB7CiAgICAJCQkgICAgeCArPSBvYmoub2Zmc2V0TGVmdDsKICAgIAkJCSAgICB5ICs9IG9iai5vZmZzZXRUb3A7CgkJICAgICAgICB9IHdoaWxlIChvYmogPSBvYmoub2Zmc2V0UGFyZW50KTsKCQkgICAgfQoJCQlyZXR1cm4ge3g6IHgsIHk6IHksIHc6IHcsIGg6IGh9OwogICAgICAgIH0KCQkKCQlmdW5jdGlvbiBoaWdobGlnaHRFbGVtZW50KGVsZW1lbnQpIHsKCQkgICAgdmFyIHAgPSBnZXRSZWN0KGVsZW1lbnQpOwoJCSAgICAKCQkgICAgaGlnaGxpZ2h0LnN0eWxlLnRvcCA9IHAueSArICJweCI7CiAgICAJCWhpZ2hsaWdodC5zdHlsZS5sZWZ0ID0gcC54ICsgInB4IjsKICAgICAgICAJaGlnaGxpZ2h0LnN0eWxlLndpZHRoID0gcC53ICsgInB4IjsKICAgICAgICAJaGlnaGxpZ2h0LnN0eWxlLmhlaWdodCA9IHAuaCArICJweCI7CgkJfQoJCQoJCWZ1bmN0aW9uIGNsZWFySGlnaGxpZ2h0KCkgewoJCSAgICBoaWdobGlnaHQuc3R5bGUudG9wID0gIi0xMDBweCI7CiAgICAgICAgCWhpZ2hsaWdodC5zdHlsZS5oZWlnaHQgPSAiMHB4IjsKCQl9CgkJCgkJZnVuY3Rpb24gb3V0cHV0Rm9yT2JqZWN0KG9iamVjdCkgewoJCSAgICB2YXIgb3V0cHV0OwoJCSAgICAKICAgICAgICAgICAgaWYgKG9iamVjdC5vZmZzZXRUb3AgIT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgICAgICAgICAgICBvdXRwdXQuY2xhc3NOYW1lID0gImRvbWxpbmsiOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHRhcmdldCwgZWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW92ZXIiLCBmdW5jdGlvbigpIHsgaGlnaGxpZ2h0RWxlbWVudChlbGVtZW50KTsgfSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW91dCIsICBmdW5jdGlvbigpIHsgY2xlYXJIaWdobGlnaHQoKTsgfSwgICAgICAgICAgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsICAgICBmdW5jdGlvbigpIHsgZW1pdEVsZW1lbnQoZWxlbWVudCk7IH0sICAgICAgZmFsc2UpOwogICAgICAgICAgICAgICAgfSkob3V0cHV0LCBvYmplY3QpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKG9iamVjdCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChvYmplY3QuY29uc3RydWN0b3IgPT0gTm9kZUxpc3QpIHsKICAgICAgICAgICAgICAgIG91dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiWyIpKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb2JqZWN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZENoaWxkKG91dHB1dEZvck9iamVjdChvYmplY3RbaV0pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaSAhPSBvYmplY3QubGVuZ3RoLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiLCAiKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIl0iKSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBvdXRwdXQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShTdHJpbmcob2JqZWN0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKCQl9CgkJCgkJZnVuY3Rpb24gZXhlY3V0ZV9pbnB1dCgpCgkJewoJCQloaXN0LnB1c2goaW5wdXQpOwoJCQkKCQkJcHJpbnRsbigiPiAiICsgaW5wdXQpOwoJCQl0cnkgewoJCQkJYW5zID0gZXZhbEluQ29udGV4dChpbnB1dCk7CgkJCX0gY2F0Y2ggKGVycikgewoJCQkJYW5zID0gZXJyOwoJCQl9CgkJCQoJCQl2YXIgaGFuZGxlZCA9IGZhbHNlOwoJCQlpZiAoYW5zICE9IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgb3V0cHV0KG91dHB1dEZvck9iamVjdChhbnMpKTsKCQkJfQoJCQkKCQkJaW5wdXQgPSAiIjsKCQkJaGlzdF9udW0gPSAwOwoJCQljdXJzb3JfbG9jYXRpb24gPSAwOwoJCX0KCQkKCQlmdW5jdGlvbiB1cGRhdGVfYXV0b2NvbXBsZXRlKHJlcGxhY2UpIHsKCQkgICAgaWYgKHdpbmRvdy5kaXNhYmxlQXV0b2NvbXBsZXRlKQoJCSAgICAgICAgcmV0dXJuOwoJCSAgICAgICAgCgkJCXZhciBwYXJhbTEsIHBhcmFtMjsKCQkJdmFyIG1hdGNoX2NvbXBhcmUgPSBmdW5jdGlvbiAoYSwgYikgewoJCQkJaWYgKGFbcGFyYW0xXSA8IGJbcGFyYW0xXSkKCQkJCQlyZXR1cm4gLTE7CgkJCQlpZiAoYVtwYXJhbTFdID4gYltwYXJhbTFdKQoJCQkJCXJldHVybiAxOwoJCQkJaWYgKGFbcGFyYW0yXSA8IGJbcGFyYW0yXSkKCQkJCQlyZXR1cm4gLTE7CgkJCQlpZiAoYVtwYXJhbTJdID4gYltwYXJhbTJdKQoJCQkJCXJldHVybiAxOwoJCQkJcmV0dXJuIDA7CgkJCX0KCQkJCgkJCWNsZWFyX2F1dG9jb21wbGV0ZSgpOwoKCQkJLy8gT2JqZWN0aXZlLUogYXV0b2NvbXBsZXRlOgkJCQoJCQl2YXIgb2Jqal9tYXRjaGVzID0gW107CgkJCQoJCQl2YXIgb2Jqal9vYmo7CgkJCWlmICh0eXBlb2Yod2luZG93X2NvbnRleHQub2Jqal9wcmVwcm9jZXNzKSAhPSAidW5kZWZpbmVkIikgewoJCQkJdmFyIG9iampfbWF0Y2ggPSBpbnB1dC5zdWJzdHJpbmcoMCwgY3Vyc29yX2xvY2F0aW9uKS5tYXRjaCgvXFtbXHddK1tcc10rW1x3XSokLyk7CgkJCQlpZiAob2Jqal9tYXRjaCkgewoJCQkJCXZhciBwYXJ0cyA9IG9iampfbWF0Y2hbMF0uc3Vic3RyaW5nKDEpLnNwbGl0KCIgIik7CgkJCQkJb2Jqal9vYmpfbmFtZSA9IHBhcnRzWzBdOwoJCQkJCW9iampfbWF0Y2hfc3RyaW5nID0gKHBhcnRzLmxlbmd0aCA+IDEpID8gcGFydHNbMV0gOiAiIjsKCQkJCQkKCQkJCQl0cnkgewoJCQkJCQlvYmpqX29iaiA9IGV2YWxJbkNvbnRleHQocGFydHNbMF0pOwoJCQkJCQl2YXIgaXNhID0gb2Jqal9vYmouaXNhOwoJCQkJCQl2YXIgZGVwdGggPSAwOwoJCQkJCQl3aGlsZSAoaXNhKSB7CgkJCQkJCQlmb3IgKHZhciBuYW1lIGluIGlzYS5tZXRob2RzLmJ1Y2tldHMpCgkJCQkJCQkJaWYgKG5hbWUuaW5kZXhPZihvYmpqX21hdGNoX3N0cmluZykgPT0gMCkKCQkJCQkJCQkJb2Jqal9tYXRjaGVzLnB1c2goeyBuYW1lOiBuYW1lLCB0eXBlOiBpc2EubmFtZSwgZGVwdGg6IGRlcHRoIH0pOwoJCQkJCQkJaXNhID0gaXNhLnN1cGVyX2NsYXNzOwoJCQkJCQkJZGVwdGgrKzsKCQkJCQkJfQoJCQkJCX0gY2F0Y2ggKGVycikgewoJCQkJCQlvYmpqX29iaiA9IG51bGw7CgkJCQkJfQoJCQkJfQoJCQl9CgkJCQoJCQkvLyBKYXZhU2NyaXB0IGF1dG9jb21wbGV0ZToKCQkJdmFyIGpzX21hdGNoZXMgPSBbXTsKCQkJCgkJCXZhciBqc19tYXRjaF90bXAgPSBpbnB1dC5zdWJzdHJpbmcoMCwgY3Vyc29yX2xvY2F0aW9uKS5tYXRjaCgvW1x3XVtcd1wuXCRcKFwpXFtcXVwiXCddKiQvKTsKCQkJdmFyIGpzX21hdGNoID0gKGpzX21hdGNoX3RtcCkgPyBqc19tYXRjaF90bXBbMF0gOiAiIjsKCQkJdmFyIGpzX29ial9uYW1lICAgICA9IGpzX21hdGNoLnN1YnN0cmluZygwLCBqc19tYXRjaC5sYXN0SW5kZXhPZigiLiIpKTsKCQkJdmFyIGpzX21hdGNoX3N0cmluZyA9IGpzX21hdGNoLnN1YnN0cmluZyhqc19tYXRjaC5sYXN0SW5kZXhPZigiLiIpKzEpOwoJCQkKCQkJdmFyIGpzX29iaiA9IG51bGw7CgkJCWlmIChqc19tYXRjaC5pbmRleE9mKCIuIikgPCAwKSB7CgkJCQlqc19vYmogPSB3aW5kb3dfY29udGV4dDsgLy8gZ2xvYmFsCgkJCX0gZWxzZSB7CgkJCQl0cnkgewoJCQkJCWpzX29iaiA9IGV2YWxJbkNvbnRleHQoanNfb2JqX25hbWUpOwoJCQkJfSBjYXRjaCAoZXJyKSB7CgkJCQkJanNfb2JqID0gbnVsbDsKCQkJCX0KCQkJfQoJCQlpZiAoanNfb2JqKQoJCQkJZm9yICh2YXIgbmFtZSBpbiBqc19vYmopIHsKCQkJCSAgICB0cnkgewogICAgCQkJCQlpZiAobmFtZS5pbmRleE9mKGpzX21hdGNoX3N0cmluZykgPT0gMCkKICAgIAkJCQkJCWpzX21hdGNoZXMucHVzaCh7IG5hbWU6IG5hbWUsIHR5cGU6IGRlZXBfdHlwZW9mKGpzX29ialtuYW1lXSkgfSk7CgkJCQkgICAgfSBjYXRjaCAoZSkgewoJCQkJICAgICAgICAvL2NvbnNvbGUubG9nKCJFcnJvciBidXQgY29udGludWluZzogIiArIGUgKyAiICgiK25hbWUrIikiKTsKCQkJCSAgICB9CgkJCQl9CgkJCQoJCQl2YXIgbWF0Y2hlcywgbWF0Y2hfc3RyaW5nOwoJCQkvLyBHaXZlIE9iamVjdGl2ZS1KIHByaW9yaXR5CgkJCWlmIChvYmpqX29iaikgewoJCQkJbWF0Y2hfc3RyaW5nCT0gb2Jqal9tYXRjaF9zdHJpbmc7CgkJCQltYXRjaGVzCQkJPSBvYmpqX21hdGNoZXM7CgkJCQlwYXJhbTEJCQk9ICJkZXB0aCI7CgkJCQlwYXJhbTIJCQk9ICJuYW1lIjsKCQkJfSBlbHNlIHsKCQkJCW1hdGNoX3N0cmluZwk9IGpzX21hdGNoX3N0cmluZzsKCQkJCW1hdGNoZXMJCQk9IGpzX21hdGNoZXM7CgkJCQlwYXJhbTEJCQk9ICJ0eXBlIjsKCQkJCXBhcmFtMgkJCT0gIm5hbWUiOwoJCQl9CgkJCQoJCQkvLyBDb21tb24gdG8gYm90aCBKYXZhU2NyaXB0IGFuZCBPYmplY3RpdmUtSjoKCQkJbWF0Y2hlcyA9IG1hdGNoZXMuc29ydChtYXRjaF9jb21wYXJlKTsKCQkJCgkJCWlmIChtYXRjaGVzLmxlbmd0aCA+IDApIHsKCQkJCXZhciBhdXRvY29tcGxldGVfbGlzdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInVsIik7CgkJCQlhdXRvY29tcGxldGVfbGlzdC5zZXRBdHRyaWJ1dGUoImlkIiwgImF1dG9jb21wbGV0ZS1saXN0Iik7CgkJCQkKCQkJCWZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hlcy5sZW5ndGg7IGkrKykgewoJCQkJCgkJCQkJdHJ5IHsKCQkJCQkJdmFyIGF1dG9jb21wbGV0ZV9pdGVtID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKTsKCQkJCQkJYXV0b2NvbXBsZXRlX2l0ZW0ucHJvcF9uYW1lID0gbWF0Y2hlc1tpXS5uYW1lOwoJCQkJCQlhdXRvY29tcGxldGVfaXRlbS5wcm9wX3R5cGUgPSBtYXRjaGVzW2ldLnR5cGU7CiAgICAgICAgICAgICAgICAgICAgCQoJCQkJCQlhdXRvY29tcGxldGVfaXRlbS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKGUpIHsKCQkJCQkJCWlucHV0ID0gcmVwbGFjZV9tYXRjaChpbnB1dCwgbWF0Y2hfc3RyaW5nLCBlLnRhcmdldC5wcm9wX25hbWUsIGUudGFyZ2V0LnByb3BfdHlwZSk7CgkJCQkJCQl1cGRhdGVfaW5wdXQoKTsKCQkJCQkJCWNsZWFyX2F1dG9jb21wbGV0ZSgpOwoJCQkJCQl9LCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgCQoJCQkJCQlhdXRvY29tcGxldGVfaXRlbS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShtYXRjaGVzW2ldLm5hbWUgKyAiICgiKyBtYXRjaGVzW2ldLnR5cGUgKyIpIikpOwoJCQkJCQkKCQkJCQkJYXV0b2NvbXBsZXRlX2xpc3QuYXBwZW5kQ2hpbGQoYXV0b2NvbXBsZXRlX2l0ZW0pOwoJCQkJCX0gY2F0Y2goZXJyKSB7CgkJCQkJfQoJCQkJfQoJCQkJCgkJCQlpZiAobWF0Y2hlcy5sZW5ndGggPiAwKSB7CgkJCQkJaWYgKG1hdGNoZXMubGVuZ3RoID4gMSB8fCAhcmVwbGFjZSkKCQkJCQkJYXV0b2NvbXBsZXRlX3Jlc3VsdHMuYXBwZW5kQ2hpbGQoYXV0b2NvbXBsZXRlX2xpc3QpOwoJCQkJCQoJCQkJCWlmIChyZXBsYWNlKSB7CgkJCQkJCXZhciBudW1fbWF0Y2hpbmdfY2hhcnMgPSBtYXRjaGluZ19jaGFycyhtYXRjaGVzKTsKCQkJCQkJdmFyIHJlcGxhY2VtZW50ID0gbWF0Y2hlc1swXS5uYW1lLnN1YnN0cmluZygwLCBudW1fbWF0Y2hpbmdfY2hhcnMrMSk7CgkJCQkJCQoJCQkJCQl2YXIgdHlwZSA9IChtYXRjaGVzLmxlbmd0aCA9PSAxKSA/IG1hdGNoZXNbMF0udHlwZSA6IG51bGw7CgkJCQkJCWlucHV0ID0gcmVwbGFjZV9tYXRjaChpbnB1dCwgbWF0Y2hfc3RyaW5nLCByZXBsYWNlbWVudCwgdHlwZSk7CgkJCQkJCQoJCQkJCQltYXRjaF9zdHJpbmcgPSByZXBsYWNlbWVudDsgLy8gaGFja2lzaDogdXBkYXRlIHNvIHN1YnNlcXVlbnQgcmVwbGFjZW1lbnQgd29yayAoY2F1c2Ugb2YgdGhhdCBjbG9zdXJlIGNyYXApCgkJCQkJfQoJCQkJfQoJCQl9CgkJfQoJCQoJCWZ1bmN0aW9uIHVwZGF0ZV9pbnB1dCgpCgkJewogICAgICAgICAgICB3aGlsZSAoYmVnaW5uaW5nLmZpcnN0Q2hpbGQpCiAgICAgICAgICAgICAgICBiZWdpbm5pbmcucmVtb3ZlQ2hpbGQoYmVnaW5uaW5nLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICB3aGlsZSAoY3Vyc29yLmZpcnN0Q2hpbGQpCiAgICAgICAgICAgICAgICBjdXJzb3IucmVtb3ZlQ2hpbGQoY3Vyc29yLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICB3aGlsZSAoZW5kLmZpcnN0Q2hpbGQpCiAgICAgICAgICAgICAgICBlbmQucmVtb3ZlQ2hpbGQoZW5kLmZpcnN0Q2hpbGQpOwogICAgICAgICAgICAKICAgICAgICAgICAgYmVnaW5uaW5nLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGlucHV0LnN1YnN0cmluZygwLCBjdXJzb3JfbG9jYXRpb24pKSk7CiAgICAgICAgICAgIGN1cnNvci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgoY3Vyc29yX2xvY2F0aW9uIDwgaW5wdXQubGVuZ3RoKSA/IGlucHV0LmNoYXJBdChjdXJzb3JfbG9jYXRpb24pIDogIiAiKSk7CiAgICAgICAgICAgIGVuZC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShpbnB1dC5zdWJzdHJpbmcoY3Vyc29yX2xvY2F0aW9uKzEpKSk7CiAgICAgICAgICAgIAoJCQl2YXIgdG9wID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSgkKCJjb25zb2xlLWhpc3RvcnkiKSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgiaGVpZ2h0Iik7CgkJCXZhciB0b3BfdmFsID0gcGFyc2VJbnQodG9wKSAtIDEwMDsgLy8gLSAoaW5uZXJIZWlnaHQvMik7CgkJCXNjcm9sbFRvKDAsIHRvcF92YWwpOwoJCX0KCQkKCQlmdW5jdGlvbiBwcmludChsaW5lKSB7IGNvbnNvbGVfaGlzdG9yeS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lKSk7IH0KCQlmdW5jdGlvbiBwcmludGxuKGxpbmUpIHsgY29uc29sZV9oaXN0b3J5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmUgKyAiXG4iKSk7IH0KCQlmdW5jdGlvbiBvdXRwdXQoZWxlbWVudCkgeyBjb25zb2xlX2hpc3RvcnkuYXBwZW5kQ2hpbGQoZWxlbWVudCk7IGNvbnNvbGVfaGlzdG9yeS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiXG4iKSkgfQoJCQoJCXdpbmRvdy5zZXRUaW1lb3V0KGluaXQsIDApOwogICAgfSkoKTsKICAgIAoJPC9zY3JpcHQ+CjwvaGVhZD4KPGJvZHk+Cgo8ZGl2IGNsYXNzPSJjb25zb2xlIiBpZD0iY29uc29sZS1oaXN0b3J5Ij48L2Rpdj4KPGRpdiBjbGFzcz0iY29uc29sZSIgaWQ9ImNvbnNvbGUtaW5wdXQiPjxzcGFuPiZndDsmbmJzcDs8L3NwYW4+PHNwYW4gaWQ9ImlucHV0LWJlZ2lubmluZyI+PC9zcGFuPjxzcGFuIGlkPSJjdXJzb3IiPiZuYnNwOzwvc3Bhbj48c3BhbiBpZD0iaW5wdXQtZW5kIj48L3NwYW4+PC9kaXY+Cgo8ZGl2IGlkPSJhdXRvY29tcGxldGUtcmVzdWx0cyI+PC9kaXY+CjxpbnB1dCB0eXBlPSJ0ZXh0IiBpZD0iaGlkZGVuLWlucHV0IiAvPgo8L2JvZHk+CjwvaHRtbD4K';dataurl='data:text/html;charset=utf-8;base64,'+data;window_name%20=%20confirm('Open%20in%20new%20window?%20(\'OK\'%20for%20new,%20\'Cancel\'%20for%20existing)')?'_blank':'_self';new_window%20=%20window.open('',window_name,'height=600,width=400,menubar=no,location=no,toolbar=no,status=yes,resizable=yes,scrollbars=yes');new_window.document.write(atob(data));setTimeout(function()%20{%20new_window.focus();%20},%200);})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment