Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active January 28, 2018 13:36
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/3ce920d1184d5bd2436bca0560751885 to your computer and use it in GitHub Desktop.
Save timelyportfolio/3ce920d1184d5bd2436bca0560751885 to your computer and use it in GitHub Desktop.
parallel-coordinates with bootstrap button categorical filtering
license: mit
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvaS5leGVjKG4pKXN3aXRjaCh1PXJbMl0uc3BsaXQoIiwiKSxyWzFdKXtjYXNlImhzbCI6cmV0dXJuIGUocGFyc2VGbG9hdCh1WzBdKSxwYXJzZUZsb2F0KHVbMV0pLzEwMCxwYXJzZUZsb2F0KHVbMl0pLzEwMCk7Y2FzZSJyZ2IiOnJldHVybiB0KGt0KHVbMF0pLGt0KHVbMV0pLGt0KHVbMl0pKX1yZXR1cm4oaT1HYS5nZXQobi50b0xvd2VyQ2FzZSgpKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMNCn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLFMubGluZVN0YXJ0PXJ9fTtyZXR1cm4gU31mdW5jdGlvbiB1KHQsZSxyLGEsYyxsLHMsZixoLGcscCx2LGQsbSl7dmFyIHk9cy10LE09Zi1lLHg9eSp5K00qTTtpZih4PjQqaSYmZC0tKXt2YXIgYj1hK2csXz1jK3Asdz1sK3YsUz1NYXRoLnNxcnQoYipiK18qXyt3KncpLGs9TWF0aC5hc2luKHcvPVMpLEU9Z2EoZ2EodyktMSk8Q2F8fGdhKHItaCk8Q2E/KHIraCkvMjpNYXRoLmF0YW4yKF8sYiksQT1uKEUsayksTj1BWzBdLEM9QVsxXSx6PU4tdCxxPUMtZSxMPU0qei15KnE7KEwqTC94Pml8fGdhKCh5KnorTSpxKS94LS41KT4uM3x8bz5hKmcrYypwK2wqdikmJih1KHQsZSxyLGEsYyxsLE4sQyxFLGIvPVMsXy89Uyx3LGQsbSksbS5wb2ludChOLEMpLHUoTixDLEUsYixfLHcscyxmLGgsZyxwLHYsZCxtKSl9fXZhciBpPS41LG89TWF0aC5jb3MoMzAqRGEpLGE9MTY7cmV0dXJuIHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPShpPW4qbik+MCYmMTYsdCk6TWF0aC5zcXJ0KGkpfSx0fWZ1bmN0aW9uIHRyKG4pe3ZhciB0PW5yKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oW3QqUGEsZSpQYV0pfSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBvcih0KG4pKX19ZnVuY3Rpb24gZXIobil7dGhpcy5zdHJlYW09bn1mdW5jdGlvbiBycihuLHQpe3JldHVybntwb2ludDp0LHNwaGVyZTpmdW5jdGlvbigpe24uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtuLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpfX19ZnVuY3Rpb24gdXIobil7cmV0dXJuIGlyKGZ1bmN0aW9uKCl7cmV0dXJuIG59KSgpfWZ1bmN0aW9uIGlyKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuIG49YShuWzBdKkRhLG5bMV0qRGEpLFtuWzBdKmgrYyxsLW5bMV0qaF19ZnVuY3Rpb24gZShuKXtyZXR1cm4gbj1hLmludmVydCgoblswXS1jKS9oLChsLW5bMV0pL2gpLG4mJltuWzBdKlBhLG5bMV0qUGFdfWZ1bmN0aW9uIHIoKXthPUFlKG89bHIobSxNLHgpLGkpO3ZhciBuPWkodixkKTtyZXR1cm4gYz1nLW5bMF0qaCxsPXArblsxXSpoLHUoKX1mdW5jdGlvbiB1KCl7cmV0dXJuIHMmJihzLnZhbGlkPSExLHM9bnVsbCksdH12YXIgaSxvLGEsYyxsLHMsZj1ucihmdW5jdGlvbihuLHQpe3JldHVybiBuPWkobix0KSxbblswXSpoK2MsbC1uWzFdKmhdfSksaD0xNTAsZz00ODAscD0yNTAsdj0wLGQ9MCxtPTAsTT0wLHg9MCxiPUxjLF89eSx3PW51bGwsUz1udWxsO3JldHVybiB0LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEpLHM9b3IoYihvLGYoXyhuKSkpKSxzLnZhbGlkPSEwLHN9LHQuY2xpcEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPW51bGw9PW4/KHc9bixMYyk6SGUoKHc9K24pKkRhKSx1KCkpOnd9LHQuY2xpcEV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oUz1uLF89bj9JZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKTp5LHUoKSk6U30sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rbixyKCkpOmh9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuWzBdLHA9K25bMV0scigpKTpbZyxwXX0sdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9blswXSUzNjAqRGEsZD1uWzFdJTM2MCpEYSxyKCkpOlt2KlBhLGQqUGFdfSx0LnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uWzBdJTM2MCpEYSxNPW5bMV0lMzYwKkRhLHg9bi5sZW5ndGg+Mj9uWzJdJTM2MCpEYTowLHIoKSk6W20qUGEsTSpQYSx4KlBhXX0sdGEucmViaW5kKHQsZiwicHJlY2lzaW9uIiksZnVuY3Rpb24oKXtyZXR1cm4gaT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmludmVydD1pLmludmVydCYmZSxyKCl9fWZ1bmN0aW9uIG9yKG4pe3JldHVybiBycihuLGZ1bmN0aW9uKHQsZSl7bi5wb2ludCh0KkRhLGUqRGEpfSl9ZnVuY3Rpb24gYXIobix0KXtyZXR1cm5bbix0XX1mdW5jdGlvbiBjcihuLHQpe3JldHVybltuPnFhP24tTGE6LXFhPm4/bitMYTpuLHRdfWZ1bmN0aW9uIGxyKG4sdCxlKXtyZXR1cm4gbj90fHxlP0FlKGZyKG4pLGhyKHQsZSkpOmZyKG4pOnR8fGU/aHIodCxlKTpjcn1mdW5jdGlvbiBzcihuKXtyZXR1cm4gZnVuY3Rpb24odCxlKXtyZXR1cm4gdCs9bixbdD5xYT90LUxhOi1xYT50P3QrTGE6dCxlXX19ZnVuY3Rpb24gZnIobil7dmFyIHQ9c3Iobik7cmV0dXJuIHQuaW52ZXJ0PXNyKC1uKSx0fWZ1bmN0aW9uIGhyKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguY29zKHQpLGE9TWF0aC5jb3MobikqZSxjPU1hdGguc2luKG4pKmUsbD1NYXRoLnNpbih0KSxzPWwqcithKnU7cmV0dXJuW01hdGguYXRhbjIoYyppLXMqbyxhKnItbCp1KSx0dChzKmkrYypvKV19dmFyIHI9TWF0aC5jb3MobiksdT1NYXRoLnNpbihuKSxpPU1hdGguY29zKHQpLG89TWF0aC5zaW4odCk7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCppLWMqbztyZXR1cm5bTWF0aC5hdGFuMihjKmkrbCpvLGEqcitzKnUpLHR0KHMqci1hKnUpXX0sZX1mdW5jdGlvbiBncihuLHQpe3ZhciBlPU1hdGguY29zKG4pLHI9TWF0aC5zaW4obik7cmV0dXJuIGZ1bmN0aW9uKHUsaSxvLGEpe3ZhciBjPW8qdDtudWxsIT11Pyh1PXByKGUsdSksaT1wcihlLGkpLChvPjA/aT51OnU+aSkmJih1Kz1vKkxhKSk6KHU9bitvKkxhLGk9bi0uNSpjKTtmb3IodmFyIGwscz11O28+MD9zPmk6aT5zO3MtPWMpYS5wb2ludCgobD14ZShbZSwtcipNYXRoLmNvcyhzKSwtcipNYXRoLnNpbihzKV0pKVswXSxsWzFdKX19ZnVuY3Rpb24gcHIobix0KXt2YXIgZT1wZSh0KTtlWzBdLT1uLE1lKGUpO3ZhciByPW50KC1lWzFdKTtyZXR1cm4oKC1lWzJdPDA/LXI6cikrMipNYXRoLlBJLUNhKSUoMipNYXRoLlBJKX1mdW5jdGlvbiB2cihuLHQsZSl7dmFyIHI9dGEucmFuZ2Uobix0LUNhLGUpLmNvbmNhdCh0KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKHQpe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGRyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gbXIobil7cmV0dXJuIG4uc291cmNlfWZ1bmN0aW9uIHlyKG4pe3JldHVybiBuLnRhcmdldH1mdW5jdGlvbiBNcihuLHQsZSxyKXt2YXIgdT1NYXRoLmNvcyh0KSxpPU1hdGguc2luKHQpLG89TWF0aC5jb3MociksYT1NYXRoLnNpbihyKSxjPXUqTWF0aC5jb3MobiksbD11Kk1hdGguc2luKG4pLHM9bypNYXRoLmNvcyhlKSxmPW8qTWF0aC5zaW4oZSksaD0yKk1hdGguYXNpbihNYXRoLnNxcnQoaXQoci10KSt1Km8qaXQoZS1uKSkpLGc9MS9NYXRoLnNpbihoKSxwPWg/ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zaW4obio9aCkqZyxlPU1hdGguc2luKGgtbikqZyxyPWUqYyt0KnMsdT1lKmwrdCpmLG89ZSppK3QqYTtyZXR1cm5bTWF0aC5hdGFuMih1LHIpKlBhLE1hdGguYXRhbjIobyxNYXRoLnNxcnQocipyK3UqdSkpKlBhXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipQYSx0KlBhXX07cmV0dXJuIHAuZGlzdGFuY2U9aCxwfWZ1bmN0aW9uIHhyKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBpPU1hdGguc2luKHUqPURhKSxvPU1hdGguY29zKHUpLGE9Z2EoKG4qPURhKS10KSxjPU1hdGguY29zKGEpO1ljKz1NYXRoLmF0YW4yKE1hdGguc3FydCgoYT1vKk1hdGguc2luKGEpKSphKyhhPXIqaS1lKm8qYykqYSksZSppK3IqbypjKSx0PW4sZT1pLHI9b312YXIgdCxlLHI7WmMucG9pbnQ9ZnVuY3Rpb24odSxpKXt0PXUqRGEsZT1NYXRoLnNpbihpKj1EYSkscj1NYXRoLmNvcyhpKSxaYy5wb2ludD1ufSxaYy5saW5lRW5kPWZ1bmN0aW9uKCl7WmMucG9pbnQ9WmMubGluZUVuZD1ifX1mdW5jdGlvbiBicihuLHQpe2Z1bmN0aW9uIGUodCxlKXt2YXIgcj1NYXRoLmNvcyh0KSx1PU1hdGguY29zKGUpLGk9bihyKnUpO3JldHVybltpKnUqTWF0aC5zaW4odCksaSpNYXRoLnNpbihlKV19cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKG4sZSl7dmFyIHI9TWF0aC5zcXJ0KG4qbitlKmUpLHU9dChyKSxpPU1hdGguc2luKHUpLG89TWF0aC5jb3ModSk7cmV0dXJuW01hdGguYXRhbjIobippLHIqbyksTWF0aC5hc2luKHImJmUqaS9yKV19LGV9ZnVuY3Rpb24gX3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7bz4wPy1SYStDYT50JiYodD0tUmErQ2EpOnQ+UmEtQ2EmJih0PVJhLUNhKTt2YXIgZT1vL01hdGgucG93KHUodCksaSk7cmV0dXJuW2UqTWF0aC5zaW4oaSpuKSxvLWUqTWF0aC5jb3MoaSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1mdW5jdGlvbihuKXtyZXR1cm4gTWF0aC50YW4ocWEvNCtuLzIpfSxpPW49PT10P01hdGguc2luKG4pOk1hdGgubG9nKHIvTWF0aC5jb3ModCkpL01hdGgubG9nKHUodCkvdShuKSksbz1yKk1hdGgucG93KHUobiksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1vLXQscj1LKGkpKk1hdGguc3FydChuKm4rZSplKTtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL2ksMipNYXRoLmF0YW4oTWF0aC5wb3coby9yLDEvaSkpLVJhXX0sZSk6U3J9ZnVuY3Rpb24gd3Iobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9aS10O3JldHVybltlKk1hdGguc2luKHUqbiksaS1lKk1hdGguY29zKHUqbildfXZhciByPU1hdGguY29zKG4pLHU9bj09PXQ/TWF0aC5zaW4obik6KHItTWF0aC5jb3ModCkpLyh0LW4pLGk9ci91K247cmV0dXJuIGdhKHUpPENhP2FyOihlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPWktdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsaS1LKHUpKk1hdGguc3FydChuKm4rZSplKV19LGUpfWZ1bmN0aW9uIFNyKG4sdCl7cmV0dXJuW24sTWF0aC5sb2coTWF0aC50YW4ocWEvNCt0LzIpKV19ZnVuY3Rpb24ga3Iobil7dmFyIHQsZT11cihuKSxyPWUuc2NhbGUsdT1lLnRyYW5zbGF0ZSxpPWUuY2xpcEV4dGVudDtyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbigpe3ZhciBuPXIuYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiBuPT09ZT90P2UuY2xpcEV4dGVudChudWxsKTplOm59LGUudHJhbnNsYXRlPWZ1bmN0aW9uKCl7dmFyIG49dS5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3ZhciBvPWkuYXBwbHkoZSxhcmd1bWVudHMpO2lmKG89PT1lKXtpZih0PW51bGw9PW4pe3ZhciBhPXFhKnIoKSxjPXUoKTtpKFtbY1swXS1hLGNbMV0tYV0sW2NbMF0rYSxjWzFdK2FdXSl9fWVsc2UgdCYmKG89bnVsbCk7cmV0dXJuIG99LGUuY2xpcEV4dGVudChudWxsKX1mdW5jdGlvbiBFcihuLHQpe3JldHVybltNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpLC1uXX1mdW5jdGlvbiBBcihuKXtyZXR1cm4gblswXX1mdW5jdGlvbiBOcihuKXtyZXR1cm4gblsxXX1mdW5jdGlvbiBDcihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1bMCwxXSxyPTIsdT0yO3Q+dTt1Kyspe2Zvcig7cj4xJiZRKG5bZVtyLTJdXSxuW2Vbci0xXV0sblt1XSk8PTA7KS0tcjtlW3IrK109dX1yZXR1cm4gZS5zbGljZSgwLHIpfWZ1bmN0aW9uIHpyKG4sdCl7cmV0dXJuIG5bMF0tdFswXXx8blsxXS10WzFdfWZ1bmN0aW9uIHFyKG4sdCxlKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKTwoZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBMcihuLHQsZSxyKXt2YXIgdT1uWzBdLGk9ZVswXSxvPXRbMF0tdSxhPXJbMF0taSxjPW5bMV0sbD1lWzFdLHM9dFsxXS1jLGY9clsxXS1sLGg9KGEqKGMtbCktZioodS1pKSkvKGYqby1hKnMpO3JldHVyblt1K2gqbyxjK2gqc119ZnVuY3Rpb24gVHIobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuISh0WzBdLWVbMF18fHRbMV0tZVsxXSl9ZnVuY3Rpb24gUnIoKXt0dSh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gRHIobil7dmFyIHQ9ZWwucG9wKCl8fG5ldyBScjtyZXR1cm4gdC5zaXRlPW4sdH1mdW5jdGlvbiBQcihuKXtYcihuKSxRYy5yZW1vdmUobiksZWwucHVzaChuKSx0dShuKX1mdW5jdGlvbiBVcihuKXt2YXIgdD1uLmNpcmNsZSxlPXQueCxyPXQuY3ksdT17eDplLHk6cn0saT1uLlAsbz1uLk4sYT1bbl07UHIobik7Zm9yKHZhciBjPWk7Yy5jaXJjbGUmJmdhKGUtYy5jaXJjbGUueCk8Q2EmJmdhKHItYy5jaXJjbGUuY3kpPENhOylpPWMuUCxhLnVuc2hpZnQoYyksUHIoYyksYz1pO2EudW5zaGlmdChjKSxYcihjKTtmb3IodmFyIGw9bztsLmNpcmNsZSYmZ2EoZS1sLmNpcmNsZS54KTxDYSYmZ2Eoci1sLmNpcmNsZS5jeSk8Q2E7KW89bC5OLGEucHVzaChsKSxQcihsKSxsPW87YS5wdXNoKGwpLFhyKGwpO3ZhciBzLGY9YS5sZW5ndGg7Zm9yKHM9MTtmPnM7KytzKWw9YVtzXSxjPWFbcy0xXSxLcihsLmVkZ2UsYy5zaXRlLGwuc2l0ZSx1KTtjPWFbMF0sbD1hW2YtMV0sbC5lZGdlPUpyKGMuc2l0ZSxsLnNpdGUsbnVsbCx1KSxWcihjKSxWcihsKX1mdW5jdGlvbiBqcihuKXtmb3IodmFyIHQsZSxyLHUsaT1uLngsbz1uLnksYT1RYy5fO2E7KWlmKHI9RnIoYSxvKS1pLHI+Q2EpYT1hLkw7ZWxzZXtpZih1PWktSHIoYSxvKSwhKHU+Q2EpKXtyPi1DYT8odD1hLlAsZT1hKTp1Pi1DYT8odD1hLGU9YS5OKTp0PWU9YTticmVha31pZighYS5SKXt0PWE7YnJlYWt9YT1hLlJ9dmFyIGM9RHIobik7aWYoUWMuaW5zZXJ0KHQsYyksdHx8ZSl7aWYodD09PWUpcmV0dXJuIFhyKHQpLGU9RHIodC5zaXRlKSxRYy5pbnNlcnQoYyxlKSxjLmVkZ2U9ZS5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpLFZyKHQpLHZvaWQgVnIoZSk7aWYoIWUpcmV0dXJuIHZvaWQoYy5lZGdlPUpyKHQuc2l0ZSxjLnNpdGUpKTtYcih0KSxYcihlKTt2YXIgbD10LnNpdGUscz1sLngsZj1sLnksaD1uLngtcyxnPW4ueS1mLHA9ZS5zaXRlLHY9cC54LXMsZD1wLnktZixtPTIqKGgqZC1nKnYpLHk9aCpoK2cqZyxNPXYqditkKmQseD17eDooZCp5LWcqTSkvbStzLHk6KGgqTS12KnkpL20rZn07S3IoZS5lZGdlLGwscCx4KSxjLmVkZ2U9SnIobCxuLG51bGwseCksZS5lZGdlPUpyKG4scCxudWxsLHgpLFZyKHQpLFZyKGUpfX1mdW5jdGlvbiBGcihuLHQpe3ZhciBlPW4uc2l0ZSxyPWUueCx1PWUueSxpPXUtdDtpZighaSlyZXR1cm4gcjt2YXIgbz1uLlA7aWYoIW8pcmV0dXJuLTEvMDtlPW8uc2l0ZTt2YXIgYT1lLngsYz1lLnksbD1jLXQ7aWYoIWwpcmV0dXJuIGE7dmFyIHM9YS1yLGY9MS9pLTEvbCxoPXMvbDtyZXR1cm4gZj8oLWgrTWF0aC5zcXJ0KGgqaC0yKmYqKHMqcy8oLTIqbCktYytsLzIrdS1pLzIpKSkvZityOihyK2EpLzJ9ZnVuY3Rpb24gSHIobix0KXt2YXIgZT1uLk47aWYoZSlyZXR1cm4gRnIoZSx0KTt2YXIgcj1uLnNpdGU7cmV0dXJuIHIueT09PXQ/ci54OjEvMH1mdW5jdGlvbiBPcihuKXt0aGlzLnNpdGU9bix0aGlzLmVkZ2VzPVtdfWZ1bmN0aW9uIElyKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYSxjLGwscyxmPW5bMF1bMF0saD1uWzFdWzBdLGc9blswXVsxXSxwPW5bMV1bMV0sdj1LYyxkPXYubGVuZ3RoO2QtLTspaWYoaT12W2RdLGkmJmkucHJlcGFyZSgpKWZvcihhPWkuZWRnZXMsYz1hLmxlbmd0aCxvPTA7Yz5vOylzPWFbb10uZW5kKCkscj1zLngsdT1zLnksbD1hWysrbyVjXS5zdGFydCgpLHQ9bC54LGU9bC55LChnYShyLXQpPkNhfHxnYSh1LWUpPkNhKSYmKGEuc3BsaWNlKG8sMCxuZXcgUXIoR3IoaS5zaXRlLHMsZ2Eoci1mKTxDYSYmcC11PkNhP3t4OmYseTpnYSh0LWYpPENhP2U6cH06Z2EodS1wKTxDYSYmaC1yPkNhP3t4OmdhKGUtcCk8Q2E/dDpoLHk6cH06Z2Eoci1oKTxDYSYmdS1nPkNhP3t4OmgseTpnYSh0LWgpPENhP2U6Z306Z2EodS1nKTxDYSYmci1mPkNhP3t4OmdhKGUtZyk8Q2E/dDpmLHk6Z306bnVsbCksaS5zaXRlLG51bGwpKSwrK2MpfWZ1bmN0aW9uIFlyKG4sdCl7cmV0dXJuIHQuYW5nbGUtbi5hbmdsZX1mdW5jdGlvbiBacigpe3R1KHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH1mdW5jdGlvbiBWcihuKXt2YXIgdD1uLlAsZT1uLk47aWYodCYmZSl7dmFyIHI9dC5zaXRlLHU9bi5zaXRlLGk9ZS5zaXRlO2lmKHIhPT1pKXt2YXIgbz11LngsYT11LnksYz1yLngtbyxsPXIueS1hLHM9aS54LW8sZj1pLnktYSxoPTIqKGMqZi1sKnMpO2lmKCEoaD49LXphKSl7dmFyIGc9YypjK2wqbCxwPXMqcytmKmYsdj0oZipnLWwqcCkvaCxkPShjKnAtcypnKS9oLGY9ZCthLG09cmwucG9wKCl8fG5ldyBacjttLmFyYz1uLG0uc2l0ZT11LG0ueD12K28sbS55PWYrTWF0aC5zcXJ0KHYqditkKmQpLG0uY3k9ZixuLmNpcmNsZT1tO2Zvcih2YXIgeT1udWxsLE09dGwuXztNOylpZihtLnk8TS55fHxtLnk9PT1NLnkmJm0ueDw9TS54KXtpZighTS5MKXt5PU0uUDticmVha31NPU0uTH1lbHNle2lmKCFNLlIpe3k9TTticmVha31NPU0uUn10bC5pbnNlcnQoeSxtKSx5fHwobmw9bSl9fX19ZnVuY3Rpb24gWHIobil7dmFyIHQ9bi5jaXJjbGU7dCYmKHQuUHx8KG5sPXQuTiksdGwucmVtb3ZlKHQpLHJsLnB1c2godCksdHUodCksbi5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gJHIobil7Zm9yKHZhciB0LGU9R2Mscj1PZShuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdKSx1PWUubGVuZ3RoO3UtLTspdD1lW3VdLCghQnIodCxuKXx8IXIodCl8fGdhKHQuYS54LXQuYi54KTxDYSYmZ2EodC5hLnktdC5iLnkpPENhKSYmKHQuYT10LmI9bnVsbCxlLnNwbGljZSh1LDEpKX1mdW5jdGlvbiBCcihuLHQpe3ZhciBlPW4uYjtpZihlKXJldHVybiEwO3ZhciByLHUsaT1uLmEsbz10WzBdWzBdLGE9dFsxXVswXSxjPXRbMF1bMV0sbD10WzFdWzFdLHM9bi5sLGY9bi5yLGg9cy54LGc9cy55LHA9Zi54LHY9Zi55LGQ9KGgrcCkvMixtPShnK3YpLzI7aWYodj09PWcpe2lmKG8+ZHx8ZD49YSlyZXR1cm47aWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDpkLHk6Y307ZT17eDpkLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OmQseTpsfTtlPXt4OmQseTpjfX19ZWxzZSBpZihyPShoLXApLyh2LWcpLHU9bS1yKmQsLTE+cnx8cj4xKWlmKGg+cCl7aWYoaSl7aWYoaS55Pj1sKXJldHVybn1lbHNlIGk9e3g6KGMtdSkvcix5OmN9O2U9e3g6KGwtdSkvcix5Omx9fWVsc2V7aWYoaSl7aWYoaS55PGMpcmV0dXJufWVsc2UgaT17eDoobC11KS9yLHk6bH07ZT17eDooYy11KS9yLHk6Y319ZWxzZSBpZih2Pmcpe2lmKGkpe2lmKGkueD49YSlyZXR1cm59ZWxzZSBpPXt4Om8seTpyKm8rdX07ZT17eDphLHk6ciphK3V9fWVsc2V7aWYoaSl7aWYoaS54PG8pcmV0dXJufWVsc2UgaT17eDphLHk6ciphK3V9O2U9e3g6byx5OnIqbyt1fX1yZXR1cm4gbi5hPWksbi5iPWUsITB9ZnVuY3Rpb24gV3Iobix0KXt0aGlzLmw9bix0aGlzLnI9dCx0aGlzLmE9dGhpcy5iPW51bGx9ZnVuY3Rpb24gSnIobix0LGUscil7dmFyIHU9bmV3IFdyKG4sdCk7cmV0dXJuIEdjLnB1c2godSksZSYmS3IodSxuLHQsZSksciYmS3IodSx0LG4sciksS2Nbbi5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LG4sdCkpLEtjW3QuaV0uZWRnZXMucHVzaChuZXcgUXIodSx0LG4pKSx1fWZ1bmN0aW9uIEdyKG4sdCxlKXt2YXIgcj1uZXcgV3IobixudWxsKTtyZXR1cm4gci5hPXQsci5iPWUsR2MucHVzaChyKSxyfWZ1bmN0aW9uIEtyKG4sdCxlLHIpe24uYXx8bi5iP24ubD09PWU/bi5iPXI6bi5hPXI6KG4uYT1yLG4ubD10LG4ucj1lKX1mdW5jdGlvbiBRcihuLHQsZSl7dmFyIHI9bi5hLHU9bi5iO3RoaXMuZWRnZT1uLHRoaXMuc2l0ZT10LHRoaXMuYW5nbGU9ZT9NYXRoLmF0YW4yKGUueS10LnksZS54LXQueCk6bi5sPT09dD9NYXRoLmF0YW4yKHUueC1yLngsci55LXUueSk6TWF0aC5hdGFuMihyLngtdS54LHUueS1yLnkpfWZ1bmN0aW9uIG51KCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24gdHUobil7bi5VPW4uQz1uLkw9bi5SPW4uUD1uLk49bnVsbH1mdW5jdGlvbiBldShuLHQpe3ZhciBlPXQscj10LlIsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gcnUobix0KXt2YXIgZT10LHI9dC5MLHU9ZS5VO3U/dS5MPT09ZT91Lkw9cjp1LlI9cjpuLl89cixyLlU9dSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIHV1KG4pe2Zvcig7bi5MOyluPW4uTDtyZXR1cm4gbn1mdW5jdGlvbiBpdShuLHQpe3ZhciBlLHIsdSxpPW4uc29ydChvdSkucG9wKCk7Zm9yKEdjPVtdLEtjPW5ldyBBcnJheShuLmxlbmd0aCksUWM9bmV3IG51LHRsPW5ldyBudTs7KWlmKHU9bmwsaSYmKCF1fHxpLnk8dS55fHxpLnk9PT11LnkmJmkueDx1LngpKShpLnghPT1lfHxpLnkhPT1yKSYmKEtjW2kuaV09bmV3IE9yKGkpLGpyKGkpLGU9aS54LHI9aS55KSxpPW4ucG9wKCk7ZWxzZXtpZighdSlicmVhaztVcih1LmFyYyl9dCYmKCRyKHQpLElyKHQpKTt2YXIgbz17Y2VsbHM6S2MsZWRnZXM6R2N9O3JldHVybiBRYz10bD1HYz1LYz1udWxsLG99ZnVuY3Rpb24gb3Uobix0KXtyZXR1cm4gdC55LW4ueXx8dC54LW4ueH1mdW5jdGlvbiBhdShuLHQsZSl7cmV0dXJuKG4ueC1lLngpKih0Lnktbi55KS0obi54LXQueCkqKGUueS1uLnkpfWZ1bmN0aW9uIGN1KG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gbHUobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBzdSgpe3JldHVybntsZWFmOiEwLG5vZGVzOltdLHBvaW50Om51bGwseDpudWxsLHk6bnVsbH19ZnVuY3Rpb24gZnUobix0LGUscix1LGkpe2lmKCFuKHQsZSxyLHUsaSkpe3ZhciBvPS41KihlK3UpLGE9LjUqKHIraSksYz10Lm5vZGVzO2NbMF0mJmZ1KG4sY1swXSxlLHIsbyxhKSxjWzFdJiZmdShuLGNbMV0sbyxyLHUsYSksY1syXSYmZnUobixjWzJdLGUsYSxvLGkpLGNbM10mJmZ1KG4sY1szXSxvLGEsdSxpKX19ZnVuY3Rpb24gaHUobix0LGUscix1LGksbyl7dmFyIGEsYz0xLzA7cmV0dXJuIGZ1bmN0aW9uIGwobixzLGYsaCxnKXtpZighKHM+aXx8Zj5vfHxyPmh8fHU+Zykpe2lmKHA9bi5wb2ludCl7dmFyIHAsdj10LW4ueCxkPWUtbi55LG09dip2K2QqZDtpZihjPm0pe3ZhciB5PU1hdGguc3FydChjPW0pO3I9dC15LHU9ZS15LGk9dCt5LG89ZSt5LGE9cH19Zm9yKHZhciBNPW4ubm9kZXMseD0uNSoocytoKSxiPS41KihmK2cpLF89dD49eCx3PWU+PWIsUz13PDwxfF8saz1TKzQ7az5TOysrUylpZihuPU1bMyZTXSlzd2l0Y2goMyZTKXtjYXNlIDA6bChuLHMsZix4LGIpO2JyZWFrO2Nhc2UgMTpsKG4seCxmLGgsYik7YnJlYWs7Y2FzZSAyOmwobixzLGIseCxnKTticmVhaztjYXNlIDM6bChuLHgsYixoLGcpfX19KG4scix1LGksbyksYX1mdW5jdGlvbiBndShuLHQpe249dGEucmdiKG4pLHQ9dGEucmdiKHQpO3ZhciBlPW4ucixyPW4uZyx1PW4uYixpPXQuci1lLG89dC5nLXIsYT10LmItdTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIiMiK3h0KE1hdGgucm91bmQoZStpKm4pKSt4dChNYXRoLnJvdW5kKHIrbypuKSkreHQoTWF0aC5yb3VuZCh1K2EqbikpfX1mdW5jdGlvbiBwdShuLHQpe3ZhciBlLHI9e30sdT17fTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPW11KG5bZV0sdFtlXSk6dVtlXT1uW2VdO2ZvcihlIGluIHQpZSBpbiBufHwodVtlXT10W2VdKTtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKGUgaW4gcil1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIHZ1KG4sdCl7cmV0dXJuIG49K24sdD0rdCxmdW5jdGlvbihlKXtyZXR1cm4gbiooMS1lKSt0KmV9fWZ1bmN0aW9uIGR1KG4sdCl7dmFyIGUscix1LGk9aWwubGFzdEluZGV4PW9sLmxhc3RJbmRleD0wLG89LTEsYT1bXSxjPVtdO2ZvcihuKz0iIix0Kz0iIjsoZT1pbC5leGVjKG4pKSYmKHI9b2wuZXhlYyh0KSk7KSh1PXIuaW5kZXgpPmkmJih1PXQuc2xpY2UoaSx1KSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLChlPWVbMF0pPT09KHI9clswXSk/YVtvXT9hW29dKz1yOmFbKytvXT1yOihhWysrb109bnVsbCxjLnB1c2goe2k6byx4OnZ1KGUscil9KSksaT1vbC5sYXN0SW5kZXg7cmV0dXJuIGk8dC5sZW5ndGgmJih1PXQuc2xpY2UoaSksYVtvXT9hW29dKz11OmFbKytvXT11KSxhLmxlbmd0aDwyP2NbMF0/KHQ9Y1swXS54LGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifSk6ZnVuY3Rpb24oKXtyZXR1cm4gdH06KHQ9Yy5sZW5ndGgsZnVuY3Rpb24obil7Zm9yKHZhciBlLHI9MDt0PnI7KytyKWFbKGU9Y1tyXSkuaV09ZS54KG4pO3JldHVybiBhLmpvaW4oIiIpfSl9ZnVuY3Rpb24gbXUobix0KXtmb3IodmFyIGUscj10YS5pbnRlcnBvbGF0b3JzLmxlbmd0aDstLXI+PTAmJiEoZT10YS5pbnRlcnBvbGF0b3JzW3JdKG4sdCkpOyk7cmV0dXJuIGV9ZnVuY3Rpb24geXUobix0KXt2YXIgZSxyPVtdLHU9W10saT1uLmxlbmd0aCxvPXQubGVuZ3RoLGE9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpO2ZvcihlPTA7YT5lOysrZSlyLnB1c2gobXUobltlXSx0W2VdKSk7Zm9yKDtpPmU7KytlKXVbZV09bltlXTtmb3IoO28+ZTsrK2UpdVtlXT10W2VdO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZT0wO2E+ZTsrK2UpdVtlXT1yW2VdKG4pO3JldHVybiB1fX1mdW5jdGlvbiBNdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+PXQ/MDp0Pj0xPzE6bih0KX19ZnVuY3Rpb24geHUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiAxLW4oMS10KX19ZnVuY3Rpb24gYnUobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybi41KiguNT50P24oMip0KToyLW4oMi0yKnQpKX19ZnVuY3Rpb24gX3Uobil7cmV0dXJuIG4qbn1mdW5jdGlvbiB3dShuKXtyZXR1cm4gbipuKm59ZnVuY3Rpb24gU3Uobil7aWYoMD49bilyZXR1cm4gMDtpZihuPj0xKXJldHVybiAxO3ZhciB0PW4qbixlPXQqbjtyZXR1cm4gNCooLjU+bj9lOjMqKG4tdCkrZS0uNzUpfWZ1bmN0aW9uIGt1KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gRXUobil7cmV0dXJuIDEtTWF0aC5jb3MobipSYSl9ZnVuY3Rpb24gQXUobil7cmV0dXJuIE1hdGgucG93KDIsMTAqKG4tMSkpfWZ1bmN0aW9uIE51KG4pe3JldHVybiAxLU1hdGguc3FydCgxLW4qbil9ZnVuY3Rpb24gQ3Uobix0KXt2YXIgZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD0uNDUpLGFyZ3VtZW50cy5sZW5ndGg/ZT10L0xhKk1hdGguYXNpbigxL24pOihuPTEsZT10LzQpLGZ1bmN0aW9uKHIpe3JldHVybiAxK24qTWF0aC5wb3coMiwtMTAqcikqTWF0aC5zaW4oKHItZSkqTGEvdCl9fWZ1bmN0aW9uIHp1KG4pe3JldHVybiBufHwobj0xLjcwMTU4KSxmdW5jdGlvbih0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfX1mdW5jdGlvbiBxdShuKXtyZXR1cm4gMS8yLjc1Pm4/Ny41NjI1Km4qbjoyLzIuNzU+bj83LjU2MjUqKG4tPTEuNS8yLjc1KSpuKy43NToyLjUvMi43NT5uPzcuNTYyNSoobi09Mi4yNS8yLjc1KSpuKy45Mzc1OjcuNTYyNSoobi09Mi42MjUvMi43NSkqbisuOTg0Mzc1fWZ1bmN0aW9uIEx1KG4sdCl7bj10YS5oY2wobiksdD10YS5oY2wodCk7dmFyIGU9bi5oLHI9bi5jLHU9bi5sLGk9dC5oLWUsbz10LmMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuYzpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBzdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFR1KG4sdCl7bj10YS5oc2wobiksdD10YS5oc2wodCk7dmFyIGU9bi5oLHI9bi5zLHU9bi5sLGk9dC5oLWUsbz10LnMtcixhPXQubC11O3JldHVybiBpc05hTihvKSYmKG89MCxyPWlzTmFOKHIpP3QuczpyKSxpc05hTihpKT8oaT0wLGU9aXNOYU4oZSk/dC5oOmUpOmk+MTgwP2ktPTM2MDotMTgwPmkmJihpKz0zNjApLGZ1bmN0aW9uKG4pe3JldHVybiBjdChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIFJ1KG4sdCl7bj10YS5sYWIobiksdD10YS5sYWIodCk7dmFyIGU9bi5sLHI9bi5hLHU9bi5iLGk9dC5sLWUsbz10LmEtcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaHQoZStpKm4scitvKm4sdSthKm4pKyIifX1mdW5jdGlvbiBEdShuLHQpe3JldHVybiB0LT1uLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnJvdW5kKG4rdCplKX19ZnVuY3Rpb24gUHUobil7dmFyIHQ9W24uYSxuLmJdLGU9W24uYyxuLmRdLHI9anUodCksdT1VdSh0LGUpLGk9anUoRnUoZSx0LC11KSl8fDA7dFswXSplWzFdPGVbMF0qdFsxXSYmKHRbMF0qPS0xLHRbMV0qPS0xLHIqPS0xLHUqPS0xKSx0aGlzLnJvdGF0ZT0ocj9NYXRoLmF0YW4yKHRbMV0sdFswXSk6TWF0aC5hdGFuMigtZVswXSxlWzFdKSkqUGEsdGhpcy50cmFuc2xhdGU9W24uZSxuLmZdLHRoaXMuc2NhbGU9W3IsaV0sdGhpcy5za2V3PWk/TWF0aC5hdGFuMih1LGkpKlBhOjB9ZnVuY3Rpb24gVXUobix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXX1mdW5jdGlvbiBqdShuKXt2YXIgdD1NYXRoLnNxcnQoVXUobixuKSk7cmV0dXJuIHQmJihuWzBdLz10LG5bMV0vPXQpLHR9ZnVuY3Rpb24gRnUobix0LGUpe3JldHVybiBuWzBdKz1lKnRbMF0sblsxXSs9ZSp0WzFdLG59ZnVuY3Rpb24gSHUobix0KXt2YXIgZSxyPVtdLHU9W10saT10YS50cmFuc2Zvcm0obiksbz10YS50cmFuc2Zvcm0odCksYT1pLnRyYW5zbGF0ZSxjPW8udHJhbnNsYXRlLGw9aS5yb3RhdGUscz1vLnJvdGF0ZSxmPWkuc2tldyxoPW8uc2tldyxnPWkuc2NhbGUscD1vLnNjYWxlO3JldHVybiBhWzBdIT1jWzBdfHxhWzFdIT1jWzFdPyhyLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6MSx4OnZ1KGFbMF0sY1swXSl9LHtpOjMseDp2dShhWzFdLGNbMV0pfSkpOnIucHVzaChjWzBdfHxjWzFdPyJ0cmFuc2xhdGUoIitjKyIpIjoiIiksbCE9cz8obC1zPjE4MD9zKz0zNjA6cy1sPjE4MCYmKGwrPTM2MCksdS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJyb3RhdGUoIixudWxsLCIpIiktMix4OnZ1KGwscyl9KSk6cyYmci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiK3MrIikiKSxmIT1oP3UucHVzaCh7aTpyLnB1c2goci5wb3AoKSsic2tld1goIixudWxsLCIpIiktMix4OnZ1KGYsaCl9KTpoJiZyLnB1c2goci5wb3AoKSsic2tld1goIitoKyIpIiksZ1swXSE9cFswXXx8Z1sxXSE9cFsxXT8oZT1yLnB1c2goci5wb3AoKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIiksdS5wdXNoKHtpOmUtNCx4OnZ1KGdbMF0scFswXSl9LHtpOmUtMix4OnZ1KGdbMV0scFsxXSl9KSk6KDEhPXBbMF18fDEhPXBbMV0pJiZyLnB1c2goci5wb3AoKSsic2NhbGUoIitwKyIpIiksZT11Lmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIHQsaT0tMTsrK2k8ZTspclsodD11W2ldKS5pXT10Lngobik7cmV0dXJuIHIuam9pbigiIil9fWZ1bmN0aW9uIE91KG4sdCl7cmV0dXJuIHQ9KHQtPW49K24pfHwxL3QsZnVuY3Rpb24oZSl7cmV0dXJuKGUtbikvdH19ZnVuY3Rpb24gSXUobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigxLChlLW4pL3QpKX19ZnVuY3Rpb24gWXUobil7Zm9yKHZhciB0PW4uc291cmNlLGU9bi50YXJnZXQscj1WdSh0LGUpLHU9W3RdO3QhPT1yOyl0PXQucGFyZW50LHUucHVzaCh0KTtmb3IodmFyIGk9dS5sZW5ndGg7ZSE9PXI7KXUuc3BsaWNlKGksMCxlKSxlPWUucGFyZW50O3JldHVybiB1fWZ1bmN0aW9uIFp1KG4pe2Zvcih2YXIgdD1bXSxlPW4ucGFyZW50O251bGwhPWU7KXQucHVzaChuKSxuPWUsZT1lLnBhcmVudDtyZXR1cm4gdC5wdXNoKG4pLHR9ZnVuY3Rpb24gVnUobix0KXtpZihuPT09dClyZXR1cm4gbjtmb3IodmFyIGU9WnUobikscj1adSh0KSx1PWUucG9wKCksaT1yLnBvcCgpLG89bnVsbDt1PT09aTspbz11LHU9ZS5wb3AoKSxpPXIucG9wKCk7cmV0dXJuIG99ZnVuY3Rpb24gWHUobil7bi5maXhlZHw9Mn1mdW5jdGlvbiAkdShuKXtuLmZpeGVkJj0tN31mdW5jdGlvbiBCdShuKXtuLmZpeGVkfD00LG4ucHg9bi54LG4ucHk9bi55fWZ1bmN0aW9uIFd1KG4pe24uZml4ZWQmPS01fWZ1bmN0aW9uIEp1KG4sdCxlKXt2YXIgcj0wLHU9MDtpZihuLmNoYXJnZT0wLCFuLmxlYWYpZm9yKHZhciBpLG89bi5ub2RlcyxhPW8ubGVuZ3RoLGM9LTE7KytjPGE7KWk9b1tjXSxudWxsIT1pJiYoSnUoaSx0LGUpLG4uY2hhcmdlKz1pLmNoYXJnZSxyKz1pLmNoYXJnZSppLmN4LHUrPWkuY2hhcmdlKmkuY3kpO2lmKG4ucG9pbnQpe24ubGVhZnx8KG4ucG9pbnQueCs9TWF0aC5yYW5kb20oKS0uNSxuLnBvaW50LnkrPU1hdGgucmFuZG9tKCktLjUpO3ZhciBsPXQqZVtuLnBvaW50LmluZGV4XTtuLmNoYXJnZSs9bi5wb2ludENoYXJnZT1sLHIrPWwqbi5wb2ludC54LHUrPWwqbi5wb2ludC55fW4uY3g9ci9uLmNoYXJnZSxuLmN5PXUvbi5jaGFyZ2V9ZnVuY3Rpb24gR3Uobix0KXtyZXR1cm4gdGEucmViaW5kKG4sdCwic29ydCIsImNoaWxkcmVuIiwidmFsdWUiKSxuLm5vZGVzPW4sbi5saW5rcz1yaSxufWZ1bmN0aW9uIEt1KG4sdCl7Zm9yKHZhciBlPVtuXTtudWxsIT0obj1lLnBvcCgpKTspaWYodChuKSwodT1uLmNoaWxkcmVuKSYmKHI9dS5sZW5ndGgpKWZvcih2YXIgcix1Oy0tcj49MDspZS5wdXNoKHVbcl0pfWZ1bmN0aW9uIFF1KG4sdCl7Zm9yKHZhciBlPVtuXSxyPVtdO251bGwhPShuPWUucG9wKCkpOylpZihyLnB1c2gobiksKGk9bi5jaGlsZHJlbikmJih1PWkubGVuZ3RoKSlmb3IodmFyIHUsaSxvPS0xOysrbzx1OyllLnB1c2goaVtvXSk7Zm9yKDtudWxsIT0obj1yLnBvcCgpKTspdChuKX1mdW5jdGlvbiBuaShuKXtyZXR1cm4gbi5jaGlsZHJlbn1mdW5jdGlvbiB0aShuKXtyZXR1cm4gbi52YWx1ZX1mdW5jdGlvbiBlaShuLHQpe3JldHVybiB0LnZhbHVlLW4udmFsdWV9ZnVuY3Rpb24gcmkobil7cmV0dXJuIHRhLm1lcmdlKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLmNoaWxkcmVufHxbXSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6bix0YXJnZXQ6dH19KX0pKX1mdW5jdGlvbiB1aShuKXtyZXR1cm4gbi54fWZ1bmN0aW9uIGlpKG4pe3JldHVybiBuLnl9ZnVuY3Rpb24gb2kobix0LGUpe24ueTA9dCxuLnk9ZX1mdW5jdGlvbiBhaShuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpfWZ1bmN0aW9uIGNpKG4pe2Zvcih2YXIgdD0tMSxlPW5bMF0ubGVuZ3RoLHI9W107Kyt0PGU7KXJbdF09MDtyZXR1cm4gcn1mdW5jdGlvbiBsaShuKXtmb3IodmFyIHQsZT0xLHI9MCx1PW5bMF1bMV0saT1uLmxlbmd0aDtpPmU7KytlKSh0PW5bZV1bMV0pPnUmJihyPWUsdT10KTtyZXR1cm4gcn1mdW5jdGlvbiBzaShuKXtyZXR1cm4gbi5yZWR1Y2UoZmksMCl9ZnVuY3Rpb24gZmkobix0KXtyZXR1cm4gbit0WzFdfWZ1bmN0aW9uIGhpKG4sdCl7cmV0dXJuIGdpKG4sTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMisxKSl9ZnVuY3Rpb24gZ2kobix0KXtmb3IodmFyIGU9LTEscj0rblswXSx1PShuWzFdLXIpL3QsaT1bXTsrK2U8PXQ7KWlbZV09dSplK3I7cmV0dXJuIGl9ZnVuY3Rpb24gcGkobil7cmV0dXJuW3RhLm1pbihuKSx0YS5tYXgobildfWZ1bmN0aW9uIHZpKG4sdCl7cmV0dXJuIG4udmFsdWUtdC52YWx1ZX1mdW5jdGlvbiBkaShuLHQpe3ZhciBlPW4uX3BhY2tfbmV4dDtuLl9wYWNrX25leHQ9dCx0Ll9wYWNrX3ByZXY9bix0Ll9wYWNrX25leHQ9ZSxlLl9wYWNrX3ByZXY9dH1mdW5jdGlvbiBtaShuLHQpe24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1ufWZ1bmN0aW9uIHlpKG4sdCl7dmFyIGU9dC54LW4ueCxyPXQueS1uLnksdT1uLnIrdC5yO3JldHVybi45OTkqdSp1PmUqZStyKnJ9ZnVuY3Rpb24gTWkobil7ZnVuY3Rpb24gdChuKXtzPU1hdGgubWluKG4ueC1uLnIscyksZj1NYXRoLm1heChuLngrbi5yLGYpLGg9TWF0aC5taW4obi55LW4ucixoKSxnPU1hdGgubWF4KG4ueStuLnIsZyl9aWYoKGU9bi5jaGlsZHJlbikmJihsPWUubGVuZ3RoKSl7dmFyIGUscix1LGksbyxhLGMsbCxzPTEvMCxmPS0xLzAsaD0xLzAsZz0tMS8wO2lmKGUuZm9yRWFjaCh4aSkscj1lWzBdLHIueD0tci5yLHIueT0wLHQociksbD4xJiYodT1lWzFdLHUueD11LnIsdS55PTAsdCh1KSxsPjIpKWZvcihpPWVbMl0sd2kocix1LGkpLHQoaSksZGkocixpKSxyLl9wYWNrX3ByZXY9aSxkaShpLHUpLHU9ci5fcGFja19uZXh0LG89MztsPm87bysrKXt3aShyLHUsaT1lW29dKTt2YXIgcD0wLHY9MSxkPTE7Zm9yKGE9dS5fcGFja19uZXh0O2EhPT11O2E9YS5fcGFja19uZXh0LHYrKylpZih5aShhLGkpKXtwPTE7YnJlYWt9aWYoMT09cClmb3IoYz1yLl9wYWNrX3ByZXY7YyE9PWEuX3BhY2tfcHJldiYmIXlpKGMsaSk7Yz1jLl9wYWNrX3ByZXYsZCsrKTtwPyhkPnZ8fHY9PWQmJnUucjxyLnI/bWkocix1PWEpOm1pKHI9Yyx1KSxvLS0pOihkaShyLGkpLHU9aSx0KGkpKX12YXIgbT0ocytmKS8yLHk9KGgrZykvMixNPTA7Zm9yKG89MDtsPm87bysrKWk9ZVtvXSxpLngtPW0saS55LT15LE09TWF0aC5tYXgoTSxpLnIrTWF0aC5zcXJ0KGkueCppLngraS55KmkueSkpO24ucj1NLGUuZm9yRWFjaChiaSl9fWZ1bmN0aW9uIHhpKG4pe24uX3BhY2tfbmV4dD1uLl9wYWNrX3ByZXY9bn1mdW5jdGlvbiBiaShuKXtkZWxldGUgbi5fcGFja19uZXh0LGRlbGV0ZSBuLl9wYWNrX3ByZXZ9ZnVuY3Rpb24gX2kobix0LGUscil7dmFyIHU9bi5jaGlsZHJlbjtpZihuLng9dCs9cipuLngsbi55PWUrPXIqbi55LG4ucio9cix1KWZvcih2YXIgaT0tMSxvPXUubGVuZ3RoOysraTxvOylfaSh1W2ldLHQsZSxyKX1mdW5jdGlvbiB3aShuLHQsZSl7dmFyIHI9bi5yK2Uucix1PXQueC1uLngsaT10Lnktbi55O2lmKHImJih1fHxpKSl7dmFyIG89dC5yK2UucixhPXUqdStpKmk7byo9byxyKj1yO3ZhciBjPS41KyhyLW8pLygyKmEpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKihyK2EpLShyLT1hKSpyLW8qbykpLygyKmEpO2UueD1uLngrYyp1K2wqaSxlLnk9bi55K2MqaS1sKnV9ZWxzZSBlLng9bi54K3IsZS55PW4ueX1mdW5jdGlvbiBTaShuLHQpe3JldHVybiBuLnBhcmVudD09dC5wYXJlbnQ/MToyfWZ1bmN0aW9uIGtpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQubGVuZ3RoP3RbMF06bi50fWZ1bmN0aW9uIEVpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4odD1lLmxlbmd0aCk/ZVt0LTFdOm4udH1mdW5jdGlvbiBBaShuLHQsZSl7dmFyIHI9ZS8odC5pLW4uaSk7dC5jLT1yLHQucys9ZSxuLmMrPXIsdC56Kz1lLHQubSs9ZX1mdW5jdGlvbiBOaShuKXtmb3IodmFyIHQsZT0wLHI9MCx1PW4uY2hpbGRyZW4saT11Lmxlbmd0aDstLWk+PTA7KXQ9dVtpXSx0LnorPWUsdC5tKz1lLGUrPXQucysocis9dC5jKX1mdW5jdGlvbiBDaShuLHQsZSl7cmV0dXJuIG4uYS5wYXJlbnQ9PT10LnBhcmVudD9uLmE6ZX1mdW5jdGlvbiB6aShuKXtyZXR1cm4gMSt0YS5tYXgobixmdW5jdGlvbihuKXtyZXR1cm4gbi55fSl9ZnVuY3Rpb24gcWkobil7cmV0dXJuIG4ucmVkdWNlKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4rdC54fSwwKS9uLmxlbmd0aH1mdW5jdGlvbiBMaShuKXt2YXIgdD1uLmNoaWxkcmVuO3JldHVybiB0JiZ0Lmxlbmd0aD9MaSh0WzBdKTpufWZ1bmN0aW9uIFRpKG4pe3ZhciB0LGU9bi5jaGlsZHJlbjtyZXR1cm4gZSYmKHQ9ZS5sZW5ndGgpP1RpKGVbdC0xXSk6bn1mdW5jdGlvbiBSaShuKXtyZXR1cm57eDpuLngseTpuLnksZHg6bi5keCxkeTpuLmR5fX1mdW5jdGlvbiBEaShuLHQpe3ZhciBlPW4ueCt0WzNdLHI9bi55K3RbMF0sdT1uLmR4LXRbMV0tdFszXSxpPW4uZHktdFswXS10WzJdO3JldHVybiAwPnUmJihlKz11LzIsdT0wKSwwPmkmJihyKz1pLzIsaT0wKSx7eDplLHk6cixkeDp1LGR5Oml9fWZ1bmN0aW9uIFBpKG4pe3ZhciB0PW5bMF0sZT1uW24ubGVuZ3RoLTFdO3JldHVybiBlPnQ/W3QsZV06W2UsdF19ZnVuY3Rpb24gVWkobil7cmV0dXJuIG4ucmFuZ2VFeHRlbnQ/bi5yYW5nZUV4dGVudCgpOlBpKG4ucmFuZ2UoKSl9ZnVuY3Rpb24gamkobix0LGUscil7dmFyIHU9ZShuWzBdLG5bMV0pLGk9cih0WzBdLHRbMV0pO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gaSh1KG4pKX19ZnVuY3Rpb24gRmkobix0KXt2YXIgZSxyPTAsdT1uLmxlbmd0aC0xLGk9bltyXSxvPW5bdV07cmV0dXJuIGk+byYmKGU9cixyPXUsdT1lLGU9aSxpPW8sbz1lKSxuW3JdPXQuZmxvb3IoaSksblt1XT10LmNlaWwobyksbn1mdW5jdGlvbiBIaShuKXtyZXR1cm4gbj97Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguZmxvb3IodC9uKSpufSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmNlaWwodC9uKSpufX06bWx9ZnVuY3Rpb24gT2kobix0LGUscil7dmFyIHU9W10saT1bXSxvPTAsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCktMTtmb3IoblthXTxuWzBdJiYobj1uLnNsaWNlKCkucmV2ZXJzZSgpLHQ9dC5zbGljZSgpLnJldmVyc2UoKSk7KytvPD1hOyl1LnB1c2goZShuW28tMV0sbltvXSkpLGkucHVzaChyKHRbby0xXSx0W29dKSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPXRhLmJpc2VjdChuLHQsMSxhKS0xO3JldHVybiBpW2VdKHVbZV0odCkpfX1mdW5jdGlvbiBJaShuLHQsZSxyKXtmdW5jdGlvbiB1KCl7dmFyIHU9TWF0aC5taW4obi5sZW5ndGgsdC5sZW5ndGgpPjI/T2k6amksYz1yP0l1Ok91O3JldHVybiBvPXUobix0LGMsZSksYT11KHQsbixjLG11KSxpfWZ1bmN0aW9uIGkobil7cmV0dXJuIG8obil9dmFyIG8sYTtyZXR1cm4gaS5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIGEobil9LGkuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKE51bWJlciksdSgpKTpufSxpLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sdSgpKTp0fSxpLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGkucmFuZ2UobikuaW50ZXJwb2xhdGUoRHUpfSxpLmNsYW1wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdSgpKTpyfSxpLmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdSgpKTplfSxpLnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSxpLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSxpLm5pY2U9ZnVuY3Rpb24odCl7cmV0dXJuIFppKG4sdCksdSgpfSxpLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSWkobix0LGUscil9LHUoKX1mdW5jdGlvbiBZaShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJyYW5nZSIsInJhbmdlUm91bmQiLCJpbnRlcnBvbGF0ZSIsImNsYW1wIil9ZnVuY3Rpb24gWmkobix0KXtyZXR1cm4gRmkobixIaShWaShuLHQpWzJdKSl9ZnVuY3Rpb24gVmkobix0KXtudWxsPT10JiYodD0xMCk7dmFyIGU9UGkobikscj1lWzFdLWVbMF0sdT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIvdCkvTWF0aC5MTjEwKSksaT10L3IqdTtyZXR1cm4uMTU+PWk/dSo9MTA6LjM1Pj1pP3UqPTU6Ljc1Pj1pJiYodSo9MiksZVswXT1NYXRoLmNlaWwoZVswXS91KSp1LGVbMV09TWF0aC5mbG9vcihlWzFdL3UpKnUrLjUqdSxlWzJdPXUsZX1mdW5jdGlvbiBYaShuLHQpe3JldHVybiB0YS5yYW5nZS5hcHBseSh0YSxWaShuLHQpKX1mdW5jdGlvbiAkaShuLHQsZSl7dmFyIHI9Vmkobix0KTtpZihlKXt2YXIgdT1pYy5leGVjKGUpO2lmKHUuc2hpZnQoKSwicyI9PT11WzhdKXt2YXIgaT10YS5mb3JtYXRQcmVmaXgoTWF0aC5tYXgoZ2EoclswXSksZ2EoclsxXSkpKTtyZXR1cm4gdVs3XXx8KHVbN109Ii4iK0JpKGkuc2NhbGUoclsyXSkpKSx1WzhdPSJmIixlPXRhLmZvcm1hdCh1LmpvaW4oIiIpKSxmdW5jdGlvbihuKXtyZXR1cm4gZShpLnNjYWxlKG4pKStpLnN5bWJvbH19dVs3XXx8KHVbN109Ii4iK1dpKHVbOF0scikpLGU9dS5qb2luKCIiKX1lbHNlIGU9IiwuIitCaShyWzJdKSsiZiI7cmV0dXJuIHRhLmZvcm1hdChlKX1mdW5jdGlvbiBCaShuKXtyZXR1cm4tTWF0aC5mbG9vcihNYXRoLmxvZyhuKS9NYXRoLkxOMTArLjAxKX1mdW5jdGlvbiBXaShuLHQpe3ZhciBlPUJpKHRbMl0pO3JldHVybiBuIGluIHlsP01hdGguYWJzKGUtQmkoTWF0aC5tYXgoZ2EodFswXSksZ2EodFsxXSkpKSkrICsoImUiIT09bik6ZS0yKigiJSI9PT1uKX1mdW5jdGlvbiBKaShuLHQsZSxyKXtmdW5jdGlvbiB1KG4pe3JldHVybihlP01hdGgubG9nKDA+bj8wOm4pOi1NYXRoLmxvZyhuPjA/MDotbikpL01hdGgubG9nKHQpfWZ1bmN0aW9uIGkobil7cmV0dXJuIGU/TWF0aC5wb3codCxuKTotTWF0aC5wb3codCwtbil9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gbih1KHQpKX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10WzBdPj0wLG4uZG9tYWluKChyPXQubWFwKE51bWJlcikpLm1hcCh1KSksbyk6cn0sby5iYXNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLG4uZG9tYWluKHIubWFwKHUpKSxvKTp0fSxvLm5pY2U9ZnVuY3Rpb24oKXt2YXIgdD1GaShyLm1hcCh1KSxlP01hdGg6eGwpO3JldHVybiBuLmRvbWFpbih0KSxyPXQubWFwKGkpLG99LG8udGlja3M9ZnVuY3Rpb24oKXt2YXIgbj1QaShyKSxvPVtdLGE9blswXSxjPW5bMV0sbD1NYXRoLmZsb29yKHUoYSkpLHM9TWF0aC5jZWlsKHUoYykpLGY9dCUxPzI6dDtpZihpc0Zpbml0ZShzLWwpKXtpZihlKXtmb3IoO3M+bDtsKyspZm9yKHZhciBoPTE7Zj5oO2grKylvLnB1c2goaShsKSpoKTtvLnB1c2goaShsKSl9ZWxzZSBmb3Ioby5wdXNoKGkobCkpO2wrKzxzOylmb3IodmFyIGg9Zi0xO2g+MDtoLS0pby5wdXNoKGkobCkqaCk7Zm9yKGw9MDtvW2xdPGE7bCsrKTtmb3Iocz1vLmxlbmd0aDtvW3MtMV0+YztzLS0pO289by5zbGljZShsLHMpfXJldHVybiBvfSxvLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gTWw7YXJndW1lbnRzLmxlbmd0aDwyP3Q9TWw6ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXRhLmZvcm1hdCh0KSk7dmFyIHIsYT1NYXRoLm1heCguMSxuL28udGlja3MoKS5sZW5ndGgpLGM9ZT8ocj0xZS0xMixNYXRoLmNlaWwpOihyPS0xZS0xMixNYXRoLmZsb29yKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4vaShjKHUobikrcikpPD1hP3Qobik6IiJ9fSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gSmkobi5jb3B5KCksdCxlLHIpfSxZaShvLG4pfWZ1bmN0aW9uIEdpKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHUodCkpfXZhciB1PUtpKHQpLGk9S2koMS90KTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGkobi5pbnZlcnQodCkpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obi5kb21haW4oKGU9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxyKTplfSxyLnRpY2tzPWZ1bmN0aW9uKG4pe3JldHVybiBYaShlLG4pfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gJGkoZSxuLHQpfSxyLm5pY2U9ZnVuY3Rpb24obil7cmV0dXJuIHIuZG9tYWluKFppKGUsbikpfSxyLmV4cG9uZW50PWZ1bmN0aW9uKG8pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUtpKHQ9byksaT1LaSgxL3QpLG4uZG9tYWluKGUubWFwKHUpKSxyKTp0fSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gR2kobi5jb3B5KCksdCxlKX0sWWkocixuKX1mdW5jdGlvbiBLaShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDA+dD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX19ZnVuY3Rpb24gUWkobix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBpWygodS5nZXQoZSl8fCgicmFuZ2UiPT09dC50P3Uuc2V0KGUsbi5wdXNoKGUpKTowLzApKS0xKSVpLmxlbmd0aF19ZnVuY3Rpb24gcih0LGUpe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn0pfXZhciB1LGksbztyZXR1cm4gZS5kb21haW49ZnVuY3Rpb24ocil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIG47bj1bXSx1PW5ldyBsO2Zvcih2YXIgaSxvPS0xLGE9ci5sZW5ndGg7KytvPGE7KXUuaGFzKGk9cltvXSl8fHUuc2V0KGksbi5wdXNoKGkpKTtyZXR1cm4gZVt0LnRdLmFwcGx5KGUsdC5hKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLG89MCx0PXt0OiJyYW5nZSIsYTphcmd1bWVudHN9LGUpOml9LGUucmFuZ2VQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz0oYytsKS8yLDApOihsLWMpLyhuLmxlbmd0aC0xK2EpO3JldHVybiBpPXIoYytzKmEvMixzKSxvPTAsdD17dDoicmFuZ2VQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRQb2ludHM9ZnVuY3Rpb24odSxhKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApO3ZhciBjPXVbMF0sbD11WzFdLHM9bi5sZW5ndGg8Mj8oYz1sPU1hdGgucm91bmQoKGMrbCkvMiksMCk6KGwtYykvKG4ubGVuZ3RoLTErYSl8MDtyZXR1cm4gaT1yKGMrTWF0aC5yb3VuZChzKmEvMisobC1jLShuLmxlbmd0aC0xK2EpKnMpLzIpLHMpLG89MCx0PXt0OiJyYW5nZVJvdW5kUG9pbnRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZUJhbmRzPWZ1bmN0aW9uKHUsYSxjKXthcmd1bWVudHMubGVuZ3RoPDImJihhPTApLGFyZ3VtZW50cy5sZW5ndGg8MyYmKGM9YSk7dmFyIGw9dVsxXTx1WzBdLHM9dVtsLTBdLGY9dVsxLWxdLGg9KGYtcykvKG4ubGVuZ3RoLWErMipjKTtyZXR1cm4gaT1yKHMraCpjLGgpLGwmJmkucmV2ZXJzZSgpLG89aCooMS1hKSx0PXt0OiJyYW5nZUJhbmRzIixhOmFyZ3VtZW50c30sZX0sZS5yYW5nZVJvdW5kQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD1NYXRoLmZsb29yKChmLXMpLyhuLmxlbmd0aC1hKzIqYykpO3JldHVybiBpPXIocytNYXRoLnJvdW5kKChmLXMtKG4ubGVuZ3RoLWEpKmgpLzIpLGgpLGwmJmkucmV2ZXJzZSgpLG89TWF0aC5yb3VuZChoKigxLWEpKSx0PXt0OiJyYW5nZVJvdW5kQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZD1mdW5jdGlvbigpe3JldHVybiBvfSxlLnJhbmdlRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIFBpKHQuYVswXSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBRaShuLHQpfSxlLmRvbWFpbihuKX1mdW5jdGlvbiBubyhuLHQpe2Z1bmN0aW9uIGkoKXt2YXIgZT0wLHI9dC5sZW5ndGg7Zm9yKGE9W107KytlPHI7KWFbZS0xXT10YS5xdWFudGlsZShuLGUvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhuKXtyZXR1cm4gaXNOYU4obj0rbik/dm9pZCAwOnRbdGEuYmlzZWN0KGEsbildfXZhciBhO3JldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10Lm1hcChyKS5maWx0ZXIodSkuc29ydChlKSxpKCkpOm59LG8ucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKCkpOnR9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKGUpe3JldHVybiBlPXQuaW5kZXhPZihlKSwwPmU/WzAvMCwwLzBdOltlPjA/YVtlLTFdOm5bMF0sZTxhLmxlbmd0aD9hW2VdOm5bbi5sZW5ndGgtMV1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gbm8obix0KX0saSgpfWZ1bmN0aW9uIHRvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBlW01hdGgubWF4KDAsTWF0aC5taW4obyxNYXRoLmZsb29yKGkqKHQtbikpKSldfWZ1bmN0aW9uIHUoKXtyZXR1cm4gaT1lLmxlbmd0aC8odC1uKSxvPWUubGVuZ3RoLTEscn12YXIgaSxvO3JldHVybiByLmRvbWFpbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rZVswXSx0PStlW2UubGVuZ3RoLTFdLHUoKSk6W24sdF19LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LHIuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiB0PWUuaW5kZXhPZih0KSx0PTA+dD8wLzA6dC9pK24sW3QsdCsxL2ldfSxyLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdG8obix0LGUpfSx1KCl9ZnVuY3Rpb24gZW8obix0KXtmdW5jdGlvbiBlKGUpe3JldHVybiBlPj1lP3RbdGEuYmlzZWN0KG4sZSldOnZvaWQgMH1yZXR1cm4gZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlKTpufSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZSk6dH0sZS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLFtuW2UtMV0sbltlXV19LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBlbyhuLHQpfSxlfWZ1bmN0aW9uIHJvKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuK259cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLm1hcCh0KSx0KTpufSx0LnRpY2tzPWZ1bmN0aW9uKHQpe3JldHVybiBYaShuLHQpfSx0LnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gJGkobix0LGUpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8obil9LHR9ZnVuY3Rpb24gdW8oKXtyZXR1cm4gMH1mdW5jdGlvbiBpbyhuKXtyZXR1cm4gbi5pbm5lclJhZGl1c31mdW5jdGlvbiBvbyhuKXtyZXR1cm4gbi5vdXRlclJhZGl1c31mdW5jdGlvbiBhbyhuKXtyZXR1cm4gbi5zdGFydEFuZ2xlfWZ1bmN0aW9uIGNvKG4pe3JldHVybiBuLmVuZEFuZ2xlfWZ1bmN0aW9uIGxvKG4pe3JldHVybiBuJiZuLnBhZEFuZ2xlfWZ1bmN0aW9uIHNvKG4sdCxlLHIpe3JldHVybihuLWUpKnQtKHQtcikqbj4wPzA6MX1mdW5jdGlvbiBmbyhuLHQsZSxyLHUpe3ZhciBpPW5bMF0tdFswXSxvPW5bMV0tdFsxXSxhPSh1P3I6LXIpL01hdGguc3FydChpKmkrbypvKSxjPWEqbyxsPS1hKmkscz1uWzBdK2MsZj1uWzFdK2wsaD10WzBdK2MsZz10WzFdK2wscD0ocytoKS8yLHY9KGYrZykvMixkPWgtcyxtPWctZix5PWQqZCttKm0sTT1lLXIseD1zKmctaCpmLGI9KDA+bT8tMToxKSpNYXRoLnNxcnQoTSpNKnkteCp4KSxfPSh4Km0tZCpiKS95LHc9KC14KmQtbSpiKS95LFM9KHgqbStkKmIpL3ksaz0oLXgqZCttKmIpL3ksRT1fLXAsQT13LXYsTj1TLXAsQz1rLXY7cmV0dXJuIEUqRStBKkE+TipOK0MqQyYmKF89Uyx3PWspLFtbXy1jLHctbF0sW18qZS9NLHcqZS9NXV19ZnVuY3Rpb24gaG8obil7ZnVuY3Rpb24gdCh0KXtmdW5jdGlvbiBvKCl7bC5wdXNoKCJNIixpKG4ocyksYSkpfWZvcih2YXIgYyxsPVtdLHM9W10sZj0tMSxoPXQubGVuZ3RoLGc9RXQoZSkscD1FdChyKTsrK2Y8aDspdS5jYWxsKHRoaXMsYz10W2ZdLGYpP3MucHVzaChbK2cuY2FsbCh0aGlzLGMsZiksK3AuY2FsbCh0aGlzLGMsZildKTpzLmxlbmd0aCYmKG8oKSxzPVtdKTtyZXR1cm4gcy5sZW5ndGgmJm8oKSxsLmxlbmd0aD9sLmpvaW4oIiIpOm51bGx9dmFyIGU9QXIscj1Ocix1PU5lLGk9Z28sbz1pLmtleSxhPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LmRlZmluZWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LmludGVycG9sYXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP2k9bjooaT1FbC5nZXQobil8fGdvKS5rZXksdCk6b30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sdCk6YX0sdH1mdW5jdGlvbiBnbyhuKXtyZXR1cm4gbi5qb2luKCJMIil9ZnVuY3Rpb24gcG8obil7cmV0dXJuIGdvKG4pKyJaIn1mdW5jdGlvbiB2byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwoclswXSsocj1uW3RdKVswXSkvMiwiViIsclsxXSk7cmV0dXJuIGU+MSYmdS5wdXNoKCJIIixyWzBdKSx1LmpvaW4oIiIpfWZ1bmN0aW9uIG1vKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIlYiLChyPW5bdF0pWzFdLCJIIixyWzBdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiB5byhuKXtmb3IodmFyIHQ9MCxlPW4ubGVuZ3RoLHI9blswXSx1PVtyWzBdLCIsIixyWzFdXTsrK3Q8ZTspdS5wdXNoKCJIIiwocj1uW3RdKVswXSwiViIsclsxXSk7cmV0dXJuIHUuam9pbigiIil9ZnVuY3Rpb24gTW8obix0KXtyZXR1cm4gbi5sZW5ndGg8ND9nbyhuKTpuWzFdK19vKG4uc2xpY2UoMSwtMSksd28obix0KSl9ZnVuY3Rpb24geG8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKChuLnB1c2goblswXSksbiksd28oW25bbi5sZW5ndGgtMl1dLmNvbmNhdChuLFtuWzFdXSksdCkpfWZ1bmN0aW9uIGJvKG4sdCl7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLHdvKG4sdCkpfWZ1bmN0aW9uIF9vKG4sdCl7aWYodC5sZW5ndGg8MXx8bi5sZW5ndGghPXQubGVuZ3RoJiZuLmxlbmd0aCE9dC5sZW5ndGgrMilyZXR1cm4gZ28obik7dmFyIGU9bi5sZW5ndGghPXQubGVuZ3RoLHI9IiIsdT1uWzBdLGk9blsxXSxvPXRbMF0sYT1vLGM9MTtpZihlJiYocis9IlEiKyhpWzBdLTIqb1swXS8zKSsiLCIrKGlbMV0tMipvWzFdLzMpKyIsIitpWzBdKyIsIitpWzFdLHU9blsxXSxjPTIpLHQubGVuZ3RoPjEpe2E9dFsxXSxpPW5bY10sYysrLHIrPSJDIisodVswXStvWzBdKSsiLCIrKHVbMV0rb1sxXSkrIiwiKyhpWzBdLWFbMF0pKyIsIisoaVsxXS1hWzFdKSsiLCIraVswXSsiLCIraVsxXTtmb3IodmFyIGw9MjtsPHQubGVuZ3RoO2wrKyxjKyspaT1uW2NdLGE9dFtsXSxyKz0iUyIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdfWlmKGUpe3ZhciBzPW5bY107cis9IlEiKyhpWzBdKzIqYVswXS8zKSsiLCIrKGlbMV0rMiphWzFdLzMpKyIsIitzWzBdKyIsIitzWzFdfXJldHVybiByfWZ1bmN0aW9uIHdvKG4sdCl7Zm9yKHZhciBlLHI9W10sdT0oMS10KS8yLGk9blswXSxvPW5bMV0sYT0xLGM9bi5sZW5ndGg7KythPGM7KWU9aSxpPW8sbz1uW2FdLHIucHVzaChbdSoob1swXS1lWzBdKSx1KihvWzFdLWVbMV0pXSk7cmV0dXJuIHJ9ZnVuY3Rpb24gU28obil7aWYobi5sZW5ndGg8MylyZXR1cm4gZ28obik7dmFyIHQ9MSxlPW4ubGVuZ3RoLHI9blswXSx1PXJbMF0saT1yWzFdLG89W3UsdSx1LChyPW5bMV0pWzBdXSxhPVtpLGksaSxyWzFdXSxjPVt1LCIsIixpLCJMIixObyhDbCxvKSwiLCIsTm8oQ2wsYSldO2ZvcihuLnB1c2gobltlLTFdKTsrK3Q8PWU7KXI9blt0XSxvLnNoaWZ0KCksby5wdXNoKHJbMF0pLGEuc2hpZnQoKSxhLnB1c2goclsxXSksQ28oYyxvLGEpO3JldHVybiBuLnBvcCgpLGMucHVzaCgiTCIsciksYy5qb2luKCIiKX1mdW5jdGlvbiBrbyhuKXtpZihuLmxlbmd0aDw0KXJldHVybiBnbyhuKTtmb3IodmFyIHQsZT1bXSxyPS0xLHU9bi5sZW5ndGgsaT1bMF0sbz1bMF07KytyPDM7KXQ9bltyXSxpLnB1c2godFswXSksby5wdXNoKHRbMV0pO2ZvcihlLnB1c2goTm8oQ2wsaSkrIiwiK05vKENsLG8pKSwtLXI7KytyPHU7KXQ9bltyXSxpLnNoaWZ0KCksaS5wdXNoKHRbMF0pLG8uc2hpZnQoKSxvLnB1c2godFsxXSksQ28oZSxpLG8pO3JldHVybiBlLmpvaW4oIiIpfWZ1bmN0aW9uIEVvKG4pe2Zvcih2YXIgdCxlLHI9LTEsdT1uLmxlbmd0aCxpPXUrNCxvPVtdLGE9W107KytyPDQ7KWU9bltyJXVdLG8ucHVzaChlWzBdKSxhLnB1c2goZVsxXSk7Zm9yKHQ9W05vKENsLG8pLCIsIixObyhDbCxhKV0sLS1yOysrcjxpOyllPW5bciV1XSxvLnNoaWZ0KCksby5wdXNoKGVbMF0pLGEuc2hpZnQoKSxhLnB1c2goZVsxXSksQ28odCxvLGEpO3JldHVybiB0LmpvaW4oIiIpfWZ1bmN0aW9uIEFvKG4sdCl7dmFyIGU9bi5sZW5ndGgtMTtpZihlKWZvcih2YXIgcix1LGk9blswXVswXSxvPW5bMF1bMV0sYT1uW2VdWzBdLWksYz1uW2VdWzFdLW8sbD0tMTsrK2w8PWU7KXI9bltsXSx1PWwvZSxyWzBdPXQqclswXSsoMS10KSooaSt1KmEpLHJbMV09dCpyWzFdKygxLXQpKihvK3UqYyk7cmV0dXJuIFNvKG4pfWZ1bmN0aW9uIE5vKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdK25bM10qdFszXX1mdW5jdGlvbiBDbyhuLHQsZSl7bi5wdXNoKCJDIixObyhBbCx0KSwiLCIsTm8oQWwsZSksIiwiLE5vKE5sLHQpLCIsIixObyhObCxlKSwiLCIsTm8oQ2wsdCksIiwiLE5vKENsLGUpKX1mdW5jdGlvbiB6byhuLHQpe3JldHVybih0WzFdLW5bMV0pLyh0WzBdLW5bMF0pfWZ1bmN0aW9uIHFvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgtMSxyPVtdLHU9blswXSxpPW5bMV0sbz1yWzBdPXpvKHUsaSk7Kyt0PGU7KXJbdF09KG8rKG89em8odT1pLGk9blt0KzFdKSkpLzI7cmV0dXJuIHJbdF09byxyfWZ1bmN0aW9uIExvKG4pe2Zvcih2YXIgdCxlLHIsdSxpPVtdLG89cW8obiksYT0tMSxjPW4ubGVuZ3RoLTE7KythPGM7KXQ9em8oblthXSxuW2ErMV0pLGdhKHQpPENhP29bYV09b1thKzFdPTA6KGU9b1thXS90LHI9b1thKzFdL3QsdT1lKmUrcipyLHU+OSYmKHU9Myp0L01hdGguc3FydCh1KSxvW2FdPXUqZSxvW2ErMV09dSpyKSk7Zm9yKGE9LTE7KythPD1jOyl1PShuW01hdGgubWluKGMsYSsxKV1bMF0tbltNYXRoLm1heCgwLGEtMSldWzBdKS8oNiooMStvW2FdKm9bYV0pKSxpLnB1c2goW3V8fDAsb1thXSp1fHwwXSk7cmV0dXJuIGl9ZnVuY3Rpb24gVG8obil7cmV0dXJuIG4ubGVuZ3RoPDM/Z28obik6blswXStfbyhuLExvKG4pKX1mdW5jdGlvbiBSbyhuKXtmb3IodmFyIHQsZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspdD1uW3VdLGU9dFswXSxyPXRbMV0tUmEsdFswXT1lKk1hdGguY29zKHIpLHRbMV09ZSpNYXRoLnNpbihyKTtyZXR1cm4gbn1mdW5jdGlvbiBEbyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIGMoKXt2LnB1c2goIk0iLGEobihtKSxmKSxzLGwobihkLnJldmVyc2UoKSksZiksIloiKX1mb3IodmFyIGgsZyxwLHY9W10sZD1bXSxtPVtdLHk9LTEsTT10Lmxlbmd0aCx4PUV0KGUpLGI9RXQodSksXz1lPT09cj9mdW5jdGlvbigpe3JldHVybiBnfTpFdChyKSx3PXU9PT1pP2Z1bmN0aW9uKCl7cmV0dXJuIHB9OkV0KGkpOysreTxNOylvLmNhbGwodGhpcyxoPXRbeV0seSk/KGQucHVzaChbZz0reC5jYWxsKHRoaXMsaCx5KSxwPStiLmNhbGwodGhpcyxoLHkpXSksbS5wdXNoKFsrXy5jYWxsKHRoaXMsaCx5KSwrdy5jYWxsKHRoaXMsaCx5KV0pKTpkLmxlbmd0aCYmKGMoKSxkPVtdLG09W10pO3JldHVybiBkLmxlbmd0aCYmYygpLHYubGVuZ3RoP3Yuam9pbigiIik6bnVsbH12YXIgZT1BcixyPUFyLHU9MCxpPU5yLG89TmUsYT1nbyxjPWEua2V5LGw9YSxzPSJMIixmPS43O3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9cj1uLHQpOnJ9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cg0KfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9aT1uLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bix0KTp1fSx0LnkxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sdCk6b30sdC5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9hPW46KGE9RWwuZ2V0KG4pfHxnbykua2V5LGw9YS5yZXZlcnNlfHxhLHM9YS5jbG9zZWQ/Ik0iOiJMIix0KTpjfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bix0KTpmfSx0fWZ1bmN0aW9uIFBvKG4pe3JldHVybiBuLnJhZGl1c31mdW5jdGlvbiBVbyhuKXtyZXR1cm5bbi54LG4ueV19ZnVuY3Rpb24gam8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10WzBdLHI9dFsxXS1SYTtyZXR1cm5bZSpNYXRoLmNvcyhyKSxlKk1hdGguc2luKHIpXX19ZnVuY3Rpb24gRm8oKXtyZXR1cm4gNjR9ZnVuY3Rpb24gSG8oKXtyZXR1cm4iY2lyY2xlIn1mdW5jdGlvbiBPbyhuKXt2YXIgdD1NYXRoLnNxcnQobi9xYSk7cmV0dXJuIk0wLCIrdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIistdCsiQSIrdCsiLCIrdCsiIDAgMSwxIDAsIit0KyJaIn1mdW5jdGlvbiBJbyhuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdCxlOyh0PXRoaXNbbl0pJiYoZT10W3QuYWN0aXZlXSkmJigtLXQuY291bnQ/ZGVsZXRlIHRbdC5hY3RpdmVdOmRlbGV0ZSB0aGlzW25dLHQuYWN0aXZlKz0uNSxlLmV2ZW50JiZlLmV2ZW50LmludGVycnVwdC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLmluZGV4KSl9fWZ1bmN0aW9uIFlvKG4sdCxlKXtyZXR1cm4geWEobixQbCksbi5uYW1lc3BhY2U9dCxuLmlkPWUsbn1mdW5jdGlvbiBabyhuLHQsZSxyKXt2YXIgdT1uLmlkLGk9bi5uYW1lc3BhY2U7cmV0dXJuIFkobiwiZnVuY3Rpb24iPT10eXBlb2YgZT9mdW5jdGlvbihuLG8sYSl7bltpXVt1XS50d2Vlbi5zZXQodCxyKGUuY2FsbChuLG4uX19kYXRhX18sbyxhKSkpfTooZT1yKGUpLGZ1bmN0aW9uKG4pe25baV1bdV0udHdlZW4uc2V0KHQsZSl9KSl9ZnVuY3Rpb24gVm8obil7cmV0dXJuIG51bGw9PW4mJihuPSIiKSxmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn19ZnVuY3Rpb24gWG8obil7cmV0dXJuIG51bGw9PW4/Il9fdHJhbnNpdGlvbl9fIjoiX190cmFuc2l0aW9uXyIrbisiX18ifWZ1bmN0aW9uICRvKG4sdCxlLHIsdSl7dmFyIGk9bltlXXx8KG5bZV09e2FjdGl2ZTowLGNvdW50OjB9KSxvPWlbcl07aWYoIW8pe3ZhciBhPXUudGltZTtvPWlbcl09e3R3ZWVuOm5ldyBsLHRpbWU6YSxkZWxheTp1LmRlbGF5LGR1cmF0aW9uOnUuZHVyYXRpb24sZWFzZTp1LmVhc2UsaW5kZXg6dH0sdT1udWxsLCsraS5jb3VudCx0YS50aW1lcihmdW5jdGlvbih1KXtmdW5jdGlvbiBjKGUpe2lmKGkuYWN0aXZlPnIpcmV0dXJuIHMoKTt2YXIgdT1pW2kuYWN0aXZlXTt1JiYoLS1pLmNvdW50LGRlbGV0ZSBpW2kuYWN0aXZlXSx1LmV2ZW50JiZ1LmV2ZW50LmludGVycnVwdC5jYWxsKG4sbi5fX2RhdGFfXyx1LmluZGV4KSksaS5hY3RpdmU9cixvLmV2ZW50JiZvLmV2ZW50LnN0YXJ0LmNhbGwobixuLl9fZGF0YV9fLHQpLG8udHdlZW4uZm9yRWFjaChmdW5jdGlvbihlLHIpeyhyPXIuY2FsbChuLG4uX19kYXRhX18sdCkpJiZ2LnB1c2gocil9KSxoPW8uZWFzZSxmPW8uZHVyYXRpb24sdGEudGltZXIoZnVuY3Rpb24oKXtyZXR1cm4gcC5jPWwoZXx8MSk/TmU6bCwxfSwwLGEpfWZ1bmN0aW9uIGwoZSl7aWYoaS5hY3RpdmUhPT1yKXJldHVybiAxO2Zvcih2YXIgdT1lL2YsYT1oKHUpLGM9di5sZW5ndGg7Yz4wOyl2Wy0tY10uY2FsbChuLGEpO3JldHVybiB1Pj0xPyhvLmV2ZW50JiZvLmV2ZW50LmVuZC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxzKCkpOnZvaWQgMH1mdW5jdGlvbiBzKCl7cmV0dXJuLS1pLmNvdW50P2RlbGV0ZSBpW3JdOmRlbGV0ZSBuW2VdLDF9dmFyIGYsaCxnPW8uZGVsYXkscD1lYyx2PVtdO3JldHVybiBwLnQ9ZythLHU+PWc/Yyh1LWcpOnZvaWQocC5jPWMpfSwwLGEpfX1mdW5jdGlvbiBCbyhuLHQsZSl7bi5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3ZhciByPXQobik7cmV0dXJuInRyYW5zbGF0ZSgiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIsMCkifSl9ZnVuY3Rpb24gV28obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoMCwiKyhpc0Zpbml0ZShyKT9yOmUobikpKyIpIn0pfWZ1bmN0aW9uIEpvKG4pe3JldHVybiBuLnRvSVNPU3RyaW5nKCl9ZnVuY3Rpb24gR28obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odCl9ZnVuY3Rpb24gdShuLGUpe3ZhciByPW5bMV0tblswXSx1PXIvZSxpPXRhLmJpc2VjdChWbCx1KTtyZXR1cm4gaT09VmwubGVuZ3RoP1t0LnllYXIsVmkobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4vMzE1MzZlNn0pLGUpWzJdXTppP3RbdS9WbFtpLTFdPFZsW2ldL3U/aS0xOmldOltCbCxWaShuLGUpWzJdXX1yZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEtvKG4uaW52ZXJ0KHQpKX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4uZG9tYWluKHQpLHIpOm4uZG9tYWluKCkubWFwKEtvKX0sci5uaWNlPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4haXNOYU4oZSkmJiFuLnJhbmdlKGUsS28oK2UrMSksdCkubGVuZ3RofXZhciBpPXIuZG9tYWluKCksbz1QaShpKSxhPW51bGw9PW4/dShvLDEwKToibnVtYmVyIj09dHlwZW9mIG4mJnUobyxuKTtyZXR1cm4gYSYmKG49YVswXSx0PWFbMV0pLHIuZG9tYWluKEZpKGksdD4xP3tmbG9vcjpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmZsb29yKHQpKTspdD1Lbyh0LTEpO3JldHVybiB0fSxjZWlsOmZ1bmN0aW9uKHQpe2Zvcig7ZSh0PW4uY2VpbCh0KSk7KXQ9S28oK3QrMSk7cmV0dXJuIHR9fTpuKSl9LHIudGlja3M9ZnVuY3Rpb24obix0KXt2YXIgZT1QaShyLmRvbWFpbigpKSxpPW51bGw9PW4/dShlLDEwKToibnVtYmVyIj09dHlwZW9mIG4/dShlLG4pOiFuLnJhbmdlJiZbe3JhbmdlOm59LHRdO3JldHVybiBpJiYobj1pWzBdLHQ9aVsxXSksbi5yYW5nZShlWzBdLEtvKCtlWzFdKzEpLDE+dD8xOnQpfSxyLnRpY2tGb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEdvKG4uY29weSgpLHQsZSl9LFlpKHIsbil9ZnVuY3Rpb24gS28obil7cmV0dXJuIG5ldyBEYXRlKG4pfWZ1bmN0aW9uIFFvKG4pe3JldHVybiBKU09OLnBhcnNlKG4ucmVzcG9uc2VUZXh0KX1mdW5jdGlvbiBuYShuKXt2YXIgdD11YS5jcmVhdGVSYW5nZSgpO3JldHVybiB0LnNlbGVjdE5vZGUodWEuYm9keSksdC5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQobi5yZXNwb25zZVRleHQpfXZhciB0YT17dmVyc2lvbjoiMy41LjUifSxlYT1bXS5zbGljZSxyYT1mdW5jdGlvbihuKXtyZXR1cm4gZWEuY2FsbChuKX0sdWE9dGhpcy5kb2N1bWVudDtpZih1YSl0cnl7cmEodWEuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlfWNhdGNoKGlhKXtyYT1mdW5jdGlvbihuKXtmb3IodmFyIHQ9bi5sZW5ndGgsZT1uZXcgQXJyYXkodCk7dC0tOyllW3RdPW5bdF07cmV0dXJuIGV9fWlmKERhdGUubm93fHwoRGF0ZS5ub3c9ZnVuY3Rpb24oKXtyZXR1cm4rbmV3IERhdGV9KSx1YSl0cnl7dWEuY3JlYXRlRWxlbWVudCgiRElWIikuc3R5bGUuc2V0UHJvcGVydHkoIm9wYWNpdHkiLDAsIiIpfWNhdGNoKG9hKXt2YXIgYWE9dGhpcy5FbGVtZW50LnByb3RvdHlwZSxjYT1hYS5zZXRBdHRyaWJ1dGUsbGE9YWEuc2V0QXR0cmlidXRlTlMsc2E9dGhpcy5DU1NTdHlsZURlY2xhcmF0aW9uLnByb3RvdHlwZSxmYT1zYS5zZXRQcm9wZXJ0eTthYS5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24obix0KXtjYS5jYWxsKHRoaXMsbix0KyIiKX0sYWEuc2V0QXR0cmlidXRlTlM9ZnVuY3Rpb24obix0LGUpe2xhLmNhbGwodGhpcyxuLHQsZSsiIil9LHNhLnNldFByb3BlcnR5PWZ1bmN0aW9uKG4sdCxlKXtmYS5jYWxsKHRoaXMsbix0KyIiLGUpfX10YS5hc2NlbmRpbmc9ZSx0YS5kZXNjZW5kaW5nPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4+dD8tMTp0Pm4/MTp0Pj1uPzA6MC8wfSx0YS5taW49ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmZT5yJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJmU+ciYmKGU9cil9cmV0dXJuIGV9LHRhLm1heD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKXtmb3IoOysrdTxpOylpZihudWxsIT0ocj1uW3VdKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPW5bdV0pJiZyPmUmJihlPXIpfWVsc2V7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj5lJiYoZT1yKX1yZXR1cm4gZX0sdGEuZXh0ZW50PWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1LGk9LTEsbz1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK2k8bzspaWYobnVsbCE9KHI9bltpXSkmJnI+PXIpe2U9dT1yO2JyZWFrfWZvcig7KytpPG87KW51bGwhPShyPW5baV0pJiYoZT5yJiYoZT1yKSxyPnUmJih1PXIpKX1lbHNle2Zvcig7KytpPG87KWlmKG51bGwhPShyPXQuY2FsbChuLG5baV0saSkpJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9cmV0dXJuW2UsdV19LHRhLnN1bT1mdW5jdGlvbihuLHQpe3ZhciBlLHI9MCxpPW4ubGVuZ3RoLG89LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK288aTspdShlPStuW29dKSYmKHIrPWUpO2Vsc2UgZm9yKDsrK288aTspdShlPSt0LmNhbGwobixuW29dLG8pKSYmKHIrPWUpO3JldHVybiByfSx0YS5tZWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaT0wLG89bi5sZW5ndGgsYT0tMSxjPW87aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2E8bzspdShlPXIoblthXSkpP2krPWU6LS1jO2Vsc2UgZm9yKDsrK2E8bzspdShlPXIodC5jYWxsKG4sblthXSxhKSkpP2krPWU6LS1jO3JldHVybiBjP2kvYzp2b2lkIDB9LHRhLnF1YW50aWxlPWZ1bmN0aW9uKG4sdCl7dmFyIGU9KG4ubGVuZ3RoLTEpKnQrMSxyPU1hdGguZmxvb3IoZSksdT0rbltyLTFdLGk9ZS1yO3JldHVybiBpP3UraSoobltyXS11KTp1fSx0YS5tZWRpYW49ZnVuY3Rpb24obix0KXt2YXIgaSxvPVtdLGE9bi5sZW5ndGgsYz0tMTtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrYzxhOyl1KGk9cihuW2NdKSkmJm8ucHVzaChpKTtlbHNlIGZvcig7KytjPGE7KXUoaT1yKHQuY2FsbChuLG5bY10sYykpKSYmby5wdXNoKGkpO3JldHVybiBvLmxlbmd0aD90YS5xdWFudGlsZShvLnNvcnQoZSksLjUpOnZvaWQgMH0sdGEudmFyaWFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxpLG89bi5sZW5ndGgsYT0wLGM9MCxsPS0xLHM9MDtpZigxPT09YXJndW1lbnRzLmxlbmd0aClmb3IoOysrbDxvOyl1KGU9cihuW2xdKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtlbHNlIGZvcig7KytsPG87KXUoZT1yKHQuY2FsbChuLG5bbF0sbCkpKSYmKGk9ZS1hLGErPWkvKytzLGMrPWkqKGUtYSkpO3JldHVybiBzPjE/Yy8ocy0xKTp2b2lkIDB9LHRhLmRldmlhdGlvbj1mdW5jdGlvbigpe3ZhciBuPXRhLnZhcmlhbmNlLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbj9NYXRoLnNxcnQobik6bn07dmFyIGhhPWkoZSk7dGEuYmlzZWN0TGVmdD1oYS5sZWZ0LHRhLmJpc2VjdD10YS5iaXNlY3RSaWdodD1oYS5yaWdodCx0YS5iaXNlY3Rvcj1mdW5jdGlvbihuKXtyZXR1cm4gaSgxPT09bi5sZW5ndGg/ZnVuY3Rpb24odCxyKXtyZXR1cm4gZShuKHQpLHIpfTpuKX0sdGEuc2h1ZmZsZT1mdW5jdGlvbihuLHQsZSl7KGk9YXJndW1lbnRzLmxlbmd0aCk8MyYmKGU9bi5sZW5ndGgsMj5pJiYodD0wKSk7Zm9yKHZhciByLHUsaT1lLXQ7aTspdT1NYXRoLnJhbmRvbSgpKmktLXwwLHI9bltpK3RdLG5baSt0XT1uW3UrdF0sblt1K3RdPXI7cmV0dXJuIG59LHRhLnBlcm11dGU9ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9dC5sZW5ndGgscj1uZXcgQXJyYXkoZSk7ZS0tOylyW2VdPW5bdFtlXV07cmV0dXJuIHJ9LHRhLnBhaXJzPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlPTAscj1uLmxlbmd0aC0xLHU9blswXSxpPW5ldyBBcnJheSgwPnI/MDpyKTtyPmU7KWlbZV09W3Q9dSx1PW5bKytlXV07cmV0dXJuIGl9LHRhLnppcD1mdW5jdGlvbigpe2lmKCEocj1hcmd1bWVudHMubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsdD10YS5taW4oYXJndW1lbnRzLG8pLGU9bmV3IEFycmF5KHQpOysrbjx0Oylmb3IodmFyIHIsdT0tMSxpPWVbbl09bmV3IEFycmF5KHIpOysrdTxyOylpW3VdPWFyZ3VtZW50c1t1XVtuXTtyZXR1cm4gZX0sdGEudHJhbnNwb3NlPWZ1bmN0aW9uKG4pe3JldHVybiB0YS56aXAuYXBwbHkodGEsbil9LHRhLmtleXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKGUpO3JldHVybiB0fSx0YS52YWx1ZXM9ZnVuY3Rpb24obil7dmFyIHQ9W107Zm9yKHZhciBlIGluIG4pdC5wdXNoKG5bZV0pO3JldHVybiB0fSx0YS5lbnRyaWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaCh7a2V5OmUsdmFsdWU6bltlXX0pO3JldHVybiB0fSx0YS5tZXJnZT1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHU9bi5sZW5ndGgsaT0tMSxvPTA7KytpPHU7KW8rPW5baV0ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKTstLXU+PTA7KWZvcihyPW5bdV0sdD1yLmxlbmd0aDstLXQ+PTA7KWVbLS1vXT1yW3RdO3JldHVybiBlfTt2YXIgZ2E9TWF0aC5hYnM7dGEucmFuZ2U9ZnVuY3Rpb24obix0LGUpe2lmKGFyZ3VtZW50cy5sZW5ndGg8MyYmKGU9MSxhcmd1bWVudHMubGVuZ3RoPDImJih0PW4sbj0wKSksKHQtbikvZT09PTEvMCl0aHJvdyBuZXcgRXJyb3IoImluZmluaXRlIHJhbmdlIik7dmFyIHIsdT1bXSxpPWEoZ2EoZSkpLG89LTE7aWYobio9aSx0Kj1pLGUqPWksMD5lKWZvcig7KHI9bitlKisrbyk+dDspdS5wdXNoKHIvaSk7ZWxzZSBmb3IoOyhyPW4rZSorK28pPHQ7KXUucHVzaChyL2kpO3JldHVybiB1fSx0YS5tYXA9ZnVuY3Rpb24obix0KXt2YXIgZT1uZXcgbDtpZihuIGluc3RhbmNlb2YgbCluLmZvckVhY2goZnVuY3Rpb24obix0KXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KG4pKXt2YXIgcix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK3U8aTspZS5zZXQodSxuW3VdKTtlbHNlIGZvcig7Kyt1PGk7KWUuc2V0KHQuY2FsbChuLHI9blt1XSx1KSxyKX1lbHNlIGZvcih2YXIgbyBpbiBuKWUuc2V0KG8sbltvXSk7cmV0dXJuIGV9O3ZhciBwYT0iX19wcm90b19fIix2YT0iXHgwMCI7YyhsLHtoYXM6aCxnZXQ6ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX1tzKG4pXX0sc2V0OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIHRoaXMuX1tzKG4pXT10fSxyZW1vdmU6ZyxrZXlzOnAsdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIG49W107Zm9yKHZhciB0IGluIHRoaXMuXyluLnB1c2godGhpcy5fW3RdKTtyZXR1cm4gbn0sZW50cmllczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHtrZXk6Zih0KSx2YWx1ZTp0aGlzLl9bdF19KTtyZXR1cm4gbn0sc2l6ZTp2LGVtcHR5OmQsZm9yRWFjaDpmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gdGhpcy5fKW4uY2FsbCh0aGlzLGYodCksdGhpcy5fW3RdKX19KSx0YS5uZXN0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LG8sYSl7aWYoYT49aS5sZW5ndGgpcmV0dXJuIHI/ci5jYWxsKHUsbyk6ZT9vLnNvcnQoZSk6bztmb3IodmFyIGMscyxmLGgsZz0tMSxwPW8ubGVuZ3RoLHY9aVthKytdLGQ9bmV3IGw7KytnPHA7KShoPWQuZ2V0KGM9dihzPW9bZ10pKSk/aC5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gdD8ocz10KCksZj1mdW5jdGlvbihlLHIpe3Muc2V0KGUsbih0LHIsYSkpfSk6KHM9e30sZj1mdW5jdGlvbihlLHIpe3NbZV09bih0LHIsYSl9KSxkLmZvckVhY2goZiksc31mdW5jdGlvbiB0KG4sZSl7aWYoZT49aS5sZW5ndGgpcmV0dXJuIG47dmFyIHI9W10sdT1vW2UrK107cmV0dXJuIG4uZm9yRWFjaChmdW5jdGlvbihuLHUpe3IucHVzaCh7a2V5Om4sdmFsdWVzOnQodSxlKX0pfSksdT9yLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gdShuLmtleSx0LmtleSl9KTpyfXZhciBlLHIsdT17fSxpPVtdLG89W107cmV0dXJuIHUubWFwPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oZSx0LDApfSx1LmVudHJpZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobih0YS5tYXAsZSwwKSwwKX0sdS5rZXk9ZnVuY3Rpb24obil7cmV0dXJuIGkucHVzaChuKSx1fSx1LnNvcnRLZXlzPWZ1bmN0aW9uKG4pe3JldHVybiBvW2kubGVuZ3RoLTFdPW4sdX0sdS5zb3J0VmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBlPW4sdX0sdS5yb2xsdXA9ZnVuY3Rpb24obil7cmV0dXJuIHI9bix1fSx1fSx0YS5zZXQ9ZnVuY3Rpb24obil7dmFyIHQ9bmV3IG07aWYobilmb3IodmFyIGU9MCxyPW4ubGVuZ3RoO3I+ZTsrK2UpdC5hZGQobltlXSk7cmV0dXJuIHR9LGMobSx7aGFzOmgsYWRkOmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKz0iIildPSEwLG59LHJlbW92ZTpnLHZhbHVlczpwLHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpKX19KSx0YS5iZWhhdmlvcj17fSx0YS5yZWJpbmQ9ZnVuY3Rpb24obix0KXtmb3IodmFyIGUscj0xLHU9YXJndW1lbnRzLmxlbmd0aDsrK3I8dTspbltlPWFyZ3VtZW50c1tyXV09TShuLHQsdFtlXSk7cmV0dXJuIG59O3ZhciBkYT1bIndlYmtpdCIsIm1zIiwibW96IiwiTW96IiwibyIsIk8iXTt0YS5kaXNwYXRjaD1mdW5jdGlvbigpe2Zvcih2YXIgbj1uZXcgXyx0PS0xLGU9YXJndW1lbnRzLmxlbmd0aDsrK3Q8ZTspblthcmd1bWVudHNbdF1dPXcobik7cmV0dXJuIG59LF8ucHJvdG90eXBlLm9uPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bi5pbmRleE9mKCIuIikscj0iIjtpZihlPj0wJiYocj1uLnNsaWNlKGUrMSksbj1uLnNsaWNlKDAsZSkpLG4pcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj90aGlzW25dLm9uKHIpOnRoaXNbbl0ub24ocix0KTtpZigyPT09YXJndW1lbnRzLmxlbmd0aCl7aWYobnVsbD09dClmb3IobiBpbiB0aGlzKXRoaXMuaGFzT3duUHJvcGVydHkobikmJnRoaXNbbl0ub24ocixudWxsKTtyZXR1cm4gdGhpc319LHRhLmV2ZW50PW51bGwsdGEucmVxdW90ZT1mdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKG1hLCJcXCQmIil9O3ZhciBtYT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2cseWE9e30uX19wcm90b19fP2Z1bmN0aW9uKG4sdCl7bi5fX3Byb3RvX189dH06ZnVuY3Rpb24obix0KXtmb3IodmFyIGUgaW4gdCluW2VdPXRbZV19LE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvcihuKX0seGE9ZnVuY3Rpb24obix0KXtyZXR1cm4gdC5xdWVyeVNlbGVjdG9yQWxsKG4pfSxiYT1mdW5jdGlvbihuLHQpe3ZhciBlPW4ubWF0Y2hlc3x8blt4KG4sIm1hdGNoZXNTZWxlY3RvciIpXTtyZXR1cm4oYmE9ZnVuY3Rpb24obix0KXtyZXR1cm4gZS5jYWxsKG4sdCl9KShuLHQpfTsiZnVuY3Rpb24iPT10eXBlb2YgU2l6emxlJiYoTWE9ZnVuY3Rpb24obix0KXtyZXR1cm4gU2l6emxlKG4sdClbMF18fG51bGx9LHhhPVNpenpsZSxiYT1TaXp6bGUubWF0Y2hlc1NlbGVjdG9yKSx0YS5zZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2VsZWN0KHVhLmRvY3VtZW50RWxlbWVudCl9O3ZhciBfYT10YS5zZWxlY3Rpb24ucHJvdG90eXBlPVtdO19hLnNlbGVjdD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpPVtdO249TihuKTtmb3IodmFyIG89LTEsYT10aGlzLmxlbmd0aDsrK288YTspe2kucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KHI9dGhpc1tvXSkucGFyZW50Tm9kZTtmb3IodmFyIGM9LTEsbD1yLmxlbmd0aDsrK2M8bDspKHU9cltjXSk/KHQucHVzaChlPW4uY2FsbCh1LHUuX19kYXRhX18sYyxvKSksZSYmIl9fZGF0YV9fImluIHUmJihlLl9fZGF0YV9fPXUuX19kYXRhX18pKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEoaSl9LF9hLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9W107bj1DKG4pO2Zvcih2YXIgdT0tMSxpPXRoaXMubGVuZ3RoOysrdTxpOylmb3IodmFyIG89dGhpc1t1XSxhPS0xLGM9by5sZW5ndGg7KythPGM7KShlPW9bYV0pJiYoci5wdXNoKHQ9cmEobi5jYWxsKGUsZS5fX2RhdGFfXyxhLHUpKSksdC5wYXJlbnROb2RlPWUpO3JldHVybiBBKHIpfTt2YXIgd2E9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIix4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O3RhLm5zPXtwcmVmaXg6d2EscXVhbGlmeTpmdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIjoiKSxlPW47cmV0dXJuIHQ+PTAmJihlPW4uc2xpY2UoMCx0KSxuPW4uc2xpY2UodCsxKSksd2EuaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOndhW2VdLGxvY2FsOm59Om59fSxfYS5hdHRyPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpO3JldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbi5sb2NhbD9lLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6ZS5nZXRBdHRyaWJ1dGUobil9Zm9yKHQgaW4gbil0aGlzLmVhY2goeih0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKHoobix0KSl9LF9hLmNsYXNzZWQ9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIGU9dGhpcy5ub2RlKCkscj0obj1UKG4pKS5sZW5ndGgsdT0tMTtpZih0PWUuY2xhc3NMaXN0KXtmb3IoOysrdTxyOylpZighdC5jb250YWlucyhuW3VdKSlyZXR1cm4hMX1lbHNlIGZvcih0PWUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOysrdTxyOylpZighTChuW3VdKS50ZXN0KHQpKXJldHVybiExO3JldHVybiEwfWZvcih0IGluIG4pdGhpcy5lYWNoKFIodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChSKG4sdCkpfSxfYS5zdHlsZT1mdW5jdGlvbihuLGUscil7dmFyIHU9YXJndW1lbnRzLmxlbmd0aDtpZigzPnUpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj51JiYoZT0iIik7Zm9yKHIgaW4gbil0aGlzLmVhY2goUChyLG5bcl0sZSkpO3JldHVybiB0aGlzfWlmKDI+dSl7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIHQoaSkuZ2V0Q29tcHV0ZWRTdHlsZShpLG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9cj0iIn1yZXR1cm4gdGhpcy5lYWNoKFAobixlLHIpKX0sX2EucHJvcGVydHk9ZnVuY3Rpb24obix0KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2lmKCJzdHJpbmciPT10eXBlb2YgbilyZXR1cm4gdGhpcy5ub2RlKClbbl07Zm9yKHQgaW4gbil0aGlzLmVhY2goVSh0LG5bdF0pKTtyZXR1cm4gdGhpc31yZXR1cm4gdGhpcy5lYWNoKFUobix0KSl9LF9hLnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKCl7dmFyIHQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PSIifTpmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9bn0pOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxfYS5odG1sPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PXQ/IiI6dH06bnVsbD09bj9mdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPSIifTpmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPW59KTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LF9hLmFwcGVuZD1mdW5jdGlvbihuKXtyZXR1cm4gbj1qKG4pLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LF9hLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBuPWoobiksdD1OKHQpLHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxfYS5yZW1vdmU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKEYpfSxfYS5kYXRhPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByLHUsaSxvPW4ubGVuZ3RoLGY9ZS5sZW5ndGgsaD1NYXRoLm1pbihvLGYpLGc9bmV3IEFycmF5KGYpLHA9bmV3IEFycmF5KGYpLHY9bmV3IEFycmF5KG8pO2lmKHQpe3ZhciBkLG09bmV3IGwseT1uZXcgQXJyYXkobyk7Zm9yKHI9LTE7KytyPG87KW0uaGFzKGQ9dC5jYWxsKHU9bltyXSx1Ll9fZGF0YV9fLHIpKT92W3JdPXU6bS5zZXQoZCx1KSx5W3JdPWQ7Zm9yKHI9LTE7KytyPGY7KSh1PW0uZ2V0KGQ9dC5jYWxsKGUsaT1lW3JdLHIpKSk/dSE9PSEwJiYoZ1tyXT11LHUuX19kYXRhX189aSk6cFtyXT1IKGkpLG0uc2V0KGQsITApO2ZvcihyPS0xOysrcjxvOyltLmdldCh5W3JdKSE9PSEwJiYodltyXT1uW3JdKX1lbHNle2ZvcihyPS0xOysrcjxoOyl1PW5bcl0saT1lW3JdLHU/KHUuX19kYXRhX189aSxnW3JdPXUpOnBbcl09SChpKTtmb3IoO2Y+cjsrK3IpcFtyXT1IKGVbcl0pO2Zvcig7bz5yOysrcil2W3JdPW5bcl19cC51cGRhdGU9ZyxwLnBhcmVudE5vZGU9Zy5wYXJlbnROb2RlPXYucGFyZW50Tm9kZT1uLnBhcmVudE5vZGUsYS5wdXNoKHApLGMucHVzaChnKSxzLnB1c2godil9dmFyIHIsdSxpPS0xLG89dGhpcy5sZW5ndGg7aWYoIWFyZ3VtZW50cy5sZW5ndGgpe2ZvcihuPW5ldyBBcnJheShvPShyPXRoaXNbMF0pLmxlbmd0aCk7KytpPG87KSh1PXJbaV0pJiYobltpXT11Ll9fZGF0YV9fKTtyZXR1cm4gbn12YXIgYT1aKFtdKSxjPUEoW10pLHM9QShbXSk7aWYoImZ1bmN0aW9uIj09dHlwZW9mIG4pZm9yKDsrK2k8bzspZShyPXRoaXNbaV0sbi5jYWxsKHIsci5wYXJlbnROb2RlLl9fZGF0YV9fLGkpKTtlbHNlIGZvcig7KytpPG87KWUocj10aGlzW2ldLG4pO3JldHVybiBjLmVudGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGF9LGMuZXhpdD1mdW5jdGlvbigpe3JldHVybiBzfSxjfSxfYS5kYXR1bT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsbik6dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iKX0sX2EuZmlsdGVyPWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PVtdOyJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj1PKG4pKTtmb3IodmFyIGk9MCxvPXRoaXMubGVuZ3RoO28+aTtpKyspe3UucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9KGU9dGhpc1tpXSkucGFyZW50Tm9kZTtmb3IodmFyIGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBBKHUpfSxfYS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgbj0tMSx0PXRoaXMubGVuZ3RoOysrbjx0Oylmb3IodmFyIGUscj10aGlzW25dLHU9ci5sZW5ndGgtMSxpPXJbdV07LS11Pj0wOykoZT1yW3VdKSYmKGkmJmkhPT1lLm5leHRTaWJsaW5nJiZpLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsaSksaT1lKTtyZXR1cm4gdGhpc30sX2Euc29ydD1mdW5jdGlvbihuKXtuPUkuYXBwbHkodGhpcyxhcmd1bWVudHMpO2Zvcih2YXIgdD0tMSxlPXRoaXMubGVuZ3RoOysrdDxlOyl0aGlzW3RdLnNvcnQobik7cmV0dXJuIHRoaXMub3JkZXIoKX0sX2EuZWFjaD1mdW5jdGlvbihuKXtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKHQsZSxyKXtuLmNhbGwodCx0Ll9fZGF0YV9fLGUscil9KX0sX2EuY2FsbD1mdW5jdGlvbihuKXt2YXIgdD1yYShhcmd1bWVudHMpO3JldHVybiBuLmFwcGx5KHRbMF09dGhpcyx0KSx0aGlzfSxfYS5lbXB0eT1mdW5jdGlvbigpe3JldHVybiF0aGlzLm5vZGUoKX0sX2Eubm9kZT1mdW5jdGlvbigpe2Zvcih2YXIgbj0wLHQ9dGhpcy5sZW5ndGg7dD5uO24rKylmb3IodmFyIGU9dGhpc1tuXSxyPTAsdT1lLmxlbmd0aDt1PnI7cisrKXt2YXIgaT1lW3JdO2lmKGkpcmV0dXJuIGl9cmV0dXJuIG51bGx9LF9hLnNpemU9ZnVuY3Rpb24oKXt2YXIgbj0wO3JldHVybiBZKHRoaXMsZnVuY3Rpb24oKXsrK259KSxufTt2YXIgU2E9W107dGEuc2VsZWN0aW9uLmVudGVyPVosdGEuc2VsZWN0aW9uLmVudGVyLnByb3RvdHlwZT1TYSxTYS5hcHBlbmQ9X2EuYXBwZW5kLFNhLmVtcHR5PV9hLmVtcHR5LFNhLm5vZGU9X2Eubm9kZSxTYS5jYWxsPV9hLmNhbGwsU2Euc2l6ZT1fYS5zaXplLFNhLnNlbGVjdD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvPVtdLGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe3I9KHU9dGhpc1thXSkudXBkYXRlLG8ucHVzaCh0PVtdKSx0LnBhcmVudE5vZGU9dS5wYXJlbnROb2RlO2Zvcih2YXIgbD0tMSxzPXUubGVuZ3RoOysrbDxzOykoaT11W2xdKT8odC5wdXNoKHJbbF09ZT1uLmNhbGwodS5wYXJlbnROb2RlLGkuX19kYXRhX18sbCxhKSksZS5fX2RhdGFfXz1pLl9fZGF0YV9fKTp0LnB1c2gobnVsbCl9cmV0dXJuIEEobyl9LFNhLmluc2VydD1mdW5jdGlvbihuLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PVYodGhpcykpLF9hLmluc2VydC5jYWxsKHRoaXMsbix0KX0sdGEuc2VsZWN0PWZ1bmN0aW9uKHQpe3ZhciBlO3JldHVybiJzdHJpbmciPT10eXBlb2YgdD8oZT1bTWEodCx1YSldLGUucGFyZW50Tm9kZT11YS5kb2N1bWVudEVsZW1lbnQpOihlPVt0XSxlLnBhcmVudE5vZGU9bih0KSksQShbZV0pfSx0YS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQ7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBuPyh0PXJhKHhhKG4sdWEpKSx0LnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KToodD1uLHQucGFyZW50Tm9kZT1udWxsKSxBKFt0XSl9LF9hLm9uPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO2lmKDM+cil7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPnImJih0PSExKTtmb3IoZSBpbiBuKXRoaXMuZWFjaChYKGUsbltlXSx0KSk7cmV0dXJuIHRoaXN9aWYoMj5yKXJldHVybihyPXRoaXMubm9kZSgpWyJfX29uIituXSkmJnIuXztlPSExfXJldHVybiB0aGlzLmVhY2goWChuLHQsZSkpfTt2YXIga2E9dGEubWFwKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pO3VhJiZrYS5mb3JFYWNoKGZ1bmN0aW9uKG4peyJvbiIrbiBpbiB1YSYma2EucmVtb3ZlKG4pfSk7dmFyIEVhLEFhPTA7dGEubW91c2U9ZnVuY3Rpb24obil7cmV0dXJuIEoobixrKCkpfTt2YXIgTmE9dGhpcy5uYXZpZ2F0b3ImJi9XZWJLaXQvLnRlc3QodGhpcy5uYXZpZ2F0b3IudXNlckFnZW50KT8tMTowO3RhLnRvdWNoPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPXQsdD1rKCkuY2hhbmdlZFRvdWNoZXMpLHQpZm9yKHZhciByLHU9MCxpPXQubGVuZ3RoO2k+dTsrK3UpaWYoKHI9dFt1XSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIEoobixyKX0sdGEuYmVoYXZpb3IuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt0aGlzLm9uKCJtb3VzZWRvd24uZHJhZyIsaSkub24oInRvdWNoc3RhcnQuZHJhZyIsbyl9ZnVuY3Rpb24gZShuLHQsZSxpLG8pe3JldHVybiBmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt2YXIgbixlLHI9dChoLHYpO3ImJihuPXJbMF0tTVswXSxlPXJbMV0tTVsxXSxwfD1ufGUsTT1yLGcoe3R5cGU6ImRyYWciLHg6clswXStsWzBdLHk6clsxXStsWzFdLGR4Om4sZHk6ZX0pKX1mdW5jdGlvbiBjKCl7dChoLHYpJiYobS5vbihpK2QsbnVsbCkub24obytkLG51bGwpLHkocCYmdGEuZXZlbnQudGFyZ2V0PT09ZiksZyh7dHlwZToiZHJhZ2VuZCJ9KSl9dmFyIGwscz10aGlzLGY9dGEuZXZlbnQudGFyZ2V0LGg9cy5wYXJlbnROb2RlLGc9ci5vZihzLGFyZ3VtZW50cykscD0wLHY9bigpLGQ9Ii5kcmFnIisobnVsbD09dj8iIjoiLSIrdiksbT10YS5zZWxlY3QoZShmKSkub24oaStkLGEpLm9uKG8rZCxjKSx5PVcoZiksTT10KGgsdik7dT8obD11LmFwcGx5KHMsYXJndW1lbnRzKSxsPVtsLngtTVswXSxsLnktTVsxXV0pOmw9WzAsMF0sZyh7dHlwZToiZHJhZ3N0YXJ0In0pfX12YXIgcj1FKG4sImRyYWciLCJkcmFnc3RhcnQiLCJkcmFnZW5kIiksdT1udWxsLGk9ZShiLHRhLm1vdXNlLHQsIm1vdXNlbW92ZSIsIm1vdXNldXAiKSxvPWUoRyx0YS50b3VjaCx5LCJ0b3VjaG1vdmUiLCJ0b3VjaGVuZCIpO3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LHRhLnJlYmluZChuLHIsIm9uIil9LHRhLnRvdWNoZXM9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1rKCkudG91Y2hlcyksdD9yYSh0KS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9SihuLHQpO3JldHVybiBlLmlkZW50aWZpZXI9dC5pZGVudGlmaWVyLGV9KTpbXX07dmFyIENhPTFlLTYsemE9Q2EqQ2EscWE9TWF0aC5QSSxMYT0yKnFhLFRhPUxhLUNhLFJhPXFhLzIsRGE9cWEvMTgwLFBhPTE4MC9xYSxVYT1NYXRoLlNRUlQyLGphPTIsRmE9NDt0YS5pbnRlcnBvbGF0ZVpvb209ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4pe3ZhciB0PW4qeTtpZihtKXt2YXIgZT1ydCh2KSxvPWkvKGphKmgpKihlKnV0KFVhKnQrdiktZXQodikpO3JldHVybltyK28qbCx1K28qcyxpKmUvcnQoVWEqdCt2KV19cmV0dXJuW3IrbipsLHUrbipzLGkqTWF0aC5leHAoVWEqdCldfXZhciByPW5bMF0sdT1uWzFdLGk9blsyXSxvPXRbMF0sYT10WzFdLGM9dFsyXSxsPW8tcixzPWEtdSxmPWwqbCtzKnMsaD1NYXRoLnNxcnQoZiksZz0oYypjLWkqaStGYSpmKS8oMippKmphKmgpLHA9KGMqYy1pKmktRmEqZikvKDIqYypqYSpoKSx2PU1hdGgubG9nKE1hdGguc3FydChnKmcrMSktZyksZD1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLG09ZC12LHk9KG18fE1hdGgubG9nKGMvaSkpL1VhO3JldHVybiBlLmR1cmF0aW9uPTFlMyp5LGV9LHRhLmJlaGF2aW9yLnpvb209ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24ub24ocSxmKS5vbihPYSsiLnpvb20iLGcpLm9uKCJkYmxjbGljay56b29tIixwKS5vbihSLGgpfWZ1bmN0aW9uIGUobil7cmV0dXJuWyhuWzBdLWsueCkvay5rLChuWzFdLWsueSkvay5rXX1mdW5jdGlvbiByKG4pe3JldHVybltuWzBdKmsuaytrLngsblsxXSprLmsray55XX1mdW5jdGlvbiB1KG4pe2suaz1NYXRoLm1heChOWzBdLE1hdGgubWluKE5bMV0sbikpfWZ1bmN0aW9uIGkobix0KXt0PXIodCksay54Kz1uWzBdLXRbMF0say55Kz1uWzFdLXRbMV19ZnVuY3Rpb24gbyh0LGUscixvKXt0Ll9fY2hhcnRfXz17eDprLngseTprLnksazprLmt9LHUoTWF0aC5wb3coMixvKSksaShkPWUsciksdD10YS5zZWxlY3QodCksQz4wJiYodD10LnRyYW5zaXRpb24oKS5kdXJhdGlvbihDKSksdC5jYWxsKG4uZXZlbnQpfWZ1bmN0aW9uIGEoKXtiJiZiLmRvbWFpbih4LnJhbmdlKCkubWFwKGZ1bmN0aW9uKG4pe3JldHVybihuLWsueCkvay5rfSkubWFwKHguaW52ZXJ0KSksdyYmdy5kb21haW4oXy5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLnkpL2sua30pLm1hcChfLmludmVydCkpfWZ1bmN0aW9uIGMobil7eisrfHxuKHt0eXBlOiJ6b29tc3RhcnQifSl9ZnVuY3Rpb24gbChuKXthKCksbih7dHlwZToiem9vbSIsc2NhbGU6ay5rLHRyYW5zbGF0ZTpbay54LGsueV19KX1mdW5jdGlvbiBzKG4pey0tenx8bih7dHlwZToiem9vbWVuZCJ9KSxkPW51bGx9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtmPTEsaSh0YS5tb3VzZSh1KSxnKSxsKGEpfWZ1bmN0aW9uIHIoKXtoLm9uKEwsbnVsbCkub24oVCxudWxsKSxwKGYmJnRhLmV2ZW50LnRhcmdldD09PW8pLHMoYSl9dmFyIHU9dGhpcyxvPXRhLmV2ZW50LnRhcmdldCxhPUQub2YodSxhcmd1bWVudHMpLGY9MCxoPXRhLnNlbGVjdCh0KHUpKS5vbihMLG4pLm9uKFQsciksZz1lKHRhLm1vdXNlKHUpKSxwPVcodSk7RGwuY2FsbCh1KSxjKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49dGEudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9dGEuZXZlbnQudGFyZ2V0O3RhLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsYSksXy5wdXNoKHQpO2Zvcih2YXIgZT10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBjPW4oKSxsPURhdGUubm93KCk7aWYoMT09PWMubGVuZ3RoKXtpZig1MDA+bC1NKXt2YXIgcz1jWzBdO28ocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWx9ZWxzZSBpZihjLmxlbmd0aD4xKXt2YXIgcz1jWzBdLGY9Y1sxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixvPXRhLnRvdWNoZXMocCk7RGwuY2FsbChwKTtmb3IodmFyIGE9MCxjPW8ubGVuZ3RoO2M+YTsrK2Escj1udWxsKWlmKGU9b1thXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksbCh2KX1mdW5jdGlvbiBhKCl7aWYodGEuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfXRhLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24ocSxmKS5vbihSLGgpLEUoKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PXRhLnNlbGVjdChwKSxFPVcocCk7dCgpLGModiksdy5vbihxLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOih2PWUoZD1tfHx0YS5tb3VzZSh0aGlzKSksRGwuY2FsbCh0aGlzKSxjKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipIYSgpKSprLmspLGkoZCx2KSxsKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj10YS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLG4sZShuKSx0YS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sTj1JYSxDPTI1MCx6PTAscT0ibW91c2Vkb3duLnpvb20iLEw9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1FKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIE9hfHwoT2E9Im9ud2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooSGE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxjKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1BWzBdLHI9QVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sbChuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGMobiksbChuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxhKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPW51bGw9PXQ/SWE6Wyt0WzBdLCt0WzFdXSxuKTpOfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10JiZbK3RbMF0sK3RbMV1dLG4pOkF9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sdGEucmViaW5kKG4sRCwib24iKX07dmFyIEhhLE9hLElhPVswLDEvMF07dGEuY29sb3I9b3Qsb3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHRhLmhzbD1hdDt2YXIgWWE9YXQucHJvdG90eXBlPW5ldyBvdDtZYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxZYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sWWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdGEuaGNsPWx0O3ZhciBaYT1sdC5wcm90b3R5cGU9bmV3IG90O1phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1ZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sWmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1WYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLnJnYj1mdW5jdGlvbigpe3JldHVybiBzdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHRhLmxhYj1mdDt2YXIgVmE9MTgsWGE9Ljk1MDQ3LCRhPTEsQmE9MS4wODg4MyxXYT1mdC5wcm90b3R5cGU9bmV3IG90O1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sV2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBodCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHRhLnJnYj1tdDt2YXIgSmE9bXQucHJvdG90eXBlPW5ldyBvdDtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IG10KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG10KHUsdSx1KX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbXQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxKYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxKYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyIEdhPXRhLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7R2EuZm9yRWFjaChmdW5jdGlvbihuLHQpe0dhLnNldChuLHl0KHQpKX0pLHRhLmZ1bmN0b3I9RXQsdGEueGhyPUF0KHkpLHRhLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPU50KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LHRhLmNzdj10YS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHRhLnRzdj10YS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEthLFFhLG5jLHRjLGVjLHJjPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07UWE/UWEubj1pOkthPWksUWE9aSxuY3x8KHRjPWNsZWFyVGltZW91dCh0YyksbmM9MSxyYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciB1Yz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksdWNbOCtlLzNdfTt2YXIgaWM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLG9jPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGFjPXRhLnRpbWU9e30sY2M9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2xjLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2xjLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2xjLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2xjLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgbGM9RGF0ZS5wcm90b3R5cGU7YWMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxhYy55ZWFycz1hYy55ZWFyLnJhbmdlLGFjLnllYXJzLnV0Yz1hYy55ZWFyLnV0Yy5yYW5nZSxhYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGNjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxhYy5kYXlzPWFjLmRheS5yYW5nZSxhYy5kYXlzLnV0Yz1hYy5kYXkudXRjLnJhbmdlLGFjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1hYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWFjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWFjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1hYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChhYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2FjW24rInMiXT1lLnJhbmdlLGFjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsYWNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGFjLndlZWs9YWMuc3VuZGF5LGFjLndlZWtzPWFjLnN1bmRheS5yYW5nZSxhYy53ZWVrcy51dGM9YWMuc3VuZGF5LnV0Yy5yYW5nZSxhYy53ZWVrT2ZZZWFyPWFjLnN1bmRheU9mWWVhcjt2YXIgc2M9eyItIjoiIixfOiIgIiwwOiIwIn0sZmM9L15ccypcZCsvLGhjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBnYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1nYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQscGMpLGxlKHBjLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXBjLnQ6dGhpcy5zPXBjLnQNCn0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIHBjPW5ldyBjZTt0YS5nZW8uc3RyZWFtPWZ1bmN0aW9uKG4sdCl7biYmdmMuaGFzT3duUHJvcGVydHkobi50eXBlKT92Y1tuLnR5cGVdKG4sdCk6c2Uobix0KX07dmFyIHZjPXtGZWF0dXJlOmZ1bmN0aW9uKG4sdCl7c2Uobi5nZW9tZXRyeSx0KX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5mZWF0dXJlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0uZ2VvbWV0cnksdCl9fSxkYz17U3BoZXJlOmZ1bmN0aW9uKG4sdCl7dC5zcGhlcmUoKX0sUG9pbnQ6ZnVuY3Rpb24obix0KXtuPW4uY29vcmRpbmF0ZXMsdC5wb2ludChuWzBdLG5bMV0sblsyXSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KW49ZVtyXSx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTGluZVN0cmluZzpmdW5jdGlvbihuLHQpe2ZlKG4uY29vcmRpbmF0ZXMsdCwwKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uY29vcmRpbmF0ZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylmZShlW3JdLHQsMCl9LFBvbHlnb246ZnVuY3Rpb24obix0KXtoZShuLmNvb3JkaW5hdGVzLHQpfSxNdWx0aVBvbHlnb246ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWhlKGVbcl0sdCl9LEdlb21ldHJ5Q29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmdlb21ldHJpZXMscj0tMSx1PWUubGVuZ3RoOysrcjx1OylzZShlW3JdLHQpfX07dGEuZ2VvLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIG1jPTAsdGEuZ2VvLnN0cmVhbShuLE1jKSxtY307dmFyIG1jLHljPW5ldyBjZSxNYz17c3BoZXJlOmZ1bmN0aW9uKCl7bWMrPTQqcWF9LHBvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3ljLnJlc2V0KCksTWMubGluZVN0YXJ0PWdlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49Mip5YzttYys9MD5uPzQqcWErbjpuLE1jLmxpbmVTdGFydD1NYy5saW5lRW5kPU1jLnBvaW50PWJ9fTt0YS5nZW8uYm91bmRzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe00ucHVzaCh4PVtzPW4saD1uXSksZj50JiYoZj10KSx0PmcmJihnPXQpfWZ1bmN0aW9uIHQodCxlKXt2YXIgcj1wZShbdCpEYSxlKkRhXSk7aWYobSl7dmFyIHU9ZGUobSxyKSxpPVt1WzFdLC11WzBdLDBdLG89ZGUoaSx1KTtNZShvKSxvPXhlKG8pO3ZhciBjPXQtcCxsPWM+MD8xOi0xLHY9b1swXSpQYSpsLGQ9Z2EoYyk+MTgwO2lmKGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PW9bMV0qUGE7eT5nJiYoZz15KX1lbHNlIGlmKHY9KHYrMzYwKSUzNjAtMTgwLGReKHY+bCpwJiZsKnQ+dikpe3ZhciB5PS1vWzFdKlBhO2Y+eSYmKGY9eSl9ZWxzZSBmPmUmJihmPWUpLGU+ZyYmKGc9ZSk7ZD9wPnQ/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCk6aD49cz8ocz50JiYocz10KSx0PmgmJihoPXQpKTp0PnA/YShzLHQpPmEocyxoKSYmKGg9dCk6YSh0LGgpPmEocyxoKSYmKHM9dCl9ZWxzZSBuKHQsZSk7bT1yLHA9dH1mdW5jdGlvbiBlKCl7Yi5wb2ludD10fWZ1bmN0aW9uIHIoKXt4WzBdPXMseFsxXT1oLGIucG9pbnQ9bixtPW51bGx9ZnVuY3Rpb24gdShuLGUpe2lmKG0pe3ZhciByPW4tcDt5Kz1nYShyKT4xODA/cisocj4wPzM2MDotMzYwKTpyfWVsc2Ugdj1uLGQ9ZTtNYy5wb2ludChuLGUpLHQobixlKX1mdW5jdGlvbiBpKCl7TWMubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbygpe3UodixkKSxNYy5saW5lRW5kKCksZ2EoeSk+Q2EmJihzPS0oaD0xODApKSx4WzBdPXMseFsxXT1oLG09bnVsbH1mdW5jdGlvbiBhKG4sdCl7cmV0dXJuKHQtPW4pPDA/dCszNjA6dH1mdW5jdGlvbiBjKG4sdCl7cmV0dXJuIG5bMF0tdFswXX1mdW5jdGlvbiBsKG4sdCl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgcyxmLGgsZyxwLHYsZCxtLHksTSx4LGI9e3BvaW50Om4sbGluZVN0YXJ0OmUsbGluZUVuZDpyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1pLGIubGluZUVuZD1vLHk9MCxNYy5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe01jLnBvbHlnb25FbmQoKSxiLnBvaW50PW4sYi5saW5lU3RhcnQ9ZSxiLmxpbmVFbmQ9ciwwPnljPyhzPS0oaD0xODApLGY9LShnPTkwKSk6eT5DYT9nPTkwOi1DYT55JiYoZj0tOTApLHhbMF09cyx4WzFdPWh9fTtyZXR1cm4gZnVuY3Rpb24obil7Zz1oPS0ocz1mPTEvMCksTT1bXSx0YS5nZW8uc3RyZWFtKG4sYik7dmFyIHQ9TS5sZW5ndGg7aWYodCl7TS5zb3J0KGMpO2Zvcih2YXIgZSxyPTEsdT1NWzBdLGk9W3VdO3Q+cjsrK3IpZT1NW3JdLGwoZVswXSx1KXx8bChlWzFdLHUpPyhhKHVbMF0sZVsxXSk+YSh1WzBdLHVbMV0pJiYodVsxXT1lWzFdKSxhKGVbMF0sdVsxXSk+YSh1WzBdLHVbMV0pJiYodVswXT1lWzBdKSk6aS5wdXNoKHU9ZSk7Zm9yKHZhciBvLGUscD0tMS8wLHQ9aS5sZW5ndGgtMSxyPTAsdT1pW3RdO3Q+PXI7dT1lLCsrcillPWlbcl0sKG89YSh1WzFdLGVbMF0pKT5wJiYocD1vLHM9ZVswXSxoPXVbMV0pfXJldHVybiBNPXg9bnVsbCwxLzA9PT1zfHwxLzA9PT1mP1tbMC8wLDAvMF0sWzAvMCwwLzBdXTpbW3MsZl0sW2gsZ11dfX0oKSx0YS5nZW8uY2VudHJvaWQ9ZnVuY3Rpb24obil7eGM9YmM9X2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4scWMpO3ZhciB0PU5jLGU9Q2Mscj16Yyx1PXQqdCtlKmUrcipyO3JldHVybiB6YT51JiYodD1rYyxlPUVjLHI9QWMsQ2E+YmMmJih0PV9jLGU9d2Mscj1TYyksdT10KnQrZSplK3Iqcix6YT51KT9bMC8wLDAvMF06W01hdGguYXRhbjIoZSx0KSpQYSx0dChyL01hdGguc3FydCh1KSkqUGFdfTt2YXIgeGMsYmMsX2Msd2MsU2Msa2MsRWMsQWMsTmMsQ2MsemMscWM9e3NwaGVyZTpiLHBvaW50Ol9lLGxpbmVTdGFydDpTZSxsaW5lRW5kOmtlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1FZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3FjLmxpbmVTdGFydD1TZX19LExjPUxlKE5lLFBlLGplLFstcWEsLXFhLzJdKSxUYz0xZTk7dGEuZ2VvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgbix0LGUscix1LGksbz17c3RyZWFtOmZ1bmN0aW9uKG4pe3JldHVybiB1JiYodS52YWxpZD0hMSksdT1pKG4pLHUudmFsaWQ9ITAsdX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUllKG49K2FbMF1bMF0sdD0rYVswXVsxXSxlPSthWzFdWzBdLHI9K2FbMV1bMV0pLHUmJih1LnZhbGlkPSExLHU9bnVsbCksbyk6W1tuLHRdLFtlLHJdXX19O3JldHVybiBvLmV4dGVudChbWzAsMF0sWzk2MCw1MDBdXSl9LCh0YS5nZW8uY29uaWNFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoWmUpfSkucmF3PVplLHRhLmdlby5hbGJlcnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCl9LHRhLmdlby5hbGJlcnNVc2E9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3ZhciBpPW5bMF0sbz1uWzFdO3JldHVybiB0PW51bGwsZShpLG8pLHR8fChyKGksbyksdCl8fHUoaSxvKSx0fXZhciB0LGUscix1LGk9dGEuZ2VvLmFsYmVycygpLG89dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxhPXRhLmdlby5jb25pY0VxdWFsQXJlYSgpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbihuLGUpe3Q9W24sZV19fTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24obil7dmFyIHQ9aS5zY2FsZSgpLGU9aS50cmFuc2xhdGUoKSxyPShuWzBdLWVbMF0pL3QsdT0oblsxXS1lWzFdKS90O3JldHVybih1Pj0uMTImJi4yMzQ+dSYmcj49LS40MjUmJi0uMjE0PnI/bzp1Pj0uMTY2JiYuMjM0PnUmJnI+PS0uMjE0JiYtLjExNT5yP2E6aSkuaW52ZXJ0KG4pfSxuLnN0cmVhbT1mdW5jdGlvbihuKXt2YXIgdD1pLnN0cmVhbShuKSxlPW8uc3RyZWFtKG4pLHI9YS5zdHJlYW0obik7cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sdSl7dC5wb2ludChuLHUpLGUucG9pbnQobix1KSxyLnBvaW50KG4sdSl9LHNwaGVyZTpmdW5jdGlvbigpe3Quc3BoZXJlKCksZS5zcGhlcmUoKSxyLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGUubGluZVN0YXJ0KCksci5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGUubGluZUVuZCgpLHIubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLGUucG9seWdvblN0YXJ0KCksci5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3QucG9seWdvbkVuZCgpLGUucG9seWdvbkVuZCgpLHIucG9seWdvbkVuZCgpfX19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnByZWNpc2lvbih0KSxvLnByZWNpc2lvbih0KSxhLnByZWNpc2lvbih0KSxuKTppLnByZWNpc2lvbigpfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpLnNjYWxlKHQpLG8uc2NhbGUoLjM1KnQpLGEuc2NhbGUodCksbi50cmFuc2xhdGUoaS50cmFuc2xhdGUoKSkpOmkuc2NhbGUoKX0sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGkudHJhbnNsYXRlKCk7dmFyIGw9aS5zY2FsZSgpLHM9K3RbMF0sZj0rdFsxXTtyZXR1cm4gZT1pLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbcy0uNDU1KmwsZi0uMjM4KmxdLFtzKy40NTUqbCxmKy4yMzgqbF1dKS5zdHJlYW0oYykucG9pbnQscj1vLnRyYW5zbGF0ZShbcy0uMzA3KmwsZisuMjAxKmxdKS5jbGlwRXh0ZW50KFtbcy0uNDI1KmwrQ2EsZisuMTIqbCtDYV0sW3MtLjIxNCpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCx1PWEudHJhbnNsYXRlKFtzLS4yMDUqbCxmKy4yMTIqbF0pLmNsaXBFeHRlbnQoW1tzLS4yMTQqbCtDYSxmKy4xNjYqbCtDYV0sW3MtLjExNSpsLUNhLGYrLjIzNCpsLUNhXV0pLnN0cmVhbShjKS5wb2ludCxufSxuLnNjYWxlKDEwNzApfTt2YXIgUmMsRGMsUGMsVWMsamMsRmMsSGM9e3BvaW50OmIsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0RjPTAsSGMubGluZVN0YXJ0PVZlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SGMubGluZVN0YXJ0PUhjLmxpbmVFbmQ9SGMucG9pbnQ9YixSYys9Z2EoRGMvMil9fSxPYz17cG9pbnQ6WGUsbGluZVN0YXJ0OmIsbGluZUVuZDpiLHBvbHlnb25TdGFydDpiLHBvbHlnb25FbmQ6Yn0sSWM9e3BvaW50OldlLGxpbmVTdGFydDpKZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0ljLmxpbmVTdGFydD1LZX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0ljLnBvaW50PVdlLEljLmxpbmVTdGFydD1KZSxJYy5saW5lRW5kPUdlfX07dGEuZ2VvLnBhdGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe3JldHVybiBuJiYoImZ1bmN0aW9uIj09dHlwZW9mIGEmJmkucG9pbnRSYWRpdXMoK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxvJiZvLnZhbGlkfHwobz11KGkpKSx0YS5nZW8uc3RyZWFtKG4sbykpLGkucmVzdWx0KCl9ZnVuY3Rpb24gdCgpe3JldHVybiBvPW51bGwsbn12YXIgZSxyLHUsaSxvLGE9NC41O3JldHVybiBuLmFyZWE9ZnVuY3Rpb24obil7cmV0dXJuIFJjPTAsdGEuZ2VvLnN0cmVhbShuLHUoSGMpKSxSY30sbi5jZW50cm9pZD1mdW5jdGlvbihuKXtyZXR1cm4gX2M9d2M9U2M9a2M9RWM9QWM9TmM9Q2M9emM9MCx0YS5nZW8uc3RyZWFtKG4sdShJYykpLHpjP1tOYy96YyxDYy96Y106QWM/W2tjL0FjLEVjL0FjXTpTYz9bX2MvU2Msd2MvU2NdOlswLzAsMC8wXX0sbi5ib3VuZHM9ZnVuY3Rpb24obil7cmV0dXJuIGpjPUZjPS0oUGM9VWM9MS8wKSx0YS5nZW8uc3RyZWFtKG4sdShPYykpLFtbUGMsVWNdLFtqYyxGY11dfSxuLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9KGU9bik/bi5zdHJlYW18fHRyKG4pOnksdCgpKTplfSxuLmNvbnRleHQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09KHI9bik/bmV3ICRlOm5ldyBRZShuKSwiZnVuY3Rpb24iIT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cyhhKSx0KCkpOnJ9LG4ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLG4pOmF9LG4ucHJvamVjdGlvbih0YS5nZW8uYWxiZXJzVXNhKCkpLmNvbnRleHQobnVsbCl9LHRhLmdlby50cmFuc2Zvcm09ZnVuY3Rpb24obil7cmV0dXJue3N0cmVhbTpmdW5jdGlvbih0KXt2YXIgZT1uZXcgZXIodCk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfX19LGVyLnByb3RvdHlwZT17cG9pbnQ6ZnVuY3Rpb24obix0KXt0aGlzLnN0cmVhbS5wb2ludChuLHQpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX0sdGEuZ2VvLnByb2plY3Rpb249dXIsdGEuZ2VvLnByb2plY3Rpb25NdXRhdG9yPWlyLCh0YS5nZW8uZXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKGFyKX0pLnJhdz1hci5pbnZlcnQ9YXIsdGEuZ2VvLnJvdGF0aW9uPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQ9bih0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9cmV0dXJuIG49bHIoblswXSUzNjAqRGEsblsxXSpEYSxuLmxlbmd0aD4yP25bMl0qRGE6MCksdC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bi5pbnZlcnQodFswXSpEYSx0WzFdKkRhKSx0WzBdKj1QYSx0WzFdKj1QYSx0fSx0fSxjci5pbnZlcnQ9YXIsdGEuZ2VvLmNpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyLHQ9bHIoLW5bMF0qRGEsLW5bMV0qRGEsMCkuaW52ZXJ0LHU9W107cmV0dXJuIGUobnVsbCxudWxsLDEse3BvaW50OmZ1bmN0aW9uKG4sZSl7dS5wdXNoKG49dChuLGUpKSxuWzBdKj1QYSxuWzFdKj1QYX19KSx7dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3VdfX12YXIgdCxlLHI9WzAsMF0sdT02O3JldHVybiBuLm9yaWdpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uYW5nbGU9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IoKHQ9K3IpKkRhLHUqRGEpLG4pOnR9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWdyKHQqRGEsKHU9K3IpKkRhKSxuKTp1fSxuLmFuZ2xlKDkwKX0sdGEuZ2VvLmRpc3RhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUscj0odFswXS1uWzBdKSpEYSx1PW5bMV0qRGEsaT10WzFdKkRhLG89TWF0aC5zaW4ociksYT1NYXRoLmNvcyhyKSxjPU1hdGguc2luKHUpLGw9TWF0aC5jb3ModSkscz1NYXRoLnNpbihpKSxmPU1hdGguY29zKGkpO3JldHVybiBNYXRoLmF0YW4yKE1hdGguc3FydCgoZT1mKm8pKmUrKGU9bCpzLWMqZiphKSplKSxjKnMrbCpmKmEpfSx0YS5nZW8uZ3JhdGljdWxlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnQoKX19ZnVuY3Rpb24gdCgpe3JldHVybiB0YS5yYW5nZShNYXRoLmNlaWwoaS9kKSpkLHUsZCkubWFwKGgpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwobC9tKSptLGMsbSkubWFwKGcpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKHIvcCkqcCxlLHApLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVkKT5DYX0pLm1hcChzKSkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChhL3YpKnYsbyx2KS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIGdhKG4lbSk+Q2F9KS5tYXAoZikpfXZhciBlLHIsdSxpLG8sYSxjLGwscyxmLGgsZyxwPTEwLHY9cCxkPTkwLG09MzYwLHk9Mi41O3JldHVybiBuLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOm59fSl9LG4ub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChpKS5jb25jYXQoZyhjKS5zbGljZSgxKSxoKHUpLnJldmVyc2UoKS5zbGljZSgxKSxnKGwpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvckV4dGVudCh0KS5taW5vckV4dGVudCh0KTpuLm1pbm9yRXh0ZW50KCl9LG4ubWFqb3JFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3RbMF1bMF0sdT0rdFsxXVswXSxsPSt0WzBdWzFdLGM9K3RbMV1bMV0saT51JiYodD1pLGk9dSx1PXQpLGw+YyYmKHQ9bCxsPWMsYz10KSxuLnByZWNpc2lvbih5KSk6W1tpLGxdLFt1LGNdXX0sbi5taW5vckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdFswXVswXSxlPSt0WzFdWzBdLGE9K3RbMF1bMV0sbz0rdFsxXVsxXSxyPmUmJih0PXIscj1lLGU9dCksYT5vJiYodD1hLGE9byxvPXQpLG4ucHJlY2lzaW9uKHkpKTpbW3IsYV0sW2Usb11dfSxuLnN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bi5tYWpvclN0ZXAodCkubWlub3JTdGVwKHQpOm4ubWlub3JTdGVwKCl9LG4ubWFqb3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSt0WzBdLG09K3RbMV0sbik6W2QsbV19LG4ubWlub3JTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0WzBdLHY9K3RbMV0sbik6W3Asdl19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PSt0LHM9dnIoYSxvLDkwKSxmPWRyKHIsZSx5KSxoPXZyKGwsYyw5MCksZz1kcihpLHUseSksbik6eX0sbi5tYWpvckV4dGVudChbWy0xODAsLTkwK0NhXSxbMTgwLDkwLUNhXV0pLm1pbm9yRXh0ZW50KFtbLTE4MCwtODAtQ2FdLFsxODAsODArQ2FdXSl9LHRhLmdlby5ncmVhdEFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6W3R8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpXX19dmFyIHQsZSxyPW1yLHU9eXI7cmV0dXJuIG4uZGlzdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZ2VvLmRpc3RhbmNlKHR8fHIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGV8fHUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ZSx0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP251bGw6ZSxuKTpyfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/bnVsbDp0LG4pOnV9LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bjowfSxufSx0YS5nZW8uaW50ZXJwb2xhdGU9ZnVuY3Rpb24obix0KXtyZXR1cm4gTXIoblswXSpEYSxuWzFdKkRhLHRbMF0qRGEsdFsxXSpEYSl9LHRhLmdlby5sZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIFljPTAsdGEuZ2VvLnN0cmVhbShuLFpjKSxZY307dmFyIFljLFpjPXtzcGhlcmU6Yixwb2ludDpiLGxpbmVTdGFydDp4cixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxWYz1icihmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5zcXJ0KDIvKDErbikpfSxmdW5jdGlvbihuKXtyZXR1cm4gMipNYXRoLmFzaW4obi8yKX0pOyh0YS5nZW8uYXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFZjKX0pLnJhdz1WYzt2YXIgWGM9YnIoZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5hY29zKG4pO3JldHVybiB0JiZ0L01hdGguc2luKHQpfSx5KTsodGEuZ2VvLmF6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFhjKX0pLnJhdz1YYywodGEuZ2VvLmNvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIFllKF9yKX0pLnJhdz1fciwodGEuZ2VvLmNvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gWWUod3IpfSkucmF3PXdyO3ZhciAkYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS9ufSxNYXRoLmF0YW4pOyh0YS5nZW8uZ25vbW9uaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoJGMpfSkucmF3PSRjLFNyLmludmVydD1mdW5jdGlvbihuLHQpe3JldHVybltuLDIqTWF0aC5hdGFuKE1hdGguZXhwKHQpKS1SYV19LCh0YS5nZW8ubWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4ga3IoU3IpfSkucmF3PVNyO3ZhciBCYz1icihmdW5jdGlvbigpe3JldHVybiAxfSxNYXRoLmFzaW4pOyh0YS5nZW8ub3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKEJjKX0pLnJhdz1CYzt2YXIgV2M9YnIoZnVuY3Rpb24obil7cmV0dXJuIDEvKDErbil9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXRhbihuKX0pOyh0YS5nZW8uc3RlcmVvZ3JhcGhpYz1mdW5jdGlvbigpe3JldHVybiB1cihXYyl9KS5yYXc9V2MsRXIuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuWy10LDIqTWF0aC5hdGFuKE1hdGguZXhwKG4pKS1SYV19LCh0YS5nZW8udHJhbnN2ZXJzZU1lcmNhdG9yPWZ1bmN0aW9uKCl7dmFyIG49a3IoRXIpLHQ9bi5jZW50ZXIsZT1uLnJvdGF0ZTtyZXR1cm4gbi5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIG4/dChbLW5bMV0sblswXV0pOihuPXQoKSxbblsxXSwtblswXV0pfSxuLnJvdGF0ZT1mdW5jdGlvbihuKXtyZXR1cm4gbj9lKFtuWzBdLG5bMV0sbi5sZW5ndGg+Mj9uWzJdKzkwOjkwXSk6KG49ZSgpLFtuWzBdLG5bMV0sblsyXS05MF0pfSxlKFswLDAsOTBdKX0pLnJhdz1Fcix0YS5nZW9tPXt9LHRhLmdlb20uaHVsbD1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KG4pe2lmKG4ubGVuZ3RoPDMpcmV0dXJuW107dmFyIHQsdT1FdChlKSxpPUV0KHIpLG89bi5sZW5ndGgsYT1bXSxjPVtdO2Zvcih0PTA7bz50O3QrKylhLnB1c2goWyt1LmNhbGwodGhpcyxuW3RdLHQpLCtpLmNhbGwodGhpcyxuW3RdLHQpLHRdKTtmb3IoYS5zb3J0KHpyKSx0PTA7bz50O3QrKyljLnB1c2goW2FbdF1bMF0sLWFbdF1bMV1dKTt2YXIgbD1DcihhKSxzPUNyKGMpLGY9c1swXT09PWxbMF0saD1zW3MubGVuZ3RoLTFdPT09bFtsLmxlbmd0aC0xXSxnPVtdO2Zvcih0PWwubGVuZ3RoLTE7dD49MDstLXQpZy5wdXNoKG5bYVtsW3RdXVsyXV0pO2Zvcih0PStmO3Q8cy5sZW5ndGgtaDsrK3QpZy5wdXNoKG5bYVtzW3RdXVsyXV0pO3JldHVybiBnfXZhciBlPUFyLHI9TnI7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dChuKToodC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sdCk6cn0sdCl9LHRhLmdlb20ucG9seWdvbj1mdW5jdGlvbihuKXtyZXR1cm4geWEobixKYyksbn07dmFyIEpjPXRhLmdlb20ucG9seWdvbi5wcm90b3R5cGU9W107SmMuYXJlYT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PS0xLGU9dGhpcy5sZW5ndGgscj10aGlzW2UtMV0sdT0wOysrdDxlOyluPXIscj10aGlzW3RdLHUrPW5bMV0qclswXS1uWzBdKnJbMV07cmV0dXJuLjUqdX0sSmMuY2VudHJvaWQ9ZnVuY3Rpb24obil7dmFyIHQsZSxyPS0xLHU9dGhpcy5sZW5ndGgsaT0wLG89MCxhPXRoaXNbdS0xXTtmb3IoYXJndW1lbnRzLmxlbmd0aHx8KG49LTEvKDYqdGhpcy5hcmVhKCkpKTsrK3I8dTspdD1hLGE9dGhpc1tyXSxlPXRbMF0qYVsxXS1hWzBdKnRbMV0saSs9KHRbMF0rYVswXSkqZSxvKz0odFsxXSthWzFdKSplO3JldHVybltpKm4sbypuXX0sSmMuY2xpcD1mdW5jdGlvbihuKXtmb3IodmFyIHQsZSxyLHUsaSxvLGE9VHIobiksYz0tMSxsPXRoaXMubGVuZ3RoLVRyKHRoaXMpLHM9dGhpc1tsLTFdOysrYzxsOyl7Zm9yKHQ9bi5zbGljZSgpLG4ubGVuZ3RoPTAsdT10aGlzW2NdLGk9dFsocj10Lmxlbmd0aC1hKS0xXSxlPS0xOysrZTxyOylvPXRbZV0scXIobyxzLHUpPyhxcihpLHMsdSl8fG4ucHVzaChMcihpLG8scyx1KSksbi5wdXNoKG8pKTpxcihpLHMsdSkmJm4ucHVzaChMcihpLG8scyx1KSksaT1vO2EmJm4ucHVzaChuWzBdKSxzPXV9cmV0dXJuIG59O3ZhciBHYyxLYyxRYyxubCx0bCxlbD1bXSxybD1bXTtPci5wcm90b3R5cGUucHJlcGFyZT1mdW5jdGlvbigpe2Zvcih2YXIgbix0PXRoaXMuZWRnZXMsZT10Lmxlbmd0aDtlLS07KW49dFtlXS5lZGdlLG4uYiYmbi5hfHx0LnNwbGljZShlLDEpO3JldHVybiB0LnNvcnQoWXIpLHQubGVuZ3RofSxRci5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZS5sPT09dGhpcy5zaXRlP3RoaXMuZWRnZS5hOnRoaXMuZWRnZS5ifSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmI6dGhpcy5lZGdlLmF9fSxudS5wcm90b3R5cGU9e2luc2VydDpmdW5jdGlvbihuLHQpe3ZhciBlLHIsdTtpZihuKXtpZih0LlA9bix0Lk49bi5OLG4uTiYmKG4uTi5QPXQpLG4uTj10LG4uUil7Zm9yKG49bi5SO24uTDspbj1uLkw7bi5MPXR9ZWxzZSBuLlI9dDtlPW59ZWxzZSB0aGlzLl8/KG49dXUodGhpcy5fKSx0LlA9bnVsbCx0Lk49bixuLlA9bi5MPXQsZT1uKToodC5QPXQuTj1udWxsLHRoaXMuXz10LGU9bnVsbCk7Zm9yKHQuTD10LlI9bnVsbCx0LlU9ZSx0LkM9ITAsbj10O2UmJmUuQzspcj1lLlUsZT09PXIuTD8odT1yLlIsdSYmdS5DPyhlLkM9dS5DPSExLHIuQz0hMCxuPXIpOihuPT09ZS5SJiYoZXUodGhpcyxlKSxuPWUsZT1uLlUpLGUuQz0hMSxyLkM9ITAscnUodGhpcyxyKSkpOih1PXIuTCx1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLkwmJihydSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxldSh0aGlzLHIpKSksZT1uLlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbihuKXtuLk4mJihuLk4uUD1uLlApLG4uUCYmKG4uUC5OPW4uTiksbi5OPW4uUD1udWxsO3ZhciB0LGUscix1PW4uVSxpPW4uTCxvPW4uUjtpZihlPWk/bz91dShvKTppOm8sdT91Lkw9PT1uP3UuTD1lOnUuUj1lOnRoaXMuXz1lLGkmJm8/KHI9ZS5DLGUuQz1uLkMsZS5MPWksaS5VPWUsZSE9PW8/KHU9ZS5VLGUuVT1uLlUsbj1lLlIsdS5MPW4sZS5SPW8sby5VPWUpOihlLlU9dSx1PWUsbj1lLlIpKToocj1uLkMsbj1lKSxuJiYobi5VPXUpLCFyKXtpZihuJiZuLkMpcmV0dXJuIHZvaWQobi5DPSExKTtkb3tpZihuPT09dGhpcy5fKWJyZWFrO2lmKG49PT11Lkwpe2lmKHQ9dS5SLHQuQyYmKHQuQz0hMSx1LkM9ITAsZXUodGhpcyx1KSx0PXUuUiksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5SJiZ0LlIuQ3x8KHQuTC5DPSExLHQuQz0hMCxydSh0aGlzLHQpLHQ9dS5SKSx0LkM9dS5DLHUuQz10LlIuQz0hMSxldSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfX1lbHNlIGlmKHQ9dS5MLHQuQyYmKHQuQz0hMSx1LkM9ITAscnUodGhpcyx1KSx0PXUuTCksdC5MJiZ0LkwuQ3x8dC5SJiZ0LlIuQyl7dC5MJiZ0LkwuQ3x8KHQuUi5DPSExLHQuQz0hMCxldSh0aGlzLHQpLHQ9dS5MKSx0LkM9dS5DLHUuQz10LkwuQz0hMSxydSh0aGlzLHUpLG49dGhpcy5fO2JyZWFrfXQuQz0hMCxuPXUsdT11LlV9d2hpbGUoIW4uQyk7biYmKG4uQz0hMSl9fX0sdGEuZ2VvbS52b3Jvbm9pPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7dmFyIHQ9bmV3IEFycmF5KG4ubGVuZ3RoKSxyPWFbMF1bMF0sdT1hWzBdWzFdLGk9YVsxXVswXSxvPWFbMV1bMV07cmV0dXJuIGl1KGUobiksYSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLGEpe3ZhciBjPWUuZWRnZXMsbD1lLnNpdGUscz10W2FdPWMubGVuZ3RoP2MubWFwKGZ1bmN0aW9uKG4pe3ZhciB0PW4uc3RhcnQoKTtyZXR1cm5bdC54LHQueV19KTpsLng+PXImJmwueDw9aSYmbC55Pj11JiZsLnk8PW8/W1tyLG9dLFtpLG9dLFtpLHVdLFtyLHVdXTpbXTtzLnBvaW50PW5bYV19KSx0fWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKGZ1bmN0aW9uKG4sdCl7cmV0dXJue3g6TWF0aC5yb3VuZChpKG4sdCkvQ2EpKkNhLHk6TWF0aC5yb3VuZChvKG4sdCkvQ2EpKkNhLGk6dH19KX12YXIgcj1Bcix1PU5yLGk9cixvPXUsYT11bDtyZXR1cm4gbj90KG4pOih0LmxpbmtzPWZ1bmN0aW9uKG4pe3JldHVybiBpdShlKG4pKS5lZGdlcy5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG4ubCYmbi5yfSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6blt0LmwuaV0sdGFyZ2V0Om5bdC5yLmldfX0pfSx0LnRyaWFuZ2xlcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtyZXR1cm4gaXUoZShuKSkuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2Zvcih2YXIgdSxpLG89ZS5zaXRlLGE9ZS5lZGdlcy5zb3J0KFlyKSxjPS0xLGw9YS5sZW5ndGgscz1hW2wtMV0uZWRnZSxmPXMubD09PW8/cy5yOnMubDsrK2M8bDspdT1zLGk9ZixzPWFbY10uZWRnZSxmPXMubD09PW8/cy5yOnMubCxyPGkuaSYmcjxmLmkmJmF1KG8saSxmKTwwJiZ0LnB1c2goW25bcl0sbltpLmldLG5bZi5pXV0pfSksdH0sdC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHI9biksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHU9biksdCk6dX0sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW51bGw9PW4/dWw6bix0KTphPT09dWw/bnVsbDphfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5jbGlwRXh0ZW50KG4mJltbMCwwXSxuXSk6YT09PXVsP251bGw6YSYmYVsxXX0sdCl9O3ZhciB1bD1bWy0xZTYsLTFlNl0sWzFlNiwxZTZdXTt0YS5nZW9tLmRlbGF1bmF5PWZ1bmN0aW9uKG4pe3JldHVybiB0YS5nZW9tLnZvcm9ub2koKS50cmlhbmdsZXMobil9LHRhLmdlb20ucXVhZHRyZWU9ZnVuY3Rpb24obix0LGUscix1KXtmdW5jdGlvbiBpKG4pe2Z1bmN0aW9uIGkobix0LGUscix1LGksbyxhKXtpZighaXNOYU4oZSkmJiFpc05hTihyKSlpZihuLmxlYWYpe3ZhciBjPW4ueCxzPW4ueTtpZihudWxsIT1jKWlmKGdhKGMtZSkrZ2Eocy1yKTwuMDEpbChuLHQsZSxyLHUsaSxvLGEpO2Vsc2V7dmFyIGY9bi5wb2ludDtuLng9bi55PW4ucG9pbnQ9bnVsbCxsKG4sZixjLHMsdSxpLG8sYSksbChuLHQsZSxyLHUsaSxvLGEpfWVsc2Ugbi54PWUsbi55PXIsbi5wb2ludD10fWVsc2UgbChuLHQsZSxyLHUsaSxvLGEpfWZ1bmN0aW9uIGwobix0LGUscix1LG8sYSxjKXt2YXIgbD0uNSoodSthKSxzPS41KihvK2MpLGY9ZT49bCxoPXI+PXMsZz1oPDwxfGY7bi5sZWFmPSExLG49bi5ub2Rlc1tnXXx8KG4ubm9kZXNbZ109c3UoKSksZj91PWw6YT1sLGg/bz1zOmM9cyxpKG4sdCxlLHIsdSxvLGEsYyl9dmFyIHMsZixoLGcscCx2LGQsbSx5LE09RXQoYSkseD1FdChjKTtpZihudWxsIT10KXY9dCxkPWUsbT1yLHk9dTtlbHNlIGlmKG09eT0tKHY9ZD0xLzApLGY9W10saD1bXSxwPW4ubGVuZ3RoLG8pZm9yKGc9MDtwPmc7KytnKXM9bltnXSxzLng8diYmKHY9cy54KSxzLnk8ZCYmKGQ9cy55KSxzLng+bSYmKG09cy54KSxzLnk+eSYmKHk9cy55KSxmLnB1c2gocy54KSxoLnB1c2gocy55KTtlbHNlIGZvcihnPTA7cD5nOysrZyl7dmFyIGI9K00ocz1uW2ddLGcpLF89K3gocyxnKTt2PmImJih2PWIpLGQ+XyYmKGQ9XyksYj5tJiYobT1iKSxfPnkmJih5PV8pLGYucHVzaChiKSxoLnB1c2goXyl9dmFyIHc9bS12LFM9eS1kO3c+Uz95PWQrdzptPXYrUzt2YXIgaz1zdSgpO2lmKGsuYWRkPWZ1bmN0aW9uKG4pe2koayxuLCtNKG4sKytnKSwreChuLGcpLHYsZCxtLHkpfSxrLnZpc2l0PWZ1bmN0aW9uKG4pe2Z1KG4sayx2LGQsbSx5KX0say5maW5kPWZ1bmN0aW9uKG4pe3JldHVybiBodShrLG5bMF0sblsxXSx2LGQsbSx5KX0sZz0tMSxudWxsPT10KXtmb3IoOysrZzxwOylpKGssbltnXSxmW2ddLGhbZ10sdixkLG0seSk7LS1nfWVsc2Ugbi5mb3JFYWNoKGsuYWRkKTtyZXR1cm4gZj1oPW49cz1udWxsLGt9dmFyIG8sYT1BcixjPU5yO3JldHVybihvPWFyZ3VtZW50cy5sZW5ndGgpPyhhPWN1LGM9bHUsMz09PW8mJih1PWUscj10LGU9dD0wKSxpKG4pKTooaS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4saSk6YX0saS55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4saSk6Y30saS5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PStuWzBdWzBdLGU9K25bMF1bMV0scj0rblsxXVswXSx1PStuWzFdWzFdKSxpKTpudWxsPT10P251bGw6W1t0LGVdLFtyLHVdXX0saS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP3Q9ZT1yPXU9bnVsbDoodD1lPTAscj0rblswXSx1PStuWzFdKSxpKTpudWxsPT10P251bGw6W3ItdCx1LWVdfSxpKX0sdGEuaW50ZXJwb2xhdGVSZ2I9Z3UsdGEuaW50ZXJwb2xhdGVPYmplY3Q9cHUsdGEuaW50ZXJwb2xhdGVOdW1iZXI9dnUsdGEuaW50ZXJwb2xhdGVTdHJpbmc9ZHU7dmFyIGlsPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxvbD1uZXcgUmVnRXhwKGlsLnNvdXJjZSwiZyIpO3RhLmludGVycG9sYXRlPW11LHRhLmludGVycG9sYXRvcnM9W2Z1bmN0aW9uKG4sdCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuKCJzdHJpbmciPT09ZT9HYS5oYXModCl8fC9eKCN8cmdiXCh8aHNsXCgpLy50ZXN0KHQpP2d1OmR1OnQgaW5zdGFuY2VvZiBvdD9ndTpBcnJheS5pc0FycmF5KHQpP3l1OiJvYmplY3QiPT09ZSYmaXNOYU4odCk/cHU6dnUpKG4sdCl9XSx0YS5pbnRlcnBvbGF0ZUFycmF5PXl1O3ZhciBhbD1mdW5jdGlvbigpe3JldHVybiB5fSxjbD10YS5tYXAoe2xpbmVhcjphbCxwb2x5Omt1LHF1YWQ6ZnVuY3Rpb24oKXtyZXR1cm4gX3V9LGN1YmljOmZ1bmN0aW9uKCl7cmV0dXJuIHd1fSxzaW46ZnVuY3Rpb24oKXtyZXR1cm4gRXV9LGV4cDpmdW5jdGlvbigpe3JldHVybiBBdX0sY2lyY2xlOmZ1bmN0aW9uKCl7cmV0dXJuIE51fSxlbGFzdGljOkN1LGJhY2s6enUsYm91bmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHF1fX0pLGxsPXRhLm1hcCh7ImluIjp5LG91dDp4dSwiaW4tb3V0IjpidSwib3V0LWluIjpmdW5jdGlvbihuKXtyZXR1cm4gYnUoeHUobikpfX0pO3RhLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCItIiksZT10Pj0wP24uc2xpY2UoMCx0KTpuLHI9dD49MD9uLnNsaWNlKHQrMSk6ImluIjtyZXR1cm4gZT1jbC5nZXQoZSl8fGFsLHI9bGwuZ2V0KHIpfHx5LE11KHIoZS5hcHBseShudWxsLGVhLmNhbGwoYXJndW1lbnRzLDEpKSkpfSx0YS5pbnRlcnBvbGF0ZUhjbD1MdSx0YS5pbnRlcnBvbGF0ZUhzbD1UdSx0YS5pbnRlcnBvbGF0ZUxhYj1SdSx0YS5pbnRlcnBvbGF0ZVJvdW5kPUR1LHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXt2YXIgdD11YS5jcmVhdGVFbGVtZW50TlModGEubnMucHJlZml4LnN2ZywiZyIpO3JldHVybih0YS50cmFuc2Zvcm09ZnVuY3Rpb24obil7aWYobnVsbCE9bil7dC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsbik7dmFyIGU9dC50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpfXJldHVybiBuZXcgUHUoZT9lLm1hdHJpeDpzbCl9KShuKX0sUHUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMudHJhbnNsYXRlKyIpcm90YXRlKCIrdGhpcy5yb3RhdGUrIilza2V3WCgiK3RoaXMuc2tldysiKXNjYWxlKCIrdGhpcy5zY2FsZSsiKSJ9O3ZhciBzbD17YToxLGI6MCxjOjAsZDoxLGU6MCxmOjB9O3RhLmludGVycG9sYXRlVHJhbnNmb3JtPUh1LHRhLmxheW91dD17fSx0YS5sYXlvdXQuYnVuZGxlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKG4pe2Zvcih2YXIgdD1bXSxlPS0xLHI9bi5sZW5ndGg7KytlPHI7KXQucHVzaChZdShuW2VdKSk7cmV0dXJuIHR9fSx0YS5sYXlvdXQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG4sbCxmLGgsZyxwPXt9LHY9W10sZD10YS5yYW5nZShpKSxtPVtdO2ZvcihlPVtdLHI9W10sbj0wLGg9LTE7KytoPGk7KXtmb3IobD0wLGc9LTE7KytnPGk7KWwrPXVbaF1bZ107di5wdXNoKGwpLG0ucHVzaCh0YS5yYW5nZShpKSksbis9bH1mb3IobyYmZC5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG8odltuXSx2W3RdKX0pLGEmJm0uZm9yRWFjaChmdW5jdGlvbihuLHQpe24uc29ydChmdW5jdGlvbihuLGUpe3JldHVybiBhKHVbdF1bbl0sdVt0XVtlXSl9KX0pLG49KExhLXMqaSkvbixsPTAsaD0tMTsrK2g8aTspe2ZvcihmPWwsZz0tMTsrK2c8aTspe3ZhciB5PWRbaF0sTT1tW3ldW2ddLHg9dVt5XVtNXSxiPWwsXz1sKz14Km47cFt5KyItIitNXT17aW5kZXg6eSxzdWJpbmRleDpNLHN0YXJ0QW5nbGU6YixlbmRBbmdsZTpfLHZhbHVlOnh9fXJbeV09e2luZGV4Onksc3RhcnRBbmdsZTpmLGVuZEFuZ2xlOmwsdmFsdWU6KGwtZikvbn0sbCs9c31mb3IoaD0tMTsrK2g8aTspZm9yKGc9aC0xOysrZzxpOyl7dmFyIHc9cFtoKyItIitnXSxTPXBbZysiLSIraF07KHcudmFsdWV8fFMudmFsdWUpJiZlLnB1c2gody52YWx1ZTxTLnZhbHVlP3tzb3VyY2U6Uyx0YXJnZXQ6d306e3NvdXJjZTp3LHRhcmdldDpTfSl9YyYmdCgpfWZ1bmN0aW9uIHQoKXtlLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gYygobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUpLzIsKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlKS8yKX0pfXZhciBlLHIsdSxpLG8sYSxjLGw9e30scz0wO3JldHVybiBsLm1hdHJpeD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1uKSYmdS5sZW5ndGgsZT1yPW51bGwsbCk6dX0sbC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4sZT1yPW51bGwsbCk6c30sbC5zb3J0R3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPW4sZT1yPW51bGwsbCk6b30sbC5zb3J0U3ViZ3JvdXBzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPW4sZT1udWxsLGwpOmF9LGwuc29ydENob3Jkcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLGUmJnQoKSxsKTpjfSxsLmNob3Jkcz1mdW5jdGlvbigpe3JldHVybiBlfHxuKCksZX0sbC5ncm91cHM9ZnVuY3Rpb24oKXtyZXR1cm4gcnx8bigpLHJ9LGx9LHRhLmxheW91dC5mb3JjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyLHUpe2lmKHQucG9pbnQhPT1uKXt2YXIgaT10LmN4LW4ueCxvPXQuY3ktbi55LGE9dS1lLGM9aSppK28qbztpZihjPmEqYS9kKXtpZihwPmMpe3ZhciBsPXQuY2hhcmdlL2M7bi5weC09aSpsLG4ucHktPW8qbH1yZXR1cm4hMH1pZih0LnBvaW50JiZjJiZwPmMpe3ZhciBsPXQucG9pbnRDaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfX1yZXR1cm4hdC5jaGFyZ2V9fWZ1bmN0aW9uIHQobil7bi5weD10YS5ldmVudC54LG4ucHk9dGEuZXZlbnQueSxhLnJlc3VtZSgpfXZhciBlLHIsdSxpLG8sYT17fSxjPXRhLmRpc3BhdGNoKCJzdGFydCIsInRpY2siLCJlbmQiKSxsPVsxLDFdLHM9LjksZj1mbCxoPWhsLGc9LTMwLHA9Z2wsdj0uMSxkPS42NCxtPVtdLE09W107cmV0dXJuIGEudGljaz1mdW5jdGlvbigpe2lmKChyKj0uOTkpPC4wMDUpcmV0dXJuIGMuZW5kKHt0eXBlOiJlbmQiLGFscGhhOnI9MH0pLCEwO3ZhciB0LGUsYSxmLGgscCxkLHkseCxiPW0ubGVuZ3RoLF89TS5sZW5ndGg7Zm9yKGU9MDtfPmU7KytlKWE9TVtlXSxmPWEuc291cmNlLGg9YS50YXJnZXQseT1oLngtZi54LHg9aC55LWYueSwocD15KnkreCp4KSYmKHA9cippW2VdKigocD1NYXRoLnNxcnQocCkpLXVbZV0pL3AseSo9cCx4Kj1wLGgueC09eSooZD1mLndlaWdodC8oaC53ZWlnaHQrZi53ZWlnaHQpKSxoLnktPXgqZCxmLngrPXkqKGQ9MS1kKSxmLnkrPXgqZCk7aWYoKGQ9cip2KSYmKHk9bFswXS8yLHg9bFsxXS8yLGU9LTEsZCkpZm9yKDsrK2U8YjspYT1tW2VdLGEueCs9KHktYS54KSpkLGEueSs9KHgtYS55KSpkO2lmKGcpZm9yKEp1KHQ9dGEuZ2VvbS5xdWFkdHJlZShtKSxyLG8pLGU9LTE7KytlPGI7KShhPW1bZV0pLmZpeGVkfHx0LnZpc2l0KG4oYSkpO2ZvcihlPS0xOysrZTxiOylhPW1bZV0sYS5maXhlZD8oYS54PWEucHgsYS55PWEucHkpOihhLngtPShhLnB4LShhLnB4PWEueCkpKnMsYS55LT0oYS5weS0oYS5weT1hLnkpKSpzKTtjLnRpY2soe3R5cGU6InRpY2siLGFscGhhOnJ9KX0sYS5ub2Rlcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT1uLGEpOm19LGEubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09bixhKTpNfSxhLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bixhKTpsfSxhLmxpbmtEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmZ9LGEuZGlzdGFuY2U9YS5saW5rRGlzdGFuY2UsYS5saW5rU3RyZW5ndGg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpofSxhLmZyaWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPStuLGEpOnN9LGEuY2hhcmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Z30sYS5jaGFyZ2VEaXN0YW5jZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uKm4sYSk6TWF0aC5zcXJ0KHApfSxhLmdyYXZpdHk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K24sYSk6dn0sYS50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1uKm4sYSk6TWF0aC5zcXJ0KGQpfSxhLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStuLHI/cj1uPjA/bjowOm4+MCYmKGMuc3RhcnQoe3R5cGU6InN0YXJ0IixhbHBoYTpyPW59KSx0YS50aW1lcihhLnRpY2spKSxhKTpyfSxhLnN0YXJ0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHIpe2lmKCFlKXtmb3IoZT1uZXcgQXJyYXkoYyksYT0wO2M+YTsrK2EpZVthXT1bXTtmb3IoYT0wO3M+YTsrK2Epe3ZhciB1PU1bYV07ZVt1LnNvdXJjZS5pbmRleF0ucHVzaCh1LnRhcmdldCksZVt1LnRhcmdldC5pbmRleF0ucHVzaCh1LnNvdXJjZSl9fWZvcih2YXIgaSxvPWVbdF0sYT0tMSxsPW8ubGVuZ3RoOysrYTxsOylpZighaXNOYU4oaT1vW2FdW25dKSlyZXR1cm4gaTtyZXR1cm4gTWF0aC5yYW5kb20oKSpyfXZhciB0LGUscixjPW0ubGVuZ3RoLHM9TS5sZW5ndGgscD1sWzBdLHY9bFsxXTtmb3IodD0wO2M+dDsrK3QpKHI9bVt0XSkuaW5kZXg9dCxyLndlaWdodD0wO2Zvcih0PTA7cz50OysrdClyPU1bdF0sIm51bWJlciI9PXR5cGVvZiByLnNvdXJjZSYmKHIuc291cmNlPW1bci5zb3VyY2VdKSwibnVtYmVyIj09dHlwZW9mIHIudGFyZ2V0JiYoci50YXJnZXQ9bVtyLnRhcmdldF0pLCsrci5zb3VyY2Uud2VpZ2h0LCsrci50YXJnZXQud2VpZ2h0O2Zvcih0PTA7Yz50OysrdClyPW1bdF0saXNOYU4oci54KSYmKHIueD1uKCJ4IixwKSksaXNOYU4oci55KSYmKHIueT1uKCJ5Iix2KSksaXNOYU4oci5weCkmJihyLnB4PXIueCksaXNOYU4oci5weSkmJihyLnB5PXIueSk7aWYodT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZilmb3IodD0wO3M+dDsrK3QpdVt0XT0rZi5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdCl1W3RdPWY7aWYoaT1bXSwiZnVuY3Rpb24iPT10eXBlb2YgaClmb3IodD0wO3M+dDsrK3QpaVt0XT0raC5jYWxsKHRoaXMsTVt0XSx0KTtlbHNlIGZvcih0PTA7cz50OysrdClpW3RdPWg7aWYobz1bXSwiZnVuY3Rpb24iPT10eXBlb2YgZylmb3IodD0wO2M+dDsrK3Qpb1t0XT0rZy5jYWxsKHRoaXMsbVt0XSx0KTtlbHNlIGZvcih0PTA7Yz50OysrdClvW3RdPWc7cmV0dXJuIGEucmVzdW1lKCl9LGEucmVzdW1lPWZ1bmN0aW9uKCl7cmV0dXJuIGEuYWxwaGEoLjEpfSxhLnN0b3A9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSgwKX0sYS5kcmFnPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fChlPXRhLmJlaGF2aW9yLmRyYWcoKS5vcmlnaW4oeSkub24oImRyYWdzdGFydC5mb3JjZSIsWHUpLm9uKCJkcmFnLmZvcmNlIix0KS5vbigiZHJhZ2VuZC5mb3JjZSIsJHUpKSxhcmd1bWVudHMubGVuZ3RoP3ZvaWQgdGhpcy5vbigibW91c2VvdmVyLmZvcmNlIixCdSkub24oIm1vdXNlb3V0LmZvcmNlIixXdSkuY2FsbChlKTplfSx0YS5yZWJpbmQoYSxjLCJvbiIpfTt2YXIgZmw9MjAsaGw9MSxnbD0xLzA7dGEubGF5b3V0LmhpZXJhcmNoeT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odSl7dmFyIGksbz1bdV0sYT1bXTtmb3IodS5kZXB0aD0wO251bGwhPShpPW8ucG9wKCkpOylpZihhLnB1c2goaSksKGw9ZS5jYWxsKG4saSxpLmRlcHRoKSkmJihjPWwubGVuZ3RoKSl7Zm9yKHZhciBjLGwsczstLWM+PTA7KW8ucHVzaChzPWxbY10pLHMucGFyZW50PWkscy5kZXB0aD1pLmRlcHRoKzE7ciYmKGkudmFsdWU9MCksaS5jaGlsZHJlbj1sfWVsc2UgciYmKGkudmFsdWU9K3IuY2FsbChuLGksaS5kZXB0aCl8fDApLGRlbGV0ZSBpLmNoaWxkcmVuO3JldHVybiBRdSh1LGZ1bmN0aW9uKG4pe3ZhciBlLHU7dCYmKGU9bi5jaGlsZHJlbikmJmUuc29ydCh0KSxyJiYodT1uLnBhcmVudCkmJih1LnZhbHVlKz1uLnZhbHVlKX0pLGF9dmFyIHQ9ZWksZT1uaSxyPXRpO3JldHVybiBuLnNvcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLmNoaWxkcmVuPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4ucmV2YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gciYmKEt1KHQsZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmKG4udmFsdWU9MCl9KSxRdSh0LGZ1bmN0aW9uKHQpe3ZhciBlO3QuY2hpbGRyZW58fCh0LnZhbHVlPStyLmNhbGwobix0LHQuZGVwdGgpfHwwKSwoZT10LnBhcmVudCkmJihlLnZhbHVlKz10LnZhbHVlKX0pKSx0fSxufSx0YS5sYXlvdXQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0LGUscix1KXt2YXIgaT10LmNoaWxkcmVuO2lmKHQueD1lLHQueT10LmRlcHRoKnUsdC5keD1yLHQuZHk9dSxpJiYobz1pLmxlbmd0aCkpe3ZhciBvLGEsYyxsPS0xO2ZvcihyPXQudmFsdWU/ci90LnZhbHVlOjA7KytsPG87KW4oYT1pW2xdLGUsYz1hLnZhbHVlKnIsdSksZSs9Y319ZnVuY3Rpb24gdChuKXt2YXIgZT1uLmNoaWxkcmVuLHI9MDtpZihlJiYodT1lLmxlbmd0aCkpZm9yKHZhciB1LGk9LTE7KytpPHU7KXI9TWF0aC5tYXgocix0KGVbaV0pKTtyZXR1cm4gMStyfWZ1bmN0aW9uIGUoZSxpKXt2YXIgbz1yLmNhbGwodGhpcyxlLGkpO3JldHVybiBuKG9bMF0sMCx1WzBdLHVbMV0vdChvWzBdKSksb312YXIgcj10YS5sYXlvdXQuaGllcmFyY2h5KCksdT1bMSwxXTtyZXR1cm4gZS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sZSk6dX0sR3UoZSxyKX0sdGEubGF5b3V0LnBpZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obyl7dmFyIGEsYz1vLmxlbmd0aCxsPW8ubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuK3QuY2FsbChuLGUscil9KSxzPSsoImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksZj0oImZ1bmN0aW9uIj09dHlwZW9mIHU/dS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dSktcyxoPU1hdGgubWluKE1hdGguYWJzKGYpL2MsKygiZnVuY3Rpb24iPT10eXBlb2YgaT9pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTppKSksZz1oKigwPmY/LTE6MSkscD0oZi1jKmcpL3RhLnN1bShsKSx2PXRhLnJhbmdlKGMpLGQ9W107cmV0dXJuIG51bGwhPWUmJnYuc29ydChlPT09cGw/ZnVuY3Rpb24obix0KXtyZXR1cm4gbFt0XS1sW25dfTpmdW5jdGlvbihuLHQpe3JldHVybiBlKG9bbl0sb1t0XSl9KSx2LmZvckVhY2goZnVuY3Rpb24obil7ZFtuXT17ZGF0YTpvW25dLHZhbHVlOmE9bFtuXSxzdGFydEFuZ2xlOnMsZW5kQW5nbGU6cys9YSpwK2cscGFkQW5nbGU6aH19KSxkfXZhciB0PU51bWJlcixlPXBsLHI9MCx1PUxhLGk9MDtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uc29ydD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG4pOnJ9LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbn07dmFyIHBsPXt9O3RhLmxheW91dC5zdGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oYSxjKXtpZighKGg9YS5sZW5ndGgpKXJldHVybiBhO3ZhciBsPWEubWFwKGZ1bmN0aW9uKGUscil7cmV0dXJuIHQuY2FsbChuLGUscil9KSxzPWwubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hcChmdW5jdGlvbih0LGUpe3JldHVybltpLmNhbGwobix0LGUpLG8uY2FsbChuLHQsZSldfSl9KSxmPWUuY2FsbChuLHMsYyk7bD10YS5wZXJtdXRlKGwsZikscz10YS5wZXJtdXRlKHMsZik7dmFyIGgsZyxwLHYsZD1yLmNhbGwobixzLGMpLG09bFswXS5sZW5ndGg7Zm9yKHA9MDttPnA7KytwKWZvcih1LmNhbGwobixsWzBdW3BdLHY9ZFtwXSxzWzBdW3BdWzFdKSxnPTE7aD5nOysrZyl1LmNhbGwobixsW2ddW3BdLHYrPXNbZy0xXVtwXVsxXSxzW2ddW3BdWzFdKTtyZXR1cm4gYX12YXIgdD15LGU9YWkscj1jaSx1PW9pLGk9dWksbz1paTtyZXR1cm4gbi52YWx1ZXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxuKTp0fSxuLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dmwuZ2V0KHQpfHxhaSxuKTplfSxuLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRsLmdldCh0KXx8Y2ksbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sbi5vdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxufTt2YXIgdmw9dGEubWFwKHsiaW5zaWRlLW91dCI6ZnVuY3Rpb24obil7dmFyIHQsZSxyPW4ubGVuZ3RoLHU9bi5tYXAobGkpLGk9bi5tYXAoc2kpLG89dGEucmFuZ2Uocikuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiB1W25dLXVbdF19KSxhPTAsYz0wLGw9W10scz1bXTtmb3IodD0wO3I+dDsrK3QpZT1vW3RdLGM+YT8oYSs9aVtlXSxsLnB1c2goZSkpOihjKz1pW2VdLHMucHVzaChlKSk7cmV0dXJuIHMucmV2ZXJzZSgpLmNvbmNhdChsKX0scmV2ZXJzZTpmdW5jdGlvbihuKXtyZXR1cm4gdGEucmFuZ2Uobi5sZW5ndGgpLnJldmVyc2UoKX0sImRlZmF1bHQiOmFpfSksZGw9dGEubWFwKHtzaWxob3VldHRlOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz1bXSxhPTAsYz1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtyPmEmJihhPXIpLG8ucHVzaChyKX1mb3IoZT0wO2k+ZTsrK2UpY1tlXT0oYS1vW2VdKS8yO3JldHVybiBjfSx3aWdnbGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvLGEsYyxsLHM9bi5sZW5ndGgsZj1uWzBdLGg9Zi5sZW5ndGgsZz1bXTtmb3IoZ1swXT1jPWw9MCxlPTE7aD5lOysrZSl7Zm9yKHQ9MCx1PTA7cz50OysrdCl1Kz1uW3RdW2VdWzFdO2Zvcih0PTAsaT0wLGE9ZltlXVswXS1mW2UtMV1bMF07cz50OysrdCl7Zm9yKHI9MCxvPShuW3RdW2VdWzFdLW5bdF1bZS0xXVsxXSkvKDIqYSk7dD5yOysrcilvKz0obltyXVtlXVsxXS1uW3JdW2UtMV1bMV0pL2E7aSs9bypuW3RdW2VdWzFdfWdbZV09Yy09dT9pL3UqYTowLGw+YyYmKGw9Yyl9Zm9yKGU9MDtoPmU7KytlKWdbZV0tPWw7cmV0dXJuIGd9LGV4cGFuZDpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1uLmxlbmd0aCxpPW5bMF0ubGVuZ3RoLG89MS91LGE9W107Zm9yKGU9MDtpPmU7KytlKXtmb3IodD0wLHI9MDt1PnQ7dCsrKXIrPW5bdF1bZV1bMV07aWYocilmb3IodD0wO3U+dDt0Kyspblt0XVtlXVsxXS89cjtlbHNlIGZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdPW99Zm9yKGU9MDtpPmU7KytlKWFbZV09MDtyZXR1cm4gYX0semVybzpjaX0pO3RhLmxheW91dC5oaXN0b2dyYW09ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7Zm9yKHZhciBvLGEsYz1bXSxsPW4ubWFwKGUsdGhpcykscz1yLmNhbGwodGhpcyxsLGkpLGY9dS5jYWxsKHRoaXMscyxsLGkpLGk9LTEsaD1sLmxlbmd0aCxnPWYubGVuZ3RoLTEscD10PzE6MS9oOysraTxnOylvPWNbaV09W10sby5keD1mW2krMV0tKG8ueD1mW2ldKSxvLnk9MDtpZihnPjApZm9yKGk9LTE7KytpPGg7KWE9bFtpXSxhPj1zWzBdJiZhPD1zWzFdJiYobz1jW3RhLmJpc2VjdChmLGEsMSxnKS0xXSxvLnkrPXAsby5wdXNoKG5baV0pKTtyZXR1cm4gY312YXIgdD0hMCxlPU51bWJlcixyPXBpLHU9aGk7cmV0dXJuIG4udmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uYmlucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24obil7cmV0dXJuIGdpKG4sdCl9OkV0KHQpLG4pOnV9LG4uZnJlcXVlbmN5PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSEhZSxuKTp0fSxufSx0YS5sYXlvdXQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXt2YXIgbz1lLmNhbGwodGhpcyxuLGkpLGE9b1swXSxjPXVbMF0sbD11WzFdLHM9bnVsbD09dD9NYXRoLnNxcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmdW5jdGlvbigpe3JldHVybiB0fTtpZihhLng9YS55PTAsUXUoYSxmdW5jdGlvbihuKXtuLnI9K3Mobi52YWx1ZSl9KSxRdShhLE1pKSxyKXt2YXIgZj1yKih0PzE6TWF0aC5tYXgoMiphLnIvYywyKmEuci9sKSkvMjtRdShhLGZ1bmN0aW9uKG4pe24ucis9Zn0pLFF1KGEsTWkpLFF1KGEsZnVuY3Rpb24obil7bi5yLT1mfSl9cmV0dXJuIF9pKGEsYy8yLGwvMix0PzE6MS9NYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKSxvfXZhciB0LGU9dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQodmkpLHI9MCx1PVsxLDFdO3JldHVybiBuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1udWxsPT1lfHwiZnVuY3Rpb24iPT10eXBlb2YgZT9lOitlLG4pOnR9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxHdShuLGUpfSx0YS5sYXlvdXQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgcz1vLmNhbGwodGhpcyxuLHUpLGY9c1swXSxoPXQoZik7aWYoUXUoaCxlKSxoLnBhcmVudC5tPS1oLnosS3UoaCxyKSxsKUt1KGYsaSk7ZWxzZXt2YXIgZz1mLHA9Zix2PWY7S3UoZixmdW5jdGlvbihuKXtuLng8Zy54JiYoZz1uKSxuLng+cC54JiYocD1uKSxuLmRlcHRoPnYuZGVwdGgmJih2PW4pfSk7dmFyIGQ9YShnLHApLzItZy54LG09Y1swXS8ocC54K2EocCxnKS8yK2QpLHk9Y1sxXS8odi5kZXB0aHx8MSk7S3UoZixmdW5jdGlvbihuKXtuLng9KG4ueCtkKSptLG4ueT1uLmRlcHRoKnl9KX1yZXR1cm4gc31mdW5jdGlvbiB0KG4pe2Zvcih2YXIgdCxlPXtBOm51bGwsY2hpbGRyZW46W25dfSxyPVtlXTtudWxsIT0odD1yLnBvcCgpKTspZm9yKHZhciB1LGk9dC5jaGlsZHJlbixvPTAsYT1pLmxlbmd0aDthPm87KytvKXIucHVzaCgoaVtvXT11PXtfOmlbb10scGFyZW50OnQsY2hpbGRyZW46KHU9aVtvXS5jaGlsZHJlbikmJnUuc2xpY2UoKXx8W10sQTpudWxsLGE6bnVsbCx6OjAsbTowLGM6MCxzOjAsdDpudWxsLGk6b30pLmE9dSk7cmV0dXJuIGUuY2hpbGRyZW5bMF19ZnVuY3Rpb24gZShuKXt2YXIgdD1uLmNoaWxkcmVuLGU9bi5wYXJlbnQuY2hpbGRyZW4scj1uLmk/ZVtuLmktMV06bnVsbDtpZih0Lmxlbmd0aCl7Tmkobik7dmFyIGk9KHRbMF0ueit0W3QubGVuZ3RoLTFdLnopLzI7cj8obi56PXIueithKG4uXyxyLl8pLG4ubT1uLnotaSk6bi56PWl9ZWxzZSByJiYobi56PXIueithKG4uXyxyLl8pKTtuLnBhcmVudC5BPXUobixyLG4ucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIHIobil7bi5fLng9bi56K24ucGFyZW50Lm0sbi5tKz1uLnBhcmVudC5tfWZ1bmN0aW9uIHUobix0LGUpe2lmKHQpe2Zvcih2YXIgcix1PW4saT1uLG89dCxjPXUucGFyZW50LmNoaWxkcmVuWzBdLGw9dS5tLHM9aS5tLGY9by5tLGg9Yy5tO289RWkobyksdT1raSh1KSxvJiZ1OyljPWtpKGMpLGk9RWkoaSksaS5hPW4scj1vLnorZi11LnotbCthKG8uXyx1Ll8pLHI+MCYmKEFpKENpKG8sbixlKSxuLHIpLGwrPXIscys9ciksZis9by5tLGwrPXUubSxoKz1jLm0scys9aS5tO28mJiFFaShpKSYmKGkudD1vLGkubSs9Zi1zKSx1JiYha2koYykmJihjLnQ9dSxjLm0rPWwtaCxlPW4pfXJldHVybiBlfWZ1bmN0aW9uIGkobil7bi54Kj1jWzBdLG4ueT1uLmRlcHRoKmNbMV19dmFyIG89dGEubGF5b3V0LmhpZXJhcmNoeSgpLnNvcnQobnVsbCkudmFsdWUobnVsbCksYT1TaSxjPVsxLDFdLGw9bnVsbDtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbik6YX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP2k6bnVsbCxuKTpsP251bGw6Y30sbi5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1udWxsPT0oYz10KT9udWxsOmksbik6bD9jOm51bGx9LEd1KG4sbyl9LHRhLmxheW91dC5jbHVzdGVyPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvLGE9dC5jYWxsKHRoaXMsbixpKSxjPWFbMF0sbD0wO1F1KGMsZnVuY3Rpb24obil7dmFyIHQ9bi5jaGlsZHJlbjt0JiZ0Lmxlbmd0aD8obi54PXFpKHQpLG4ueT16aSh0KSk6KG4ueD1vP2wrPWUobixvKTowLG4ueT0wLG89bil9KTt2YXIgcz1MaShjKSxmPVRpKGMpLGg9cy54LWUocyxmKS8yLGc9Zi54K2UoZixzKS8yO3JldHVybiBRdShjLHU/ZnVuY3Rpb24obil7bi54PShuLngtYy54KSpyWzBdLG4ueT0oYy55LW4ueSkqclsxXX06ZnVuY3Rpb24obil7bi54PShuLngtaCkvKGctaCkqclswXSxuLnk9KDEtKGMueT9uLnkvYy55OjEpKSpyWzFdfSksYX12YXIgdD10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxlPVNpLHI9WzEsMV0sdT0hMTtyZXR1cm4gbi5zZXBhcmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PShyPXQpLG4pOnU/bnVsbDpyfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGwhPShyPXQpLG4pOnU/cjpudWxsfSxHdShuLHQpfSx0YS5sYXlvdXQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix0KXtmb3IodmFyIGUscix1PS0xLGk9bi5sZW5ndGg7Kyt1PGk7KXI9KGU9blt1XSkudmFsdWUqKDA+dD8wOnQpLGUuYXJlYT1pc05hTihyKXx8MD49cj8wOnJ9ZnVuY3Rpb24gdChlKXt2YXIgaT1lLmNoaWxkcmVuO2lmKGkmJmkubGVuZ3RoKXt2YXIgbyxhLGMsbD1mKGUpLHM9W10saD1pLnNsaWNlKCkscD0xLzAsdj0ic2xpY2UiPT09Zz9sLmR4OiJkaWNlIj09PWc/bC5keToic2xpY2UtZGljZSI9PT1nPzEmZS5kZXB0aD9sLmR5OmwuZHg6TWF0aC5taW4obC5keCxsLmR5KTtmb3IobihoLGwuZHgqbC5keS9lLnZhbHVlKSxzLmFyZWE9MDsoYz1oLmxlbmd0aCk+MDspcy5wdXNoKG89aFtjLTFdKSxzLmFyZWErPW8uYXJlYSwic3F1YXJpZnkiIT09Z3x8KGE9cihzLHYpKTw9cD8oaC5wb3AoKSxwPWEpOihzLmFyZWEtPXMucG9wKCkuYXJlYSx1KHMsdixsLCExKSx2PU1hdGgubWluKGwuZHgsbC5keSkscy5sZW5ndGg9cy5hcmVhPTAscD0xLzApO3MubGVuZ3RoJiYodShzLHYsbCwhMCkscy5sZW5ndGg9cy5hcmVhPTApLGkuZm9yRWFjaCh0KX19ZnVuY3Rpb24gZSh0KXt2YXIgcj10LmNoaWxkcmVuO2lmKHImJnIubGVuZ3RoKXt2YXIgaSxvPWYodCksYT1yLnNsaWNlKCksYz1bXTtmb3IobihhLG8uZHgqby5keS90LnZhbHVlKSxjLmFyZWE9MDtpPWEucG9wKCk7KWMucHVzaChpKSxjLmFyZWErPWkuYXJlYSxudWxsIT1pLnomJih1KGMsaS56P28uZHg6by5keSxvLCFhLmxlbmd0aCksYy5sZW5ndGg9Yy5hcmVhPTApO3IuZm9yRWFjaChlKX19ZnVuY3Rpb24gcihuLHQpe2Zvcih2YXIgZSxyPW4uYXJlYSx1PTAsaT0xLzAsbz0tMSxhPW4ubGVuZ3RoOysrbzxhOykoZT1uW29dLmFyZWEpJiYoaT5lJiYoaT1lKSxlPnUmJih1PWUpKTtyZXR1cm4gcio9cix0Kj10LHI/TWF0aC5tYXgodCp1KnAvcixyLyh0KmkqcCkpOjEvMH1mdW5jdGlvbiB1KG4sdCxlLHIpe3ZhciB1LGk9LTEsbz1uLmxlbmd0aCxhPWUueCxsPWUueSxzPXQ/YyhuLmFyZWEvdCk6MDtpZih0PT1lLmR4KXtmb3IoKHJ8fHM+ZS5keSkmJihzPWUuZHkpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keT1zLGErPXUuZHg9TWF0aC5taW4oZS54K2UuZHgtYSxzP2ModS5hcmVhL3MpOjApO3Uuej0hMCx1LmR4Kz1lLngrZS5keC1hLGUueSs9cyxlLmR5LT1zfWVsc2V7Zm9yKChyfHxzPmUuZHgpJiYocz1lLmR4KTsrK2k8bzspdT1uW2ldLHUueD1hLHUueT1sLHUuZHg9cyxsKz11LmR5PU1hdGgubWluKGUueStlLmR5LWwscz9jKHUuYXJlYS9zKTowKTt1Lno9ITEsdS5keSs9ZS55K2UuZHktbCxlLngrPXMsZS5keC09c319ZnVuY3Rpb24gaShyKXt2YXIgdT1vfHxhKHIpLGk9dVswXTtyZXR1cm4gaS54PTAsaS55PTAsaS5keD1sWzBdLGkuZHk9bFsxXSxvJiZhLnJldmFsdWUoaSksbihbaV0saS5keCppLmR5L2kudmFsdWUpLChvP2U6dCkoaSksaCYmKG89dSksdX12YXIgbyxhPXRhLmxheW91dC5oaWVyYXJjaHkoKSxjPU1hdGgucm91bmQsbD1bMSwxXSxzPW51bGwsZj1SaSxoPSExLGc9InNxdWFyaWZ5IixwPS41KigxK01hdGguc3FydCg1KSk7DQpyZXR1cm4gaS5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5wYWRkaW5nPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQodCl7dmFyIGU9bi5jYWxsKGksdCx0LmRlcHRoKTtyZXR1cm4gbnVsbD09ZT9SaSh0KTpEaSh0LCJudW1iZXIiPT10eXBlb2YgZT9bZSxlLGUsZV06ZSl9ZnVuY3Rpb24gZSh0KXtyZXR1cm4gRGkodCxuKX1pZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gczt2YXIgcjtyZXR1cm4gZj1udWxsPT0ocz1uKT9SaToiZnVuY3Rpb24iPT0ocj10eXBlb2Ygbik/dDoibnVtYmVyIj09PXI/KG49W24sbixuLG5dLGUpOmUsaX0saS5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uP01hdGgucm91bmQ6TnVtYmVyLGkpOmMhPU51bWJlcn0saS5zdGlja3k9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bixvPW51bGwsaSk6aH0saS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1uLGkpOnB9LGkubW9kZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz1uKyIiLGkpOmd9LEd1KGksYSl9LHRhLnJhbmRvbT17bm9ybWFsOmZ1bmN0aW9uKG4sdCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gMj5lJiYodD0xKSwxPmUmJihuPTApLGZ1bmN0aW9uKCl7dmFyIGUscix1O2RvIGU9MipNYXRoLnJhbmRvbSgpLTEscj0yKk1hdGgucmFuZG9tKCktMSx1PWUqZStyKnI7d2hpbGUoIXV8fHU+MSk7cmV0dXJuIG4rdCplKk1hdGguc3FydCgtMipNYXRoLmxvZyh1KS91KX19LGxvZ05vcm1hbDpmdW5jdGlvbigpe3ZhciBuPXRhLnJhbmRvbS5ub3JtYWwuYXBwbHkodGEsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAobigpKX19LGJhdGVzOmZ1bmN0aW9uKG4pe3ZhciB0PXRhLnJhbmRvbS5pcndpbkhhbGwobik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQoKS9ufX0saXJ3aW5IYWxsOmZ1bmN0aW9uKG4pe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MDtuPmU7ZSsrKXQrPU1hdGgucmFuZG9tKCk7cmV0dXJuIHR9fX0sdGEuc2NhbGU9e307dmFyIG1sPXtmbG9vcjp5LGNlaWw6eX07dGEuc2NhbGUubGluZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIElpKFswLDFdLFswLDFdLG11LCExKX07dmFyIHlsPXtzOjEsZzoxLHA6MSxyOjEsZToxfTt0YS5zY2FsZS5sb2c9ZnVuY3Rpb24oKXtyZXR1cm4gSmkodGEuc2NhbGUubGluZWFyKCkuZG9tYWluKFswLDFdKSwxMCwhMCxbMSwxMF0pfTt2YXIgTWw9dGEuZm9ybWF0KCIuMGUiKSx4bD17Zmxvb3I6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguY2VpbCgtbil9LGNlaWw6ZnVuY3Rpb24obil7cmV0dXJuLU1hdGguZmxvb3IoLW4pfX07dGEuc2NhbGUucG93PWZ1bmN0aW9uKCl7cmV0dXJuIEdpKHRhLnNjYWxlLmxpbmVhcigpLDEsWzAsMV0pfSx0YS5zY2FsZS5zcXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLnBvdygpLmV4cG9uZW50KC41KX0sdGEuc2NhbGUub3JkaW5hbD1mdW5jdGlvbigpe3JldHVybiBRaShbXSx7dDoicmFuZ2UiLGE6W1tdXX0pfSx0YS5zY2FsZS5jYXRlZ29yeTEwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShibCl9LHRhLnNjYWxlLmNhdGVnb3J5MjA9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKF9sKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGI9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKHdsKX0sdGEuc2NhbGUuY2F0ZWdvcnkyMGM9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuc2NhbGUub3JkaW5hbCgpLnJhbmdlKFNsKX07dmFyIGJsPVsyMDYyMjYwLDE2NzQ0MjA2LDI5MjQ1ODgsMTQwMzQ3MjgsOTcyNTg4NSw5MTk3MTMxLDE0OTA3MzMwLDgzNTU3MTEsMTIzNjkxODYsMTU1NjE3NV0ubWFwKE10KSxfbD1bMjA2MjI2MCwxMTQ1NDQ0MCwxNjc0NDIwNiwxNjc1OTY3MiwyOTI0NTg4LDEwMDE4Njk4LDE0MDM0NzI4LDE2NzUwNzQyLDk3MjU4ODUsMTI5NTU4NjEsOTE5NzEzMSwxMjg4NTE0MCwxNDkwNzMzMCwxNjIzNDE5NCw4MzU1NzExLDEzMDkyODA3LDEyMzY5MTg2LDE0NDA4NTg5LDE1NTYxNzUsMTA0MTA3MjVdLm1hcChNdCksd2w9WzM3NTA3NzcsNTM5NTYxOSw3MDQwNzE5LDEwMjY0Mjg2LDY1MTkwOTcsOTIxNjU5NCwxMTkxNTExNSwxMzU1NjYzNiw5MjAyOTkzLDEyNDI2ODA5LDE1MTg2NTE0LDE1MTkwOTMyLDg2NjYxNjksMTEzNTY0OTAsMTQwNDk2NDMsMTUxNzczNzIsODA3NzY4MywxMDgzNDMyNCwxMzUyODUwOSwxNDU4OTY1NF0ubWFwKE10KSxTbD1bMzI0NDczMyw3MDU3MTEwLDEwNDA2NjI1LDEzMDMyNDMxLDE1MDk1MDUzLDE2NjE2NzY0LDE2NjI1MjU5LDE2NjM0MDE4LDMyNTMwNzYsNzY1MjQ3MCwxMDYwNzAwMywxMzEwMTUwNCw3Njk1MjgxLDEwMzk0MzEyLDEyMzY5MzcyLDE0MzQyODkxLDY1MTM1MDcsOTg2ODk1MCwxMjQzNDg3NywxNDI3NzA4MV0ubWFwKE10KTt0YS5zY2FsZS5xdWFudGlsZT1mdW5jdGlvbigpe3JldHVybiBubyhbXSxbXSl9LHRhLnNjYWxlLnF1YW50aXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRvKDAsMSxbMCwxXSl9LHRhLnNjYWxlLnRocmVzaG9sZD1mdW5jdGlvbigpe3JldHVybiBlbyhbLjVdLFswLDFdKX0sdGEuc2NhbGUuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gcm8oWzAsMV0pfSx0YS5zdmc9e30sdGEuc3ZnLmFyYz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbj1NYXRoLm1heCgwLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbD1NYXRoLm1heCgwLCtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkscz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1SYSxmPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLVJhLGg9TWF0aC5hYnMoZi1zKSxnPXM+Zj8wOjE7aWYobj5sJiYocD1sLGw9bixuPXApLGg+PVRhKXJldHVybiB0KGwsZykrKG4/dChuLDEtZyk6IiIpKyJaIjt2YXIgcCx2LGQsbSx5LE0seCxiLF8sdyxTLGssRT0wLEE9MCxOPVtdO2lmKChtPSgrYy5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fDApLzIpJiYoZD1pPT09a2w/TWF0aC5zcXJ0KG4qbitsKmwpOitpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxnfHwoQSo9LTEpLGwmJihBPXR0KGQvbCpNYXRoLnNpbihtKSkpLG4mJihFPXR0KGQvbipNYXRoLnNpbihtKSkpKSxsKXt5PWwqTWF0aC5jb3MocytBKSxNPWwqTWF0aC5zaW4ocytBKSx4PWwqTWF0aC5jb3MoZi1BKSxiPWwqTWF0aC5zaW4oZi1BKTt2YXIgQz1NYXRoLmFicyhmLXMtMipBKTw9cWE/MDoxO2lmKEEmJnNvKHksTSx4LGIpPT09Z15DKXt2YXIgej0ocytmKS8yO3k9bCpNYXRoLmNvcyh6KSxNPWwqTWF0aC5zaW4oeikseD1iPW51bGx9fWVsc2UgeT1NPTA7aWYobil7Xz1uKk1hdGguY29zKGYtRSksdz1uKk1hdGguc2luKGYtRSksUz1uKk1hdGguY29zKHMrRSksaz1uKk1hdGguc2luKHMrRSk7dmFyIHE9TWF0aC5hYnMocy1mKzIqRSk8PXFhPzA6MTtpZihFJiZzbyhfLHcsUyxrKT09PTEtZ15xKXt2YXIgTD0ocytmKS8yO189bipNYXRoLmNvcyhMKSx3PW4qTWF0aC5zaW4oTCksUz1rPW51bGx9fWVsc2UgXz13PTA7aWYoKHA9TWF0aC5taW4oTWF0aC5hYnMobC1uKS8yLCt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpPi4wMDEpe3Y9bD5uXmc/MDoxO3ZhciBUPW51bGw9PVM/W18sd106bnVsbD09eD9beSxNXTpMcihbeSxNXSxbUyxrXSxbeCxiXSxbXyx3XSksUj15LVRbMF0sRD1NLVRbMV0sUD14LVRbMF0sVT1iLVRbMV0saj0xL01hdGguc2luKE1hdGguYWNvcygoUipQK0QqVSkvKE1hdGguc3FydChSKlIrRCpEKSpNYXRoLnNxcnQoUCpQK1UqVSkpKS8yKSxGPU1hdGguc3FydChUWzBdKlRbMF0rVFsxXSpUWzFdKTtpZihudWxsIT14KXt2YXIgSD1NYXRoLm1pbihwLChsLUYpLyhqKzEpKSxPPWZvKG51bGw9PVM/W18sd106W1Msa10sW3ksTV0sbCxILGcpLEk9Zm8oW3gsYl0sW18sd10sbCxILGcpO3A9PT1IP04ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLE9bMV0sIkEiLGwsIiwiLGwsIiAwICIsMS1nXnNvKE9bMV1bMF0sT1sxXVsxXSxJWzFdWzBdLElbMV1bMV0pLCIsIixnLCIgIixJWzFdLCJBIixILCIsIixILCIgMCAwLCIsdiwiICIsSVswXSk6Ti5wdXNoKCJNIixPWzBdLCJBIixILCIsIixILCIgMCAxLCIsdiwiICIsSVswXSl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pO2lmKG51bGwhPVMpe3ZhciBZPU1hdGgubWluKHAsKG4tRikvKGotMSkpLFo9Zm8oW3ksTV0sW1Msa10sbiwtWSxnKSxWPWZvKFtfLHddLG51bGw9PXg/W3ksTV06W3gsYl0sbiwtWSxnKTtwPT09WT9OLnB1c2goIkwiLFZbMF0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixWWzFdLCJBIixuLCIsIixuLCIgMCAiLGdec28oVlsxXVswXSxWWzFdWzFdLFpbMV1bMF0sWlsxXVsxXSksIiwiLDEtZywiICIsWlsxXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pOk4ucHVzaCgiTCIsVlswXSwiQSIsWSwiLCIsWSwiIDAgMCwiLHYsIiAiLFpbMF0pfWVsc2UgTi5wdXNoKCJMIixfLCIsIix3KX1lbHNlIE4ucHVzaCgiTSIseSwiLCIsTSksbnVsbCE9eCYmTi5wdXNoKCJBIixsLCIsIixsLCIgMCAiLEMsIiwiLGcsIiAiLHgsIiwiLGIpLE4ucHVzaCgiTCIsXywiLCIsdyksbnVsbCE9UyYmTi5wdXNoKCJBIixuLCIsIixuLCIgMCAiLHEsIiwiLDEtZywiICIsUywiLCIsayk7cmV0dXJuIE4ucHVzaCgiWiIpLE4uam9pbigiIil9ZnVuY3Rpb24gdChuLHQpe3JldHVybiJNMCwiK24rIkEiK24rIiwiK24rIiAwIDEsIit0KyIgMCwiKy1uKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIitufXZhciBlPWlvLHI9b28sdT11byxpPWtsLG89YW8sYT1jbyxjPWxvO3JldHVybiBuLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUV0KHQpLG4pOmV9LG4ub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQodCksbik6cn0sbi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9RXQodCksbik6dX0sbi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dD09a2w/a2w6RXQodCksbik6aX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9RXQodCksbik6YX0sbi5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKCl7dmFyIG49KCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLHQ9KCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSsgK2EuYXBwbHkodGhpcyxhcmd1bWVudHMpKS8yLVJhO3JldHVybltNYXRoLmNvcyh0KSpuLE1hdGguc2luKHQpKm5dfSxufTt2YXIga2w9ImF1dG8iO3RhLnN2Zy5saW5lPWZ1bmN0aW9uKCl7cmV0dXJuIGhvKHkpfTt2YXIgRWw9dGEubWFwKHtsaW5lYXI6Z28sImxpbmVhci1jbG9zZWQiOnBvLHN0ZXA6dm8sInN0ZXAtYmVmb3JlIjptbywic3RlcC1hZnRlciI6eW8sYmFzaXM6U28sImJhc2lzLW9wZW4iOmtvLCJiYXNpcy1jbG9zZWQiOkVvLGJ1bmRsZTpBbyxjYXJkaW5hbDpibywiY2FyZGluYWwtb3BlbiI6TW8sImNhcmRpbmFsLWNsb3NlZCI6eG8sbW9ub3RvbmU6VG99KTtFbC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7dC5rZXk9bix0LmNsb3NlZD0vLWNsb3NlZCQvLnRlc3Qobil9KTt2YXIgQWw9WzAsMi8zLDEvMywwXSxObD1bMCwxLzMsMi8zLDBdLENsPVswLDEvNiwyLzMsMS82XTt0YS5zdmcubGluZS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1obyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbn0sbW8ucmV2ZXJzZT15byx5by5yZXZlcnNlPW1vLHRhLnN2Zy5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIERvKHkpfSx0YS5zdmcuYXJlYS5yYWRpYWw9ZnVuY3Rpb24oKXt2YXIgbj1EbyhSbyk7cmV0dXJuIG4ucmFkaXVzPW4ueCxkZWxldGUgbi54LG4uaW5uZXJSYWRpdXM9bi54MCxkZWxldGUgbi54MCxuLm91dGVyUmFkaXVzPW4ueDEsZGVsZXRlIG4ueDEsbi5hbmdsZT1uLnksZGVsZXRlIG4ueSxuLnN0YXJ0QW5nbGU9bi55MCxkZWxldGUgbi55MCxuLmVuZEFuZ2xlPW4ueTEsZGVsZXRlIG4ueTEsbn0sdGEuc3ZnLmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGEpe3ZhciBjPXQodGhpcyxpLG4sYSksbD10KHRoaXMsbyxuLGEpO3JldHVybiJNIitjLnAwK3IoYy5yLGMucDEsYy5hMS1jLmEwKSsoZShjLGwpP3UoYy5yLGMucDEsYy5yLGMucDApOnUoYy5yLGMucDEsbC5yLGwucDApK3IobC5yLGwucDEsbC5hMS1sLmEwKSt1KGwucixsLnAxLGMucixjLnAwKSkrIloifWZ1bmN0aW9uIHQobix0LGUscil7dmFyIHU9dC5jYWxsKG4sZSxyKSxpPWEuY2FsbChuLHUsciksbz1jLmNhbGwobix1LHIpLVJhLHM9bC5jYWxsKG4sdSxyKS1SYTtyZXR1cm57cjppLGEwOm8sYTE6cyxwMDpbaSpNYXRoLmNvcyhvKSxpKk1hdGguc2luKG8pXSxwMTpbaSpNYXRoLmNvcyhzKSxpKk1hdGguc2luKHMpXX19ZnVuY3Rpb24gZShuLHQpe3JldHVybiBuLmEwPT10LmEwJiZuLmExPT10LmExfWZ1bmN0aW9uIHIobix0LGUpe3JldHVybiJBIituKyIsIituKyIgMCAiKyArKGU+cWEpKyIsMSAiK3R9ZnVuY3Rpb24gdShuLHQsZSxyKXtyZXR1cm4iUSAwLDAgIityfXZhciBpPW1yLG89eXIsYT1QbyxjPWFvLGw9Y287cmV0dXJuIG4ucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KHQpLG4pOmF9LG4uc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPUV0KHQpLG4pOml9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPUV0KHQpLG4pOm99LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1FdCh0KSxuKTpjfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPUV0KHQpLG4pOmx9LG59LHRhLnN2Zy5kaWFnb25hbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obix1KXt2YXIgaT10LmNhbGwodGhpcyxuLHUpLG89ZS5jYWxsKHRoaXMsbix1KSxhPShpLnkrby55KS8yLGM9W2kse3g6aS54LHk6YX0se3g6by54LHk6YX0sb107cmV0dXJuIGM9Yy5tYXAociksIk0iK2NbMF0rIkMiK2NbMV0rIiAiK2NbMl0rIiAiK2NbM119dmFyIHQ9bXIsZT15cixyPVVvO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FdChlKSxuKTp0fSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxuLnByb2plY3Rpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxuKTpyfSxufSx0YS5zdmcuZGlhZ29uYWwucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49dGEuc3ZnLmRpYWdvbmFsKCksdD1VbyxlPW4ucHJvamVjdGlvbjtyZXR1cm4gbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2Uoam8odD1uKSk6dH0sbn0sdGEuc3ZnLnN5bWJvbD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixyKXtyZXR1cm4oemwuZ2V0KHQuY2FsbCh0aGlzLG4scikpfHxPbykoZS5jYWxsKHRoaXMsbixyKSl9dmFyIHQ9SG8sZT1GbztyZXR1cm4gbi50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUV0KGUpLG4pOnR9LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxufTt2YXIgemw9dGEubWFwKHtjaXJjbGU6T28sY3Jvc3M6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vNSkvMjtyZXR1cm4iTSIrLTMqdCsiLCIrLXQrIkgiKy10KyJWIistMyp0KyJIIit0KyJWIistdCsiSCIrMyp0KyJWIit0KyJIIit0KyJWIiszKnQrIkgiKy10KyJWIit0KyJIIistMyp0KyJaIn0sZGlhbW9uZDpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi8oMipMbCkpLGU9dCpMbDtyZXR1cm4iTTAsIistdCsiTCIrZSsiLDAgMCwiK3QrIiAiKy1lKyIsMFoifSxzcXVhcmU6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4pLzI7cmV0dXJuIk0iKy10KyIsIistdCsiTCIrdCsiLCIrLXQrIiAiK3QrIiwiK3QrIiAiKy10KyIsIit0KyJaIn0sInRyaWFuZ2xlLWRvd24iOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuL3FsKSxlPXQqcWwvMjtyZXR1cm4iTTAsIitlKyJMIit0KyIsIistZSsiICIrLXQrIiwiKy1lKyJaIn0sInRyaWFuZ2xlLXVwIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9xbCksZT10KnFsLzI7cmV0dXJuIk0wLCIrLWUrIkwiK3QrIiwiK2UrIiAiKy10KyIsIitlKyJaIn19KTt0YS5zdmcuc3ltYm9sVHlwZXM9emwua2V5cygpO3ZhciBxbD1NYXRoLnNxcnQoMyksTGw9TWF0aC50YW4oMzAqRGEpO19hLnRyYW5zaXRpb249ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscj1UbHx8KytVbCx1PVhvKG4pLGk9W10sbz1SbHx8e3RpbWU6RGF0ZS5ub3coKSxlYXNlOlN1LGRlbGF5OjAsZHVyYXRpb246MjUwfSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtpLnB1c2godD1bXSk7Zm9yKHZhciBsPXRoaXNbYV0scz0tMSxmPWwubGVuZ3RoOysrczxmOykoZT1sW3NdKSYmJG8oZSxzLHUscixvKSx0LnB1c2goZSl9cmV0dXJuIFlvKGksdSxyKX0sX2EuaW50ZXJydXB0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmVhY2gobnVsbD09bj9EbDpJbyhYbyhuKSkpfTt2YXIgVGwsUmwsRGw9SW8oWG8oKSksUGw9W10sVWw9MDtQbC5jYWxsPV9hLmNhbGwsUGwuZW1wdHk9X2EuZW1wdHksUGwubm9kZT1fYS5ub2RlLFBsLnNpemU9X2Euc2l6ZSx0YS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG4mJm4udHJhbnNpdGlvbj9UbD9uLnRyYW5zaXRpb24odCk6bjp0YS5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG4pfSx0YS50cmFuc2l0aW9uLnByb3RvdHlwZT1QbCxQbC5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9dGhpcy5pZCxpPXRoaXMubmFtZXNwYWNlLG89W107bj1OKG4pO2Zvcih2YXIgYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7by5wdXNoKHQ9W10pO2Zvcih2YXIgbD10aGlzW2FdLHM9LTEsZj1sLmxlbmd0aDsrK3M8ZjspKHI9bFtzXSkmJihlPW4uY2FsbChyLHIuX19kYXRhX18scyxhKSk/KCJfX2RhdGFfXyJpbiByJiYoZS5fX2RhdGFfXz1yLl9fZGF0YV9fKSwkbyhlLHMsaSx1LHJbaV1bdV0pLHQucHVzaChlKSk6dC5wdXNoKG51bGwpfXJldHVybiBZbyhvLGksdSl9LFBsLnNlbGVjdEFsbD1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG89dGhpcy5pZCxhPXRoaXMubmFtZXNwYWNlLGM9W107bj1DKG4pO2Zvcih2YXIgbD0tMSxzPXRoaXMubGVuZ3RoOysrbDxzOylmb3IodmFyIGY9dGhpc1tsXSxoPS0xLGc9Zi5sZW5ndGg7KytoPGc7KWlmKHI9ZltoXSl7aT1yW2FdW29dLGU9bi5jYWxsKHIsci5fX2RhdGFfXyxoLGwpLGMucHVzaCh0PVtdKTtmb3IodmFyIHA9LTEsdj1lLmxlbmd0aDsrK3A8djspKHU9ZVtwXSkmJiRvKHUscCxhLG8saSksdC5wdXNoKHUpfXJldHVybiBZbyhjLGEsbyl9LFBsLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSk7Zm9yKHZhciBlPXRoaXNbaV0sYT0wLGM9ZS5sZW5ndGg7Yz5hO2ErKykocj1lW2FdKSYmbi5jYWxsKHIsci5fX2RhdGFfXyxhLGkpJiZ0LnB1c2gocil9cmV0dXJuIFlvKHUsdGhpcy5uYW1lc3BhY2UsdGhpcy5pZCl9LFBsLnR3ZWVuPWZ1bmN0aW9uKG4sdCl7dmFyIGU9dGhpcy5pZCxyPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpcy5ub2RlKClbcl1bZV0udHdlZW4uZ2V0KG4pOlkodGhpcyxudWxsPT10P2Z1bmN0aW9uKHQpe3Rbcl1bZV0udHdlZW4ucmVtb3ZlKG4pfTpmdW5jdGlvbih1KXt1W3JdW2VdLnR3ZWVuLnNldChuLHQpfSl9LFBsLmF0dHI9ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUoYSl9ZnVuY3Rpb24gcigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsKX1mdW5jdGlvbiB1KG4pe3JldHVybiBudWxsPT1uP2U6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZShhKTtyZXR1cm4gZSE9PW4mJih0PW8oZSxuKSxmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZShhLHQobikpfSl9KX1mdW5jdGlvbiBpKG4pe3JldHVybiBudWxsPT1uP3I6KG4rPSIiLGZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmdldEF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwsdChuKSl9KX0pfWlmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHQgaW4gbil0aGlzLmF0dHIodCxuW3RdKTtyZXR1cm4gdGhpc312YXIgbz0idHJhbnNmb3JtIj09bj9IdTptdSxhPXRhLm5zLnF1YWxpZnkobik7cmV0dXJuIFpvKHRoaXMsImF0dHIuIituLHQsYS5sb2NhbD9pOnUpfSxQbC5hdHRyVHdlZW49ZnVuY3Rpb24obix0KXtmdW5jdGlvbiBlKG4sZSl7dmFyIHI9dC5jYWxsKHRoaXMsbixlLHRoaXMuZ2V0QXR0cmlidXRlKHUpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodSxyKG4pKX19ZnVuY3Rpb24gcihuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCkpO3JldHVybiByJiZmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHUuc3BhY2UsdS5sb2NhbCxyKG4pKX19dmFyIHU9dGEubnMucXVhbGlmeShuKTtyZXR1cm4gdGhpcy50d2VlbigiYXR0ci4iK24sdS5sb2NhbD9yOmUpfSxQbC5zdHlsZT1mdW5jdGlvbihuLGUscil7ZnVuY3Rpb24gdSgpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobil9ZnVuY3Rpb24gaShlKXtyZXR1cm4gbnVsbD09ZT91OihlKz0iIixmdW5jdGlvbigpe3ZhciB1LGk9dCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKTtyZXR1cm4gaSE9PWUmJih1PW11KGksZSksZnVuY3Rpb24odCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHUodCkscil9KX0pfXZhciBvPWFyZ3VtZW50cy5sZW5ndGg7aWYoMz5vKXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+byYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5zdHlsZShyLG5bcl0sZSk7cmV0dXJuIHRoaXN9cj0iIn1yZXR1cm4gWm8odGhpcywic3R5bGUuIituLGUsaSl9LFBsLnN0eWxlVHdlZW49ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUodSxpKXt2YXIgbz1lLmNhbGwodGhpcyx1LGksdCh0aGlzKS5nZXRDb21wdXRlZFN0eWxlKHRoaXMsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuKSk7cmV0dXJuIG8mJmZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobixvKHQpLHIpfX1yZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwzJiYocj0iIiksdGhpcy50d2Vlbigic3R5bGUuIituLHUpfSxQbC50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBabyh0aGlzLCJ0ZXh0IixuLFZvKX0sUGwucmVtb3ZlPWZ1bmN0aW9uKCl7dmFyIG49dGhpcy5uYW1lc3BhY2U7cmV0dXJuIHRoaXMuZWFjaCgiZW5kLnRyYW5zaXRpb24iLGZ1bmN0aW9uKCl7dmFyIHQ7dGhpc1tuXS5jb3VudDwyJiYodD10aGlzLnBhcmVudE5vZGUpJiZ0LnJlbW92ZUNoaWxkKHRoaXMpfSl9LFBsLmVhc2U9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZWFzZTooImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPXRhLmVhc2UuYXBwbHkodGEsYXJndW1lbnRzKSksWSh0aGlzLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZWFzZT1ufSkpfSxQbC5kZWxheT1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kZWxheTpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZGVsYXk9K24uY2FsbChyLHIuX19kYXRhX18sdSxpKX06KG49K24sZnVuY3Rpb24ocil7cltlXVt0XS5kZWxheT1ufSkpfSxQbC5kdXJhdGlvbj1mdW5jdGlvbihuKXt2YXIgdD10aGlzLmlkLGU9dGhpcy5uYW1lc3BhY2U7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT90aGlzLm5vZGUoKVtlXVt0XS5kdXJhdGlvbjpZKHRoaXMsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24ocix1LGkpe3JbZV1bdF0uZHVyYXRpb249TWF0aC5tYXgoMSxuLmNhbGwocixyLl9fZGF0YV9fLHUsaSkpfToobj1NYXRoLm1heCgxLG4pLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZHVyYXRpb249bn0pKX0sUGwuZWFjaD1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciB1PVJsLGk9VGw7dHJ5e1RsPWUsWSh0aGlzLGZ1bmN0aW9uKHQsdSxpKXtSbD10W3JdW2VdLG4uY2FsbCh0LHQuX19kYXRhX18sdSxpKX0pfWZpbmFsbHl7Umw9dSxUbD1pfX1lbHNlIFkodGhpcyxmdW5jdGlvbih1KXt2YXIgaT11W3JdW2VdOyhpLmV2ZW50fHwoaS5ldmVudD10YS5kaXNwYXRjaCgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSkpLm9uKG4sdCl9KTtyZXR1cm4gdGhpc30sUGwudHJhbnNpdGlvbj1mdW5jdGlvbigpe2Zvcih2YXIgbix0LGUscix1PXRoaXMuaWQsaT0rK1VsLG89dGhpcy5uYW1lc3BhY2UsYT1bXSxjPTAsbD10aGlzLmxlbmd0aDtsPmM7YysrKXthLnB1c2gobj1bXSk7Zm9yKHZhciB0PXRoaXNbY10scz0wLGY9dC5sZW5ndGg7Zj5zO3MrKykoZT10W3NdKSYmKHI9ZVtvXVt1XSwkbyhlLHMsbyxpLHt0aW1lOnIudGltZSxlYXNlOnIuZWFzZSxkZWxheTpyLmRlbGF5K3IuZHVyYXRpb24sZHVyYXRpb246ci5kdXJhdGlvbn0pKSxuLnB1c2goZSl9cmV0dXJuIFlvKGEsbyxpKX0sdGEuc3ZnLmF4aXM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuLGw9dGEuc2VsZWN0KHRoaXMpLHM9dGhpcy5fX2NoYXJ0X198fGUsZj10aGlzLl9fY2hhcnRfXz1lLmNvcHkoKSxoPW51bGw9PWM/Zi50aWNrcz9mLnRpY2tzLmFwcGx5KGYsYSk6Zi5kb21haW4oKTpjLGc9bnVsbD09dD9mLnRpY2tGb3JtYXQ/Zi50aWNrRm9ybWF0LmFwcGx5KGYsYSk6eTp0LHA9bC5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShoLGYpLHY9cC5lbnRlcigpLmluc2VydCgiZyIsIi5kb21haW4iKS5hdHRyKCJjbGFzcyIsInRpY2siKS5zdHlsZSgib3BhY2l0eSIsQ2EpLGQ9dGEudHJhbnNpdGlvbihwLmV4aXQoKSkuc3R5bGUoIm9wYWNpdHkiLENhKS5yZW1vdmUoKSxtPXRhLnRyYW5zaXRpb24ocC5vcmRlcigpKS5zdHlsZSgib3BhY2l0eSIsMSksTT1NYXRoLm1heCh1LDApK28seD1VaShmKSxiPWwuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbMF0pLF89KGIuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLHRhLnRyYW5zaXRpb24oYikpO3YuYXBwZW5kKCJsaW5lIiksdi5hcHBlbmQoInRleHQiKTt2YXIgdyxTLGssRSxBPXYuc2VsZWN0KCJsaW5lIiksTj1tLnNlbGVjdCgibGluZSIpLEM9cC5zZWxlY3QoInRleHQiKS50ZXh0KGcpLHo9di5zZWxlY3QoInRleHQiKSxxPW0uc2VsZWN0KCJ0ZXh0IiksTD0idG9wIj09PXJ8fCJsZWZ0Ij09PXI/LTE6MTtpZigiYm90dG9tIj09PXJ8fCJ0b3AiPT09cj8obj1Cbyx3PSJ4IixrPSJ5IixTPSJ4MiIsRT0ieTIiLEMuYXR0cigiZHkiLDA+TD8iMGVtIjoiLjcxZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLCJtaWRkbGUiKSxfLmF0dHIoImQiLCJNIit4WzBdKyIsIitMKmkrIlYwSCIreFsxXSsiViIrTCppKSk6KG49V28sdz0ieSIsaz0ieCIsUz0ieTIiLEU9IngyIixDLmF0dHIoImR5IiwiLjMyZW0iKS5zdHlsZSgidGV4dC1hbmNob3IiLDA+TD8iZW5kIjoic3RhcnQiKSxfLmF0dHIoImQiLCJNIitMKmkrIiwiK3hbMF0rIkgwViIreFsxXSsiSCIrTCppKSksQS5hdHRyKEUsTCp1KSx6LmF0dHIoayxMKk0pLE4uYXR0cihTLDApLmF0dHIoRSxMKnUpLHEuYXR0cih3LDApLmF0dHIoayxMKk0pLGYucmFuZ2VCYW5kKXt2YXIgVD1mLFI9VC5yYW5nZUJhbmQoKS8yO3M9Zj1mdW5jdGlvbihuKXtyZXR1cm4gVChuKStSfX1lbHNlIHMucmFuZ2VCYW5kP3M9ZjpkLmNhbGwobixmLHMpO3YuY2FsbChuLHMsZiksbS5jYWxsKG4sZixmKX0pfXZhciB0LGU9dGEuc2NhbGUubGluZWFyKCkscj1qbCx1PTYsaT02LG89MyxhPVsxMF0sYz1udWxsO3JldHVybiBuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5vcmllbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCBpbiBGbD90KyIiOmpsLG4pOnJ9LG4udGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1hcmd1bWVudHMsbik6YX0sbi50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXQsbik6Y30sbi50aWNrRm9ybWF0PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi50aWNrU2l6ZT1mdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoO3JldHVybiBlPyh1PSt0LGk9K2FyZ3VtZW50c1tlLTFdLG4pOnV9LG4uaW5uZXJUaWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLm91dGVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3Qsbik6aX0sbi50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSxuLnRpY2tTdWJkaXZpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbn0sbn07dmFyIGpsPSJib3R0b20iLEZsPXt0b3A6MSxyaWdodDoxLGJvdHRvbToxLGxlZnQ6MX07dGEuc3ZnLmJydXNoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD10YS5zZWxlY3QodGhpcykuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKS5vbigibW91c2Vkb3duLmJydXNoIixpKS5vbigidG91Y2hzdGFydC5icnVzaCIsaSksbz10LnNlbGVjdEFsbCgiLmJhY2tncm91bmQiKS5kYXRhKFswXSk7by5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiYmFja2dyb3VuZCIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIikuc3R5bGUoImN1cnNvciIsImNyb3NzaGFpciIpLHQuc2VsZWN0QWxsKCIuZXh0ZW50IikuZGF0YShbMF0pLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJleHRlbnQiKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpO3ZhciBhPXQuc2VsZWN0QWxsKCIucmVzaXplIikuZGF0YSh2LHkpO2EuZXhpdCgpLnJlbW92ZSgpLGEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsZnVuY3Rpb24obil7cmV0dXJuInJlc2l6ZSAiK259KS5zdHlsZSgiY3Vyc29yIixmdW5jdGlvbihuKXtyZXR1cm4gSGxbbl19KS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IixmdW5jdGlvbihuKXtyZXR1cm4vW2V3XSQvLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoInkiLGZ1bmN0aW9uKG4pe3JldHVybi9eW25zXS8udGVzdChuKT8tMzpudWxsfSkuYXR0cigid2lkdGgiLDYpLmF0dHIoImhlaWdodCIsNikuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKSxhLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpO3ZhciBjLGY9dGEudHJhbnNpdGlvbih0KSxoPXRhLnRyYW5zaXRpb24obyk7bCYmKGM9VWkobCksaC5hdHRyKCJ4IixjWzBdKS5hdHRyKCJ3aWR0aCIsY1sxXS1jWzBdKSxyKGYpKSxzJiYoYz1VaShzKSxoLmF0dHIoInkiLGNbMF0pLmF0dHIoImhlaWdodCIsY1sxXS1jWzBdKSx1KGYpKSxlKGYpfSl9ZnVuY3Rpb24gZShuKXtuLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7cmV0dXJuInRyYW5zbGF0ZSgiK2ZbKy9lJC8udGVzdChuKV0rIiwiK2hbKy9ecy8udGVzdChuKV0rIikifSl9ZnVuY3Rpb24gcihuKXtuLnNlbGVjdCgiLmV4dGVudCIpLmF0dHIoIngiLGZbMF0pLG4uc2VsZWN0QWxsKCIuZXh0ZW50LC5uPnJlY3QsLnM+cmVjdCIpLmF0dHIoIndpZHRoIixmWzFdLWZbMF0pfWZ1bmN0aW9uIHUobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ5IixoWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwuZT5yZWN0LC53PnJlY3QiKS5hdHRyKCJoZWlnaHQiLGhbMV0taFswXSl9ZnVuY3Rpb24gaSgpe2Z1bmN0aW9uIGkoKXszMj09dGEuZXZlbnQua2V5Q29kZSYmKEN8fChNPW51bGwscVswXS09ZlsxXSxxWzFdLT1oWzFdLEM9MiksUygpKX1mdW5jdGlvbiB2KCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJjI9PUMmJihxWzBdKz1mWzFdLHFbMV0rPWhbMV0sQz0wLFMoKSl9ZnVuY3Rpb24gZCgpe3ZhciBuPXRhLm1vdXNlKGIpLHQ9ITE7eCYmKG5bMF0rPXhbMF0sblsxXSs9eFsxXSksQ3x8KHRhLmV2ZW50LmFsdEtleT8oTXx8KE09WyhmWzBdK2ZbMV0pLzIsKGhbMF0raFsxXSkvMl0pLHFbMF09ZlsrKG5bMF08TVswXSldLHFbMV09aFsrKG5bMV08TVsxXSldKTpNPW51bGwpLEEmJm0obixsLDApJiYocihrKSx0PSEwKSxOJiZtKG4scywxKSYmKHUoayksdD0hMCksdCYmKGUoayksdyh7dHlwZToiYnJ1c2giLG1vZGU6Qz8ibW92ZSI6InJlc2l6ZSJ9KSl9ZnVuY3Rpb24gbShuLHQsZSl7dmFyIHIsdSxpPVVpKHQpLGM9aVswXSxsPWlbMV0scz1xW2VdLHY9ZT9oOmYsZD12WzFdLXZbMF07cmV0dXJuIEMmJihjLT1zLGwtPWQrcykscj0oZT9wOmcpP01hdGgubWF4KGMsTWF0aC5taW4obCxuW2VdKSk6bltlXSxDP3U9KHIrPXMpK2Q6KE0mJihzPU1hdGgubWF4KGMsTWF0aC5taW4obCwyKk1bZV0tcikpKSxyPnM/KHU9cixyPXMpOnU9cyksdlswXSE9cnx8dlsxXSE9dT8oZT9hPW51bGw6bz1udWxsLHZbMF09cix2WzFdPXUsITApOnZvaWQgMH1mdW5jdGlvbiB5KCl7ZCgpLGsuc3R5bGUoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG4uZW1wdHkoKT8ibm9uZSI6bnVsbCksdGEuc2VsZWN0KCJib2R5Iikuc3R5bGUoImN1cnNvciIsbnVsbCksTC5vbigibW91c2Vtb3ZlLmJydXNoIixudWxsKS5vbigibW91c2V1cC5icnVzaCIsbnVsbCkub24oInRvdWNobW92ZS5icnVzaCIsbnVsbCkub24oInRvdWNoZW5kLmJydXNoIixudWxsKS5vbigia2V5ZG93bi5icnVzaCIsbnVsbCkub24oImtleXVwLmJydXNoIixudWxsKSx6KCksdyh7dHlwZToiYnJ1c2hlbmQifSl9dmFyIE0seCxiPXRoaXMsXz10YS5zZWxlY3QodGEuZXZlbnQudGFyZ2V0KSx3PWMub2YoYixhcmd1bWVudHMpLGs9dGEuc2VsZWN0KGIpLEU9Xy5kYXR1bSgpLEE9IS9eKG58cykkLy50ZXN0KEUpJiZsLE49IS9eKGV8dykkLy50ZXN0KEUpJiZzLEM9Xy5jbGFzc2VkKCJleHRlbnQiKSx6PVcoYikscT10YS5tb3VzZShiKSxMPXRhLnNlbGVjdCh0KGIpKS5vbigia2V5ZG93bi5icnVzaCIsaSkub24oImtleXVwLmJydXNoIix2KTtpZih0YS5ldmVudC5jaGFuZ2VkVG91Y2hlcz9MLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLGQpLm9uKCJ0b3VjaGVuZC5icnVzaCIseSk6TC5vbigibW91c2Vtb3ZlLmJydXNoIixkKS5vbigibW91c2V1cC5icnVzaCIseSksay5pbnRlcnJ1cHQoKS5zZWxlY3RBbGwoIioiKS5pbnRlcnJ1cHQoKSxDKXFbMF09ZlswXS1xWzBdLHFbMV09aFswXS1xWzFdO2Vsc2UgaWYoRSl7dmFyIFQ9Ky93JC8udGVzdChFKSxSPSsvXm4vLnRlc3QoRSk7eD1bZlsxLVRdLXFbMF0saFsxLVJdLXFbMV1dLHFbMF09ZltUXSxxWzFdPWhbUl19ZWxzZSB0YS5ldmVudC5hbHRLZXkmJihNPXEuc2xpY2UoKSk7ay5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJub25lIikuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLF8uc3R5bGUoImN1cnNvciIpKSx3KHt0eXBlOiJicnVzaHN0YXJ0In0pLGQoKX12YXIgbyxhLGM9RShuLCJicnVzaHN0YXJ0IiwiYnJ1c2giLCJicnVzaGVuZCIpLGw9bnVsbCxzPW51bGwsZj1bMCwwXSxoPVswLDBdLGc9ITAscD0hMCx2PU9sWzBdO3JldHVybiBuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPWMub2YodGhpcyxhcmd1bWVudHMpLHQ9e3g6Zix5OmgsaTpvLGo6YX0sZT10aGlzLl9fY2hhcnRfX3x8dDt0aGlzLl9fY2hhcnRfXz10LFRsP3RhLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKCkuZWFjaCgic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7bz1lLmksYT1lLmosZj1lLngsaD1lLnksbih7dHlwZToiYnJ1c2hzdGFydCJ9KX0pLnR3ZWVuKCJicnVzaDpicnVzaCIsZnVuY3Rpb24oKXt2YXIgZT15dShmLHQueCkscj15dShoLHQueSk7cmV0dXJuIG89YT1udWxsLGZ1bmN0aW9uKHUpe2Y9dC54PWUodSksaD10Lnk9cih1KSxuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pfX0pLmVhY2goImVuZC5icnVzaCIsZnVuY3Rpb24oKXtvPXQuaSxhPXQuaixuKHt0eXBlOiJicnVzaCIsbW9kZToicmVzaXplIn0pLG4oe3R5cGU6ImJydXNoZW5kIn0pfSk6KG4oe3R5cGU6ImJydXNoc3RhcnQifSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KSl9KX0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPXQsdj1PbFshbDw8MXwhc10sbik6bH0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsdj1PbFshbDw8MXwhc10sbik6c30sbi5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmcz8oZz0hIXRbMF0scD0hIXRbMV0pOmw/Zz0hIXQ6cyYmKHA9ISF0KSxuKTpsJiZzP1tnLHBdOmw/ZzpzP3A6bnVsbH0sbi5leHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGUscix1LGksYztyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obCYmKGU9dFswXSxyPXRbMV0scyYmKGU9ZVswXSxyPXJbMF0pLG89W2Uscl0sbC5pbnZlcnQmJihlPWwoZSkscj1sKHIpKSxlPnImJihjPWUsZT1yLHI9YyksKGUhPWZbMF18fHIhPWZbMV0pJiYoZj1bZSxyXSkpLHMmJih1PXRbMF0saT10WzFdLGwmJih1PXVbMV0saT1pWzFdKSxhPVt1LGldLHMuaW52ZXJ0JiYodT1zKHUpLGk9cyhpKSksdT5pJiYoYz11LHU9aSxpPWMpLCh1IT1oWzBdfHxpIT1oWzFdKSYmKGg9W3UsaV0pKSxuKToobCYmKG8/KGU9b1swXSxyPW9bMV0pOihlPWZbMF0scj1mWzFdLGwuaW52ZXJ0JiYoZT1sLmludmVydChlKSxyPWwuaW52ZXJ0KHIpKSxlPnImJihjPWUsZT1yLHI9YykpKSxzJiYoYT8odT1hWzBdLGk9YVsxXSk6KHU9aFswXSxpPWhbMV0scy5pbnZlcnQmJih1PXMuaW52ZXJ0KHUpLGk9cy5pbnZlcnQoaSkpLHU+aSYmKGM9dSx1PWksaT1jKSkpLGwmJnM/W1tlLHVdLFtyLGldXTpsP1tlLHJdOnMmJlt1LGldKX0sbi5jbGVhcj1mdW5jdGlvbigpe3JldHVybiBuLmVtcHR5KCl8fChmPVswLDBdLGg9WzAsMF0sbz1hPW51bGwpLG59LG4uZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hIWwmJmZbMF09PWZbMV18fCEhcyYmaFswXT09aFsxXX0sdGEucmViaW5kKG4sYywib24iKX07dmFyIEhsPXtuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LE9sPVtbIm4iLCJlIiwicyIsInciLCJudyIsIm5lIiwic2UiLCJzdyJdLFsiZSIsInciXSxbIm4iLCJzIl0sW11dLElsPWFjLmZvcm1hdD1nYy50aW1lRm9ybWF0LFlsPUlsLnV0YyxabD1ZbCgiJVktJW0tJWRUJUg6JU06JVMuJUxaIik7SWwuaXNvPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nJiYrbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP0pvOlpsLEpvLnBhcnNlPWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBEYXRlKG4pO3JldHVybiBpc05hTih0KT9udWxsOnR9LEpvLnRvU3RyaW5nPVpsLnRvU3RyaW5nLGFjLnNlY29uZD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IGNjKDFlMypNYXRoLmZsb29yKG4vMWUzKSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzFlMypNYXRoLmZsb29yKHQpKX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0U2Vjb25kcygpfSksYWMuc2Vjb25kcz1hYy5zZWNvbmQucmFuZ2UsYWMuc2Vjb25kcy51dGM9YWMuc2Vjb25kLnV0Yy5yYW5nZSxhYy5taW51dGU9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBjYyg2ZTQqTWF0aC5mbG9vcihuLzZlNCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSs2ZTQqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX0pLGFjLm1pbnV0ZXM9YWMubWludXRlLnJhbmdlLGFjLm1pbnV0ZXMudXRjPWFjLm1pbnV0ZS51dGMucmFuZ2UsYWMuaG91cj1GdChmdW5jdGlvbihuKXt2YXIgdD1uLmdldFRpbWV6b25lT2Zmc2V0KCkvNjA7cmV0dXJuIG5ldyBjYygzNmU1KihNYXRoLmZsb29yKG4vMzZlNS10KSt0KSl9LGZ1bmN0aW9uKG4sdCl7bi5zZXRUaW1lKG4uZ2V0VGltZSgpKzM2ZTUqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9KSxhYy5ob3Vycz1hYy5ob3VyLnJhbmdlLGFjLmhvdXJzLnV0Yz1hYy5ob3VyLnV0Yy5yYW5nZSxhYy5tb250aD1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXREYXRlKDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRNb250aChuLmdldE1vbnRoKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1vbnRoKCl9KSxhYy5tb250aHM9YWMubW9udGgucmFuZ2UsYWMubW9udGhzLnV0Yz1hYy5tb250aC51dGMucmFuZ2U7dmFyIFZsPVsxZTMsNWUzLDE1ZTMsM2U0LDZlNCwzZTUsOWU1LDE4ZTUsMzZlNSwxMDhlNSwyMTZlNSw0MzJlNSw4NjRlNSwxNzI4ZTUsNjA0OGU1LDI1OTJlNiw3Nzc2ZTYsMzE1MzZlNl0sWGw9W1thYy5zZWNvbmQsMV0sW2FjLnNlY29uZCw1XSxbYWMuc2Vjb25kLDE1XSxbYWMuc2Vjb25kLDMwXSxbYWMubWludXRlLDFdLFthYy5taW51dGUsNV0sW2FjLm1pbnV0ZSwxNV0sW2FjLm1pbnV0ZSwzMF0sW2FjLmhvdXIsMV0sW2FjLmhvdXIsM10sW2FjLmhvdXIsNl0sW2FjLmhvdXIsMTJdLFthYy5kYXksMV0sW2FjLmRheSwyXSxbYWMud2VlaywxXSxbYWMubW9udGgsMV0sW2FjLm1vbnRoLDNdLFthYy55ZWFyLDFdXSwkbD1JbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldE1pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEhvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXREYXkoKSYmMSE9bi5nZXREYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXREYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfV0sWyIlWSIsTmVdXSksQmw9e3JhbmdlOmZ1bmN0aW9uKG4sdCxlKXtyZXR1cm4gdGEucmFuZ2UoTWF0aC5jZWlsKG4vZSkqZSwrdCxlKS5tYXAoS28pfSxmbG9vcjp5LGNlaWw6eX07WGwueWVhcj1hYy55ZWFyLGFjLnNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIEdvKHRhLnNjYWxlLmxpbmVhcigpLFhsLCRsKX07dmFyIFdsPVhsLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bblswXS51dGMsblsxXV19KSxKbD1ZbC5tdWx0aShbWyIuJUwiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbGxpc2Vjb25kcygpfV0sWyI6JVMiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ1NlY29uZHMoKX1dLFsiJUk6JU0iLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ01pbnV0ZXMoKX1dLFsiJUkgJXAiLGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFVUQ0hvdXJzKCl9XSxbIiVhICVkIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENEYXkoKSYmMSE9bi5nZXRVVENEYXRlKCl9XSxbIiViICVkIixmdW5jdGlvbihuKXtyZXR1cm4gMSE9bi5nZXRVVENEYXRlKCl9XSxbIiVCIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNb250aCgpfV0sWyIlWSIsTmVdXSk7V2wueWVhcj1hYy55ZWFyLnV0YyxhYy5zY2FsZS51dGM9ZnVuY3Rpb24oKXtyZXR1cm4gR28odGEuc2NhbGUubGluZWFyKCksV2wsSmwpfSx0YS50ZXh0PUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlVGV4dH0pLHRhLmpzb249ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwiYXBwbGljYXRpb24vanNvbiIsUW8sdCl9LHRhLmh0bWw9ZnVuY3Rpb24obix0KXtyZXR1cm4gTnQobiwidGV4dC9odG1sIixuYSx0KX0sdGEueG1sPUF0KGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlc3BvbnNlWE1MfSksImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodGEpOiJvYmplY3QiPT10eXBlb2YgbW9kdWxlJiZtb2R1bGUuZXhwb3J0cyYmKG1vZHVsZS5leHBvcnRzPXRhKSx0aGlzLmQzPXRhfSgpOw=="></script>
<link href="data:text/css;charset=utf-8,%2Eparcoords%20%3E%20svg%2C%20%2Eparcoords%20%3E%20canvas%20%7B%0Afont%3A%2014px%20sans%2Dserif%3B%0Aposition%3A%20absolute%3B%0A%7D%0A%2Eparcoords%20%3E%20canvas%20%7B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Eparcoords%20text%2Elabel%20%7B%0Acursor%3A%20default%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%20%7B%0Afill%3A%20transparent%3B%0A%7D%0A%2Eparcoords%20rect%2Ebackground%3Ahover%20%7B%0Afill%3A%20rgba%28120%2C120%2C120%2C0%2E2%29%3B%0A%7D%0A%2Eparcoords%20%2Eresize%20rect%20%7B%0Afill%3A%20rgba%280%2C0%2C0%2C0%2E1%29%3B%0A%7D%0A%2Eparcoords%20rect%2Eextent%20%7B%0Afill%3A%20rgba%28255%2C255%2C255%2C0%2E25%29%3B%0Astroke%3A%20rgba%280%2C0%2C0%2C0%2E6%29%3B%0A%7D%0A%2Eparcoords%20%2Eaxis%20line%2C%20%2Eparcoords%20%2Eaxis%20path%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20%23222%3B%0Ashape%2Drendering%3A%20crispEdges%3B%0A%7D%0A%2Eparcoords%20canvas%20%7B%0Aopacity%3A%201%3B%0A%2Dmoz%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Dwebkit%2Dtransition%3A%20opacity%200%2E3s%3B%0A%2Do%2Dtransition%3A%20opacity%200%2E3s%3B%0A%7D%0A%2Eparcoords%20canvas%2Efaded%20%7B%0Aopacity%3A%200%2E25%3B%0A%7D%0A%2Eparcoords%20%7B%0A%2Dwebkit%2Dtouch%2Dcallout%3A%20none%3B%0A%2Dwebkit%2Duser%2Dselect%3A%20none%3B%0A%2Dkhtml%2Duser%2Dselect%3A%20none%3B%0A%2Dmoz%2Duser%2Dselect%3A%20none%3B%0A%2Dms%2Duser%2Dselect%3A%20none%3B%0Auser%2Dselect%3A%20none%3B%0Abackground%2Dcolor%3A%20white%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uICgpIHsNCiAgZDMuc3ZnLm11bHRpYnJ1c2ggPSBmdW5jdGlvbigpIHsNCg0KICAgIC8vIEZyb20gZDMvc2NhbGUvc2NhbGUuanMNCiAgICBmdW5jdGlvbiBkM19zY2FsZUV4dGVudChkb21haW4pIHsNCiAgICAgIHZhciBzdGFydCA9IGRvbWFpblswXSwgc3RvcCA9IGRvbWFpbltkb21haW4ubGVuZ3RoIC0gMV07DQogICAgICByZXR1cm4gc3RhcnQgPCBzdG9wID8gWyBzdGFydCwgc3RvcCBdIDogWyBzdG9wLCBzdGFydCBdOw0KICAgIH0NCiAgICBmdW5jdGlvbiBkM19zY2FsZVJhbmdlKHNjYWxlKSB7DQogICAgICByZXR1cm4gc2NhbGUucmFuZ2VFeHRlbnQgPyBzY2FsZS5yYW5nZUV4dGVudCgpIDogZDNfc2NhbGVFeHRlbnQoc2NhbGUucmFuZ2UoKSk7DQogICAgfQ0KDQogICAgLy8gRnJvbSBkMw0KICAgIHZhciBkM19kb2N1bWVudCA9IHRoaXMuZG9jdW1lbnQ7DQogICAgZnVuY3Rpb24gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpIHsNCiAgICAgIHJldHVybiBub2RlICYmIChub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZS5kb2N1bWVudCB8fCBub2RlKS5kb2N1bWVudEVsZW1lbnQ7DQogICAgfQ0KICAgIGZ1bmN0aW9uIGQzX3dpbmRvdyhub2RlKSB7DQogICAgICByZXR1cm4gbm9kZSAmJiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCBub2RlLmRvY3VtZW50ICYmIG5vZGUgfHwgbm9kZS5kZWZhdWx0Vmlldyk7DQogICAgfQ0KICAgIGlmIChkM19kb2N1bWVudCkgew0KICAgICAgdHJ5IHsNCiAgICAgICAgZDNfYXJyYXkoZDNfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpWzBdLm5vZGVUeXBlOw0KICAgICAgfSBjYXRjaCAoZSkgew0KICAgICAgICBkM19hcnJheSA9IGZ1bmN0aW9uKGxpc3QpIHsNCiAgICAgICAgICB2YXIgaSA9IGxpc3QubGVuZ3RoLCBhcnJheSA9IG5ldyBBcnJheShpKTsNCiAgICAgICAgICB3aGlsZSAoaS0tKSBhcnJheVtpXSA9IGxpc3RbaV07DQogICAgICAgICAgcmV0dXJuIGFycmF5Ow0KICAgICAgICB9Ow0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKSB7DQogICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGQzX3ZlbmRvclN5bWJvbChvYmplY3QsIG5hbWUpIHsNCiAgICAgIGlmIChuYW1lIGluIG9iamVjdCkgcmV0dXJuIG5hbWU7DQogICAgICBuYW1lID0gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoMSk7DQogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGQzX3ZlbmRvclByZWZpeGVzLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgICAgICB2YXIgcHJlZml4TmFtZSA9IGQzX3ZlbmRvclByZWZpeGVzW2ldICsgbmFtZTsNCiAgICAgICAgaWYgKHByZWZpeE5hbWUgaW4gb2JqZWN0KSByZXR1cm4gcHJlZml4TmFtZTsNCiAgICAgIH0NCiAgICB9DQogICAgdmFyIGQzX3ZlbmRvclByZWZpeGVzID0gWyAid2Via2l0IiwgIm1zIiwgIm1veiIsICJNb3oiLCAibyIsICJPIiBdOw0KDQogICAgdmFyIGQzX2V2ZW50X2RyYWdTZWxlY3QgPSAib25zZWxlY3RzdGFydCIgaW4gZG9jdW1lbnQgPyBudWxsIDogZDNfdmVuZG9yU3ltYm9sKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSwgInVzZXJTZWxlY3QiKSwgZDNfZXZlbnRfZHJhZ0lkID0gMDsNCiAgICBmdW5jdGlvbiBkM19ldmVudF9kcmFnU3VwcHJlc3Mobm9kZSkgew0KICAgICAgdmFyIG5hbWUgPSAiLmRyYWdzdXBwcmVzcy0iICsgKytkM19ldmVudF9kcmFnSWQsIGNsaWNrID0gImNsaWNrIiArIG5hbWUsIHcgPSBkMy5zZWxlY3QoZDNfd2luZG93KG5vZGUpKS5vbigidG91Y2htb3ZlIiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpLm9uKCJkcmFnc3RhcnQiICsgbmFtZSwgZDNfZXZlbnRQcmV2ZW50RGVmYXVsdCkub24oInNlbGVjdHN0YXJ0IiArIG5hbWUsIGQzX2V2ZW50UHJldmVudERlZmF1bHQpOw0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QgPT0gbnVsbCkgew0KICAgICAgICBkM19ldmVudF9kcmFnU2VsZWN0ID0gIm9uc2VsZWN0c3RhcnQiIGluIG5vZGUgPyBmYWxzZSA6IGQzX3ZlbmRvclN5bWJvbChub2RlLnN0eWxlLCAidXNlclNlbGVjdCIpOw0KICAgICAgfQ0KICAgICAgaWYgKGQzX2V2ZW50X2RyYWdTZWxlY3QpIHsNCiAgICAgICAgdmFyIHN0eWxlID0gZDNfZG9jdW1lbnRFbGVtZW50KG5vZGUpLnN0eWxlLCBzZWxlY3QgPSBzdHlsZVtkM19ldmVudF9kcmFnU2VsZWN0XTsNCiAgICAgICAgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSAibm9uZSI7DQogICAgICB9DQogICAgICByZXR1cm4gZnVuY3Rpb24oc3VwcHJlc3NDbGljaykgew0KICAgICAgICB3Lm9uKG5hbWUsIG51bGwpOw0KICAgICAgICBpZiAoZDNfZXZlbnRfZHJhZ1NlbGVjdCkgc3R5bGVbZDNfZXZlbnRfZHJhZ1NlbGVjdF0gPSBzZWxlY3Q7DQogICAgICAgIGlmIChzdXBwcmVzc0NsaWNrKSB7DQogICAgICAgICAgdmFyIG9mZiA9IGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgdy5vbihjbGljaywgbnVsbCk7DQogICAgICAgICAgfTsNCiAgICAgICAgICB3Lm9uKGNsaWNrLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgIGQzX2V2ZW50UHJldmVudERlZmF1bHQoKTsNCiAgICAgICAgICAgIG9mZigpOw0KICAgICAgICAgIH0sIHRydWUpOw0KICAgICAgICAgIHNldFRpbWVvdXQob2ZmLCAwKTsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9DQoNCiAgICB2YXIgZXZlbnQgPSBkMy5kaXNwYXRjaCgiYnJ1c2hzdGFydCIsICJicnVzaCIsICJicnVzaGVuZCIpLA0KICAgICAgICBicnVzaEVsZW1lbnQsDQogICAgICAgIHggPSBudWxsLCAvLyB4LXNjYWxlLCBvcHRpb25hbA0KICAgICAgICB5ID0gbnVsbCwgLy8geS1zY2FsZSwgb3B0aW9uYWwNCiAgICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCAvLyBbeDAsIHgxXSBpbiBpbnRlZ2VyIHBpeGVscw0KICAgICAgICB5RXh0ZW50ID0gW1swLCAwXV0sIC8vIFt5MCwgeTFdIGluIGludGVnZXIgcGl4ZWxzDQogICAgICAgIHhFeHRlbnREb21haW4gPSBbXSwgLy8geC1leHRlbnQgaW4gZGF0YSBzcGFjZQ0KICAgICAgICB5RXh0ZW50RG9tYWluID0gW10sIC8vIHktZXh0ZW50IGluIGRhdGEgc3BhY2UNCiAgICAgICAgeENsYW1wID0gdHJ1ZSwgLy8gd2hldGhlciB0byBjbGFtcCB0aGUgeC1leHRlbnQgdG8gdGhlIHJhbmdlDQogICAgICAgIHlDbGFtcCA9IHRydWUsIC8vIHdoZXRoZXIgdG8gY2xhbXAgdGhlIHktZXh0ZW50IHRvIHRoZSByYW5nZQ0KICAgICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1swXSwNCiAgICAgICAgcmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbiAoKSB7fSwgLy8gRnVuY3Rpb24gdG8gJ2NhbGwnIG9uIG5ldyByZXNpemUgc2VsZWN0aW9uDQogICAgICAgIGV4dGVudEFkYXB0aW9uID0gZnVuY3Rpb24gKCkge307IC8vIEZ1bmN0aW9uIHRvICdjYWxsJyBvbiBuZXcgZXh0ZW50IHNlbGVjdGlvbg0KDQogICAgZXZlbnQub2YgPSBmdW5jdGlvbih0aGl6LCBhcmd1bWVudHopIHsNCiAgICAgIHJldHVybiBmdW5jdGlvbihlMSkgew0KICAgICAgICB0cnkgew0KICAgICAgICAgIHZhciBlMCA9DQogICAgICAgICAgZTEuc291cmNlRXZlbnQgPSBkMy5ldmVudDsNCiAgICAgICAgICBlMS50YXJnZXQgPSBicnVzaDsNCiAgICAgICAgICBkMy5ldmVudCA9IGUxOw0KICAgICAgICAgIGV2ZW50W2UxLnR5cGVdLmFwcGx5KHRoaXosIGFyZ3VtZW50eik7DQogICAgICAgIH0gZmluYWxseSB7DQogICAgICAgICAgZDMuZXZlbnQgPSBlMDsNCiAgICAgICAgfQ0KICAgICAgfTsNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gYnJ1c2goZykgew0KICAgICAgZy5lYWNoKGZ1bmN0aW9uKCkgew0KDQogICAgICAgIC8vIFByZXBhcmUgdGhlIGJydXNoIGNvbnRhaW5lciBmb3IgZXZlbnRzLg0KICAgICAgICB2YXIgZyA9IGQzLnNlbGVjdCh0aGlzKQ0KICAgICAgICAgICAgLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQ0KICAgICAgICAgICAgLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpDQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIGJydXNoc3RhcnQpDQogICAgICAgICAgICAub24oInRvdWNoc3RhcnQuYnJ1c2giLCBicnVzaHN0YXJ0KTsNCg0KICAgICAgICBicnVzaEVsZW1lbnQgPSBnOw0KDQogICAgICAgIC8vIEFuIGludmlzaWJsZSwgbW91c2VhYmxlIGFyZWEgZm9yIHN0YXJ0aW5nIGEgbmV3IGJydXNoLg0KICAgICAgICB2YXIgYmFja2dyb3VuZCA9IGcuc2VsZWN0QWxsKCIuYmFja2dyb3VuZCIpDQogICAgICAgICAgICAuZGF0YShbMF0pOw0KDQogICAgICAgIGJhY2tncm91bmQuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQ0KICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImJhY2tncm91bmQiKQ0KICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpDQogICAgICAgICAgICAuc3R5bGUoImN1cnNvciIsICJjcm9zc2hhaXIiKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cyhnKTsNCg0KICAgICAgICAvLyBXaGVuIGNhbGxlZCBvbiBhIHRyYW5zaXRpb24sIHVzZSBhIHRyYW5zaXRpb24gdG8gdXBkYXRlLg0KICAgICAgICB2YXIgZ1VwZGF0ZSA9IGQzLnRyYW5zaXRpb24oZyksDQogICAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlID0gZDMudHJhbnNpdGlvbihiYWNrZ3JvdW5kKSwNCiAgICAgICAgICAgIHJhbmdlOw0KDQogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGJhY2tncm91bmQgdG8gZmlsbCB0aGUgZGVmaW5lZCByYW5nZS4NCiAgICAgICAgLy8gSWYgdGhlIHJhbmdlIGlzbid0IGRlZmluZWQsIHlvdSBjYW4gcG9zdC1wcm9jZXNzLg0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIHJhbmdlID0gZDNfc2NhbGVSYW5nZSh4KTsNCiAgICAgICAgICBiYWNrZ3JvdW5kVXBkYXRlLmF0dHIoIngiLCByYW5nZVswXSkuYXR0cigid2lkdGgiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdYKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgcmFuZ2UgPSBkM19zY2FsZVJhbmdlKHkpOw0KICAgICAgICAgIGJhY2tncm91bmRVcGRhdGUuYXR0cigieSIsIHJhbmdlWzBdKS5hdHRyKCJoZWlnaHQiLCByYW5nZVsxXSAtIHJhbmdlWzBdKTsNCiAgICAgICAgICByZWRyYXdZKGdVcGRhdGUpOw0KICAgICAgICB9DQogICAgICAgIHJlZHJhdyhnVXBkYXRlKTsNCiAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGRyYXdFeHRlbnRzKGcpIHsNCiAgICAgIHZhciBleCA9IHhFeHRlbnQubGVuZ3RoID4geUV4dGVudC5sZW5ndGggPyB4RXh0ZW50IDogeUV4dGVudCwNCiAgICAgICAgICBpID0gZXgubGVuZ3RoDQogICAgICAgICAgZXh0ZW50QXJyID0gZXgubWFwKGZ1bmN0aW9uKGQsaSkgeyByZXR1cm4gaTsgfSksDQogICAgICAgICAgZXh0ZW50UmVzaXplcyA9IGQzLm1lcmdlKGV4Lm1hcChmdW5jdGlvbihkLGkpIHsgcmV0dXJuIHJlc2l6ZXMubWFwKGZ1bmN0aW9uKHIpIHsgcmV0dXJuIFtyLCBpXTsgfSk7IH0pKTsNCg0KICAgICAgaWYoIWcpIGcgPSBicnVzaEVsZW1lbnQ7DQoNCiAgICAgIC8vIFRoZSB2aXNpYmxlIGJydXNoIGV4dGVudDsgc3R5bGUgdGhpcyBhcyB5b3UgbGlrZSENCiAgICAgIHZhciBleHRlbnQgPSBnLnNlbGVjdEFsbCgiLmV4dGVudCIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50QXJyLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZDsgfSk7DQoNCiAgICAgIGV4dGVudC5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIGV4dGVudC5lbnRlcigpLmFwcGVuZCgicmVjdCIpDQogICAgICAgICAgLmF0dHIoImNsYXNzIiwgImV4dGVudCIpDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCAibW92ZSIpDQogICAgICAgICAgLmNhbGwoZXh0ZW50QWRhcHRpb24pOw0KDQogICAgICAvLyBNb3JlIGludmlzaWJsZSByZWN0cyBmb3IgcmVzaXppbmcgdGhlIGV4dGVudC4NCiAgICAgIHZhciByZXNpemUgPSBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpDQogICAgICAgICAgLmRhdGEoZXh0ZW50UmVzaXplcywgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMF0gKyBkWzFdOyB9KTsNCg0KICAgICAgLy8gUmVtb3ZlIGFueSBzdXBlcmZsdW91cyByZXNpemVycy4NCiAgICAgIHJlc2l6ZS5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIHZhciBuZXdSZXNpemUgPSByZXNpemUuZW50ZXIoKS5hcHBlbmQoImciKQ0KICAgICAgICAgIC5hdHRyKCJjbGFzcyIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuICJyZXNpemUgIiArIGRbMF07IH0pDQogICAgICAgICAgLnN0eWxlKCJjdXJzb3IiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkM19zdmdfYnJ1c2hDdXJzb3JbZFswXV07IH0pOw0KDQogICAgICBuZXdSZXNpemUuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9bZXddJC8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIC9eW25zXS8udGVzdChkWzBdKSA/IC0zIDogbnVsbDsgfSkNCiAgICAgICAgICAuYXR0cigid2lkdGgiLCA2KQ0KICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCA2KQ0KICAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsNCg0KICAgICAgbmV3UmVzaXplLmNhbGwocmVzaXplQWRhcHRpb24pOw0KDQogICAgICAvLyBTaG93IG9yIGhpZGUgdGhlIHJlc2l6ZXJzLg0KICAgICAgcmVzaXplLnN0eWxlKCJkaXNwbGF5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgfQ0KDQogICAgYnJ1c2guZXZlbnQgPSBmdW5jdGlvbihnKSB7DQogICAgICBnLmVhY2goZnVuY3Rpb24oKSB7DQogICAgICAgIHZhciBldmVudF8gPSBldmVudC5vZih0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICAgICAgZXh0ZW50MSA9IHt4OiB4RXh0ZW50LCB5OiB5RXh0ZW50LCBpOiB4RXh0ZW50RG9tYWluLCBqOiB5RXh0ZW50RG9tYWlufSwNCiAgICAgICAgICAgIGV4dGVudDAgPSB0aGlzLl9fY2hhcnRfXyB8fCBleHRlbnQxOw0KICAgICAgICB0aGlzLl9fY2hhcnRfXyA9IGV4dGVudDE7DQogICAgICAgIGlmIChkM190cmFuc2l0aW9uSW5oZXJpdElkKSB7DQogICAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24oKQ0KICAgICAgICAgICAgICAuZWFjaCgic3RhcnQuYnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICB4RXh0ZW50RG9tYWluID0gZXh0ZW50MC5pOyAvLyBwcmUtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQwLmo7DQogICAgICAgICAgICAgICAgeEV4dGVudCA9IGV4dGVudDAueDsNCiAgICAgICAgICAgICAgICB5RXh0ZW50ID0gZXh0ZW50MC55Ow0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoc3RhcnQifSk7DQogICAgICAgICAgICAgIH0pDQogICAgICAgICAgICAgIC50d2VlbigiYnJ1c2g6YnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgICAgICAgICAvLyBUT0RPOiB0cmFuc2l0aW9ucyBmb3IgYWxsIGV4dGVudHMNCiAgICAgICAgICAgICAgICB2YXIgeGkgPSBkM19pbnRlcnBvbGF0ZUFycmF5KHhFeHRlbnRbMF0sIGV4dGVudDEueFswXSksDQogICAgICAgICAgICAgICAgICAgIHlpID0gZDNfaW50ZXJwb2xhdGVBcnJheSh5RXh0ZW50WzBdLCBleHRlbnQxLnlbMF0pOw0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW5bMF0gPSB5RXh0ZW50RG9tYWluWzBdID0gbnVsbDsgLy8gdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICAgICAgICAgICAgICB4RXh0ZW50WzBdID0gZXh0ZW50MS54WzBdID0geGkodCk7DQogICAgICAgICAgICAgICAgICB5RXh0ZW50WzBdID0gZXh0ZW50MS55WzBdID0geWkodCk7DQogICAgICAgICAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaCIsIG1vZGU6ICJyZXNpemUifSk7DQogICAgICAgICAgICAgICAgfTsNCiAgICAgICAgICAgICAgfSkNCiAgICAgICAgICAgICAgLmVhY2goImVuZC5icnVzaCIsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgICAgICAgIHhFeHRlbnREb21haW4gPSBleHRlbnQxLmk7IC8vIHBvc3QtdHJhbnNpdGlvbiBzdGF0ZQ0KICAgICAgICAgICAgICAgIHlFeHRlbnREb21haW4gPSBleHRlbnQxLmo7DQogICAgICAgICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiAicmVzaXplIn0pOw0KICAgICAgICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgICAgICAgICB9KTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaHN0YXJ0In0pOw0KICAgICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoIiwgbW9kZTogInJlc2l6ZSJ9KTsNCiAgICAgICAgICBldmVudF8oe3R5cGU6ICJicnVzaGVuZCJ9KTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIHJlZHJhdyhnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhFeHRlbnRbZFsxXV1bKy9lJC8udGVzdChkWzBdKV0gKyAiLCIgKyB5RXh0ZW50W2RbMV1dWysvXnMvLnRlc3QoZFswXSldICsgIikiOw0KICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVkcmF3WChnKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIngiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geEV4dGVudFtkXVswXTsgfSk7DQogICAgICBnLnNlbGVjdEFsbCgiLmV4dGVudCIpLmF0dHIoIndpZHRoIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4geEV4dGVudFtkXVsxXSAtIHhFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlZHJhd1koZykgew0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJ5IiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgICAgZy5zZWxlY3RBbGwoIi5leHRlbnQiKS5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4geUV4dGVudFtkXVsxXSAtIHlFeHRlbnRbZF1bMF07IH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGJydXNoc3RhcnQoKSB7DQogICAgICB2YXIgdGFyZ2V0ID0gdGhpcywNCiAgICAgICAgICBldmVudFRhcmdldCA9IGQzLnNlbGVjdChkMy5ldmVudC50YXJnZXQpLA0KICAgICAgICAgIGV2ZW50XyA9IGV2ZW50Lm9mKHRhcmdldCwgYXJndW1lbnRzKSwNCiAgICAgICAgICBnID0gZDMuc2VsZWN0KHRhcmdldCksDQogICAgICAgICAgcmVzaXppbmcgPSBldmVudFRhcmdldC5kYXR1bSgpWzBdLA0KICAgICAgICAgIHJlc2l6aW5nWCA9ICEvXihufHMpJC8udGVzdChyZXNpemluZykgJiYgeCwNCiAgICAgICAgICByZXNpemluZ1kgPSAhL14oZXx3KSQvLnRlc3QocmVzaXppbmcpICYmIHksDQogICAgICAgICAgZHJhZ2dpbmcgPSBldmVudFRhcmdldC5jbGFzc2VkKCJleHRlbnQiKSwNCiAgICAgICAgICBkcmFnUmVzdG9yZSA9IGQzX2V2ZW50X2RyYWdTdXBwcmVzcyh0YXJnZXQpLA0KICAgICAgICAgIGNlbnRlciwNCiAgICAgICAgICBvcmlnaW4gPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgIG9mZnNldCwNCiAgICAgICAgICBpOw0KDQogICAgICB2YXIgdyA9IGQzLnNlbGVjdCh3aW5kb3cpDQogICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bikNCiAgICAgICAgICAub24oImtleXVwLmJydXNoIiwga2V5dXApOw0KDQogICAgICBpZiAoZDMuZXZlbnQuY2hhbmdlZFRvdWNoZXMpIHsNCiAgICAgICAgdy5vbigidG91Y2htb3ZlLmJydXNoIiwgYnJ1c2htb3ZlKS5vbigidG91Y2hlbmQuYnJ1c2giLCBicnVzaGVuZCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB3Lm9uKCJtb3VzZW1vdmUuYnJ1c2giLCBicnVzaG1vdmUpLm9uKCJtb3VzZXVwLmJydXNoIiwgYnJ1c2hlbmQpOw0KICAgICAgfQ0KDQogICAgICAvLyBJbnRlcnJ1cHQgdGhlIHRyYW5zaXRpb24sIGlmIGFueS4NCiAgICAgIGcuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCk7DQoNCiAgICAgIC8vIElmIHRoZSBleHRlbnQgd2FzIGNsaWNrZWQgb24sIGRyYWcgcmF0aGVyIHRoYW4gYnJ1c2g7DQogICAgICAvLyBzdG9yZSB0aGUgcG9pbnQgYmV0d2VlbiB0aGUgbW91c2UgYW5kIGV4dGVudCBvcmlnaW4gaW5zdGVhZC4NCiAgICAgIGlmIChkcmFnZ2luZykgew0KICAgICAgICBpID0gZXZlbnRUYXJnZXQuZGF0dW0oKTsNCiAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVswXSAtIG9yaWdpblswXTsNCiAgICAgICAgb3JpZ2luWzFdID0geUV4dGVudFtpXVswXSAtIG9yaWdpblsxXTsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgYSByZXNpemVyIHdhcyBjbGlja2VkIG9uLCByZWNvcmQgd2hpY2ggc2lkZSBpcyB0byBiZSByZXNpemVkLg0KICAgICAgLy8gQWxzbywgc2V0IHRoZSBvcmlnaW4gdG8gdGhlIG9wcG9zaXRlIHNpZGUuDQogICAgICBlbHNlIGlmIChyZXNpemluZykgew0KICAgICAgICB2YXIgZXggPSArL3ckLy50ZXN0KHJlc2l6aW5nKSwNCiAgICAgICAgICAgIGV5ID0gKy9ebi8udGVzdChyZXNpemluZyk7DQoNCiAgICAgICAgaSA9IGV2ZW50VGFyZ2V0LmRhdHVtKClbMV07DQogICAgICAgIG9mZnNldCA9IFt4RXh0ZW50W2ldWzEgLSBleF0gLSBvcmlnaW5bMF0sIHlFeHRlbnRbaV1bMSAtIGV5XSAtIG9yaWdpblsxXV07DQogICAgICAgIG9yaWdpblswXSA9IHhFeHRlbnRbaV1bZXhdOw0KICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldW2V5XTsNCiAgICAgIH0NCg0KICAgICAgZWxzZSB7DQogICAgICAgIGkgPSB4RXh0ZW50Lmxlbmd0aCAtIDE7IC8vIEZpZ3VyZSBvdXQgdGhlIGNvdW50IG9mIHRoZSBuZXcgZXh0ZW50Lg0KICAgICAgICB4RXh0ZW50LnB1c2goWzAsMF0pOw0KICAgICAgICB5RXh0ZW50LnB1c2goWzAsMF0pOw0KDQogICAgICAgIC8vIElmIHRoZSBBTFQga2V5IGlzIGRvd24gd2hlbiBzdGFydGluZyBhIGJydXNoLCB0aGUgY2VudGVyIGlzIGF0IHRoZSBtb3VzZS4NCiAgICAgICAgaWYgKGQzLmV2ZW50LmFsdEtleSkgY2VudGVyID0gb3JpZ2luLnNsaWNlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYWN0aXZlIGN1cnNvciB0byB0aGUgYm9keSBmb3IgdGhlIGRyYWcgZHVyYXRpb24uDQogICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7DQogICAgICBkMy5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIiwgZXZlbnRUYXJnZXQuc3R5bGUoImN1cnNvciIpKTsNCg0KICAgICAgLy8gU2hvdyByZXNpemVycyBhcyBsb25nIGFzIHdlJ3JlIG5vdCBkcmFnZ2luZyBvciByZXNpemluZy4NCiAgICAgIGlmKCFkcmFnZ2luZyAmJiAhcmVzaXppbmcpIGcuc2VsZWN0QWxsKCIucmVzaXplIikuc3R5bGUoImRpc3BsYXkiLCBudWxsKQ0KDQogICAgICAvLyBOb3RpZnkgbGlzdGVuZXJzLg0KICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2hzdGFydCJ9KTsNCiAgICAgIGJydXNobW92ZSgpOw0KDQogICAgICBmdW5jdGlvbiBrZXlkb3duKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMikgew0KICAgICAgICAgIGlmICghZHJhZ2dpbmcpIHsNCiAgICAgICAgICAgIGNlbnRlciA9IG51bGw7DQogICAgICAgICAgICBvcmlnaW5bMF0gLT0geEV4dGVudFtpXVsxXTsNCiAgICAgICAgICAgIG9yaWdpblsxXSAtPSB5RXh0ZW50W2ldWzFdOw0KICAgICAgICAgICAgZHJhZ2dpbmcgPSAyOw0KICAgICAgICAgIH0NCiAgICAgICAgICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIGZ1bmN0aW9uIGtleXVwKCkgew0KICAgICAgICBpZiAoZDMuZXZlbnQua2V5Q29kZSA9PSAzMiAmJiBkcmFnZ2luZyA9PSAyKSB7DQogICAgICAgICAgb3JpZ2luWzBdICs9IHhFeHRlbnRbaV1bMV07DQogICAgICAgICAgb3JpZ2luWzFdICs9IHlFeHRlbnRbaV1bMV07DQogICAgICAgICAgZHJhZ2dpbmcgPSAwOw0KICAgICAgICAgIGQzLmV2ZW50LnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gYnJ1c2htb3ZlKCkgew0KICAgICAgICB2YXIgcG9pbnQgPSBkMy5tb3VzZSh0YXJnZXQpLA0KICAgICAgICAgICAgbW92ZWQgPSBmYWxzZTsNCg0KICAgICAgICAvLyBQcmVzZXJ2ZSB0aGUgb2Zmc2V0IGZvciB0aGljayByZXNpemVycy4NCiAgICAgICAgaWYgKG9mZnNldCkgew0KICAgICAgICAgIHBvaW50WzBdICs9IG9mZnNldFswXTsNCiAgICAgICAgICBwb2ludFsxXSArPSBvZmZzZXRbMV07DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWRyYWdnaW5nKSB7DQoNCiAgICAgICAgICAvLyBJZiBuZWVkZWQsIGRldGVybWluZSB0aGUgY2VudGVyIGZyb20gdGhlIGN1cnJlbnQgZXh0ZW50Lg0KICAgICAgICAgIGlmIChkMy5ldmVudC5hbHRLZXkpIHsNCiAgICAgICAgICAgIGlmICghY2VudGVyKSBjZW50ZXIgPSBbKHhFeHRlbnRbaV1bMF0gKyB4RXh0ZW50W2ldWzFdKSAvIDIsICh5RXh0ZW50W2ldWzBdICsgeUV4dGVudFtpXVsxXSkgLyAyXTsNCg0KICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBvcmlnaW4sIGZvciB3aGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLg0KICAgICAgICAgICAgb3JpZ2luWzBdID0geEV4dGVudFtpXVsrKHBvaW50WzBdIDwgY2VudGVyWzBdKV07DQogICAgICAgICAgICBvcmlnaW5bMV0gPSB5RXh0ZW50W2ldWysocG9pbnRbMV0gPCBjZW50ZXJbMV0pXTsNCiAgICAgICAgICB9DQoNCiAgICAgICAgICAvLyBXaGVuIHRoZSBBTFQga2V5IGlzIHJlbGVhc2VkLCB3ZSBjbGVhciB0aGUgY2VudGVyLg0KICAgICAgICAgIGVsc2UgY2VudGVyID0gbnVsbDsNCiAgICAgICAgfQ0KDQogICAgICAgIC8vIFVwZGF0ZSB0aGUgYnJ1c2ggZXh0ZW50IGZvciBlYWNoIGRpbWVuc2lvbi4NCiAgICAgICAgaWYgKHJlc2l6aW5nWCAmJiBtb3ZlMShwb2ludCwgeCwgMCkpIHsNCiAgICAgICAgICByZWRyYXdYKGcsIGkpOw0KICAgICAgICAgIG1vdmVkID0gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAocmVzaXppbmdZICYmIG1vdmUxKHBvaW50LCB5LCAxKSkgew0KICAgICAgICAgIHJlZHJhd1koZywgaSk7DQogICAgICAgICAgbW92ZWQgPSB0cnVlOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gRmluYWwgcmVkcmF3IGFuZCBub3RpZnkgbGlzdGVuZXJzLg0KICAgICAgICBpZiAobW92ZWQpIHsNCiAgICAgICAgICByZWRyYXcoZyk7DQogICAgICAgICAgZXZlbnRfKHt0eXBlOiAiYnJ1c2giLCBtb2RlOiBkcmFnZ2luZyA/ICJtb3ZlIiA6ICJyZXNpemUifSk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgZnVuY3Rpb24gbW92ZTEocG9pbnQsIHNjYWxlLCBqKSB7DQogICAgICAgIHZhciByYW5nZSA9IGQzX3NjYWxlUmFuZ2Uoc2NhbGUpLA0KICAgICAgICAgICAgcjAgPSByYW5nZVswXSwNCiAgICAgICAgICAgIHIxID0gcmFuZ2VbMV0sDQogICAgICAgICAgICBwb3NpdGlvbiA9IG9yaWdpbltqXSwNCiAgICAgICAgICAgIGV4dGVudCA9IGogPyB5RXh0ZW50W2ldIDogeEV4dGVudFtpXSwNCiAgICAgICAgICAgIHNpemUgPSBleHRlbnRbMV0gLSBleHRlbnRbMF0sDQogICAgICAgICAgICBtaW4sDQogICAgICAgICAgICBtYXg7DQoNCiAgICAgICAgLy8gV2hlbiBkcmFnZ2luZywgcmVkdWNlIHRoZSByYW5nZSBieSB0aGUgZXh0ZW50IHNpemUgYW5kIHBvc2l0aW9uLg0KICAgICAgICBpZiAoZHJhZ2dpbmcpIHsNCiAgICAgICAgICByMCAtPSBwb3NpdGlvbjsNCiAgICAgICAgICByMSAtPSBzaXplICsgcG9zaXRpb247DQogICAgICAgIH0NCg0KICAgICAgICAvLyBDbGFtcCB0aGUgcG9pbnQgKHVubGVzcyBjbGFtcCBzZXQgdG8gZmFsc2UpIHNvIHRoYXQgdGhlIGV4dGVudCBmaXRzIHdpdGhpbiB0aGUgcmFuZ2UgZXh0ZW50Lg0KICAgICAgICBtaW4gPSAoaiA/IHlDbGFtcCA6IHhDbGFtcCkgPyBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIHBvaW50W2pdKSkgOiBwb2ludFtqXTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBuZXcgZXh0ZW50IGJvdW5kcy4NCiAgICAgICAgaWYgKGRyYWdnaW5nKSB7DQogICAgICAgICAgbWF4ID0gKG1pbiArPSBwb3NpdGlvbikgKyBzaXplOw0KICAgICAgICB9IGVsc2Ugew0KDQogICAgICAgICAgLy8gSWYgdGhlIEFMVCBrZXkgaXMgcHJlc3NlZCwgdGhlbiBwcmVzZXJ2ZSB0aGUgY2VudGVyIG9mIHRoZSBleHRlbnQuDQogICAgICAgICAgaWYgKGNlbnRlcikgcG9zaXRpb24gPSBNYXRoLm1heChyMCwgTWF0aC5taW4ocjEsIDIgKiBjZW50ZXJbal0gLSBtaW4pKTsNCg0KICAgICAgICAgIC8vIENvbXB1dGUgdGhlIG1pbiBhbmQgbWF4IG9mIHRoZSBwb3NpdGlvbiBhbmQgcG9pbnQuDQogICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbWluKSB7DQogICAgICAgICAgICBtYXggPSBtaW47DQogICAgICAgICAgICBtaW4gPSBwb3NpdGlvbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgbWF4ID0gcG9zaXRpb247DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgLy8gVXBkYXRlIHRoZSBzdG9yZWQgYm91bmRzLg0KICAgICAgICBpZiAoZXh0ZW50WzBdICE9IG1pbiB8fCBleHRlbnRbMV0gIT0gbWF4KSB7DQogICAgICAgICAgaWYgKGopIHlFeHRlbnREb21haW5baV0gPSBudWxsOw0KICAgICAgICAgIGVsc2UgeEV4dGVudERvbWFpbltpXSA9IG51bGw7DQogICAgICAgICAgZXh0ZW50WzBdID0gbWluOw0KICAgICAgICAgIGV4dGVudFsxXSA9IG1heDsNCiAgICAgICAgICByZXR1cm4gdHJ1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBmdW5jdGlvbiBicnVzaGVuZCgpIHsNCiAgICAgICAgYnJ1c2htb3ZlKCk7DQoNCiAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgZXh0ZW50IGlzIGVtcHR5LCBjbGVhciBldmVyeXRoaW5nLg0KICAgICAgICBpZih4ICYmIHhFeHRlbnRbaV1bMF0gPT0geEV4dGVudFtpXVsxXSB8fA0KICAgICAgICAgICB5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXSkgew0KICAgICAgICAgIGJydXNoLmNsZWFyKCk7DQogICAgICAgIH0NCg0KICAgICAgICAvLyByZXNldCB0aGUgY3Vyc29yIHN0eWxlcw0KICAgICAgICBnLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKS5zZWxlY3RBbGwoIi5yZXNpemUiKS5zdHlsZSgiZGlzcGxheSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGJydXNoLmVtcHR5KGRbMV0pID8gIm5vbmUiIDogbnVsbDsgfSk7DQogICAgICAgIGQzLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLCBudWxsKTsNCg0KICAgICAgICB3IC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oIm1vdXNldXAuYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIiwgbnVsbCkNCiAgICAgICAgICAub24oImtleWRvd24uYnJ1c2giLCBudWxsKQ0KICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBudWxsKTsNCg0KICAgICAgICBkcmF3RXh0ZW50cygpOw0KDQogICAgICAgIGRyYWdSZXN0b3JlKCk7DQogICAgICAgIGV2ZW50Xyh7dHlwZTogImJydXNoZW5kIn0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGJydXNoLnggPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiB4Ow0KICAgICAgeCA9IHo7DQogICAgICByZXNpemVzID0gZDNfc3ZnX2JydXNoUmVzaXplc1sheCA8PCAxIHwgIXldOyAvLyBmb3JlIQ0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC55ID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geTsNCiAgICAgIHkgPSB6Ow0KICAgICAgcmVzaXplcyA9IGQzX3N2Z19icnVzaFJlc2l6ZXNbIXggPDwgMSB8ICF5XTsgLy8gZm9yZSENCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2gucmVzaXplQWRhcHRpb24gPSBmdW5jdGlvbih6KSB7DQogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByZXNpemVBZGFwdGlvbjsNCiAgICAgIHJlc2l6ZUFkYXB0aW9uID0gejsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9DQoNCiAgICBicnVzaC5leHRlbnRBZGFwdGlvbiA9IGZ1bmN0aW9uKHopIHsNCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGV4dGVudEFkYXB0aW9uOw0KICAgICAgZXh0ZW50QWRhcHRpb24gPSB6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH0NCg0KICAgIGJydXNoLmNsYW1wID0gZnVuY3Rpb24oeikgew0KICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4geCAmJiB5ID8gW3hDbGFtcCwgeUNsYW1wXSA6IHggPyB4Q2xhbXAgOiB5ID8geUNsYW1wIDogbnVsbDsNCiAgICAgIGlmICh4ICYmIHkpIHhDbGFtcCA9ICEhelswXSwgeUNsYW1wID0gISF6WzFdOw0KICAgICAgZWxzZSBpZiAoeCkgeENsYW1wID0gISF6Ow0KICAgICAgZWxzZSBpZiAoeSkgeUNsYW1wID0gISF6Ow0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbih6KSB7DQogICAgICB2YXIgeDAsIHgxLCB5MCwgeTEsIHQ7DQogICAgICB2YXIgeE91dHB1dCwgeU91dHB1dCwgeHlPdXRwdXQgPSBbXTsNCg0KICAgICAgLy8gSW52ZXJ0IHRoZSBwaXhlbCBleHRlbnQgdG8gZGF0YS1zcGFjZS4NCiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgew0KICAgICAgICBpZiAoeCkgew0KICAgICAgICAgIGlmICh4RXh0ZW50RG9tYWluWzBdKSB7DQogICAgICAgICAgICB4T3V0cHV0ID0geEV4dGVudERvbWFpbjsNCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgeE91dHB1dCA9IHhFeHRlbnQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmICh4LmludmVydCkgcmV0dXJuIFsgeC5pbnZlcnQoZFswXSksIHguaW52ZXJ0KGRbMV0pIF07DQogICAgICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICAgIGlmIChkWzFdIDwgZFswXSkgcmV0dXJuIFsgZFsxXSwgZFswXSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gZFsxXSAtIGRbMF0gIT0gMDsgfSk7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICAgIGlmICh5KSB7DQogICAgICAgICAgaWYgKHlFeHRlbnREb21haW5bMF0pIHsNCiAgICAgICAgICAgIHlPdXRwdXQgPSB5RXh0ZW50RG9tYWluOw0KICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICB5T3V0cHV0ID0geUV4dGVudC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICAgICAgaWYoeS5pbnZlcnQpIHJldHVybiBbIHkuaW52ZXJ0KGRbMF0pLCB5LmludmVydChkWzFdKSBdOw0KICAgICAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgICAgICBpZiAoZFsxXSA8IGRbMF0pIHJldHVybiBbIGRbMV0sIGRbMF0gXTsNCiAgICAgICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGRbMV0gLSBkWzBdICE9IDA7IH0pOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBpZih4ICYmIHkpIHsNCiAgICAgICAgICB4T3V0cHV0LmZvckVhY2goZnVuY3Rpb24gKGQsIGkpIHsNCiAgICAgICAgICAgIHh5T3V0cHV0LnB1c2goW1tkWzBdLCB5T3V0cHV0W2ldWzBdXSwgW2RbMV0sIHlPdXRwdXRbaV1bMV1dXSk7DQogICAgICAgICAgfSk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHggJiYgeSA/IHh5T3V0cHV0IDogeCA/IHhPdXRwdXQgOiB5ICYmIHlPdXRwdXQ7DQogICAgICB9DQoNCiAgICAgIC8vIFNjYWxlIHRoZSBkYXRhLXNwYWNlIGV4dGVudCB0byBwaXhlbHMuDQogICAgICBpZiAoeCkgew0KICAgICAgICB4T3V0cHV0ID0gejsNCiAgICAgICAgaWYgKHkpIHhPdXRwdXQgPSB4T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIHJldHVybiBbZFswXVswXSwgZFsxXVswXV07DQogICAgICAgIH0pOw0KICAgICAgICB4RXh0ZW50RG9tYWluID0geE91dHB1dDsNCiAgICAgICAgeE91dHB1dCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYgKHguaW52ZXJ0KSByZXR1cm4gW3goZFswXSksIHgoZFsxXSldOw0KICAgICAgICAgIHJldHVybiBkOw0KICAgICAgICB9KS5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICBpZihkWzFdIDwgZFswXSkgcmV0dXJuIFtkWzFdLCBkWzBdXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSk7DQogICAgICAgIHhFeHRlbnQgPSB4T3V0cHV0Ow0KICAgICAgICBpZigheSkgeUV4dGVudCA9IHhPdXRwdXQubWFwKGZ1bmN0aW9uKCkgeyByZXR1cm4gWzAsMF07IH0pOw0KICAgICAgfQ0KICAgICAgaWYgKHkpIHsNCiAgICAgICAgeU91dHB1dCA9IHo7DQogICAgICAgIGlmICh4KSB5T3V0cHV0ID0geU91dHB1dC5tYXAoZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgICByZXR1cm4gW2RbMF1bMV0sIGRbMV1bMV1dOw0KICAgICAgICB9KTsNCiAgICAgICAgeUV4dGVudERvbWFpbiA9IHlPdXRwdXQ7DQogICAgICAgIHlPdXRwdXQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoZCkgew0KICAgICAgICAgIGlmICh5LmludmVydCkgcmV0dXJuIFt5KGRbMF0pLCB5KGRbMV0pXTsNCiAgICAgICAgICByZXR1cm4gZDsNCiAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgaWYoZFsxXSA8IGRbMF0pIHJldHVybiBbZFsxXSwgZFswXV07DQogICAgICAgICAgcmV0dXJuIGQ7DQogICAgICAgIH0pOw0KICAgICAgICB5RXh0ZW50ID0geU91dHB1dDsNCiAgICAgICAgaWYoIXgpIHhFeHRlbnQgPSB5T3V0cHV0Lm1hcChmdW5jdGlvbiAoKSB7IHJldHVybiBbMCwwXTsgfSk7DQogICAgICB9DQoNCiAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgZXh0ZW50cyBhcmUgc2V0IHRvIGVtcHR5IGFycmF5cy4NCiAgICAgIGlmKHhFeHRlbnQubGVuZ3RoID09PSAwKSB4RXh0ZW50ID0gW1swLDBdXTsNCiAgICAgIGlmKHlFeHRlbnQubGVuZ3RoID09PSAwKSB5RXh0ZW50ID0gW1swLDBdXTsNCg0KICAgICAgcmV0dXJuIGJydXNoOw0KICAgIH07DQoNCiAgICBicnVzaC5jbGVhciA9IGZ1bmN0aW9uKCkgew0KICAgICAgeEV4dGVudCA9IFtbMCwgMF1dLCB5RXh0ZW50ID0gW1swLCAwXV07DQogICAgICB4RXh0ZW50RG9tYWluID0geUV4dGVudERvbWFpbiA9IFtdOw0KICAgICAgZHJhd0V4dGVudHMoKTsNCiAgICAgIGlmKHgpIHJlZHJhd1goYnJ1c2hFbGVtZW50KTsNCiAgICAgIGlmKHkpIHJlZHJhd1koYnJ1c2hFbGVtZW50KTsNCiAgICAgIHJldHVybiBicnVzaDsNCiAgICB9Ow0KDQogICAgYnJ1c2guZW1wdHkgPSBmdW5jdGlvbihpKSB7DQogICAgaWYgKHRoaXMuZXh0ZW50KCkubGVuZ3RoID09PSAwKSB7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogICAgICBpZih4RXh0ZW50Lmxlbmd0aCA9PSAxICYmIHlFeHRlbnQubGVuZ3RoID09IDEpIGkgPSAwOw0KICAgICAgaWYoaSAhPT0gdW5kZWZpbmVkKSB7DQogICAgICAgIHJldHVybiAhIXggJiYgeEV4dGVudFtpXVswXSA9PSB4RXh0ZW50W2ldWzFdDQogICAgICAgICAgfHwgISF5ICYmIHlFeHRlbnRbaV1bMF0gPT0geUV4dGVudFtpXVsxXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHJldHVybiBmYWxzZTsNCiAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIGQzLnJlYmluZChicnVzaCwgZXZlbnQsICJvbiIpOw0KICB9Ow0KDQogIHZhciBkM19zdmdfYnJ1c2hDdXJzb3IgPSB7DQogICAgbjogIm5zLXJlc2l6ZSIsDQogICAgZTogImV3LXJlc2l6ZSIsDQogICAgczogIm5zLXJlc2l6ZSIsDQogICAgdzogImV3LXJlc2l6ZSIsDQogICAgbnc6ICJud3NlLXJlc2l6ZSIsDQogICAgbmU6ICJuZXN3LXJlc2l6ZSIsDQogICAgc2U6ICJud3NlLXJlc2l6ZSIsDQogICAgc3c6ICJuZXN3LXJlc2l6ZSINCiAgfTsNCg0KICB2YXIgZDNfc3ZnX2JydXNoUmVzaXplcyA9IFsNCiAgICBbIm4iLCAiZSIsICJzIiwgInciLCAibnciLCAibmUiLCAic2UiLCAic3ciXSwNCiAgICBbImUiLCAidyJdLA0KICAgIFsibiIsICJzIl0sDQogICAgW10NCiAgXTsNCn0pKCk7DQo="></script>
<script src="data:application/x-javascript;base64,ZDMucGFyY29vcmRzID0gZnVuY3Rpb24oY29uZmlnKSB7DQogIHZhciBfXyA9IHsNCiAgICBkYXRhOiBbXSwNCiAgICBoaWdobGlnaHRlZDogW10sDQogICAgZGltZW5zaW9uczoge30sDQogICAgZGltZW5zaW9uVGl0bGVSb3RhdGlvbjogMCwNCiAgICBicnVzaGVkOiBmYWxzZSwNCiAgICBicnVzaGVkQ29sb3I6IG51bGwsDQogICAgYWxwaGFPbkJydXNoZWQ6IDAuMCwNCiAgICBtb2RlOiAiZGVmYXVsdCIsDQogICAgcmF0ZTogMjAsDQogICAgd2lkdGg6IDYwMCwNCiAgICBoZWlnaHQ6IDMwMCwNCiAgICBtYXJnaW46IHsgdG9wOiAyNCwgcmlnaHQ6IDAsIGJvdHRvbTogMTIsIGxlZnQ6IDAgfSwNCiAgICBudWxsVmFsdWVTZXBhcmF0b3I6ICJ1bmRlZmluZWQiLCAvLyBzZXQgdG8gInRvcCIgb3IgImJvdHRvbSINCiAgICBudWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nOiB7IHRvcDogOCwgcmlnaHQ6IDAsIGJvdHRvbTogOCwgbGVmdDogMCB9LA0KICAgIGNvbG9yOiAiIzA2OSIsDQogICAgY29tcG9zaXRlOiAic291cmNlLW92ZXIiLA0KICAgIGFscGhhOiAwLjcsDQogICAgYnVuZGxpbmdTdHJlbmd0aDogMC41LA0KICAgIGJ1bmRsZURpbWVuc2lvbjogbnVsbCwNCiAgICBzbW9vdGhuZXNzOiAwLjAsDQogICAgc2hvd0NvbnRyb2xQb2ludHM6IGZhbHNlLA0KICAgIGhpZGVBeGlzIDogW10sDQogICAgZmxpcEF4ZXM6IFtdLA0KICAgIGFuaW1hdGlvblRpbWU6IDExMDAsIC8vIEhvdyBsb25nIGl0IHRha2VzIHRvIGZsaXAgdGhlIGF4aXMgd2hlbiB5b3UgZG91YmxlIGNsaWNrDQogICAgcm90YXRlTGFiZWxzOiBmYWxzZSwNCiAgICBvdXRzaWRlRmlsdGVyczogbnVsbA0KICB9Ow0KDQogIGV4dGVuZChfXywgY29uZmlnKTsNCg0KICBpZiAoY29uZmlnICYmIGNvbmZpZy5kaW1lbnNpb25UaXRsZXMpIHsNCiAgICBjb25zb2xlLndhcm4oImRpbWVuc2lvblRpdGxlcyBwYXNzZWQgaW4gY29uZmlnIGlzIGRlcHJlY2F0ZWQuIEFkZCB0aXRsZSB0byBkaW1lbnNpb24gb2JqZWN0LiIpOw0KICAgIGQzLmVudHJpZXMoY29uZmlnLmRpbWVuc2lvblRpdGxlcykuZm9yRWFjaChmdW5jdGlvbihkKSB7DQogICAgICBpZiAoX18uZGltZW5zaW9uc1tkLmtleV0pIHsNCiAgICAgICAgX18uZGltZW5zaW9uc1tkLmtleV0udGl0bGUgPSBfXy5kaW1lbnNpb25zW2Qua2V5XS50aXRsZSA/IF9fLmRpbWVuc2lvbnNbZC5rZXldLnRpdGxlIDogZC52YWx1ZTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIF9fLmRpbWVuc2lvbnNbZC5rZXldID0gew0KICAgICAgICAgIHRpdGxlOiBkLnZhbHVlDQogICAgICAgIH07DQogICAgICB9DQogICAgfSk7DQogIH0NCnZhciBwYyA9IGZ1bmN0aW9uKHNlbGVjdGlvbikgew0KICBzZWxlY3Rpb24gPSBwYy5zZWxlY3Rpb24gPSBkMy5zZWxlY3Qoc2VsZWN0aW9uKTsNCg0KICBfXy53aWR0aCA9IHNlbGVjdGlvblswXVswXS5jbGllbnRXaWR0aDsNCiAgX18uaGVpZ2h0ID0gc2VsZWN0aW9uWzBdWzBdLmNsaWVudEhlaWdodDsNCg0KICAvLyBjYW52YXMgZGF0YSBsYXllcnMNCiAgWyJtYXJrcyIsICJmb3JlZ3JvdW5kIiwgImJydXNoZWQiLCAiaGlnaGxpZ2h0Il0uZm9yRWFjaChmdW5jdGlvbihsYXllcikgew0KICAgIGNhbnZhc1tsYXllcl0gPSBzZWxlY3Rpb24NCiAgICAgIC5hcHBlbmQoImNhbnZhcyIpDQogICAgICAuYXR0cigiY2xhc3MiLCBsYXllcilbMF1bMF07DQogICAgY3R4W2xheWVyXSA9IGNhbnZhc1tsYXllcl0uZ2V0Q29udGV4dCgiMmQiKTsNCiAgfSk7DQoNCiAgLy8gc3ZnIHRpY2sgYW5kIGJydXNoIGxheWVycw0KICBwYy5zdmcgPSBzZWxlY3Rpb24NCiAgICAuYXBwZW5kKCJzdmciKQ0KICAgICAgLmF0dHIoIndpZHRoIiwgX18ud2lkdGgpDQogICAgICAuYXR0cigiaGVpZ2h0IiwgX18uaGVpZ2h0KQ0KICAgICAgLnN0eWxlKCJmb250IiwgIjE0cHggc2Fucy1zZXJpZiIpDQogICAgICAuc3R5bGUoInBvc2l0aW9uIiwgImFic29sdXRlIikNCg0KICAgIC5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBfXy5tYXJnaW4ubGVmdCArICIsIiArIF9fLm1hcmdpbi50b3AgKyAiKSIpOw0KDQogIHJldHVybiBwYzsNCn07DQp2YXIgZXZlbnRzID0gZDMuZGlzcGF0Y2guYXBwbHkodGhpcyxbInJlbmRlciIsICJyZXNpemUiLCAiaGlnaGxpZ2h0IiwgImJydXNoIiwgImJydXNoZW5kIiwgImJydXNoc3RhcnQiLCAiYXhlc3Jlb3JkZXIiXS5jb25jYXQoZDMua2V5cyhfXykpKSwNCiAgICB3ID0gZnVuY3Rpb24oKSB7IHJldHVybiBfXy53aWR0aCAtIF9fLm1hcmdpbi5yaWdodCAtIF9fLm1hcmdpbi5sZWZ0OyB9LA0KICAgIGggPSBmdW5jdGlvbigpIHsgcmV0dXJuIF9fLmhlaWdodCAtIF9fLm1hcmdpbi50b3AgLSBfXy5tYXJnaW4uYm90dG9tOyB9LA0KICAgIGZsYWdzID0gew0KICAgICAgYnJ1c2hhYmxlOiBmYWxzZSwNCiAgICAgIHJlb3JkZXJhYmxlOiBmYWxzZSwNCiAgICAgIGF4ZXM6IGZhbHNlLA0KICAgICAgaW50ZXJhY3RpdmU6IGZhbHNlLA0KICAgICAgZGVidWc6IGZhbHNlDQogICAgfSwNCiAgICB4c2NhbGUgPSBkMy5zY2FsZS5vcmRpbmFsKCksDQogICAgZHJhZ2dpbmcgPSB7fSwNCiAgICBsaW5lID0gZDMuc3ZnLmxpbmUoKSwNCiAgICBheGlzID0gZDMuc3ZnLmF4aXMoKS5vcmllbnQoImxlZnQiKS50aWNrcyg1KSwNCiAgICBnLCAvLyBncm91cHMgZm9yIGF4ZXMsIGJydXNoZXMNCiAgICBjdHggPSB7fSwNCiAgICBjYW52YXMgPSB7fSwNCiAgICBjbHVzdGVyQ2VudHJvaWRzID0gW107DQoNCi8vIHNpZGUgZWZmZWN0cyBmb3Igc2V0dGVycw0KdmFyIHNpZGVfZWZmZWN0cyA9IGQzLmRpc3BhdGNoLmFwcGx5KHRoaXMsZDMua2V5cyhfXykpDQogIC5vbigiY29tcG9zaXRlIiwgZnVuY3Rpb24oZCkgew0KICAgIGN0eC5mb3JlZ3JvdW5kLmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gZC52YWx1ZTsNCiAgfSkNCiAgLm9uKCJhbHBoYSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBjdHguZm9yZWdyb3VuZC5nbG9iYWxBbHBoYSA9IGQudmFsdWU7DQogICAgY3R4LmJydXNoZWQuZ2xvYmFsQWxwaGEgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oImJydXNoZWRDb2xvciIsIGZ1bmN0aW9uIChkKSB7DQogICAgY3R4LmJydXNoZWQuc3Ryb2tlU3R5bGUgPSBkLnZhbHVlOw0KICB9KQ0KICAub24oIndpZHRoIiwgZnVuY3Rpb24oZCkgeyBwYy5yZXNpemUoKTsgfSkNCiAgLm9uKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHBjLnJlc2l6ZSgpOyB9KQ0KICAub24oIm1hcmdpbiIsIGZ1bmN0aW9uKGQpIHsgcGMucmVzaXplKCk7IH0pDQogIC5vbigicmF0ZSIsIGZ1bmN0aW9uKGQpIHsNCiAgICBicnVzaGVkUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgICBmb3JlZ3JvdW5kUXVldWUucmF0ZShkLnZhbHVlKTsNCiAgfSkNCiAgLm9uKCJkaW1lbnNpb25zIiwgZnVuY3Rpb24oZCkgew0KICAgIF9fLmRpbWVuc2lvbnMgPSBwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzKGQzLmtleXMoZC52YWx1ZSkpOw0KICAgIHhzY2FsZS5kb21haW4ocGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKSk7DQogICAgcGMuc29ydERpbWVuc2lvbnMoKTsNCiAgICBpZiAoZmxhZ3MuaW50ZXJhY3RpdmUpe3BjLnJlbmRlcigpLnVwZGF0ZUF4ZXMoKTt9DQogIH0pDQogIC5vbigiYnVuZGxlRGltZW5zaW9uIiwgZnVuY3Rpb24oZCkgew0KICAgICAgaWYgKCFkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgcGMuZGV0ZWN0RGltZW5zaW9ucygpOw0KICAgICAgcGMuYXV0b3NjYWxlKCk7DQogICAgICBpZiAodHlwZW9mIGQudmFsdWUgPT09ICJudW1iZXIiKSB7DQogICAgICAgICAgaWYgKGQudmFsdWUgPCBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgew0KICAgICAgICAgICAgICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5kaW1lbnNpb25zW2QudmFsdWVdOw0KICAgICAgICAgIH0gZWxzZSBpZiAoZC52YWx1ZSA8IF9fLmhpZGVBeGlzLmxlbmd0aCkgew0KICAgICAgICAgICAgICBfXy5idW5kbGVEaW1lbnNpb24gPSBfXy5oaWRlQXhpc1tkLnZhbHVlXTsNCiAgICAgICAgICB9DQogICAgICB9IGVsc2Ugew0KICAgICAgICAgIF9fLmJ1bmRsZURpbWVuc2lvbiA9IGQudmFsdWU7DQogICAgICB9DQoNCiAgICAgIF9fLmNsdXN0ZXJDZW50cm9pZHMgPSBjb21wdXRlX2NsdXN0ZXJfY2VudHJvaWRzKF9fLmJ1bmRsZURpbWVuc2lvbik7DQogICAgaWYgKGZsYWdzLmludGVyYWN0aXZlKXtwYy5yZW5kZXIoKTt9DQogIH0pDQogIC5vbigiaGlkZUF4aXMiLCBmdW5jdGlvbihkKSB7DQogICAgcGMuZGltZW5zaW9ucyhwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzKCkpOw0KICAgIHBjLmRpbWVuc2lvbnMod2l0aG91dChfXy5kaW1lbnNpb25zLCBkLnZhbHVlKSk7DQogIH0pDQogIC5vbigiZmxpcEF4ZXMiLCBmdW5jdGlvbihkKSB7DQogICAgaWYgKGQudmFsdWUgJiYgZC52YWx1ZS5sZW5ndGgpIHsNCiAgICAgICAgZC52YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKGF4aXMpIHsNCiAgICAgICAgICAgIGZsaXBBeGlzQW5kVXBkYXRlUENQKGF4aXMpOw0KICAgICAgICB9KTsNCiAgICAgICAgcGMudXBkYXRlQXhlcygwKTsNCiAgICB9DQogIH0pOw0KDQovLyBleHBvc2UgdGhlIHN0YXRlIG9mIHRoZSBjaGFydA0KcGMuc3RhdGUgPSBfXzsNCnBjLmZsYWdzID0gZmxhZ3M7DQoNCi8vIGNyZWF0ZSBnZXR0ZXIvc2V0dGVycw0KZ2V0c2V0KHBjLCBfXywgZXZlbnRzKTsNCg0KLy8gZXhwb3NlIGV2ZW50cw0KZDMucmViaW5kKHBjLCBldmVudHMsICJvbiIpOw0KDQovLyBnZXR0ZXIvc2V0dGVyIHdpdGggZXZlbnQgZmlyaW5nDQpmdW5jdGlvbiBnZXRzZXQob2JqLHN0YXRlLGV2ZW50cykgIHsNCiAgZDMua2V5cyhzdGF0ZSkuZm9yRWFjaChmdW5jdGlvbihrZXkpIHsNCiAgICAgIG9ialtrZXldID0gZnVuY3Rpb24oeCkgew0KICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCiAgICAgICAgICByZXR1cm4gc3RhdGVba2V5XTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoa2V5ID09PSAnZGltZW5zaW9ucycgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHgpID09PSAnW29iamVjdCBBcnJheV0nKSB7DQogICAgICAgICAgY29uc29sZS53YXJuKCJwYy5kaW1lbnNpb25zKFtdKSBpcyBkZXByZWNhdGVkLCB1c2UgcGMuZGltZW5zaW9ucyh7fSkiKTsNCiAgICAgICAgICB4ID0gcGMuYXBwbHlEaW1lbnNpb25EZWZhdWx0cyh4KTsNCiAgICAgICAgfQ0KICAgICAgICB2YXIgb2xkID0gc3RhdGVba2V5XTsNCiAgICAgICAgc3RhdGVba2V5XSA9IHg7DQogICAgICAgIHNpZGVfZWZmZWN0c1trZXldLmNhbGwocGMseyJ2YWx1ZSI6IHgsICJwcmV2aW91cyI6IG9sZH0pOw0KICAgICAgICBldmVudHNba2V5XS5jYWxsKHBjLHsidmFsdWUiOiB4LCAicHJldmlvdXMiOiBvbGR9KTsNCiAgICAgICAgcmV0dXJuIG9iajsNCiAgICAgIH07DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7DQogIGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsNCiAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOw0KICB9DQogIHJldHVybiB0YXJnZXQ7DQp9Ow0KDQpmdW5jdGlvbiB3aXRob3V0KGFyciwgaXRlbXMpIHsNCiAgaXRlbXMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHsNCiAgICBkZWxldGUgYXJyW2VsXTsNCiAgfSk7DQogIHJldHVybiBhcnI7DQp9Ow0KLyoqIGFkanVzdHMgYW4gYXhpcycgZGVmYXVsdCByYW5nZSBbaCgpKzEsIDFdIGlmIGEgTnVsbFZhbHVlU2VwYXJhdG9yIGlzIHNldCAqLw0KZnVuY3Rpb24gZ2V0UmFuZ2UoKSB7DQoJaWYgKF9fLm51bGxWYWx1ZVNlcGFyYXRvcj09ImJvdHRvbSIpIHsNCgkJcmV0dXJuIFtoKCkrMS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLmJvdHRvbS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLnRvcCwgMV07DQoJfSBlbHNlIGlmIChfXy5udWxsVmFsdWVTZXBhcmF0b3I9PSJ0b3AiKSB7DQoJCXJldHVybiBbaCgpKzEsIDErX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy5ib3R0b20rX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy50b3BdOw0KCX0NCglyZXR1cm4gW2goKSsxLCAxXTsNCn07DQoNCnBjLmF1dG9zY2FsZSA9IGZ1bmN0aW9uKCkgew0KICAvLyB5c2NhbGUNCiAgdmFyIGRlZmF1bHRTY2FsZXMgPSB7DQogICAgImRhdGUiOiBmdW5jdGlvbihrKSB7DQogICAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KF9fLmRhdGEsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGRba10gPyBkW2tdLmdldFRpbWUoKSA6IG51bGw7DQogICAgICB9KTsNCg0KICAgICAgLy8gc3BlY2lhbCBjYXNlIGlmIHNpbmdsZSB2YWx1ZQ0KICAgICAgaWYgKGV4dGVudFswXSA9PT0gZXh0ZW50WzFdKSB7DQogICAgICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkNCiAgICAgICAgICAuZG9tYWluKFtleHRlbnRbMF1dKQ0KICAgICAgICAgIC5yYW5nZVBvaW50cyhnZXRSYW5nZSgpKTsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIGQzLnRpbWUuc2NhbGUoKQ0KICAgICAgICAuZG9tYWluKGV4dGVudCkNCiAgICAgICAgLnJhbmdlKGdldFJhbmdlKCkpOw0KICAgIH0sDQogICAgIm51bWJlciI6IGZ1bmN0aW9uKGspIHsNCiAgICAgIHZhciBleHRlbnQgPSBkMy5leHRlbnQoX18uZGF0YSwgZnVuY3Rpb24oZCkgeyByZXR1cm4gK2Rba107IH0pOw0KDQogICAgICAvLyBzcGVjaWFsIGNhc2UgaWYgc2luZ2xlIHZhbHVlDQogICAgICBpZiAoZXh0ZW50WzBdID09PSBleHRlbnRbMV0pIHsNCiAgICAgICAgcmV0dXJuIGQzLnNjYWxlLm9yZGluYWwoKQ0KICAgICAgICAgIC5kb21haW4oW2V4dGVudFswXV0pDQogICAgICAgICAgLnJhbmdlUG9pbnRzKGdldFJhbmdlKCkpOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gZDMuc2NhbGUubGluZWFyKCkNCiAgICAgICAgLmRvbWFpbihleHRlbnQpDQogICAgICAgIC5yYW5nZShnZXRSYW5nZSgpKTsNCiAgICB9LA0KICAgICJzdHJpbmciOiBmdW5jdGlvbihrKSB7DQogICAgICB2YXIgY291bnRzID0ge30sDQogICAgICAgICAgZG9tYWluID0gW107DQoNCiAgICAgIC8vIExldCdzIGdldCB0aGUgY291bnQgZm9yIGVhY2ggdmFsdWUgc28gdGhhdCB3ZSBjYW4gc29ydCB0aGUgZG9tYWluIGJhc2VkDQogICAgICAvLyBvbiB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHZhbHVlLg0KICAgICAgX18uZGF0YS5tYXAoZnVuY3Rpb24ocCkgew0KICAgICAgICBpZiAocFtrXSA9PT0gdW5kZWZpbmVkICYmIF9fLm51bGxWYWx1ZVNlcGFyYXRvciE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgcmV0dXJuOyAvLyBudWxsIHZhbHVlcyB3aWxsIGJlIGRyYXduIGJleW9uZCB0aGUgaG9yaXpvbnRhbCBudWxsIHZhbHVlIHNlcGFyYXRvciENCiAgICAgICAgfQ0KICAgICAgICBpZiAoY291bnRzW3Bba11dID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICBjb3VudHNbcFtrXV0gPSAxOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGNvdW50c1twW2tdXSA9IGNvdW50c1twW2tdXSArIDE7DQogICAgICAgIH0NCiAgICAgIH0pOw0KDQogICAgICBkb21haW4gPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjb3VudHMpLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgICAgICByZXR1cm4gY291bnRzW2FdIC0gY291bnRzW2JdOw0KICAgICAgfSk7DQoNCiAgICAgIHJldHVybiBkMy5zY2FsZS5vcmRpbmFsKCkNCiAgICAgICAgLmRvbWFpbihkb21haW4pDQogICAgICAgIC5yYW5nZVBvaW50cyhnZXRSYW5nZSgpKTsNCiAgICB9DQogIH07DQoNCiAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGspIHsNCiAgICBpZiAoIV9fLmRpbWVuc2lvbnNba10ueXNjYWxlKXsNCiAgICAgIF9fLmRpbWVuc2lvbnNba10ueXNjYWxlID0gZGVmYXVsdFNjYWxlc1tfXy5kaW1lbnNpb25zW2tdLnR5cGVdKGspOw0KICAgIH0NCiAgfSk7DQoNCiAgLy8geHNjYWxlDQogIHhzY2FsZS5yYW5nZVBvaW50cyhbMCwgdygpXSwgMSk7DQoNCiAgLy8gUmV0aW5hIGRpc3BsYXksIGV0Yy4NCiAgdmFyIGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxOw0KDQogIC8vIGNhbnZhcyBzaXplcw0KICBwYy5zZWxlY3Rpb24uc2VsZWN0QWxsKCJjYW52YXMiKQ0KICAgICAgLnN0eWxlKCJtYXJnaW4tdG9wIiwgX18ubWFyZ2luLnRvcCArICJweCIpDQogICAgICAuc3R5bGUoIm1hcmdpbi1sZWZ0IiwgX18ubWFyZ2luLmxlZnQgKyAicHgiKQ0KICAgICAgLnN0eWxlKCJ3aWR0aCIsICh3KCkrMikgKyAicHgiKQ0KICAgICAgLnN0eWxlKCJoZWlnaHQiLCAoaCgpKzIpICsgInB4IikNCiAgICAgIC5hdHRyKCJ3aWR0aCIsICh3KCkrMikgKiBkZXZpY2VQaXhlbFJhdGlvKQ0KICAgICAgLmF0dHIoImhlaWdodCIsIChoKCkrMikgKiBkZXZpY2VQaXhlbFJhdGlvKTsNCg0KICAvLyBkZWZhdWx0IHN0eWxlcywgbmVlZHMgdG8gYmUgc2V0IHdoZW4gY2FudmFzIHdpZHRoIGNoYW5nZXMNCiAgY3R4LmZvcmVncm91bmQuc3Ryb2tlU3R5bGUgPSBfXy5jb2xvcjsNCiAgY3R4LmZvcmVncm91bmQubGluZVdpZHRoID0gMS40Ow0KICBjdHguZm9yZWdyb3VuZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBfXy5jb21wb3NpdGU7DQogIGN0eC5mb3JlZ3JvdW5kLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIGN0eC5mb3JlZ3JvdW5kLnNjYWxlKGRldmljZVBpeGVsUmF0aW8sIGRldmljZVBpeGVsUmF0aW8pOw0KICBjdHguYnJ1c2hlZC5zdHJva2VTdHlsZSA9IF9fLmJydXNoZWRDb2xvcjsNCiAgY3R4LmJydXNoZWQubGluZVdpZHRoID0gMS40Ow0KICBjdHguYnJ1c2hlZC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBfXy5jb21wb3NpdGU7DQogIGN0eC5icnVzaGVkLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIGN0eC5icnVzaGVkLnNjYWxlKGRldmljZVBpeGVsUmF0aW8sIGRldmljZVBpeGVsUmF0aW8pOw0KICBjdHguaGlnaGxpZ2h0LmxpbmVXaWR0aCA9IDM7DQogIGN0eC5oaWdobGlnaHQuc2NhbGUoZGV2aWNlUGl4ZWxSYXRpbywgZGV2aWNlUGl4ZWxSYXRpbyk7DQoNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5zY2FsZSA9IGZ1bmN0aW9uKGQsIGRvbWFpbikgew0KICBfXy5kaW1lbnNpb25zW2RdLnlzY2FsZS5kb21haW4oZG9tYWluKTsNCg0KICByZXR1cm4gdGhpczsNCn07DQoNCnBjLmZsaXAgPSBmdW5jdGlvbihkKSB7DQogIC8vX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKCkucmV2ZXJzZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCB3b3JrDQogIF9fLmRpbWVuc2lvbnNbZF0ueXNjYWxlLmRvbWFpbihfXy5kaW1lbnNpb25zW2RdLnlzY2FsZS5kb21haW4oKS5yZXZlcnNlKCkpOyAvLyB3b3Jrcw0KDQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMuY29tbW9uU2NhbGUgPSBmdW5jdGlvbihnbG9iYWwsIHR5cGUpIHsNCiAgdmFyIHQgPSB0eXBlIHx8ICJudW1iZXIiOw0KICBpZiAodHlwZW9mIGdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICBnbG9iYWwgPSB0cnVlOw0KICB9DQoNCiAgLy8gdHJ5IHRvIGF1dG9kZXRlY3QgZGltZW5zaW9ucyBhbmQgY3JlYXRlIHNjYWxlcw0KICBpZiAoIWQzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoKSB7DQogICAgcGMuZGV0ZWN0RGltZW5zaW9ucygpDQogIH0NCiAgcGMuYXV0b3NjYWxlKCk7DQoNCiAgLy8gc2NhbGVzIG9mIHRoZSBzYW1lIHR5cGUNCiAgdmFyIHNjYWxlcyA9IGQzLmtleXMoX18uZGltZW5zaW9ucykuZmlsdGVyKGZ1bmN0aW9uKHApIHsNCiAgICByZXR1cm4gX18uZGltZW5zaW9uc1twXS50eXBlID09IHQ7DQogIH0pOw0KDQogIGlmIChnbG9iYWwpIHsNCiAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KHNjYWxlcy5tYXAoZnVuY3Rpb24oZCxpKSB7DQogICAgICByZXR1cm4gX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKCk7DQogICAgfSkucmVkdWNlKGZ1bmN0aW9uKGEsYikgew0KICAgICAgcmV0dXJuIGEuY29uY2F0KGIpOw0KICAgIH0pKTsNCg0KICAgIHNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgIF9fLmRpbWVuc2lvbnNbZF0ueXNjYWxlLmRvbWFpbihleHRlbnQpOw0KICAgIH0pOw0KDQogIH0gZWxzZSB7DQogICAgc2NhbGVzLmZvckVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgX18uZGltZW5zaW9uc1tkXS55c2NhbGUuZG9tYWluKGQzLmV4dGVudChfXy5kYXRhLCBmdW5jdGlvbihkKSB7IHJldHVybiArZFtrXTsgfSkpOw0KICAgIH0pOw0KICB9DQoNCiAgLy8gdXBkYXRlIGNlbnRyb2lkcw0KICBpZiAoX18uYnVuZGxlRGltZW5zaW9uICE9PSBudWxsKSB7DQogICAgcGMuYnVuZGxlRGltZW5zaW9uKF9fLmJ1bmRsZURpbWVuc2lvbik7DQogIH0NCg0KICByZXR1cm4gdGhpczsNCn07DQpwYy5kZXRlY3REaW1lbnNpb25zID0gZnVuY3Rpb24oKSB7DQogIHBjLmRpbWVuc2lvbnMocGMuYXBwbHlEaW1lbnNpb25EZWZhdWx0cygpKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5hcHBseURpbWVuc2lvbkRlZmF1bHRzID0gZnVuY3Rpb24oZGltcykgew0KICB2YXIgdHlwZXMgPSBwYy5kZXRlY3REaW1lbnNpb25UeXBlcyhfXy5kYXRhKTsNCiAgZGltcyA9IGRpbXMgPyBkaW1zIDogZDMua2V5cyh0eXBlcyk7DQogIHZhciBuZXdEaW1zID0ge307DQogIHZhciBjdXJySW5kZXggPSAwOw0KICBkaW1zLmZvckVhY2goZnVuY3Rpb24oaykgew0KICAgIG5ld0RpbXNba10gPSBfXy5kaW1lbnNpb25zW2tdID8gX18uZGltZW5zaW9uc1trXSA6IHt9Ow0KICAgIC8vU2V0IHVwIGRlZmF1bHRzDQogICAgbmV3RGltc1trXS5vcmllbnQ9IG5ld0RpbXNba10ub3JpZW50ID8gbmV3RGltc1trXS5vcmllbnQgOiAnbGVmdCc7DQogICAgbmV3RGltc1trXS50aWNrcz0gbmV3RGltc1trXS50aWNrcyAhPSBudWxsID8gbmV3RGltc1trXS50aWNrcyA6IDU7DQogICAgbmV3RGltc1trXS5pbm5lclRpY2tTaXplPSBuZXdEaW1zW2tdLmlubmVyVGlja1NpemUgIT0gbnVsbCA/IG5ld0RpbXNba10uaW5uZXJUaWNrU2l6ZSA6IDY7DQogICAgbmV3RGltc1trXS5vdXRlclRpY2tTaXplPSBuZXdEaW1zW2tdLm91dGVyVGlja1NpemUgIT0gbnVsbCA/IG5ld0RpbXNba10ub3V0ZXJUaWNrU2l6ZSA6IDA7DQogICAgbmV3RGltc1trXS50aWNrUGFkZGluZz0gbmV3RGltc1trXS50aWNrUGFkZGluZyAhPSBudWxsID8gbmV3RGltc1trXS50aWNrUGFkZGluZyA6IDM7DQogICAgbmV3RGltc1trXS50eXBlPSBuZXdEaW1zW2tdLnR5cGUgPyBuZXdEaW1zW2tdLnR5cGUgOiB0eXBlc1trXTsNCg0KICAgIG5ld0RpbXNba10uaW5kZXggPSBuZXdEaW1zW2tdLmluZGV4ICE9IG51bGwgPyBuZXdEaW1zW2tdLmluZGV4IDogY3VyckluZGV4Ow0KICAgIGN1cnJJbmRleCsrOw0KICB9KTsNCiAgcmV0dXJuIG5ld0RpbXM7DQp9Ow0KDQpwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cyA9IGZ1bmN0aW9uKCl7DQogIHJldHVybiBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvcnQoZnVuY3Rpb24oeCwgeSl7DQogICAgcmV0dXJuIGQzLmFzY2VuZGluZyhfXy5kaW1lbnNpb25zW3hdLmluZGV4LCBfXy5kaW1lbnNpb25zW3ldLmluZGV4KTsNCiAgfSk7DQp9Ow0KDQovLyBhIGJldHRlciAidHlwZW9mIiBmcm9tIHRoaXMgcG9zdDogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83MzkwNDI2L2JldHRlci13YXktdG8tZ2V0LXR5cGUtb2YtYS1qYXZhc2NyaXB0LXZhcmlhYmxlDQpwYy50b1R5cGUgPSBmdW5jdGlvbih2KSB7DQogIHJldHVybiAoe30pLnRvU3RyaW5nLmNhbGwodikubWF0Y2goL1xzKFthLXpBLVpdKykvKVsxXS50b0xvd2VyQ2FzZSgpOw0KfTsNCg0KLy8gdHJ5IHRvIGNvZXJjZSB0byBudW1iZXIgYmVmb3JlIHJldHVybmluZyB0eXBlDQpwYy50b1R5cGVDb2VyY2VOdW1iZXJzID0gZnVuY3Rpb24odikgew0KICBpZiAoKHBhcnNlRmxvYXQodikgPT0gdikgJiYgKHYgIT0gbnVsbCkpIHsNCiAgICByZXR1cm4gIm51bWJlciI7DQogIH0NCiAgcmV0dXJuIHBjLnRvVHlwZSh2KTsNCn07DQoNCi8vIGF0dGVtcHQgdG8gZGV0ZXJtaW5lIHR5cGVzIG9mIGVhY2ggZGltZW5zaW9uIGJhc2VkIG9uIGZpcnN0IHJvdyBvZiBkYXRhDQpwYy5kZXRlY3REaW1lbnNpb25UeXBlcyA9IGZ1bmN0aW9uKGRhdGEpIHsNCiAgdmFyIHR5cGVzID0ge307DQogIGQzLmtleXMoZGF0YVswXSkNCiAgICAuZm9yRWFjaChmdW5jdGlvbihjb2wpIHsNCiAgICAgIHR5cGVzW2lzTmFOKE51bWJlcihjb2wpKSA/IGNvbCA6IHBhcnNlSW50KGNvbCldID0gcGMudG9UeXBlQ29lcmNlTnVtYmVycyhkYXRhWzBdW2NvbF0pOw0KICAgIH0pOw0KICByZXR1cm4gdHlwZXM7DQp9Ow0KcGMucmVuZGVyID0gZnVuY3Rpb24oKSB7DQogIC8vIHRyeSB0byBhdXRvZGV0ZWN0IGRpbWVuc2lvbnMgYW5kIGNyZWF0ZSBzY2FsZXMNCiAgaWYgKCFkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aCkgew0KICAgIHBjLmRldGVjdERpbWVuc2lvbnMoKQ0KICB9DQogIHBjLmF1dG9zY2FsZSgpOw0KDQogIHBjLnJlbmRlcltfXy5tb2RlXSgpOw0KDQogIGV2ZW50cy5yZW5kZXIuY2FsbCh0aGlzKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQpwYy5yZW5kZXJCcnVzaGVkID0gZnVuY3Rpb24oKSB7DQogIGlmICghZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGgpIHBjLmRldGVjdERpbWVuc2lvbnMoKTsNCg0KICBwYy5yZW5kZXJCcnVzaGVkW19fLm1vZGVdKCk7DQoNCiAgZXZlbnRzLnJlbmRlci5jYWxsKHRoaXMpOw0KICByZXR1cm4gdGhpczsNCn07DQoNCmZ1bmN0aW9uIGlzQnJ1c2hlZCgpIHsNCiAgaWYgKF9fLmJydXNoZWQgJiYgX18uYnJ1c2hlZC5sZW5ndGggIT09IF9fLmRhdGEubGVuZ3RoKQ0KICAgIHJldHVybiB0cnVlOw0KDQogIHZhciBvYmplY3QgPSBicnVzaC5jdXJyZW50TW9kZSgpLmJydXNoU3RhdGUoKTsNCg0KICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7DQogICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIGZhbHNlOw0KfTsNCg0KcGMucmVuZGVyLmRlZmF1bHQgPSBmdW5jdGlvbigpIHsNCiAgcGMuY2xlYXIoJ2ZvcmVncm91bmQnKTsNCiAgcGMuY2xlYXIoJ2hpZ2hsaWdodCcpOw0KDQogIHBjLnJlbmRlckJydXNoZWQuZGVmYXVsdCgpOw0KDQogIF9fLmRhdGEuZm9yRWFjaChwYXRoX2ZvcmVncm91bmQpOw0KfTsNCg0KdmFyIGZvcmVncm91bmRRdWV1ZSA9IGQzLnJlbmRlclF1ZXVlKHBhdGhfZm9yZWdyb3VuZCkNCiAgLnJhdGUoNTApDQogIC5jbGVhcihmdW5jdGlvbigpIHsNCiAgICBwYy5jbGVhcignZm9yZWdyb3VuZCcpOw0KICAgIHBjLmNsZWFyKCdoaWdobGlnaHQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlci5xdWV1ZSA9IGZ1bmN0aW9uKCkgew0KICBwYy5yZW5kZXJCcnVzaGVkLnF1ZXVlKCk7DQoNCiAgZm9yZWdyb3VuZFF1ZXVlKF9fLmRhdGEpOw0KfTsNCg0KcGMucmVuZGVyQnJ1c2hlZC5kZWZhdWx0ID0gZnVuY3Rpb24oKSB7DQogIHBjLmNsZWFyKCdicnVzaGVkJyk7DQoNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgX18uYnJ1c2hlZC5mb3JFYWNoKHBhdGhfYnJ1c2hlZCk7DQogIH0NCn07DQoNCnZhciBicnVzaGVkUXVldWUgPSBkMy5yZW5kZXJRdWV1ZShwYXRoX2JydXNoZWQpDQogIC5yYXRlKDUwKQ0KICAuY2xlYXIoZnVuY3Rpb24oKSB7DQogICAgcGMuY2xlYXIoJ2JydXNoZWQnKTsNCiAgfSk7DQoNCnBjLnJlbmRlckJydXNoZWQucXVldWUgPSBmdW5jdGlvbigpIHsNCiAgaWYgKGlzQnJ1c2hlZCgpKSB7DQogICAgYnJ1c2hlZFF1ZXVlKF9fLmJydXNoZWQpOw0KICB9IGVsc2Ugew0KICAgIGJydXNoZWRRdWV1ZShbXSk7IC8vIFRoaXMgaXMgbmVlZGVkIHRvIGNsZWFyIHRoZSBjdXJyZW50bHkgYnJ1c2hlZCBpdGVtcw0KICB9DQp9Ow0KZnVuY3Rpb24gY29tcHV0ZV9jbHVzdGVyX2NlbnRyb2lkcyhkKSB7DQoNCgl2YXIgY2x1c3RlckNlbnRyb2lkcyA9IGQzLm1hcCgpOw0KCXZhciBjbHVzdGVyQ291bnRzID0gZDMubWFwKCk7DQoJLy8gZGV0ZXJtaW5lIGNsdXN0ZXJDb3VudHMNCglfXy5kYXRhLmZvckVhY2goZnVuY3Rpb24ocm93KSB7DQoJCXZhciBzY2FsZWQgPSBfXy5kaW1lbnNpb25zW2RdLnlzY2FsZShyb3dbZF0pOw0KCQlpZiAoIWNsdXN0ZXJDb3VudHMuaGFzKHNjYWxlZCkpIHsNCgkJCWNsdXN0ZXJDb3VudHMuc2V0KHNjYWxlZCwgMCk7DQoJCX0NCgkJdmFyIGNvdW50ID0gY2x1c3RlckNvdW50cy5nZXQoc2NhbGVkKTsNCgkJY2x1c3RlckNvdW50cy5zZXQoc2NhbGVkLCBjb3VudCArIDEpOw0KCX0pOw0KDQoJX18uZGF0YS5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgew0KCQlkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLm1hcChmdW5jdGlvbihwLCBpKSB7DQoJCQl2YXIgc2NhbGVkID0gX18uZGltZW5zaW9uc1tkXS55c2NhbGUocm93W2RdKTsNCgkJCWlmICghY2x1c3RlckNlbnRyb2lkcy5oYXMoc2NhbGVkKSkgew0KCQkJCXZhciBtYXAgPSBkMy5tYXAoKTsNCgkJCQljbHVzdGVyQ2VudHJvaWRzLnNldChzY2FsZWQsIG1hcCk7DQoJCQl9DQoJCQlpZiAoIWNsdXN0ZXJDZW50cm9pZHMuZ2V0KHNjYWxlZCkuaGFzKHApKSB7DQoJCQkJY2x1c3RlckNlbnRyb2lkcy5nZXQoc2NhbGVkKS5zZXQocCwgMCk7DQoJCQl9DQoJCQl2YXIgdmFsdWUgPSBjbHVzdGVyQ2VudHJvaWRzLmdldChzY2FsZWQpLmdldChwKTsNCgkJCXZhbHVlICs9IF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKHJvd1twXSkgLyBjbHVzdGVyQ291bnRzLmdldChzY2FsZWQpOw0KCQkJY2x1c3RlckNlbnRyb2lkcy5nZXQoc2NhbGVkKS5zZXQocCwgdmFsdWUpOw0KCQl9KTsNCgl9KTsNCg0KCXJldHVybiBjbHVzdGVyQ2VudHJvaWRzOw0KDQp9DQoNCmZ1bmN0aW9uIGNvbXB1dGVfY2VudHJvaWRzKHJvdykgew0KCXZhciBjZW50cm9pZHMgPSBbXTsNCg0KCXZhciBwID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKTsNCgl2YXIgY29scyA9IHAubGVuZ3RoOw0KCXZhciBhID0gMC41OwkJCS8vIGNlbnRlciBiZXR3ZWVuIGF4ZXMNCglmb3IgKHZhciBpID0gMDsgaSA8IGNvbHM7ICsraSkgew0KCQkvLyBjZW50cm9pZHMgb24gJ3JlYWwnIGF4ZXMNCgkJdmFyIHggPSBwb3NpdGlvbihwW2ldKTsNCgkJdmFyIHkgPSBfXy5kaW1lbnNpb25zW3BbaV1dLnlzY2FsZShyb3dbcFtpXV0pOw0KCQljZW50cm9pZHMucHVzaCgkVihbeCwgeV0pKTsNCg0KCQkvLyBjZW50cm9pZHMgb24gJ3ZpcnR1YWwnIGF4ZXMNCgkJaWYgKGkgPCBjb2xzIC0gMSkgew0KCQkJdmFyIGN4ID0geCArIGEgKiAocG9zaXRpb24ocFtpKzFdKSAtIHgpOw0KCQkJdmFyIGN5ID0geSArIGEgKiAoX18uZGltZW5zaW9uc1twW2krMV1dLnlzY2FsZShyb3dbcFtpKzFdXSkgLSB5KTsNCgkJCWlmIChfXy5idW5kbGVEaW1lbnNpb24gIT09IG51bGwpIHsNCgkJCQl2YXIgbGVmdENlbnRyb2lkID0gX18uY2x1c3RlckNlbnRyb2lkcy5nZXQoX18uZGltZW5zaW9uc1tfXy5idW5kbGVEaW1lbnNpb25dLnlzY2FsZShyb3dbX18uYnVuZGxlRGltZW5zaW9uXSkpLmdldChwW2ldKTsNCgkJCQl2YXIgcmlnaHRDZW50cm9pZCA9IF9fLmNsdXN0ZXJDZW50cm9pZHMuZ2V0KF9fLmRpbWVuc2lvbnNbX18uYnVuZGxlRGltZW5zaW9uXS55c2NhbGUocm93W19fLmJ1bmRsZURpbWVuc2lvbl0pKS5nZXQocFtpKzFdKTsNCgkJCQl2YXIgY2VudHJvaWQgPSAwLjUgKiAobGVmdENlbnRyb2lkICsgcmlnaHRDZW50cm9pZCk7DQoJCQkJY3kgPSBjZW50cm9pZCArICgxIC0gX18uYnVuZGxpbmdTdHJlbmd0aCkgKiAoY3kgLSBjZW50cm9pZCk7DQoJCQl9DQoJCQljZW50cm9pZHMucHVzaCgkVihbY3gsIGN5XSkpOw0KCQl9DQoJfQ0KDQoJcmV0dXJuIGNlbnRyb2lkczsNCn0NCg0KcGMuY29tcHV0ZV9yZWFsX2NlbnRyb2lkcyA9IGZ1bmN0aW9uKHJvdykgew0KCXZhciByZWFsQ2VudHJvaWRzID0gW107DQoNCgl2YXIgcCA9IGQzLmtleXMoX18uZGltZW5zaW9ucyk7DQoJdmFyIGNvbHMgPSBwLmxlbmd0aDsNCgl2YXIgYSA9IDAuNTsNCg0KCWZvciAodmFyIGkgPSAwOyBpIDwgY29sczsgKytpKSB7DQoJCXZhciB4ID0gcG9zaXRpb24ocFtpXSk7DQoJCXZhciB5ID0gX18uZGltZW5zaW9uc1twW2ldXS55c2NhbGUocm93W3BbaV1dKTsNCgkJcmVhbENlbnRyb2lkcy5wdXNoKFt4LCB5XSk7DQoJfQ0KDQoJcmV0dXJuIHJlYWxDZW50cm9pZHM7DQp9DQoNCmZ1bmN0aW9uIGNvbXB1dGVfY29udHJvbF9wb2ludHMoY2VudHJvaWRzKSB7DQoNCgl2YXIgY29scyA9IGNlbnRyb2lkcy5sZW5ndGg7DQoJdmFyIGEgPSBfXy5zbW9vdGhuZXNzOw0KCXZhciBjcHMgPSBbXTsNCg0KCWNwcy5wdXNoKGNlbnRyb2lkc1swXSk7DQoJY3BzLnB1c2goJFYoW2NlbnRyb2lkc1swXS5lKDEpICsgYSoyKihjZW50cm9pZHNbMV0uZSgxKS1jZW50cm9pZHNbMF0uZSgxKSksIGNlbnRyb2lkc1swXS5lKDIpXSkpOw0KCWZvciAodmFyIGNvbCA9IDE7IGNvbCA8IGNvbHMgLSAxOyArK2NvbCkgew0KCQl2YXIgbWlkID0gY2VudHJvaWRzW2NvbF07DQoJCXZhciBsZWZ0ID0gY2VudHJvaWRzW2NvbCAtIDFdOw0KCQl2YXIgcmlnaHQgPSBjZW50cm9pZHNbY29sICsgMV07DQoNCgkJdmFyIGRpZmYgPSBsZWZ0LnN1YnRyYWN0KHJpZ2h0KTsNCgkJY3BzLnB1c2gobWlkLmFkZChkaWZmLngoYSkpKTsNCgkJY3BzLnB1c2gobWlkKTsNCgkJY3BzLnB1c2gobWlkLnN1YnRyYWN0KGRpZmYueChhKSkpOw0KCX0NCgljcHMucHVzaCgkVihbY2VudHJvaWRzW2NvbHMtMV0uZSgxKSArIGEqMiooY2VudHJvaWRzW2NvbHMtMl0uZSgxKS1jZW50cm9pZHNbY29scy0xXS5lKDEpKSwgY2VudHJvaWRzW2NvbHMtMV0uZSgyKV0pKTsNCgljcHMucHVzaChjZW50cm9pZHNbY29scyAtIDFdKTsNCg0KCXJldHVybiBjcHM7DQoNCn07cGMuc2hhZG93cyA9IGZ1bmN0aW9uKCkgew0KCWZsYWdzLnNoYWRvd3MgPSB0cnVlOw0KCXBjLmFscGhhT25CcnVzaGVkKDAuMSk7DQoJcGMucmVuZGVyKCk7DQoJcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBkcmF3IGRvdHMgd2l0aCByYWRpdXMgciBvbiB0aGUgYXhpcyBsaW5lIHdoZXJlIGRhdGEgaW50ZXJzZWN0cw0KcGMuYXhpc0RvdHMgPSBmdW5jdGlvbihyKSB7DQoJdmFyIHIgPSByIHx8IDAuMTsNCgl2YXIgY3R4ID0gcGMuY3R4Lm1hcmtzOw0KCXZhciBzdGFydEFuZ2xlID0gMDsNCgl2YXIgZW5kQW5nbGUgPSAyICogTWF0aC5QSTsNCgljdHguZ2xvYmFsQWxwaGEgPSBkMy5taW4oWyAxIC8gTWF0aC5wb3coX18uZGF0YS5sZW5ndGgsIDEgLyAyKSwgMSBdKTsNCglfXy5kYXRhLmZvckVhY2goZnVuY3Rpb24oZCkgew0KCQlkMy5lbnRyaWVzKF9fLmRpbWVuc2lvbnMpLmZvckVhY2goZnVuY3Rpb24ocCwgaSkgew0KCQkJY3R4LmJlZ2luUGF0aCgpOw0KCQkJY3R4LmFyYyhwb3NpdGlvbihwKSwgX18uZGltZW5zaW9uc1twLmtleV0ueXNjYWxlKGRbcF0pLCByLCBzdGFydEFuZ2xlLCBlbmRBbmdsZSk7DQoJCQljdHguc3Ryb2tlKCk7DQoJCQljdHguZmlsbCgpOw0KCQl9KTsNCgl9KTsNCglyZXR1cm4gdGhpczsNCn07DQoNCi8vIGRyYXcgc2luZ2xlIGN1YmljIGJlemllciBjdXJ2ZQ0KZnVuY3Rpb24gc2luZ2xlX2N1cnZlKGQsIGN0eCkgew0KDQoJdmFyIGNlbnRyb2lkcyA9IGNvbXB1dGVfY2VudHJvaWRzKGQpOw0KCXZhciBjcHMgPSBjb21wdXRlX2NvbnRyb2xfcG9pbnRzKGNlbnRyb2lkcyk7DQoNCgljdHgubW92ZVRvKGNwc1swXS5lKDEpLCBjcHNbMF0uZSgyKSk7DQoJZm9yICh2YXIgaSA9IDE7IGkgPCBjcHMubGVuZ3RoOyBpICs9IDMpIHsNCgkJaWYgKF9fLnNob3dDb250cm9sUG9pbnRzKSB7DQoJCQlmb3IgKHZhciBqID0gMDsgaiA8IDM7IGorKykgew0KCQkJCWN0eC5maWxsUmVjdChjcHNbaStqXS5lKDEpLCBjcHNbaStqXS5lKDIpLCAyLCAyKTsNCgkJCX0NCgkJfQ0KCQljdHguYmV6aWVyQ3VydmVUbyhjcHNbaV0uZSgxKSwgY3BzW2ldLmUoMiksIGNwc1tpKzFdLmUoMSksIGNwc1tpKzFdLmUoMiksIGNwc1tpKzJdLmUoMSksIGNwc1tpKzJdLmUoMikpOw0KCX0NCn07DQoNCi8vIGRyYXcgc2luZ2xlIHBvbHlsaW5lDQpmdW5jdGlvbiBjb2xvcl9wYXRoKGQsIGN0eCkgew0KCWN0eC5iZWdpblBhdGgoKTsNCglpZiAoKF9fLmJ1bmRsZURpbWVuc2lvbiAhPT0gbnVsbCAmJiBfXy5idW5kbGluZ1N0cmVuZ3RoID4gMCkgfHwgX18uc21vb3RobmVzcyA+IDApIHsNCgkJc2luZ2xlX2N1cnZlKGQsIGN0eCk7DQoJfSBlbHNlIHsNCgkJc2luZ2xlX3BhdGgoZCwgY3R4KTsNCgl9DQoJY3R4LnN0cm9rZSgpOw0KfTsNCg0KLy8gZHJhdyBtYW55IHBvbHlsaW5lcyBvZiB0aGUgc2FtZSBjb2xvcg0KZnVuY3Rpb24gcGF0aHMoZGF0YSwgY3R4KSB7DQoJY3R4LmNsZWFyUmVjdCgtMSwgLTEsIHcoKSArIDIsIGgoKSArIDIpOw0KCWN0eC5iZWdpblBhdGgoKTsNCglkYXRhLmZvckVhY2goZnVuY3Rpb24oZCkgew0KCQlpZiAoKF9fLmJ1bmRsZURpbWVuc2lvbiAhPT0gbnVsbCAmJiBfXy5idW5kbGluZ1N0cmVuZ3RoID4gMCkgfHwgX18uc21vb3RobmVzcyA+IDApIHsNCgkJCXNpbmdsZV9jdXJ2ZShkLCBjdHgpOw0KCQl9IGVsc2Ugew0KCQkJc2luZ2xlX3BhdGgoZCwgY3R4KTsNCgkJfQ0KCX0pOw0KCWN0eC5zdHJva2UoKTsNCn07DQoNCi8vIHJldHVybnMgdGhlIHktcG9zaXRpb24ganVzdCBiZXlvbmQgdGhlIHNlcGFyYXRpbmcgbnVsbCB2YWx1ZSBsaW5lDQpmdW5jdGlvbiBnZXROdWxsUG9zaXRpb24oKSB7DQoJaWYgKF9fLm51bGxWYWx1ZVNlcGFyYXRvcj09ImJvdHRvbSIpIHsNCgkJcmV0dXJuIGgoKSsxOw0KCX0gZWxzZSBpZiAoX18ubnVsbFZhbHVlU2VwYXJhdG9yPT0idG9wIikgew0KCQlyZXR1cm4gMTsNCgl9IGVsc2Ugew0KCQljb25zb2xlLmxvZygiQSB2YWx1ZSBpcyBOVUxMLCBidXQgbnVsbFZhbHVlU2VwYXJhdG9yIGlzIG5vdCBzZXQ7IHNldCBpdCB0byAnYm90dG9tJyBvciAndG9wJy4iKTsNCgl9DQoJcmV0dXJuIGgoKSsxOw0KfTsNCg0KZnVuY3Rpb24gc2luZ2xlX3BhdGgoZCwgY3R4KSB7DQoJZDMuZW50cmllcyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKHAsIGkpIHsgIC8vcCBpc24ndCByZWFsbHkgcA0KCQlpZiAoaSA9PSAwKSB7DQoJCQljdHgubW92ZVRvKHBvc2l0aW9uKHAua2V5KSwgdHlwZW9mIGRbcC5rZXldID09J3VuZGVmaW5lZCcgPyBnZXROdWxsUG9zaXRpb24oKSA6IF9fLmRpbWVuc2lvbnNbcC5rZXldLnlzY2FsZShkW3Aua2V5XSkpOw0KCQl9IGVsc2Ugew0KCQkJY3R4LmxpbmVUbyhwb3NpdGlvbihwLmtleSksIHR5cGVvZiBkW3Aua2V5XSA9PSd1bmRlZmluZWQnID8gZ2V0TnVsbFBvc2l0aW9uKCkgOiBfXy5kaW1lbnNpb25zW3Aua2V5XS55c2NhbGUoZFtwLmtleV0pKTsNCgkJfQ0KCX0pOw0KfTsNCg0KZnVuY3Rpb24gcGF0aF9icnVzaGVkKGQsIGkpIHsNCiAgaWYgKF9fLmJydXNoZWRDb2xvciAhPT0gbnVsbCkgew0KICAgIGN0eC5icnVzaGVkLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5icnVzaGVkQ29sb3IpKGQsIGkpOw0KICB9IGVsc2Ugew0KICAgIGN0eC5icnVzaGVkLnN0cm9rZVN0eWxlID0gZDMuZnVuY3RvcihfXy5jb2xvcikoZCwgaSk7DQogIH0NCiAgcmV0dXJuIGNvbG9yX3BhdGgoZCwgY3R4LmJydXNoZWQpDQp9Ow0KDQpmdW5jdGlvbiBwYXRoX2ZvcmVncm91bmQoZCwgaSkgew0KICBjdHguZm9yZWdyb3VuZC5zdHJva2VTdHlsZSA9IGQzLmZ1bmN0b3IoX18uY29sb3IpKGQsIGkpOw0KCXJldHVybiBjb2xvcl9wYXRoKGQsIGN0eC5mb3JlZ3JvdW5kKTsNCn07DQoNCmZ1bmN0aW9uIHBhdGhfaGlnaGxpZ2h0KGQsIGkpIHsNCiAgY3R4LmhpZ2hsaWdodC5zdHJva2VTdHlsZSA9IGQzLmZ1bmN0b3IoX18uY29sb3IpKGQsIGkpOw0KCXJldHVybiBjb2xvcl9wYXRoKGQsIGN0eC5oaWdobGlnaHQpOw0KfTsNCnBjLmNsZWFyID0gZnVuY3Rpb24obGF5ZXIpIHsNCiAgY3R4W2xheWVyXS5jbGVhclJlY3QoMCwgMCwgdygpICsgMiwgaCgpICsgMik7DQoNCiAgLy8gVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGF0IHRoZSBmb3JlZ3JvdW5kIGl0ZW1zIGFyZSB0cmFuc3BhcmVudA0KICAvLyB3aXRob3V0IHRoZSBuZWVkIGZvciBjaGFuZ2luZyB0aGUgb3BhY2l0eSBzdHlsZSBvZiB0aGUgZm9yZWdyb3VuZCBjYW52YXMNCiAgLy8gYXMgdGhpcyB3b3VsZCBzdG9wIHRoZSBjc3Mgc3R5bGluZyBmcm9tIHdvcmtpbmcNCiAgaWYobGF5ZXIgPT09ICJicnVzaGVkIiAmJiBpc0JydXNoZWQoKSkgew0KICAgIGN0eC5icnVzaGVkLmZpbGxTdHlsZSA9IHBjLnNlbGVjdGlvbi5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIpOw0KICAgIGN0eC5icnVzaGVkLmdsb2JhbEFscGhhID0gMSAtIF9fLmFscGhhT25CcnVzaGVkOw0KICAgIGN0eC5icnVzaGVkLmZpbGxSZWN0KDAsIDAsIHcoKSArIDIsIGgoKSArIDIpOw0KICAgIGN0eC5icnVzaGVkLmdsb2JhbEFscGhhID0gX18uYWxwaGE7DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KZDMucmViaW5kKHBjLCBheGlzLCAidGlja3MiLCAib3JpZW50IiwgInRpY2tWYWx1ZXMiLCAidGlja1N1YmRpdmlkZSIsICJ0aWNrU2l6ZSIsICJ0aWNrUGFkZGluZyIsICJ0aWNrRm9ybWF0Iik7DQoNCmZ1bmN0aW9uIGZsaXBBeGlzQW5kVXBkYXRlUENQKGRpbWVuc2lvbikgew0KICB2YXIgZyA9IHBjLnN2Zy5zZWxlY3RBbGwoIi5kaW1lbnNpb24iKTsNCg0KICBwYy5mbGlwKGRpbWVuc2lvbik7DQoNCiAgZDMuc2VsZWN0KHRoaXMucGFyZW50RWxlbWVudCkNCiAgICAudHJhbnNpdGlvbigpDQogICAgICAuZHVyYXRpb24oX18uYW5pbWF0aW9uVGltZSkNCiAgICAgIC5jYWxsKGF4aXMuc2NhbGUoX18uZGltZW5zaW9uc1tkaW1lbnNpb25dLnlzY2FsZSkpDQogICAgICAuY2FsbChheGlzLm9yaWVudChfXy5kaW1lbnNpb25zW2RpbWVuc2lvbl0ub3JpZW50KSkNCiAgICAgIC5jYWxsKGF4aXMudGlja3MoX18uZGltZW5zaW9uc1tkaW1lbnNpb25dLnRpY2tzKSkNCiAgICAgIC5jYWxsKGF4aXMuaW5uZXJUaWNrU2l6ZShfXy5kaW1lbnNpb25zW2RpbWVuc2lvbl0uaW5uZXJUaWNrU2l6ZSkpDQogICAgICAuY2FsbChheGlzLm91dGVyVGlja1NpemUoX18uZGltZW5zaW9uc1tkaW1lbnNpb25dLm91dGVyVGlja1NpemUpKQ0KICAgICAgLmNhbGwoYXhpcy50aWNrUGFkZGluZyhfXy5kaW1lbnNpb25zW2RpbWVuc2lvbl0udGlja1BhZGRpbmcpKQ0KICAgICAgLmNhbGwoYXhpcy50aWNrRm9ybWF0KF9fLmRpbWVuc2lvbnNbZGltZW5zaW9uXS50aWNrRm9ybWF0KSk7DQoNCiAgcGMucmVuZGVyKCk7DQp9DQoNCmZ1bmN0aW9uIHJvdGF0ZUxhYmVscygpIHsNCiAgaWYgKCFfXy5yb3RhdGVMYWJlbHMpIHJldHVybjsNCiAgDQogIHZhciBkZWx0YSA9IGQzLmV2ZW50LmRlbHRhWTsNCiAgZGVsdGEgPSBkZWx0YSA8IDAgPyAtNSA6IGRlbHRhOw0KICBkZWx0YSA9IGRlbHRhID4gMCA/IDUgOiBkZWx0YTsNCg0KICBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICs9IGRlbHRhOw0KICBwYy5zdmcuc2VsZWN0QWxsKCJ0ZXh0LmxhYmVsIikNCiAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIpOw0KICBkMy5ldmVudC5wcmV2ZW50RGVmYXVsdCgpOw0KfQ0KDQpmdW5jdGlvbiBkaW1lbnNpb25MYWJlbHMoZCkgew0KICByZXR1cm4gX18uZGltZW5zaW9uc1tkXS50aXRsZSA/IF9fLmRpbWVuc2lvbnNbZF0udGl0bGUgOiBkOyAgLy8gZGltZW5zaW9uIGRpc3BsYXkgbmFtZXMNCn0NCg0KcGMuY3JlYXRlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICBpZiAoZykgcGMucmVtb3ZlQXhlcygpOw0KDQogIC8vIEFkZCBhIGdyb3VwIGVsZW1lbnQgZm9yIGVhY2ggZGltZW5zaW9uLg0KICBnID0gcGMuc3ZnLnNlbGVjdEFsbCgiLmRpbWVuc2lvbiIpDQogICAgICAuZGF0YShwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiBkOw0KICAgICAgfSkNCiAgICAuZW50ZXIoKS5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJkaW1lbnNpb24iKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhzY2FsZShkKSArICIpIjsNCiAgICAgIH0pOw0KDQogIC8vIEFkZCBhbiBheGlzIGFuZCB0aXRsZS4NCiAgZy5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJheGlzIikNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKDAsMCkiKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgICB2YXIgYXhpc0VsZW1lbnQgPSBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICk7DQoNCiAgICAgICAgYXhpc0VsZW1lbnQuc2VsZWN0QWxsKCJwYXRoIikNCiAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJub25lIikNCiAgICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgIiMyMjIiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOw0KDQogICAgICAgIGF4aXNFbGVtZW50LnNlbGVjdEFsbCgibGluZSIpDQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCAibm9uZSIpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICIjMjIyIikNCiAgICAgICAgICAgIC5zdHlsZSgic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCiAgICAgIH0pDQogICAgLmFwcGVuZCgic3ZnOnRleHQiKQ0KICAgICAgLmF0dHIoew0KICAgICAgICAidGV4dC1hbmNob3IiOiAibWlkZGxlIiwNCiAgICAgICAgInkiOiAwLA0KICAgICAgICAidHJhbnNmb3JtIjogInRyYW5zbGF0ZSgwLC01KSByb3RhdGUoIiArIF9fLmRpbWVuc2lvblRpdGxlUm90YXRpb24gKyAiKSIsDQogICAgICAgICJ4IjogMCwNCiAgICAgICAgImNsYXNzIjogImxhYmVsIg0KICAgICAgfSkNCiAgICAgIC50ZXh0KGRpbWVuc2lvbkxhYmVscykNCiAgICAgIC5vbigiZGJsY2xpY2siLCBmbGlwQXhpc0FuZFVwZGF0ZVBDUCkNCiAgICAgIC5vbigid2hlZWwiLCByb3RhdGVMYWJlbHMpOw0KDQogIGlmIChfXy5udWxsVmFsdWVTZXBhcmF0b3I9PSJ0b3AiKSB7DQogICAgcGMuc3ZnLmFwcGVuZCgibGluZSIpDQogICAgICAuYXR0cigieDEiLCAwKQ0KICAgICAgLmF0dHIoInkxIiwgMStfXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLnRvcCkNCiAgICAgIC5hdHRyKCJ4MiIsIHcoKSkNCiAgICAgIC5hdHRyKCJ5MiIsIDErX18ubnVsbFZhbHVlU2VwYXJhdG9yUGFkZGluZy50b3ApDQogICAgICAuYXR0cigic3Ryb2tlLXdpZHRoIiwgMSkNCiAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzc3NyIpDQogICAgICAuYXR0cigiZmlsbCIsICJub25lIikNCiAgICAgIC5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOw0KICB9IGVsc2UgaWYgKF9fLm51bGxWYWx1ZVNlcGFyYXRvcj09ImJvdHRvbSIpIHsNCiAgICBwYy5zdmcuYXBwZW5kKCJsaW5lIikNCiAgICAgIC5hdHRyKCJ4MSIsIDApDQogICAgICAuYXR0cigieTEiLCBoKCkrMS1fXy5udWxsVmFsdWVTZXBhcmF0b3JQYWRkaW5nLmJvdHRvbSkNCiAgICAgIC5hdHRyKCJ4MiIsIHcoKSkNCiAgICAgIC5hdHRyKCJ5MiIsIGgoKSsxLV9fLm51bGxWYWx1ZVNlcGFyYXRvclBhZGRpbmcuYm90dG9tKQ0KICAgICAgLmF0dHIoInN0cm9rZS13aWR0aCIsIDEpDQogICAgICAuYXR0cigic3Ryb2tlIiwgIiM3NzciKQ0KICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpDQogICAgICAuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCiAgfQ0KDQogIGZsYWdzLmF4ZXM9IHRydWU7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMucmVtb3ZlQXhlcyA9IGZ1bmN0aW9uKCkgew0KICBnLnJlbW92ZSgpOw0KICBnID0gdW5kZWZpbmVkOw0KICByZXR1cm4gdGhpczsNCn07DQoNCnBjLnVwZGF0ZUF4ZXMgPSBmdW5jdGlvbihhbmltYXRpb25UaW1lKSB7DQogIGlmICh0eXBlb2YgYW5pbWF0aW9uVGltZSA9PT0gJ3VuZGVmaW5lZCcpIHsNCiAgICBhbmltYXRpb25UaW1lID0gX18uYW5pbWF0aW9uVGltZTsNCiAgfQ0KDQogIHZhciBnX2RhdGEgPSBwYy5zdmcuc2VsZWN0QWxsKCIuZGltZW5zaW9uIikuZGF0YShwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCg0KICAvLyBFbnRlcg0KICBnX2RhdGEuZW50ZXIoKS5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJkaW1lbnNpb24iKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKHApIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHBvc2l0aW9uKHApICsgIikiOyB9KQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkNCiAgICAuYXBwZW5kKCJzdmc6ZyIpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXhpcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgwLDApIikNCiAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgdmFyIGF4aXNFbGVtZW50ID0gZDMuc2VsZWN0KHRoaXMpLmNhbGwoIHBjLmFwcGx5QXhpc0NvbmZpZyhheGlzLCBfXy5kaW1lbnNpb25zW2RdKSApOw0KDQogICAgICAgIGF4aXNFbGVtZW50LnNlbGVjdEFsbCgicGF0aCIpDQogICAgICAgICAgICAuc3R5bGUoImZpbGwiLCAibm9uZSIpDQogICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICIjMjIyIikNCiAgICAgICAgICAgIC5zdHlsZSgic2hhcGUtcmVuZGVyaW5nIiwgImNyaXNwRWRnZXMiKTsNCg0KICAgICAgICBheGlzRWxlbWVudC5zZWxlY3RBbGwoImxpbmUiKQ0KICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgIm5vbmUiKQ0KICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCAiIzIyMiIpDQogICAgICAgICAgICAuc3R5bGUoInNoYXBlLXJlbmRlcmluZyIsICJjcmlzcEVkZ2VzIik7DQogICAgICB9KQ0KICAgIC5hcHBlbmQoInN2Zzp0ZXh0IikNCiAgICAgIC5hdHRyKHsNCiAgICAgICAgInRleHQtYW5jaG9yIjogIm1pZGRsZSIsDQogICAgICAgICJ5IjogMCwNCiAgICAgICAgInRyYW5zZm9ybSI6ICJ0cmFuc2xhdGUoMCwtNSkgcm90YXRlKCIgKyBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICsgIikiLA0KICAgICAgICAieCI6IDAsDQogICAgICAgICJjbGFzcyI6ICJsYWJlbCINCiAgICAgIH0pDQogICAgICAudGV4dChkaW1lbnNpb25MYWJlbHMpDQogICAgICAub24oImRibGNsaWNrIiwgZmxpcEF4aXNBbmRVcGRhdGVQQ1ApDQogICAgICAub24oIndoZWVsIiwgcm90YXRlTGFiZWxzKTsNCg0KICAvLyBVcGRhdGUNCiAgZ19kYXRhLmF0dHIoIm9wYWNpdHkiLCAwKTsNCiAgZ19kYXRhLnNlbGVjdCgiLmF4aXMiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgeyBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICkNCiAgICAgIH0pOw0KICBnX2RhdGEuc2VsZWN0KCIubGFiZWwiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLnRleHQoZGltZW5zaW9uTGFiZWxzKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoMCwtNSkgcm90YXRlKCIgKyBfXy5kaW1lbnNpb25UaXRsZVJvdGF0aW9uICsgIikiKTsNCg0KICAvLyBFeGl0DQogIGdfZGF0YS5leGl0KCkucmVtb3ZlKCk7DQoNCiAgZyA9IHBjLnN2Zy5zZWxlY3RBbGwoIi5kaW1lbnNpb24iKTsNCiAgZy50cmFuc2l0aW9uKCkuZHVyYXRpb24oYW5pbWF0aW9uVGltZSkNCiAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24ocCkgeyByZXR1cm4gInRyYW5zbGF0ZSgiICsgcG9zaXRpb24ocCkgKyAiKSI7IH0pDQogICAgLnN0eWxlKCJvcGFjaXR5IiwgMSk7DQoNCiAgcGMuc3ZnLnNlbGVjdEFsbCgiLmF4aXMiKQ0KICAgIC50cmFuc2l0aW9uKCkNCiAgICAgIC5kdXJhdGlvbihhbmltYXRpb25UaW1lKQ0KICAgICAgLmVhY2goZnVuY3Rpb24oZCkgeyBkMy5zZWxlY3QodGhpcykuY2FsbCggcGMuYXBwbHlBeGlzQ29uZmlnKGF4aXMsIF9fLmRpbWVuc2lvbnNbZF0pICk7DQogICAgICB9KTsNCg0KICBpZiAoZmxhZ3MuYnJ1c2hhYmxlKSBwYy5icnVzaGFibGUoKTsNCiAgaWYgKGZsYWdzLnJlb3JkZXJhYmxlKSBwYy5yZW9yZGVyYWJsZSgpOw0KICBpZiAocGMuYnJ1c2hNb2RlKCkgIT09ICJOb25lIikgew0KICAgIHZhciBtb2RlID0gcGMuYnJ1c2hNb2RlKCk7DQogICAgcGMuYnJ1c2hNb2RlKCJOb25lIik7DQogICAgcGMuYnJ1c2hNb2RlKG1vZGUpOw0KICB9DQogIHJldHVybiB0aGlzOw0KfTsNCg0KcGMuYXBwbHlBeGlzQ29uZmlnID0gZnVuY3Rpb24oYXhpcywgZGltZW5zaW9uKSB7DQogIHJldHVybiBheGlzLnNjYWxlKGRpbWVuc2lvbi55c2NhbGUpDQogICAgLm9yaWVudChkaW1lbnNpb24ub3JpZW50KQ0KICAgIC50aWNrcyhkaW1lbnNpb24udGlja3MpDQogICAgLnRpY2tWYWx1ZXMoZGltZW5zaW9uLnRpY2tWYWx1ZXMpDQogICAgLmlubmVyVGlja1NpemUoZGltZW5zaW9uLmlubmVyVGlja1NpemUpDQogICAgLm91dGVyVGlja1NpemUoZGltZW5zaW9uLm91dGVyVGlja1NpemUpDQogICAgLnRpY2tQYWRkaW5nKGRpbWVuc2lvbi50aWNrUGFkZGluZykNCiAgICAudGlja0Zvcm1hdChkaW1lbnNpb24udGlja0Zvcm1hdCkNCn07DQoNCi8vIEphc29uIERhdmllcywgaHR0cDovL2JsLm9ja3Mub3JnLzEzNDEyODENCnBjLnJlb3JkZXJhYmxlID0gZnVuY3Rpb24oKSB7DQogIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogIGcuc3R5bGUoImN1cnNvciIsICJtb3ZlIikNCiAgICAuY2FsbChkMy5iZWhhdmlvci5kcmFnKCkNCiAgICAgIC5vbigiZHJhZ3N0YXJ0IiwgZnVuY3Rpb24oZCkgew0KICAgICAgICBkcmFnZ2luZ1tkXSA9IHRoaXMuX19vcmlnaW5fXyA9IHhzY2FsZShkKTsNCiAgICAgIH0pDQogICAgICAub24oImRyYWciLCBmdW5jdGlvbihkKSB7DQogICAgICAgIGRyYWdnaW5nW2RdID0gTWF0aC5taW4odygpLCBNYXRoLm1heCgwLCB0aGlzLl9fb3JpZ2luX18gKz0gZDMuZXZlbnQuZHgpKTsNCiAgICAgICAgcGMuc29ydERpbWVuc2lvbnMoKTsNCiAgICAgICAgeHNjYWxlLmRvbWFpbihwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCiAgICAgICAgcGMucmVuZGVyKCk7DQogICAgICAgIGcuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBwb3NpdGlvbihkKSArICIpIjsNCiAgICAgICAgfSk7DQogICAgICB9KQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICAvLyBMZXQncyBzZWUgaWYgdGhlIG9yZGVyIGhhcyBjaGFuZ2VkIGFuZCBzZW5kIG91dCBhbiBldmVudCBpZiBzby4NCiAgICAgICAgdmFyIGkgPSAwLA0KICAgICAgICAgICAgaiA9IF9fLmRpbWVuc2lvbnNbZF0uaW5kZXgsDQogICAgICAgICAgICBlbGVtID0gdGhpcywNCiAgICAgICAgICAgIHBhcmVudCA9IHRoaXMucGFyZW50RWxlbWVudDsNCg0KICAgICAgICB3aGlsZSgoZWxlbSA9IGVsZW0ucHJldmlvdXNFbGVtZW50U2libGluZykgIT0gbnVsbCkgKytpOw0KICAgICAgICBpZiAoaSAhPT0gaikgew0KICAgICAgICAgIGV2ZW50cy5heGVzcmVvcmRlci5jYWxsKHBjLCBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpKTsNCiAgICAgICAgICAvLyBXZSBub3cgYWxzbyB3YW50IHRvIHJlb3JkZXIgdGhlIGFjdHVhbCBkb20gZWxlbWVudHMgdGhhdCByZXByZXNlbnQNCiAgICAgICAgICAvLyB0aGUgYXhlcy4gVGhhdCBpcywgdGhlIGcuZGltZW5zaW9uIGVsZW1lbnRzLiBJZiB3ZSBkb24ndCBkbyB0aGlzLA0KICAgICAgICAgIC8vIHdlIGdldCBhIHdlaXJkIGFuZCBjb25mdXNpbmcgdHJhbnNpdGlvbiB3aGVuIHVwZGF0ZUF4ZXMgaXMgY2FsbGVkLg0KICAgICAgICAgIC8vIFRoaXMgaXMgZHVlIHRvIHRoZSBmYWN0IHRoYXQsIGluaXRpYWxseSB0aGUgbnRoIGcuZGltZW5zaW9uIGVsZW1lbnQNCiAgICAgICAgICAvLyByZXByZXNlbnRzIHRoZSBudGggYXhpcy4gSG93ZXZlciwgYWZ0ZXIgYSBtYW51YWwgcmVvcmRlcmluZywNCiAgICAgICAgICAvLyB3aXRob3V0IHJlb3JkZXJpbmcgdGhlIGRvbSBlbGVtZW50cywgdGhlIG50aCBkb20gZWxlbWVudHMgbm8gbG9uZ2VyDQogICAgICAgICAgLy8gbmVjZXNzYXJpbHkgcmVwcmVzZW50cyB0aGUgbnRoIGF4aXMuDQogICAgICAgICAgLy8NCiAgICAgICAgICAvLyBpIGlzIHRoZSBvcmlnaW5hbCBpbmRleCBvZiB0aGUgZG9tIGVsZW1lbnQNCiAgICAgICAgICAvLyBqIGlzIHRoZSBuZXcgaW5kZXggb2YgdGhlIGRvbSBlbGVtZW50DQogICAgICAgICAgaWYgKGkgPiBqKSB7IC8vIEVsZW1lbnQgbW92ZWQgbGVmdA0KICAgICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZSh0aGlzLCBwYXJlbnQuY2hpbGRyZW5baiAtIDFdKTsNCiAgICAgICAgICB9IGVsc2UgeyAgICAgLy8gRWxlbWVudCBtb3ZlZCByaWdodA0KICAgICAgICAgICAgaWYgKChqICsgMSkgPCBwYXJlbnQuY2hpbGRyZW4ubGVuZ3RoKSB7DQogICAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUodGhpcywgcGFyZW50LmNoaWxkcmVuW2ogKyAxXSk7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICBwYXJlbnQuYXBwZW5kQ2hpbGQodGhpcyk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgZGVsZXRlIHRoaXMuX19vcmlnaW5fXzsNCiAgICAgICAgZGVsZXRlIGRyYWdnaW5nW2RdOw0KICAgICAgICBkMy5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHhzY2FsZShkKSArICIpIik7DQogICAgICAgIHBjLnJlbmRlcigpOw0KICAgICAgfSkpOw0KICBmbGFncy5yZW9yZGVyYWJsZSA9IHRydWU7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gUmVvcmRlciBkaW1lbnNpb25zLCBzdWNoIHRoYXQgdGhlIGhpZ2hlc3QgdmFsdWUgKHZpc3VhbGx5KSBpcyBvbiB0aGUgbGVmdCBhbmQNCi8vIHRoZSBsb3dlc3Qgb24gdGhlIHJpZ2h0LiBWaXN1YWwgdmFsdWVzIGFyZSBkZXRlcm1pbmVkIGJ5IHRoZSBkYXRhIHZhbHVlcyBpbg0KLy8gdGhlIGdpdmVuIHJvdy4NCnBjLnJlb3JkZXIgPSBmdW5jdGlvbihyb3dkYXRhKSB7DQogIHZhciBmaXJzdERpbSA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMF07DQoNCiAgcGMuc29ydERpbWVuc2lvbnNCeVJvd0RhdGEocm93ZGF0YSk7DQogIC8vIE5PVEU6IHRoaXMgaXMgcmVsYXRpdmVseSBjaGVhcCBnaXZlbiB0aGF0Og0KICAvLyBudW1iZXIgb2YgZGltZW5zaW9ucyA8IG51bWJlciBvZiBkYXRhIGl0ZW1zDQogIC8vIFRodXMgd2UgY2hlY2sgZXF1YWxpdHkgb2Ygb3JkZXIgdG8gcHJldmVudCByZXJlbmRlcmluZyB3aGVuIHRoaXMgaXMgdGhlIGNhc2UuDQogIHZhciByZW9yZGVyZWQgPSBmYWxzZTsNCiAgcmVvcmRlcmVkID0gZmlyc3REaW0gIT09IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMF07DQoNCiAgaWYgKHJlb3JkZXJlZCkgew0KICAgIHhzY2FsZS5kb21haW4ocGMuZ2V0T3JkZXJlZERpbWVuc2lvbktleXMoKSk7DQogICAgdmFyIGhpZ2hsaWdodGVkID0gX18uaGlnaGxpZ2h0ZWQuc2xpY2UoMCk7DQogICAgcGMudW5oaWdobGlnaHQoKTsNCg0KICAgIGcudHJhbnNpdGlvbigpDQogICAgICAuZHVyYXRpb24oMTUwMCkNCiAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB4c2NhbGUoZCkgKyAiKSI7DQogICAgICB9KTsNCiAgICBwYy5yZW5kZXIoKTsNCg0KICAgIC8vIHBjLmhpZ2hsaWdodCgpIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgaGlnaGxpZ2h0ZWQgaXMgbGVuZ3RoIHplcm8sIHNvIHdlIGRvIHRoYXQgaGVyZS4NCiAgICBpZiAoaGlnaGxpZ2h0ZWQubGVuZ3RoICE9PSAwKSB7DQogICAgICBwYy5oaWdobGlnaHQoaGlnaGxpZ2h0ZWQpOw0KICAgIH0NCiAgfQ0KfQ0KDQpwYy5zb3J0RGltZW5zaW9uc0J5Um93RGF0YSA9IGZ1bmN0aW9uKHJvd2RhdGEpIHsNCiAgdmFyIGNvcHkgPSBfXy5kaW1lbnNpb25zOw0KICB2YXIgcG9zaXRpb25Tb3J0ZWRLZXlzID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgcGl4ZWxEaWZmZXJlbmNlID0gX18uZGltZW5zaW9uc1thXS55c2NhbGUocm93ZGF0YVthXSkgLSBfXy5kaW1lbnNpb25zW2JdLnlzY2FsZShyb3dkYXRhW2JdKTsNCg0KICAgIC8vIEFycmF5LnNvcnQgaXMgbm90IG5lY2Vzc2FyaWx5IHN0YWJsZSwgdGhpcyBtZWFucyB0aGF0IGlmIHBpeGVsRGlmZmVyZW5jZSBpcyB6ZXJvDQogICAgLy8gdGhlIG9yZGVyaW5nIG9mIGRpbWVuc2lvbnMgbWlnaHQgY2hhbmdlIHVuZXhwZWN0ZWRseS4gVGhpcyBpcyBzb2x2ZWQgYnkgc29ydGluZyBvbg0KICAgIC8vIHZhcmlhYmxlIG5hbWUgaW4gdGhhdCBjYXNlLg0KICAgIGlmIChwaXhlbERpZmZlcmVuY2UgPT09IDApIHsNCiAgICAgIHJldHVybiBhLmxvY2FsZUNvbXBhcmUoYik7DQogICAgfSAvLyBlbHNlDQogICAgcmV0dXJuIHBpeGVsRGlmZmVyZW5jZTsNCiAgfSk7DQogIF9fLmRpbWVuc2lvbnMgPSB7fTsNCiAgcG9zaXRpb25Tb3J0ZWRLZXlzLmZvckVhY2goZnVuY3Rpb24ocCwgaSl7DQogICAgX18uZGltZW5zaW9uc1twXSA9IGNvcHlbcF07DQogICAgX18uZGltZW5zaW9uc1twXS5pbmRleCA9IGk7DQogIH0pOw0KfQ0KDQpwYy5zb3J0RGltZW5zaW9ucyA9IGZ1bmN0aW9uKCkgew0KICB2YXIgY29weSA9IF9fLmRpbWVuc2lvbnM7DQogIHZhciBwb3NpdGlvblNvcnRlZEtleXMgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvcnQoZnVuY3Rpb24oYSwgYikgew0KICAgIHJldHVybiBwb3NpdGlvbihhKSAtIHBvc2l0aW9uKGIpOw0KICB9KTsNCiAgX18uZGltZW5zaW9ucyA9IHt9Ow0KICBwb3NpdGlvblNvcnRlZEtleXMuZm9yRWFjaChmdW5jdGlvbihwLCBpKXsNCiAgICBfXy5kaW1lbnNpb25zW3BdID0gY29weVtwXTsNCiAgICBfXy5kaW1lbnNpb25zW3BdLmluZGV4ID0gaTsNCiAgfSkNCn07DQoNCi8vIHBhaXJzIG9mIGFkamFjZW50IGRpbWVuc2lvbnMNCnBjLmFkamFjZW50X3BhaXJzID0gZnVuY3Rpb24oYXJyKSB7DQogIHZhciByZXQgPSBbXTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoLTE7IGkrKykgew0KICAgIHJldC5wdXNoKFthcnJbaV0sYXJyW2krMV1dKTsNCiAgfTsNCiAgcmV0dXJuIHJldDsNCn07DQoNCnZhciBicnVzaCA9IHsNCiAgbW9kZXM6IHsNCiAgICAiTm9uZSI6IHsNCiAgICAgIGluc3RhbGw6IGZ1bmN0aW9uKHBjKSB7fSwgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGJlIGRvbmUuDQogICAgICB1bmluc3RhbGw6IGZ1bmN0aW9uKHBjKSB7fSwgICAgICAgICAgLy8gTm90aGluZyB0byBiZSBkb25lLg0KICAgICAgc2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gW107IH0sIC8vIE5vdGhpbmcgdG8gcmV0dXJuDQogICAgICBicnVzaFN0YXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHt9OyB9DQogICAgfQ0KICB9LA0KICBtb2RlOiAiTm9uZSIsDQogIHByZWRpY2F0ZTogIkFORCIsDQogIGN1cnJlbnRNb2RlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tb2Rlc1t0aGlzLm1vZGVdOw0KICB9DQp9Ow0KDQovLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZvciAnbGl2ZScgdXBkYXRlcyBvZiBicnVzaGVzLiBUaGF0IGlzLCBkdXJpbmcgdGhlDQovLyBzcGVjaWZpY2F0aW9uIG9mIGEgYnJ1c2gsIHRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gdXBkYXRlIHRoZSB2aWV3Lg0KLy8NCi8vIEBwYXJhbSBuZXdTZWxlY3Rpb24gLSBUaGUgbmV3IHNldCBvZiBkYXRhIGl0ZW1zIHRoYXQgaXMgY3VycmVudGx5IGNvbnRhaW5lZA0KLy8gICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBicnVzaGVzDQpmdW5jdGlvbiBicnVzaFVwZGF0ZWQobmV3U2VsZWN0aW9uLCBicnVzaF9lbCkgew0KICAvLyBpZiBvdXRzaWRlIGZpbHRlcnMgc2V0IHRoZW4gYXBwbHkgdGhlc2Ugb3V0c2lkZSBmaWx0ZXJzDQogIGlmKF9fLm91dHNpZGVGaWx0ZXJzKSB7DQogICAgbmV3U2VsZWN0aW9uID0gbmV3U2VsZWN0aW9uLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICByZXR1cm4gZDMua2V5cyhfXy5vdXRzaWRlRmlsdGVycykuZXZlcnkoZnVuY3Rpb24oZGltLCBpKSB7DQogICAgICAgIHJldHVybiBfXy5vdXRzaWRlRmlsdGVyc1tkaW1dLmluZGV4T2YoZFtkaW1dKSA+IC0xDQogICAgICB9KQ0KICAgIH0pDQogIH0NCiAgDQogIF9fLmJydXNoZWQgPSBuZXdTZWxlY3Rpb247DQogIGV2ZW50cy5icnVzaC5jYWxsKHBjLF9fLmJydXNoZWQsIGJydXNoX2VsKTsNCiAgcGMucmVuZGVyQnJ1c2hlZCgpOw0KfQ0KDQogICAgICAgIA0KLy8gYWRkIGJydXNoVXBkYXRlZCB0byBvdXIgcGFyY29vZHMNCi8vICAgdG8gbWFrZSBpdCBhY2Nlc3NpYmxlIGZyb20gb3V0c2lkZQ0KcGMuYnJ1c2hVcGRhdGVkID0gYnJ1c2hVcGRhdGVkDQoNCmZ1bmN0aW9uIGJydXNoUHJlZGljYXRlKHByZWRpY2F0ZSkgew0KICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsgcmV0dXJuIGJydXNoLnByZWRpY2F0ZTsgfQ0KDQogIHByZWRpY2F0ZSA9IFN0cmluZyhwcmVkaWNhdGUpLnRvVXBwZXJDYXNlKCk7DQogIGlmIChwcmVkaWNhdGUgIT09ICJBTkQiICYmIHByZWRpY2F0ZSAhPT0gIk9SIikgew0KICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBwcmVkaWNhdGUgIiArIHByZWRpY2F0ZSk7DQogIH0NCg0KICBicnVzaC5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7DQogIF9fLmJydXNoZWQgPSBicnVzaC5jdXJyZW50TW9kZSgpLnNlbGVjdGVkKCk7DQogIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgcmV0dXJuIHBjOw0KfQ0KDQpwYy5icnVzaE1vZGVzID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhicnVzaC5tb2Rlcyk7DQp9Ow0KDQpwYy5icnVzaE1vZGUgPSBmdW5jdGlvbihtb2RlKSB7DQogIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7DQogICAgcmV0dXJuIGJydXNoLm1vZGU7DQogIH0NCg0KICBpZiAocGMuYnJ1c2hNb2RlcygpLmluZGV4T2YobW9kZSkgPT09IC0xKSB7DQogICAgdGhyb3cgbmV3IEVycm9yKCJwYy5icnVzaG1vZGU6IFVuc3VwcG9ydGVkIGJydXNoIG1vZGU6ICIgKyBtb2RlKTsNCiAgfQ0KDQogIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyaWdnZXIgdW5uZWNlc3NhcnkgZXZlbnRzIGJ5IGNoZWNraW5nIGlmIHRoZSBtb2RlDQogIC8vIGFjdHVhbGx5IGNoYW5nZXMuDQogIGlmIChtb2RlICE9PSBicnVzaC5tb2RlKSB7DQogICAgLy8gV2hlbiBjaGFuZ2luZyBicnVzaCBtb2RlcywgdGhlIGZpcnN0IHRoaW5nIHdlIG5lZWQgdG8gZG8gaXMgY2xlYXJpbmcgYW55DQogICAgLy8gYnJ1c2hlcyBmcm9tIHRoZSBjdXJyZW50IG1vZGUsIGlmIGFueS4NCiAgICBpZiAoYnJ1c2gubW9kZSAhPT0gIk5vbmUiKSB7DQogICAgICBwYy5icnVzaFJlc2V0KCk7DQogICAgfQ0KDQogICAgLy8gTmV4dCwgd2UgbmVlZCB0byAndW5pbnN0YWxsJyB0aGUgY3VycmVudCBicnVzaE1vZGUuDQogICAgYnJ1c2gubW9kZXNbYnJ1c2gubW9kZV0udW5pbnN0YWxsKHBjKTsNCiAgICAvLyBGaW5hbGx5LCB3ZSBjYW4gaW5zdGFsbCB0aGUgcmVxdWVzdGVkIG9uZS4NCiAgICBicnVzaC5tb2RlID0gbW9kZTsNCiAgICBicnVzaC5tb2Rlc1ticnVzaC5tb2RlXS5pbnN0YWxsKCk7DQogICAgaWYgKG1vZGUgPT09ICJOb25lIikgew0KICAgICAgZGVsZXRlIHBjLmJydXNoUHJlZGljYXRlOw0KICAgIH0gZWxzZSB7DQogICAgICBwYy5icnVzaFByZWRpY2F0ZSA9IGJydXNoUHJlZGljYXRlOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBwYzsNCn07DQoNCi8vIGJydXNoIG1vZGU6IDFELUF4ZXMNCg0KKGZ1bmN0aW9uKCkgew0KCXZhciBicnVzaGVzID0ge307DQoNCglmdW5jdGlvbiBpc19icnVzaGVkKHApIHsNCgkJcmV0dXJuICFicnVzaGVzW3BdLmVtcHR5KCk7DQoJfQ0KDQogIC8vIGRhdGEgd2l0aGluIGV4dGVudHMNCiAgZnVuY3Rpb24gc2VsZWN0ZWQoKSB7DQogICAgdmFyIGFjdGl2ZXMgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmZpbHRlcihpc19icnVzaGVkKSwNCiAgICAgICAgZXh0ZW50cyA9IGFjdGl2ZXMubWFwKGZ1bmN0aW9uKHApIHsgcmV0dXJuIGJydXNoZXNbcF0uZXh0ZW50KCk7IH0pOw0KDQoJCS8vIFdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBmdWxsIGRhdGEgc2V0IHdoZW4gdGhlcmUgYXJlIG5vIGF4ZXMgYnJ1c2hlZC4NCgkJLy8gQWN0dWFsbHksIHdoZW4gdGhlcmUgYXJlIG5vIGF4ZXMgYnJ1c2hlZCwgYnkgZGVmaW5pdGlvbiwgbm8gaXRlbXMgYXJlDQoJCS8vIHNlbGVjdGVkLiBTbywgbGV0J3MgYXZvaWQgdGhlIGZpbHRlcmluZyBhbmQganVzdCByZXR1cm4gZmFsc2UuDQoJCS8vaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7DQoNCgkJLy8gUmVzb2x2ZXMgYnJva2VuIGV4YW1wbGVzIGZvciBub3cuIFRoZXkgZXhwZWN0IHRvIGdldCB0aGUgZnVsbCBkYXRhc2V0IGJhY2sgZnJvbSBlbXB0eSBicnVzaGVzDQoJCWlmIChhY3RpdmVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIF9fLmRhdGE7DQoNCgkJLy8gdGVzdCBpZiB3aXRoaW4gcmFuZ2UNCgkJdmFyIHdpdGhpbiA9IHsNCgkJCSJkYXRlIjogZnVuY3Rpb24oZCxwLGRpbWVuc2lvbikgew0KCWlmICh0eXBlb2YgX18uZGltZW5zaW9uc1twXS55c2NhbGUucmFuZ2VQb2ludHMgPT09ICJmdW5jdGlvbiIpIHsgLy8gaWYgaXQgaXMgb3JkaW5hbA0KICAgICAgICAgIHJldHVybiBleHRlbnRzW2RpbWVuc2lvbl1bMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBkW3BdICYmIGRbcF0gPD0gZXh0ZW50c1tkaW1lbnNpb25dWzFdDQogICAgICAgIH0NCiAgICAgIH0sDQogICAgICAibnVtYmVyIjogZnVuY3Rpb24oZCxwLGRpbWVuc2lvbikgew0KICAgICAgICBpZiAodHlwZW9mIF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlLnJhbmdlUG9pbnRzID09PSAiZnVuY3Rpb24iKSB7IC8vIGlmIGl0IGlzIG9yZGluYWwNCiAgICAgICAgICByZXR1cm4gZXh0ZW50c1tkaW1lbnNpb25dWzBdIDw9IF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKGRbcF0pICYmIF9fLmRpbWVuc2lvbnNbcF0ueXNjYWxlKGRbcF0pIDw9IGV4dGVudHNbZGltZW5zaW9uXVsxXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIHJldHVybiBleHRlbnRzW2RpbWVuc2lvbl1bMF0gPD0gZFtwXSAmJiBkW3BdIDw9IGV4dGVudHNbZGltZW5zaW9uXVsxXQ0KICAgICAgICB9DQogICAgICB9LA0KICAgICAgInN0cmluZyI6IGZ1bmN0aW9uKGQscCxkaW1lbnNpb24pIHsNCiAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXVswXSA8PSBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZShkW3BdKSAmJiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZShkW3BdKSA8PSBleHRlbnRzW2RpbWVuc2lvbl1bMV0NCiAgICAgIH0NCiAgICB9Ow0KDQogICAgcmV0dXJuIF9fLmRhdGENCiAgICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICBzd2l0Y2goYnJ1c2gucHJlZGljYXRlKSB7DQogICAgICAgIGNhc2UgIkFORCI6DQogICAgICAgICAgcmV0dXJuIGFjdGl2ZXMuZXZlcnkoZnVuY3Rpb24ocCwgZGltZW5zaW9uKSB7DQogICAgICAgICAgICByZXR1cm4gd2l0aGluW19fLmRpbWVuc2lvbnNbcF0udHlwZV0oZCxwLGRpbWVuc2lvbik7DQogICAgICAgICAgfSk7DQogICAgICAgIGNhc2UgIk9SIjoNCiAgICAgICAgICByZXR1cm4gYWN0aXZlcy5zb21lKGZ1bmN0aW9uKHAsIGRpbWVuc2lvbikgew0KICAgICAgICAgICAgcmV0dXJuIHdpdGhpbltfXy5kaW1lbnNpb25zW3BdLnR5cGVdKGQscCxkaW1lbnNpb24pOw0KICAgICAgICAgIH0pOw0KICAgICAgICBkZWZhdWx0Og0KICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBicnVzaCBwcmVkaWNhdGUgIiArIF9fLmJydXNoUHJlZGljYXRlKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogIH07DQoNCiAgZnVuY3Rpb24gYnJ1c2hFeHRlbnRzKGV4dGVudHMpIHsNCiAgICBpZih0eXBlb2YoZXh0ZW50cykgPT09ICd1bmRlZmluZWQnKQ0KCQl7DQoJCQl2YXIgZXh0ZW50cyA9IHt9Ow0KCQkJZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQl2YXIgYnJ1c2ggPSBicnVzaGVzW2RdOw0KCQkJCWlmIChicnVzaCAhPT0gdW5kZWZpbmVkICYmICFicnVzaC5lbXB0eSgpKSB7DQoJCQkJCXZhciBleHRlbnQgPSBicnVzaC5leHRlbnQoKTsNCgkJCQkJZXh0ZW50LnNvcnQoZDMuYXNjZW5kaW5nKTsNCgkJCQkJZXh0ZW50c1tkXSA9IGV4dGVudDsNCgkJCQl9DQoJCQl9KTsNCgkJCXJldHVybiBleHRlbnRzOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLy9maXJzdCBnZXQgYWxsIHRoZSBicnVzaCBzZWxlY3Rpb25zDQoJCQl2YXIgYnJ1c2hTZWxlY3Rpb25zID0ge307DQoJCQlnLnNlbGVjdEFsbCgnLmJydXNoJykNCgkJCQkuZWFjaChmdW5jdGlvbihkKSB7DQoJCQkJCWJydXNoU2VsZWN0aW9uc1tkXSA9IGQzLnNlbGVjdCh0aGlzKTsNCg0KCQkJfSk7DQoNCgkJCS8vIGxvb3Agb3ZlciBlYWNoIGRpbWVuc2lvbiBhbmQgdXBkYXRlIGFwcHJvcHJpYXRlbHkgKGlmIGl0IHdhcyBwYXNzZWQgaW4gdGhyb3VnaCBleHRlbnRzKQ0KCQkJZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQlpZiAoZXh0ZW50c1tkXSA9PT0gdW5kZWZpbmVkKXsNCgkJCQkJcmV0dXJuOw0KCQkJCX0NCg0KCQkJCXZhciBicnVzaCA9IGJydXNoZXNbZF07DQoJCQkJaWYgKGJydXNoICE9PSB1bmRlZmluZWQpIHsNCgkJCQkJLy91cGRhdGUgdGhlIGV4dGVudA0KCQkJCQlicnVzaC5leHRlbnQoZXh0ZW50c1tkXSk7DQoNCgkJCQkJLy9yZWRyYXcgdGhlIGJydXNoDQoJCQkJCWJydXNoU2VsZWN0aW9uc1tkXQ0KCQkJCQkJLnRyYW5zaXRpb24oKQ0KCQkJCQkJLmR1cmF0aW9uKDApDQoJCQkJCQkuY2FsbChicnVzaCk7DQoNCgkJCQkJLy9maXJlIHNvbWUgZXZlbnRzDQoJCQkJCWJydXNoLmV2ZW50KGJydXNoU2VsZWN0aW9uc1tkXSk7DQoJCQkJfQ0KCQkJfSk7DQoNCgkJCS8vcmVkcmF3IHRoZSBjaGFydA0KCQkJcGMucmVuZGVyQnJ1c2hlZCgpOw0KDQoJCQlyZXR1cm4gcGM7DQoJCX0NCiAgfQ0KDQogIGZ1bmN0aW9uIGJydXNoRm9yKGF4aXMpIHsNCiAgICB2YXIgYnJ1c2ggPSBkMy5zdmcuYnJ1c2goKTsNCg0KICAgIGJydXNoDQogICAgICAueShfXy5kaW1lbnNpb25zW2F4aXNdLnlzY2FsZSkNCiAgICAgIC5vbigiYnJ1c2hzdGFydCIsIGZ1bmN0aW9uKCkgew0KCQkJCWlmKGQzLmV2ZW50LnNvdXJjZUV2ZW50ICE9PSBudWxsKSB7DQoJCQkJCWV2ZW50cy5icnVzaHN0YXJ0LmNhbGwocGMsIF9fLmJydXNoZWQsIHRoaXMpOw0KCQkJCQlkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsNCgkJCQl9DQoJCQl9KQ0KCQkJLm9uKCJicnVzaCIsIGZ1bmN0aW9uKCkgew0KCQkJCWJydXNoVXBkYXRlZChzZWxlY3RlZCgpLCB0aGlzKTsNCgkJCX0pDQoJCQkub24oImJydXNoZW5kIiwgZnVuY3Rpb24oKSB7DQoJCQkJZXZlbnRzLmJydXNoZW5kLmNhbGwocGMsIF9fLmJydXNoZWQsIHRoaXMpOw0KCQkJfSk7DQoNCgkJYnJ1c2hlc1theGlzXSA9IGJydXNoOw0KCQlyZXR1cm4gYnJ1c2g7DQoJfTsNCg0KCWZ1bmN0aW9uIGJydXNoUmVzZXQoZGltZW5zaW9uKSB7DQoJCWlmIChkaW1lbnNpb249PT11bmRlZmluZWQpIHsNCgkJCV9fLmJydXNoZWQgPSBmYWxzZTsNCgkJCWlmIChnKSB7DQoJCQkJZy5zZWxlY3RBbGwoJy5icnVzaCcpDQoJCQkJCS5lYWNoKGZ1bmN0aW9uKGQpIHsNCgkJCQkJCWQzLnNlbGVjdCh0aGlzKQ0KCQkJCQkJCS50cmFuc2l0aW9uKCkNCgkJCQkJCQkuZHVyYXRpb24oMCkNCgkJCQkJCQkuY2FsbChicnVzaGVzW2RdLmNsZWFyKCkpOw0KCQkJCQl9KTsNCgkJCQlwYy5yZW5kZXJCcnVzaGVkKCk7DQoJCQl9DQoJCX0NCgkJZWxzZSB7DQoJCQlpZiAoZykgew0KCQkJCWcuc2VsZWN0QWxsKCcuYnJ1c2gnKQ0KCQkJCQkuZWFjaChmdW5jdGlvbihkKSB7DQoJCQkJCQlpZiAoZCE9ZGltZW5zaW9uKSByZXR1cm47DQoJCQkJCQlkMy5zZWxlY3QodGhpcykNCgkJCQkJCQkudHJhbnNpdGlvbigpDQoJCQkJCQkJLmR1cmF0aW9uKDApDQoJCQkJCQkJLmNhbGwoYnJ1c2hlc1tkXS5jbGVhcigpKTsNCgkJCQkJCWJydXNoZXNbZF0uZXZlbnQoZDMuc2VsZWN0KHRoaXMpKTsNCgkJCQkJfSk7DQoJCQkJcGMucmVuZGVyQnJ1c2hlZCgpOw0KCQkJfQ0KCQl9DQoJCXJldHVybiB0aGlzOw0KCX07DQoNCglmdW5jdGlvbiBpbnN0YWxsKCkgew0KICAgIC8vIGFsc28gbWFrZSBzZWxlY3RlZCgpIGZ1bmN0aW9uIGF2YWlsYWJsZSBvdXRzaWRlCQkNCiAgICAvLyAgIG9mIHBhcmNvb3JkcyBmb3Igb3RoZXIgbm9uLWJydXNoIGZpbHRlcnMJCQ0KICAgIHBjLnNlbGVjdGVkID0gc2VsZWN0ZWQ7DQoNCgkJaWYgKCFnKSBwYy5jcmVhdGVBeGVzKCk7DQoNCgkJLy8gQWRkIGFuZCBzdG9yZSBhIGJydXNoIGZvciBlYWNoIGF4aXMuDQoJCXZhciBicnVzaCA9IGcuYXBwZW5kKCJzdmc6ZyIpDQoJCQkuYXR0cigiY2xhc3MiLCAiYnJ1c2giKQ0KCQkJLmVhY2goZnVuY3Rpb24oZCkgew0KCQkJCWQzLnNlbGVjdCh0aGlzKS5jYWxsKGJydXNoRm9yKGQpKTsNCgkJCX0pOw0KDQoJCWJydXNoLnNlbGVjdEFsbCgicmVjdCIpDQoJCQkJLnN0eWxlKCJ2aXNpYmlsaXR5IiwgbnVsbCkNCgkJCQkuYXR0cigieCIsIC0xNSkNCgkJCQkuYXR0cigid2lkdGgiLCAzMCk7DQoNCgkJYnJ1c2guc2VsZWN0QWxsKCJyZWN0LmJhY2tncm91bmQiKQ0KCQkJCS5zdHlsZSgiZmlsbCIsICJ0cmFuc3BhcmVudCIpOw0KDQoJCWJydXNoLnNlbGVjdEFsbCgicmVjdC5leHRlbnQiKQ0KCQkJCS5zdHlsZSgiZmlsbCIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIikNCgkJCQkuc3R5bGUoInN0cm9rZSIsICJyZ2JhKDAsMCwwLDAuNikiKTsNCg0KCQlicnVzaC5zZWxlY3RBbGwoIi5yZXNpemUgcmVjdCIpDQoJCQkJLnN0eWxlKCJmaWxsIiwgInJnYmEoMCwwLDAsMC4xKSIpOw0KDQoJCXBjLmJydXNoRXh0ZW50cyA9IGJydXNoRXh0ZW50czsNCgkJcGMuYnJ1c2hSZXNldCA9IGJydXNoUmVzZXQ7DQoJCXJldHVybiBwYzsNCgl9Ow0KDQoJYnJ1c2gubW9kZXNbIjFELWF4ZXMiXSA9IHsNCgkJaW5zdGFsbDogaW5zdGFsbCwNCgkJdW5pbnN0YWxsOiBmdW5jdGlvbigpIHsNCgkJCWcuc2VsZWN0QWxsKCIuYnJ1c2giKS5yZW1vdmUoKTsNCgkJCWJydXNoZXMgPSB7fTsNCgkJCWRlbGV0ZSBwYy5icnVzaEV4dGVudHM7DQoJCQlkZWxldGUgcGMuYnJ1c2hSZXNldDsNCgkJfSwNCgkJc2VsZWN0ZWQ6IHNlbGVjdGVkLA0KCQlicnVzaFN0YXRlOiBicnVzaEV4dGVudHMNCgl9DQp9KSgpOw0KLy8gYnJ1c2ggbW9kZTogMkQtc3RydW1zDQovLyBibC5vY2tzLm9yZy9zeW50YWdtYXRpYy81NDQxMDIyDQoNCihmdW5jdGlvbigpIHsNCiAgdmFyIHN0cnVtcyA9IHt9LA0KICAgICAgc3RydW1SZWN0Ow0KDQogIGZ1bmN0aW9uIGRyYXdTdHJ1bShzdHJ1bSwgYWN0aXZlUG9pbnQpIHsNCiAgICB2YXIgc3ZnID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJnI3N0cnVtcyIpLA0KICAgICAgICBpZCA9IHN0cnVtLmRpbXMuaSwNCiAgICAgICAgcG9pbnRzID0gW3N0cnVtLnAxLCBzdHJ1bS5wMl0sDQogICAgICAgIGxpbmUgPSBzdmcuc2VsZWN0QWxsKCJsaW5lI3N0cnVtLSIgKyBpZCkuZGF0YShbc3RydW1dKSwNCiAgICAgICAgY2lyY2xlcyA9IHN2Zy5zZWxlY3RBbGwoImNpcmNsZSNzdHJ1bS0iICsgaWQpLmRhdGEocG9pbnRzKSwNCiAgICAgICAgZHJhZyA9IGQzLmJlaGF2aW9yLmRyYWcoKTsNCg0KICAgIGxpbmUuZW50ZXIoKQ0KICAgICAgLmFwcGVuZCgibGluZSIpDQogICAgICAuYXR0cigiaWQiLCAic3RydW0tIiArIGlkKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgInN0cnVtIik7DQoNCiAgICBsaW5lDQogICAgICAuYXR0cigieDEiLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiBkLnAxWzBdOyB9KQ0KICAgICAgLmF0dHIoInkxIiwgZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gZC5wMVsxXTsgfSkNCiAgICAgIC5hdHRyKCJ4MiIsIGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGQucDJbMF07IH0pDQogICAgICAuYXR0cigieTIiLCBmdW5jdGlvbihkKSB7DQogICAgICAgIHJldHVybiBkLnAyWzFdOyB9KQ0KICAgICAgLmF0dHIoInN0cm9rZSIsICJibGFjayIpDQogICAgICAuYXR0cigic3Ryb2tlLXdpZHRoIiwgMik7DQoNCiAgICBkcmFnDQogICAgICAub24oImRyYWciLCBmdW5jdGlvbihkLCBpKSB7IA0KICAgICAgICB2YXIgZXYgPSBkMy5ldmVudDsNCiAgICAgICAgaSA9IGkgKyAxOw0KICAgICAgICBzdHJ1bVsicCIgKyBpXVswXSA9IE1hdGgubWluKE1hdGgubWF4KHN0cnVtLm1pblggKyAxLCBldi54KSwgc3RydW0ubWF4WCk7DQogICAgICAgIHN0cnVtWyJwIiArIGldWzFdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWSwgZXYueSksIHN0cnVtLm1heFkpOw0KICAgICAgICBkcmF3U3RydW0oc3RydW0sIGkgLSAxKTsNCiAgICAgIH0pDQogICAgICAub24oImRyYWdlbmQiLCBvbkRyYWdFbmQoKSk7DQoNCiAgICBjaXJjbGVzLmVudGVyKCkNCiAgICAgIC5hcHBlbmQoImNpcmNsZSIpDQogICAgICAuYXR0cigiaWQiLCAic3RydW0tIiArIGlkKQ0KICAgICAgLmF0dHIoImNsYXNzIiwgInN0cnVtIik7DQoNCiAgICBjaXJjbGVzDQogICAgICAuYXR0cigiY3giLCBmdW5jdGlvbihkKSB7IHJldHVybiBkWzBdOyB9KQ0KICAgICAgLmF0dHIoImN5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZFsxXTsgfSkNCiAgICAgIC5hdHRyKCJyIiwgNSkNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuIChhY3RpdmVQb2ludCAhPT0gdW5kZWZpbmVkICYmIGkgPT09IGFjdGl2ZVBvaW50KSA/IDAuOCA6IDA7DQogICAgICB9KQ0KICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwgMC44KTsNCiAgICAgIH0pDQogICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgib3BhY2l0eSIsIDApOw0KICAgICAgfSkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgZnVuY3Rpb24gZGltZW5zaW9uc0ZvclBvaW50KHApIHsNCiAgICB2YXIgZGltcyA9IHsgaTogLTEsIGxlZnQ6IHVuZGVmaW5lZCwgcmlnaHQ6IHVuZGVmaW5lZCB9Ow0KICAgIGQzLmtleXMoX18uZGltZW5zaW9ucykuc29tZShmdW5jdGlvbihkaW0sIGkpIHsNCiAgICAgIGlmICh4c2NhbGUoZGltKSA8IHBbMF0pIHsNCiAgICAgICAgdmFyIG5leHQgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpW3BjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKCkuaW5kZXhPZihkaW0pKzFdOw0KICAgICAgICBkaW1zLmkgPSBpOw0KICAgICAgICBkaW1zLmxlZnQgPSBkaW07DQogICAgICAgIGRpbXMucmlnaHQgPSBuZXh0Ow0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9KTsNCg0KICAgIGlmIChkaW1zLmxlZnQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgLy8gRXZlbnQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmlyc3QgYXhpcy4NCiAgICAgIGRpbXMuaSA9IDA7DQogICAgICBkaW1zLmxlZnQgPSBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpWzBdOw0KICAgICAgZGltcy5yaWdodCA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMV07DQogICAgfSBlbHNlIGlmIChkaW1zLnJpZ2h0ID09PSB1bmRlZmluZWQpIHsNCiAgICAgIC8vIEV2ZW50IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBsYXN0IGF4aXMNCiAgICAgIGRpbXMuaSA9IGQzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoIC0gMTsNCiAgICAgIGRpbXMucmlnaHQgPSBkaW1zLmxlZnQ7DQogICAgICBkaW1zLmxlZnQgPSBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpW2QzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoIC0gMl07DQogICAgfQ0KDQogICAgcmV0dXJuIGRpbXM7DQogIH0NCg0KICBmdW5jdGlvbiBvbkRyYWdTdGFydCgpIHsNCiAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGRldGVybWluZSBiZXR3ZWVuIHdoaWNoIHR3byBheGVzIHRoZSBzdHVybSB3YXMgc3RhcnRlZC4NCiAgICAvLyBUaGlzIHdpbGwgZGV0ZXJtaW5lIHRoZSBmcmVlZG9tIG9mIG1vdmVtZW50LCBiZWNhdXNlIGEgc3RydW0gY2FuDQogICAgLy8gbG9naWNhbGx5IG9ubHkgaGFwcGVuIGJldHdlZW4gdHdvIGF4ZXMsIHNvIG5vIG1vdmVtZW50IG91dHNpZGUgdGhlc2UgYXhlcw0KICAgIC8vIHNob3VsZCBiZSBhbGxvd2VkLg0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBwID0gZDMubW91c2Uoc3RydW1SZWN0WzBdWzBdKSwNCiAgICAgICAgICBkaW1zLA0KICAgICAgICAgIHN0cnVtOw0KDQogICAgICBwWzBdID0gcFswXSAtIF9fLm1hcmdpbi5sZWZ0Ow0KICAgICAgcFsxXSA9IHBbMV0gLSBfXy5tYXJnaW4udG9wOw0KDQogICAgICBkaW1zID0gZGltZW5zaW9uc0ZvclBvaW50KHApLA0KICAgICAgc3RydW0gPSB7DQogICAgICAgIHAxOiBwLA0KICAgICAgICBkaW1zOiBkaW1zLA0KICAgICAgICBtaW5YOiB4c2NhbGUoZGltcy5sZWZ0KSwNCiAgICAgICAgbWF4WDogeHNjYWxlKGRpbXMucmlnaHQpLA0KICAgICAgICBtaW5ZOiAwLA0KICAgICAgICBtYXhZOiBoKCkNCiAgICAgIH07DQoNCiAgICAgIHN0cnVtc1tkaW1zLmldID0gc3RydW07DQogICAgICBzdHJ1bXMuYWN0aXZlID0gZGltcy5pOw0KDQogICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgcG9pbnQgaXMgd2l0aGluIHRoZSBib3VuZHMNCiAgICAgIHN0cnVtLnAxWzBdID0gTWF0aC5taW4oTWF0aC5tYXgoc3RydW0ubWluWCwgcFswXSksIHN0cnVtLm1heFgpOw0KICAgICAgc3RydW0ucDIgPSBzdHJ1bS5wMS5zbGljZSgpOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBvbkRyYWcoKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGV2ID0gZDMuZXZlbnQsDQogICAgICAgICAgc3RydW0gPSBzdHJ1bXNbc3RydW1zLmFjdGl2ZV07DQoNCiAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBwb2ludCBpcyB3aXRoaW4gdGhlIGJvdW5kcw0KICAgICAgc3RydW0ucDJbMF0gPSBNYXRoLm1pbihNYXRoLm1heChzdHJ1bS5taW5YICsgMSwgZXYueCAtIF9fLm1hcmdpbi5sZWZ0KSwgc3RydW0ubWF4WCk7DQogICAgICBzdHJ1bS5wMlsxXSA9IE1hdGgubWluKE1hdGgubWF4KHN0cnVtLm1pblksIGV2LnkgLSBfXy5tYXJnaW4udG9wKSwgc3RydW0ubWF4WSk7DQogICAgICBkcmF3U3RydW0oc3RydW0sIDEpOw0KICAgIH07DQogIH0NCg0KICBmdW5jdGlvbiBjb250YWlubWVudFRlc3Qoc3RydW0sIHdpZHRoKSB7DQogICAgdmFyIHAxID0gW3N0cnVtLnAxWzBdIC0gc3RydW0ubWluWCwgc3RydW0ucDFbMV0gLSBzdHJ1bS5taW5YXSwNCiAgICAgICAgcDIgPSBbc3RydW0ucDJbMF0gLSBzdHJ1bS5taW5YLCBzdHJ1bS5wMlsxXSAtIHN0cnVtLm1pblhdLA0KICAgICAgICBtMSA9IDEgLSB3aWR0aCAvIHAxWzBdLA0KICAgICAgICBiMSA9IHAxWzFdICogKDEgLSBtMSksDQogICAgICAgIG0yID0gMSAtIHdpZHRoIC8gcDJbMF0sDQogICAgICAgIGIyID0gcDJbMV0gKiAoMSAtIG0yKTsNCg0KICAgIC8vIHRlc3QgaWYgcG9pbnQgZmFsbHMgYmV0d2VlbiBsaW5lcw0KICAgIHJldHVybiBmdW5jdGlvbihwKSB7DQogICAgICB2YXIgeCA9IHBbMF0sDQogICAgICAgICAgeSA9IHBbMV0sDQogICAgICAgICAgeTEgPSBtMSAqIHggKyBiMSwNCiAgICAgICAgICB5MiA9IG0yICogeCArIGIyOw0KDQogICAgICBpZiAoeSA+IE1hdGgubWluKHkxLCB5MikgJiYgeSA8IE1hdGgubWF4KHkxLCB5MikpIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBmYWxzZTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gc2VsZWN0ZWQoKSB7DQogICAgdmFyIGlkcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHN0cnVtcyksDQogICAgICAgIGJydXNoZWQgPSBfXy5kYXRhOw0KDQogICAgLy8gR2V0IHRoZSBpZHMgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgc3RydW1zLg0KICAgIGlkcyA9IGlkcy5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgcmV0dXJuICFpc05hTihkKTsNCiAgICB9KTsNCg0KICAgIGZ1bmN0aW9uIGNyb3NzZXNTdHJ1bShkLCBpZCkgew0KICAgICAgdmFyIHN0cnVtID0gc3RydW1zW2lkXSwNCiAgICAgICAgICB0ZXN0ID0gY29udGFpbm1lbnRUZXN0KHN0cnVtLCBzdHJ1bXMud2lkdGgoaWQpKSwNCiAgICAgICAgICBkMSA9IHN0cnVtLmRpbXMubGVmdCwNCiAgICAgICAgICBkMiA9IHN0cnVtLmRpbXMucmlnaHQsDQogICAgICAgICAgeTEgPSBfXy5kaW1lbnNpb25zW2QxXS55c2NhbGUsDQogICAgICAgICAgeTIgPSBfXy5kaW1lbnNpb25zW2QyXS55c2NhbGUsDQogICAgICAgICAgcG9pbnQgPSBbeTEoZFtkMV0pIC0gc3RydW0ubWluWCwgeTIoZFtkMl0pIC0gc3RydW0ubWluWF07DQogICAgICByZXR1cm4gdGVzdChwb2ludCk7DQogICAgfQ0KDQogICAgaWYgKGlkcy5sZW5ndGggPT09IDApIHsgcmV0dXJuIGJydXNoZWQ7IH0NCg0KICAgIHJldHVybiBicnVzaGVkLmZpbHRlcihmdW5jdGlvbihkKSB7DQogICAgICBzd2l0Y2goYnJ1c2gucHJlZGljYXRlKSB7DQogICAgICBjYXNlICJBTkQiOg0KICAgICAgICByZXR1cm4gaWRzLmV2ZXJ5KGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGNhc2UgIk9SIjoNCiAgICAgICAgcmV0dXJuIGlkcy5zb21lKGZ1bmN0aW9uKGlkKSB7IHJldHVybiBjcm9zc2VzU3RydW0oZCwgaWQpOyB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBicnVzaCBwcmVkaWNhdGUgIiArIF9fLmJydXNoUHJlZGljYXRlKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlbW92ZVN0cnVtKCkgew0KICAgIHZhciBzdHJ1bSA9IHN0cnVtc1tzdHJ1bXMuYWN0aXZlXSwNCiAgICAgICAgc3ZnID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJnI3N0cnVtcyIpOw0KDQogICAgZGVsZXRlIHN0cnVtc1tzdHJ1bXMuYWN0aXZlXTsNCiAgICBzdHJ1bXMuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgIHN2Zy5zZWxlY3RBbGwoImxpbmUjc3RydW0tIiArIHN0cnVtLmRpbXMuaSkucmVtb3ZlKCk7DQogICAgc3ZnLnNlbGVjdEFsbCgiY2lyY2xlI3N0cnVtLSIgKyBzdHJ1bS5kaW1zLmkpLnJlbW92ZSgpOw0KICB9DQoNCiAgZnVuY3Rpb24gb25EcmFnRW5kKCkgew0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBicnVzaGVkID0gX18uZGF0YSwNCiAgICAgICAgICBzdHJ1bSA9IHN0cnVtc1tzdHJ1bXMuYWN0aXZlXTsNCg0KICAgICAgLy8gT2theSwgc29tZXdoYXQgdW5leHBlY3RlZCwgYnV0IG5vdCB0b3RhbGx5IHVuc3VycHJpc2luZywgYSBtb3VzY2xpY2sgaXMNCiAgICAgIC8vIGNvbnNpZGVyZWQgYSBkcmFnIHdpdGhvdXQgbW92ZS4gU28gd2UgaGF2ZSB0byBkZWFsIHdpdGggdGhhdCBjYXNlDQogICAgICBpZiAoc3RydW0gJiYgc3RydW0ucDFbMF0gPT09IHN0cnVtLnAyWzBdICYmIHN0cnVtLnAxWzFdID09PSBzdHJ1bS5wMlsxXSkgew0KICAgICAgICByZW1vdmVTdHJ1bShzdHJ1bXMpOw0KICAgICAgfQ0KDQogICAgICBicnVzaGVkID0gc2VsZWN0ZWQoc3RydW1zKTsNCiAgICAgIHN0cnVtcy5hY3RpdmUgPSB1bmRlZmluZWQ7DQogICAgICBfXy5icnVzaGVkID0gYnJ1c2hlZDsNCiAgICAgIHBjLnJlbmRlckJydXNoZWQoKTsNCiAgICAgIGV2ZW50cy5icnVzaGVuZC5jYWxsKHBjLCBfXy5icnVzaGVkKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gYnJ1c2hSZXNldChzdHJ1bXMpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RydW1zKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgc3RydW1zLmFjdGl2ZSA9IGQ7DQogICAgICAgIHJlbW92ZVN0cnVtKHN0cnVtcyk7DQogICAgICB9KTsNCiAgICAgIG9uRHJhZ0VuZChzdHJ1bXMpKCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGluc3RhbGwoKSB7DQogICAgdmFyIGRyYWcgPSBkMy5iZWhhdmlvci5kcmFnKCk7DQoNCiAgICAvLyBNYXAgb2YgY3VycmVudCBzdHJ1bXMuIFN0cnVtcyBhcmUgc3RvcmVkIHBlciBzZWdtZW50IG9mIHRoZSBQQy4gQSBzZWdtZW50LA0KICAgIC8vIGJlaW5nIHRoZSBhcmVhIGJldHdlZW4gdHdvIGF4ZXMuIFRoZSBsZWZ0IG1vc3QgYXJlYSBpcyBpbmRleGVkIGF0IDAuDQogICAgc3RydW1zLmFjdGl2ZSA9IHVuZGVmaW5lZDsNCiAgICAvLyBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgUEMgc2VnbWVudCB3aGVyZSBjdXJyZW50bHkgYSBzdHJ1bSBpcyBiZWluZw0KICAgIC8vIHBsYWNlZC4gTk9URTogZXZlbiB0aG91Z2ggdGhleSBhcmUgZXZlbmx5IHNwYWNlZCBpbiBvdXIgY3VycmVudA0KICAgIC8vIGltcGxlbWVudGF0aW9uLCB3ZSBrZWVwIGZvciB3aGVuIG5vbi1ldmVuIHNwYWNlZCBzZWdtZW50cyBhcmUgc3VwcG9ydGVkIGFzDQogICAgLy8gd2VsbC4NCiAgICBzdHJ1bXMud2lkdGggPSBmdW5jdGlvbihpZCkgew0KICAgICAgdmFyIHN0cnVtID0gc3RydW1zW2lkXTsNCg0KICAgICAgaWYgKHN0cnVtID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgIH0NCg0KICAgICAgcmV0dXJuIHN0cnVtLm1heFggLSBzdHJ1bS5taW5YOw0KICAgIH07DQoNCiAgICBwYy5vbigiYXhlc3Jlb3JkZXIuc3RydW1zIiwgZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoc3RydW1zKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIC8vIENoZWNrcyBpZiB0aGUgZmlyc3QgZGltZW5zaW9uIGlzIGRpcmVjdGx5IGxlZnQgb2YgdGhlIHNlY29uZCBkaW1lbnNpb24uDQogICAgICBmdW5jdGlvbiBjb25zZWN1dGl2ZShmaXJzdCwgc2Vjb25kKSB7DQogICAgICAgIHZhciBsZW5ndGggPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmxlbmd0aDsNCiAgICAgICAgcmV0dXJuIGQzLmtleXMoX18uZGltZW5zaW9ucykuc29tZShmdW5jdGlvbihkLCBpKSB7DQogICAgICAgICAgcmV0dXJuIChkID09PSBmaXJzdCkNCiAgICAgICAgICAgID8gaSArIGkgPCBsZW5ndGggJiYgX18uZGltZW5zaW9uc1tpICsgMV0gPT09IHNlY29uZA0KICAgICAgICAgICAgOiBmYWxzZTsNCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIGlmIChpZHMubGVuZ3RoID4gMCkgeyAvLyBXZSBoYXZlIHNvbWUgc3RydW1zLCB3aGljaCBtaWdodCBuZWVkIHRvIGJlIHJlbW92ZWQuDQogICAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICB2YXIgZGltcyA9IHN0cnVtc1tkXS5kaW1zOw0KICAgICAgICAgIHN0cnVtcy5hY3RpdmUgPSBkOw0KICAgICAgICAgIC8vIElmIHRoZSB0d28gZGltZW5zaW9ucyBvZiB0aGUgY3VycmVudCBzdHJ1bSBhcmUgbm90IG5leHQgdG8gZWFjaCBvdGhlcg0KICAgICAgICAgIC8vIGFueSBtb3JlLCB0aGFuIHdlJ2xsIG5lZWQgdG8gcmVtb3ZlIHRoZSBzdHJ1bS4gT3RoZXJ3aXNlIHdlIGtlZXAgaXQuDQogICAgICAgICAgaWYgKCFjb25zZWN1dGl2ZShkaW1zLmxlZnQsIGRpbXMucmlnaHQpKSB7DQogICAgICAgICAgICByZW1vdmVTdHJ1bShzdHJ1bXMpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIG9uRHJhZ0VuZChzdHJ1bXMpKCk7DQogICAgICB9DQogICAgfSk7DQoNCiAgICAvLyBBZGQgYSBuZXcgc3ZnIGdyb3VwIGluIHdoaWNoIHdlIGRyYXcgdGhlIHN0cnVtcy4NCiAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5hcHBlbmQoImciKQ0KICAgICAgLmF0dHIoImlkIiwgInN0cnVtcyIpDQogICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgX18ubWFyZ2luLmxlZnQgKyAiLCIgKyBfXy5tYXJnaW4udG9wICsgIikiKTsNCg0KICAgIC8vIEluc3RhbGwgdGhlIHJlcXVpcmVkIGJydXNoUmVzZXQgZnVuY3Rpb24NCiAgICBwYy5icnVzaFJlc2V0ID0gYnJ1c2hSZXNldChzdHJ1bXMpOw0KDQogICAgZHJhZw0KICAgICAgLm9uKCJkcmFnc3RhcnQiLCBvbkRyYWdTdGFydChzdHJ1bXMpKQ0KICAgICAgLm9uKCJkcmFnIiwgb25EcmFnKHN0cnVtcykpDQogICAgICAub24oImRyYWdlbmQiLCBvbkRyYWdFbmQoc3RydW1zKSk7DQoNCiAgICAvLyBOT1RFOiBUaGUgc3R5bGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUgYW5kIG5vdCBpbiB0aGUgY3NzLiBUaGlzIGlzIGJlY2F1c2UNCiAgICAvLyAgICAgICBmb3IgMUQgYnJ1c2hpbmcsIHRoZSBjYW52YXMgbGF5ZXJzIHNob3VsZCBub3QgbGlzdGVuIHRvDQogICAgLy8gICAgICAgcG9pbnRlci1ldmVudHMuDQogICAgc3RydW1SZWN0ID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuaW5zZXJ0KCJyZWN0IiwgImcjc3RydW1zIikNCiAgICAgIC5hdHRyKCJpZCIsICJzdHJ1bS1ldmVudHMiKQ0KICAgICAgLmF0dHIoIngiLCBfXy5tYXJnaW4ubGVmdCkNCiAgICAgIC5hdHRyKCJ5IiwgX18ubWFyZ2luLnRvcCkNCiAgICAgIC5hdHRyKCJ3aWR0aCIsIHcoKSkNCiAgICAgIC5hdHRyKCJoZWlnaHQiLCBoKCkgKyAyKQ0KICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgYnJ1c2gubW9kZXNbIjJELXN0cnVtcyJdID0gew0KICAgIGluc3RhbGw6IGluc3RhbGwsDQogICAgdW5pbnN0YWxsOiBmdW5jdGlvbigpIHsNCiAgICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgiZyNzdHJ1bXMiKS5yZW1vdmUoKTsNCiAgICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgicmVjdCNzdHJ1bS1ldmVudHMiKS5yZW1vdmUoKTsNCiAgICAgIHBjLm9uKCJheGVzcmVvcmRlci5zdHJ1bXMiLCB1bmRlZmluZWQpOw0KICAgICAgZGVsZXRlIHBjLmJydXNoUmVzZXQ7DQoNCiAgICAgIHN0cnVtUmVjdCA9IHVuZGVmaW5lZDsNCiAgICB9LA0KICAgIHNlbGVjdGVkOiBzZWxlY3RlZCwNCiAgICBicnVzaFN0YXRlOiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdHJ1bXM7IH0NCiAgfTsNCg0KfSgpKTsNCg0KLy8gYnJ1c2ggbW9kZTogMUQtQXhlcyB3aXRoIG11bHRpcGxlIGV4dGVudHMNCi8vIHJlcXVpcmVzIGQzLnN2Zy5tdWx0aWJydXNoDQoNCihmdW5jdGlvbigpIHsNCiAgaWYgKHR5cGVvZiBkMy5zdmcubXVsdGlicnVzaCAhPT0gJ2Z1bmN0aW9uJykgew0KCSAgcmV0dXJuOw0KICB9DQogIHZhciBicnVzaGVzID0ge307DQoNCiAgZnVuY3Rpb24gaXNfYnJ1c2hlZChwKSB7DQogICAgcmV0dXJuICFicnVzaGVzW3BdLmVtcHR5KCk7DQogIH0NCg0KICAvLyBkYXRhIHdpdGhpbiBleHRlbnRzDQogIGZ1bmN0aW9uIHNlbGVjdGVkKCkgew0KICAgIHZhciBhY3RpdmVzID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5maWx0ZXIoaXNfYnJ1c2hlZCksDQogICAgICAgIGV4dGVudHMgPSBhY3RpdmVzLm1hcChmdW5jdGlvbihwKSB7IHJldHVybiBicnVzaGVzW3BdLmV4dGVudCgpOyB9KTsNCg0KICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIHRoZSBmdWxsIGRhdGEgc2V0IHdoZW4gdGhlcmUgYXJlIG5vIGF4ZXMgYnJ1c2hlZC4NCiAgICAvLyBBY3R1YWxseSwgd2hlbiB0aGVyZSBhcmUgbm8gYXhlcyBicnVzaGVkLCBieSBkZWZpbml0aW9uLCBubyBpdGVtcyBhcmUNCiAgICAvLyBzZWxlY3RlZC4gU28sIGxldCdzIGF2b2lkIHRoZSBmaWx0ZXJpbmcgYW5kIGp1c3QgcmV0dXJuIGZhbHNlLg0KICAgIC8vaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7DQoNCiAgICAvLyBSZXNvbHZlcyBicm9rZW4gZXhhbXBsZXMgZm9yIG5vdy4gVGhleSBleHBlY3QgdG8gZ2V0IHRoZSBmdWxsIGRhdGFzZXQgYmFjayBmcm9tIGVtcHR5IGJydXNoZXMNCiAgICBpZiAoYWN0aXZlcy5sZW5ndGggPT09IDApIHJldHVybiBfXy5kYXRhOw0KDQogICAgLy8gdGVzdCBpZiB3aXRoaW4gcmFuZ2UNCiAgICB2YXIgd2l0aGluID0gew0KICAgICAgImRhdGUiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZS5yYW5nZVBvaW50cyA9PT0gImZ1bmN0aW9uIikgeyAvLyBpZiBpdCBpcyBvcmRpbmFsDQogICAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIGJbMF0gPD0gZFtwXSAmJiBkW3BdIDw9IGJbMV0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJudW1iZXIiOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBfXy5kaW1lbnNpb25zW3BdLnlzY2FsZS5yYW5nZVBvaW50cyA9PT0gImZ1bmN0aW9uIikgeyAvLyBpZiBpdCBpcyBvcmRpbmFsDQogICAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgcmV0dXJuIGJbMF0gPD0gZFtwXSAmJiBkW3BdIDw9IGJbMV0NCiAgICAgICAgfQ0KICAgICAgfSwNCiAgICAgICJzdHJpbmciOiBmdW5jdGlvbihkLHAsZGltZW5zaW9uLGIpIHsNCiAgICAgICAgcmV0dXJuIGJbMF0gPD0gX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgJiYgX18uZGltZW5zaW9uc1twXS55c2NhbGUoZFtwXSkgPD0gYlsxXQ0KICAgICAgfQ0KICAgIH07DQoNCiAgICByZXR1cm4gX18uZGF0YQ0KICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgc3dpdGNoKGJydXNoLnByZWRpY2F0ZSkgew0KICAgICAgY2FzZSAiQU5EIjoNCiAgICAgICAgcmV0dXJuIGFjdGl2ZXMuZXZlcnkoZnVuY3Rpb24ocCwgZGltZW5zaW9uKSB7DQogICAgICAgICAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXS5zb21lKGZ1bmN0aW9uKGIpIHsNCiAgICAgICAgICAJcmV0dXJuIHdpdGhpbltfXy5kaW1lbnNpb25zW3BdLnR5cGVdKGQscCxkaW1lbnNpb24sYik7DQogICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KICAgICAgY2FzZSAiT1IiOg0KICAgICAgICByZXR1cm4gYWN0aXZlcy5zb21lKGZ1bmN0aW9uKHAsIGRpbWVuc2lvbikgew0KICAgICAgCSAgcmV0dXJuIGV4dGVudHNbZGltZW5zaW9uXS5zb21lKGZ1bmN0aW9uKGIpIHsNCiAgICAgICAgICAgIAlyZXR1cm4gd2l0aGluW19fLmRpbWVuc2lvbnNbcF0udHlwZV0oZCxwLGRpbWVuc2lvbixiKTsNCiAgICAgICAgICAgIH0pOw0KICAgICAgICB9KTsNCiAgICAgIGRlZmF1bHQ6DQogICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBicnVzaCBwcmVkaWNhdGUgIiArIF9fLmJydXNoUHJlZGljYXRlKTsNCiAgICAgIH0NCiAgICB9KTsNCiAgfTsNCg0KICBmdW5jdGlvbiBicnVzaEV4dGVudHMoZXh0ZW50cykgew0KICAgIGlmICh0eXBlb2YoZXh0ZW50cykgPT09ICd1bmRlZmluZWQnKSB7DQogICAgICBleHRlbnRzID0ge307DQogICAgICBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLmZvckVhY2goZnVuY3Rpb24gKGQpIHsNCiAgICAgICAgdmFyIGJydXNoID0gYnJ1c2hlc1tkXTsNCiAgICAgICAgaWYgKGJydXNoICE9PSB1bmRlZmluZWQgJiYgIWJydXNoLmVtcHR5KCkpIHsNCiAgICAgICAgICB2YXIgZXh0ZW50ID0gYnJ1c2guZXh0ZW50KCk7DQogICAgICAgICAgZXh0ZW50c1tkXSA9IGV4dGVudDsNCiAgICAgICAgfQ0KICAgICAgfSk7DQogICAgICByZXR1cm4gZXh0ZW50czsNCiAgICB9DQogICAgZWxzZSB7DQogICAgICAvL2ZpcnN0IGdldCBhbGwgdGhlIGJydXNoIHNlbGVjdGlvbnMNCiAgICAgIHZhciBicnVzaFNlbGVjdGlvbnMgPSB7fTsNCiAgICAgIGcuc2VsZWN0QWxsKCcuYnJ1c2gnKQ0KICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7DQogICAgICAgICAgICBicnVzaFNlbGVjdGlvbnNbZF0gPSBkMy5zZWxlY3QodGhpcyk7DQogICAgICAgICAgfSk7DQoNCiAgICAgIC8vIGxvb3Agb3ZlciBlYWNoIGRpbWVuc2lvbiBhbmQgdXBkYXRlIGFwcHJvcHJpYXRlbHkgKGlmIGl0IHdhcyBwYXNzZWQgaW4gdGhyb3VnaCBleHRlbnRzKQ0KICAgICAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uIChkKSB7DQogICAgICAgIGlmIChleHRlbnRzW2RdID09PSB1bmRlZmluZWQpIHsNCiAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYnJ1c2ggPSBicnVzaGVzW2RdOw0KICAgICAgICBpZiAoYnJ1c2ggIT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIC8vdXBkYXRlIHRoZSBleHRlbnQNCiAgICAgICAgICBicnVzaC5leHRlbnQoZXh0ZW50c1tkXSk7DQoNCiAgICAgICAgICAvL3JlZHJhdyB0aGUgYnJ1c2gNCiAgICAgICAgICBicnVzaFNlbGVjdGlvbnNbZF0NCiAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKQ0KICAgICAgICAgICAgICAuZHVyYXRpb24oMCkNCiAgICAgICAgICAgICAgLmNhbGwoYnJ1c2gpOw0KDQogICAgICAgICAgLy9maXJlIHNvbWUgZXZlbnRzDQogICAgICAgICAgYnJ1c2guZXZlbnQoYnJ1c2hTZWxlY3Rpb25zW2RdKTsNCiAgICAgICAgfQ0KICAgICAgfSk7DQoNCiAgICAgIC8vcmVkcmF3IHRoZSBjaGFydA0KICAgICAgcGMucmVuZGVyQnJ1c2hlZCgpOw0KDQogICAgICByZXR1cm4gcGM7DQogICAgfQ0KICB9DQoNCiAgLy9mdW5jdGlvbiBicnVzaEV4dGVudHMoKSB7DQogIC8vICB2YXIgZXh0ZW50cyA9IHt9Ow0KICAvLyAgZDMua2V5cyhfXy5kaW1lbnNpb25zKS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgLy8gICAgdmFyIGJydXNoID0gYnJ1c2hlc1tkXTsNCiAgLy8gICAgaWYgKGJydXNoICE9PSB1bmRlZmluZWQgJiYgIWJydXNoLmVtcHR5KCkpIHsNCiAgLy8gICAgICB2YXIgZXh0ZW50ID0gYnJ1c2guZXh0ZW50KCk7DQogIC8vICAgICAgZXh0ZW50c1tkXSA9IGV4dGVudDsNCiAgLy8gICAgfQ0KICAvLyAgfSk7DQogIC8vICByZXR1cm4gZXh0ZW50czsNCiAgLy99DQoNCiAgZnVuY3Rpb24gYnJ1c2hGb3IoYXhpcykgew0KICAgIHZhciBicnVzaCA9IGQzLnN2Zy5tdWx0aWJydXNoKCk7DQoNCiAgICBicnVzaA0KICAgICAgLnkoX18uZGltZW5zaW9uc1theGlzXS55c2NhbGUpDQogICAgICAub24oImJydXNoc3RhcnQiLCBmdW5jdGlvbigpIHsNCgkJCQlpZihkMy5ldmVudC5zb3VyY2VFdmVudCAhPT0gbnVsbCkgew0KICAgICAgICAgICAgICAgICAgICBldmVudHMuYnJ1c2hzdGFydC5jYWxsKHBjLCBfXy5icnVzaGVkKTsNCgkJCQkJZDMuZXZlbnQuc291cmNlRXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7DQoJCQkJfQ0KICAgICAgfSkNCiAgICAgIC5vbigiYnJ1c2giLCBmdW5jdGlvbigpIHsNCiAgICAgICAgYnJ1c2hVcGRhdGVkKHNlbGVjdGVkKCkpOw0KICAgICAgfSkNCiAgICAgIC5vbigiYnJ1c2hlbmQiLCBmdW5jdGlvbigpIHsNCiAgICAJLy8gZDMuc3ZnLm11bHRpYnJ1c2ggY2xlYXJzIGV4dGVudHMganVzdCBiZWZvcmUgY2FsbGluZyAnYnJ1c2hlbmQnDQogICAgCS8vIHNvIHdlIGhhdmUgdG8gdXBkYXRlIGhlcmUgYWdhaW4uDQogICAgCS8vIFRoaXMgZml4ZXMgaXNzdWUgIzEwMyBmb3Igbm93LCBidXQgc2hvdWxkIGJlIGNoYW5nZWQgaW4gZDMuc3ZnLm11bHRpYnJ1c2gNCiAgICAJLy8gdG8gYXZvaWQgdW5uZWNlc3NhcnkgY29tcHV0YXRpb24uDQogICAgCWJydXNoVXBkYXRlZChzZWxlY3RlZCgpKTsNCiAgICAgICAgZXZlbnRzLmJydXNoZW5kLmNhbGwocGMsIF9fLmJydXNoZWQpOw0KICAgICAgfSkNCiAgICAgIC5leHRlbnRBZGFwdGlvbihmdW5jdGlvbihzZWxlY3Rpb24pIHsNCiAgICAJICBzZWxlY3Rpb24NCiAgICAJICAuc3R5bGUoInZpc2liaWxpdHkiLCBudWxsKQ0KICAgICAgICAgIC5hdHRyKCJ4IiwgLTE1KQ0KICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIDMwKQ0KICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJyZ2JhKDI1NSwyNTUsMjU1LDAuMjUpIikNCiAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsICJyZ2JhKDAsMCwwLDAuNikiKTsNCiAgICAgIH0pDQogICAgICAucmVzaXplQWRhcHRpb24oZnVuY3Rpb24oc2VsZWN0aW9uKSB7DQogICAgCSBzZWxlY3Rpb24NCiAgICAJICAgLnNlbGVjdEFsbCgicmVjdCIpDQogICAgCSAgIC5hdHRyKCJ4IiwgLTE1KQ0KICAgIAkgICAuYXR0cigid2lkdGgiLCAzMCkNCiAgICAgICAgIC5zdHlsZSgidmlzaWJpbGl0eSIsIG51bGwpDQogICAgICAgICAuc3R5bGUoImZpbGwiLCAicmdiYSgwLDAsMCwwLjEpIik7DQogICAgICB9KTsNCg0KICAgIGJydXNoZXNbYXhpc10gPSBicnVzaDsNCiAgICByZXR1cm4gYnJ1c2g7DQogIH0NCg0KICBmdW5jdGlvbiBicnVzaFJlc2V0KGRpbWVuc2lvbikgew0KICAgIF9fLmJydXNoZWQgPSBmYWxzZTsNCiAgICBpZiAoZykgew0KICAgICAgZy5zZWxlY3RBbGwoJy5icnVzaCcpDQogICAgICAgIC5lYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICBkMy5zZWxlY3QodGhpcykuY2FsbCgNCiAgICAgICAgICAgIGJydXNoZXNbZF0uY2xlYXIoKQ0KICAgICAgICAgICk7DQogICAgICAgIH0pOw0KICAgICAgcGMucmVuZGVyQnJ1c2hlZCgpOw0KICAgIH0NCiAgICByZXR1cm4gdGhpczsNCiAgfTsNCg0KICBmdW5jdGlvbiBpbnN0YWxsKCkgew0KICAgIGlmICghZykgcGMuY3JlYXRlQXhlcygpOw0KDQogICAgLy8gQWRkIGFuZCBzdG9yZSBhIGJydXNoIGZvciBlYWNoIGF4aXMuDQogICAgdmFyIGJydXNoID0gZy5hcHBlbmQoInN2ZzpnIikNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJicnVzaCIpDQogICAgICAuZWFjaChmdW5jdGlvbihkKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5jYWxsKGJydXNoRm9yKGQpKTsNCiAgICAgIH0pDQoNCiAgICBicnVzaC5zZWxlY3RBbGwoInJlY3QiKQ0KICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCBudWxsKQ0KICAgICAgICAuYXR0cigieCIsIC0xNSkNCiAgICAgICAgLmF0dHIoIndpZHRoIiwgMzApOw0KDQogICAgYnJ1c2guc2VsZWN0QWxsKCJyZWN0LmJhY2tncm91bmQiKQ0KICAgICAgICAuc3R5bGUoImZpbGwiLCAidHJhbnNwYXJlbnQiKTsNCg0KICAgIGJydXNoLnNlbGVjdEFsbCgicmVjdC5leHRlbnQiKQ0KICAgICAgICAuc3R5bGUoImZpbGwiLCAicmdiYSgyNTUsMjU1LDI1NSwwLjI1KSIpDQogICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgInJnYmEoMCwwLDAsMC42KSIpOw0KDQogICAgYnJ1c2guc2VsZWN0QWxsKCIucmVzaXplIHJlY3QiKQ0KICAgICAgICAuc3R5bGUoImZpbGwiLCAicmdiYSgwLDAsMCwwLjEpIik7DQoNCiAgICBwYy5icnVzaEV4dGVudHMgPSBicnVzaEV4dGVudHM7DQogICAgcGMuYnJ1c2hSZXNldCA9IGJydXNoUmVzZXQ7DQogICAgcmV0dXJuIHBjOw0KICB9DQoNCiAgYnJ1c2gubW9kZXNbIjFELWF4ZXMtbXVsdGkiXSA9IHsNCiAgICBpbnN0YWxsOiBpbnN0YWxsLA0KICAgIHVuaW5zdGFsbDogZnVuY3Rpb24oKSB7DQogICAgICBnLnNlbGVjdEFsbCgiLmJydXNoIikucmVtb3ZlKCk7DQogICAgICBicnVzaGVzID0ge307DQogICAgICBkZWxldGUgcGMuYnJ1c2hFeHRlbnRzOw0KICAgICAgZGVsZXRlIHBjLmJydXNoUmVzZXQ7DQogICAgfSwNCiAgICBzZWxlY3RlZDogc2VsZWN0ZWQsDQogICAgYnJ1c2hTdGF0ZTogYnJ1c2hFeHRlbnRzDQogIH0NCn0pKCk7DQovLyBicnVzaCBtb2RlOiBhbmd1bGFyDQovLyBjb2RlIGJhc2VkIG9uIDJELnN0cnVtcy5qcw0KDQooZnVuY3Rpb24oKSB7DQogIHZhciBhcmNzID0ge30sDQogICAgICBzdHJ1bVJlY3Q7DQoNCiAgZnVuY3Rpb24gZHJhd1N0cnVtKGFyYywgYWN0aXZlUG9pbnQpIHsNCiAgICB2YXIgc3ZnID0gcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJnI2FyY3MiKSwNCiAgICAgICAgaWQgPSBhcmMuZGltcy5pLA0KICAgICAgICBwb2ludHMgPSBbYXJjLnAyLCBhcmMucDNdLA0KICAgICAgICBsaW5lID0gc3ZnLnNlbGVjdEFsbCgibGluZSNhcmMtIiArIGlkKS5kYXRhKFt7cDE6YXJjLnAxLHAyOmFyYy5wMn0se3AxOmFyYy5wMSxwMjphcmMucDN9XSksDQogICAgICAgIGNpcmNsZXMgPSBzdmcuc2VsZWN0QWxsKCJjaXJjbGUjYXJjLSIgKyBpZCkuZGF0YShwb2ludHMpLA0KICAgICAgICBkcmFnID0gZDMuYmVoYXZpb3IuZHJhZygpLA0KICAgICAgICBwYXRoID0gc3ZnLnNlbGVjdEFsbCgicGF0aCNhcmMtIiArIGlkKS5kYXRhKFthcmNdKTsNCg0KICAgIHBhdGguZW50ZXIoKQ0KICAgICAgLmFwcGVuZCgicGF0aCIpDQogICAgICAuYXR0cigiaWQiLCAiYXJjLSIgKyBpZCkNCiAgICAgIC5hdHRyKCJjbGFzcyIsICJhcmMiKQ0KICAgICAgLnN0eWxlKCJmaWxsIiwgIm9yYW5nZSIpDQogICAgICAuc3R5bGUoIm9wYWNpdHkiLCAwLjUpOw0KDQogICAgcGF0aA0KICAgICAgLmF0dHIoImQiLCBhcmMuYXJjKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIGFyYy5wMVswXSArICIsIiArIGFyYy5wMVsxXSArICIpIik7DQoNCiAgICBsaW5lLmVudGVyKCkNCiAgICAgIC5hcHBlbmQoImxpbmUiKQ0KICAgICAgLmF0dHIoImlkIiwgImFyYy0iICsgaWQpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXJjIik7DQoNCiAgICBsaW5lDQogICAgICAuYXR0cigieDEiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnAxWzBdOyB9KQ0KICAgICAgLmF0dHIoInkxIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5wMVsxXTsgfSkNCiAgICAgIC5hdHRyKCJ4MiIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQucDJbMF07IH0pDQogICAgICAuYXR0cigieTIiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnAyWzFdOyB9KQ0KICAgICAgLmF0dHIoInN0cm9rZSIsICJibGFjayIpDQogICAgICAuYXR0cigic3Ryb2tlLXdpZHRoIiwgMik7DQoNCiAgICBkcmFnDQogICAgICAub24oImRyYWciLCBmdW5jdGlvbihkLCBpKSB7DQogICAgICAgIHZhciBldiA9IGQzLmV2ZW50LA0KICAgICAgICAJYW5nbGUgPSAwOw0KDQogICAgICAgIGkgPSBpICsgMjsNCg0KICAgICAgICBhcmNbInAiICsgaV1bMF0gPSBNYXRoLm1pbihNYXRoLm1heChhcmMubWluWCArIDEsIGV2LngpLCBhcmMubWF4WCk7DQogICAgICAgIGFyY1sicCIgKyBpXVsxXSA9IE1hdGgubWluKE1hdGgubWF4KGFyYy5taW5ZLCBldi55KSwgYXJjLm1heFkpOw0KDQogICAgICAgIGFuZ2xlID0gaSA9PT0gMyA/IGFyY3Muc3RhcnRBbmdsZShpZCkgOiBhcmNzLmVuZEFuZ2xlKGlkKTsNCg0KICAgICAgICBpZiAoKGFyYy5zdGFydEFuZ2xlIDwgTWF0aC5QSSAmJiBhcmMuZW5kQW5nbGUgPCBNYXRoLlBJICYmIGFuZ2xlIDwgTWF0aC5QSSkgfHwNCiAgICAgICAgCQkoYXJjLnN0YXJ0QW5nbGUgPj0gTWF0aC5QSSAmJiBhcmMuZW5kQW5nbGUgPj0gTWF0aC5QSSAmJiBhbmdsZSA+PSBNYXRoLlBJKSkgew0KDQogICAgICAgIAlpZiAoaSA9PT0gMikgew0KCSAgICAgICAgCWFyYy5lbmRBbmdsZSA9IGFuZ2xlOw0KCSAgICAgICAgCWFyYy5hcmMuZW5kQW5nbGUoYW5nbGUpOw0KCSAgICAgICAgfSBlbHNlIGlmIChpID09PSAzKSB7DQoJICAgICAgICAJYXJjLnN0YXJ0QW5nbGUgPSBhbmdsZTsNCgkgICAgICAgIAlhcmMuYXJjLnN0YXJ0QW5nbGUoYW5nbGUpOw0KCSAgICAgICAgfQ0KDQogICAgICAgIH0NCg0KICAgICAgICBkcmF3U3RydW0oYXJjLCBpIC0gMik7DQogICAgICB9KQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgb25EcmFnRW5kKCkpOw0KDQogICAgY2lyY2xlcy5lbnRlcigpDQogICAgICAuYXBwZW5kKCJjaXJjbGUiKQ0KICAgICAgLmF0dHIoImlkIiwgImFyYy0iICsgaWQpDQogICAgICAuYXR0cigiY2xhc3MiLCAiYXJjIik7DQoNCiAgICBjaXJjbGVzDQogICAgICAuYXR0cigiY3giLCBmdW5jdGlvbihkKSB7IHJldHVybiBkWzBdOyB9KQ0KICAgICAgLmF0dHIoImN5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZFsxXTsgfSkNCiAgICAgIC5hdHRyKCJyIiwgNSkNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuIChhY3RpdmVQb2ludCAhPT0gdW5kZWZpbmVkICYmIGkgPT09IGFjdGl2ZVBvaW50KSA/IDAuOCA6IDA7DQogICAgICB9KQ0KICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbigpIHsNCiAgICAgICAgZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJvcGFjaXR5IiwgMC44KTsNCiAgICAgIH0pDQogICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oKSB7DQogICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgib3BhY2l0eSIsIDApOw0KICAgICAgfSkNCiAgICAgIC5jYWxsKGRyYWcpOw0KICB9DQoNCiAgZnVuY3Rpb24gZGltZW5zaW9uc0ZvclBvaW50KHApIHsNCiAgICB2YXIgZGltcyA9IHsgaTogLTEsIGxlZnQ6IHVuZGVmaW5lZCwgcmlnaHQ6IHVuZGVmaW5lZCB9Ow0KICAgIGQzLmtleXMoX18uZGltZW5zaW9ucykuc29tZShmdW5jdGlvbihkaW0sIGkpIHsNCiAgICAgIGlmICh4c2NhbGUoZGltKSA8IHBbMF0pIHsNCiAgICAgICAgdmFyIG5leHQgPSBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpW3BjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKCkuaW5kZXhPZihkaW0pKzFdOw0KICAgICAgICBkaW1zLmkgPSBpOw0KICAgICAgICBkaW1zLmxlZnQgPSBkaW07DQogICAgICAgIGRpbXMucmlnaHQgPSBuZXh0Ow0KICAgICAgICByZXR1cm4gZmFsc2U7DQogICAgICB9DQogICAgICByZXR1cm4gdHJ1ZTsNCiAgICB9KTsNCg0KICAgIGlmIChkaW1zLmxlZnQgPT09IHVuZGVmaW5lZCkgew0KICAgICAgLy8gRXZlbnQgb24gdGhlIGxlZnQgc2lkZSBvZiB0aGUgZmlyc3QgYXhpcy4NCiAgICAgIGRpbXMuaSA9IDA7DQogICAgICBkaW1zLmxlZnQgPSBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpWzBdOw0KICAgICAgZGltcy5yaWdodCA9IHBjLmdldE9yZGVyZWREaW1lbnNpb25LZXlzKClbMV07DQogICAgfSBlbHNlIGlmIChkaW1zLnJpZ2h0ID09PSB1bmRlZmluZWQpIHsNCiAgICAgIC8vIEV2ZW50IG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBsYXN0IGF4aXMNCiAgICAgIGRpbXMuaSA9IGQzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoIC0gMTsNCiAgICAgIGRpbXMucmlnaHQgPSBkaW1zLmxlZnQ7DQogICAgICBkaW1zLmxlZnQgPSBwYy5nZXRPcmRlcmVkRGltZW5zaW9uS2V5cygpW2QzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoIC0gMl07DQogICAgfQ0KDQogICAgcmV0dXJuIGRpbXM7DQogIH0NCg0KICBmdW5jdGlvbiBvbkRyYWdTdGFydCgpIHsNCiAgICAvLyBGaXJzdCB3ZSBuZWVkIHRvIGRldGVybWluZSBiZXR3ZWVuIHdoaWNoIHR3byBheGVzIHRoZSBhcmMgd2FzIHN0YXJ0ZWQuDQogICAgLy8gVGhpcyB3aWxsIGRldGVybWluZSB0aGUgZnJlZWRvbSBvZiBtb3ZlbWVudCwgYmVjYXVzZSBhIGFyYyBjYW4NCiAgICAvLyBsb2dpY2FsbHkgb25seSBoYXBwZW4gYmV0d2VlbiB0d28gYXhlcywgc28gbm8gbW92ZW1lbnQgb3V0c2lkZSB0aGVzZSBheGVzDQogICAgLy8gc2hvdWxkIGJlIGFsbG93ZWQuDQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIHAgPSBkMy5tb3VzZShzdHJ1bVJlY3RbMF1bMF0pLA0KICAgICAgICAgIGRpbXMsDQogICAgICAgICAgYXJjOw0KDQogICAgICBwWzBdID0gcFswXSAtIF9fLm1hcmdpbi5sZWZ0Ow0KICAgICAgcFsxXSA9IHBbMV0gLSBfXy5tYXJnaW4udG9wOw0KDQogICAgICBkaW1zID0gZGltZW5zaW9uc0ZvclBvaW50KHApLA0KICAgICAgYXJjID0gew0KICAgICAgICBwMTogcCwNCiAgICAgICAgZGltczogZGltcywNCiAgICAgICAgbWluWDogeHNjYWxlKGRpbXMubGVmdCksDQogICAgICAgIG1heFg6IHhzY2FsZShkaW1zLnJpZ2h0KSwNCiAgICAgICAgbWluWTogMCwNCiAgICAgICAgbWF4WTogaCgpLA0KICAgICAgICBzdGFydEFuZ2xlOiB1bmRlZmluZWQsDQogICAgICAgIGVuZEFuZ2xlOiB1bmRlZmluZWQsDQogICAgICAgIGFyYzogZDMuc3ZnLmFyYygpLmlubmVyUmFkaXVzKDApDQogICAgICB9Ow0KDQogICAgICBhcmNzW2RpbXMuaV0gPSBhcmM7DQogICAgICBhcmNzLmFjdGl2ZSA9IGRpbXMuaTsNCg0KICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzDQogICAgICBhcmMucDFbMF0gPSBNYXRoLm1pbihNYXRoLm1heChhcmMubWluWCwgcFswXSksIGFyYy5tYXhYKTsNCiAgICAgIGFyYy5wMiA9IGFyYy5wMS5zbGljZSgpOw0KICAgICAgYXJjLnAzID0gYXJjLnAxLnNsaWNlKCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG9uRHJhZygpIHsNCiAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICB2YXIgZXYgPSBkMy5ldmVudCwNCiAgICAgICAgICBhcmMgPSBhcmNzW2FyY3MuYWN0aXZlXTsNCg0KICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzDQogICAgICBhcmMucDJbMF0gPSBNYXRoLm1pbihNYXRoLm1heChhcmMubWluWCArIDEsIGV2LnggLSBfXy5tYXJnaW4ubGVmdCksIGFyYy5tYXhYKTsNCiAgICAgIGFyYy5wMlsxXSA9IE1hdGgubWluKE1hdGgubWF4KGFyYy5taW5ZLCBldi55IC0gX18ubWFyZ2luLnRvcCksIGFyYy5tYXhZKTsNCiAgICAgIGFyYy5wMyA9IGFyYy5wMi5zbGljZSgpOw0KLy8gICAgICBjb25zb2xlLmxvZyhhcmNzLmFuZ2xlKGFyY3MuYWN0aXZlKSk7DQovLyAgICAgIGNvbnNvbGUubG9nKHNpZ25lZEFuZ2xlKGFyY3MudW5zaWduZWRBbmdsZShhcmNzLmFjdGl2ZSkpKTsNCiAgICAgIGRyYXdTdHJ1bShhcmMsIDEpOw0KICAgIH07DQogIH0NCg0KICAvLyBzb21lIGhlbHBlciBmdW5jdGlvbnMNCiAgZnVuY3Rpb24gaHlwb3RoZW51c2UoYSwgYikgew0KCSAgcmV0dXJuIE1hdGguc3FydChhKmEgKyBiKmIpOw0KICB9DQoNCiAgdmFyIHJhZCA9IChmdW5jdGlvbigpIHsNCgkgIHZhciBjID0gTWF0aC5QSSAvIDE4MDsNCgkgIHJldHVybiBmdW5jdGlvbihhbmdsZSkgew0KCQkgIHJldHVybiBhbmdsZSAqIGM7DQoJICB9Ow0KICB9KSgpOw0KDQogIHZhciBkZWcgPSAoZnVuY3Rpb24oKSB7DQoJICB2YXIgYyA9IDE4MCAvIE1hdGguUEk7DQoJICByZXR1cm4gZnVuY3Rpb24oYW5nbGUpIHsNCgkJICByZXR1cm4gYW5nbGUgKiBjOw0KCSAgfTsNCiAgfSkoKTsNCg0KICAvLyBbMCwgMipQSV0gLT4gWy1QSS8yLCBQSS8yXQ0KICB2YXIgc2lnbmVkQW5nbGUgPSBmdW5jdGlvbihhbmdsZSkgew0KICAgIHZhciByZXQgPSBhbmdsZTsNCiAgICBpZiAoYW5nbGUgPiBNYXRoLlBJKSB7DQogICAgICByZXQgPSBhbmdsZSAtIDEuNSAqIE1hdGguUEk7DQogICAgICByZXQgPSBhbmdsZSAtIDEuNSAqIE1hdGguUEk7DQogICAgfSBlbHNlIHsNCiAgICAgIHJldCA9IGFuZ2xlIC0gMC41ICogTWF0aC5QSTsNCiAgICAgIHJldCA9IGFuZ2xlIC0gMC41ICogTWF0aC5QSTsNCiAgICB9DQogICAgcmV0dXJuIC1yZXQ7DQogIH0NCg0KICAvKioNCiAgICogYW5nbGVzIGFyZSBzdG9yZWQgaW4gcmFkaWFucyBmcm9tIGluIFswLCAyKlBJXSwgd2hlcmUgMCBpbiAxMiBvJ2Nsb2NrLg0KICAgKiBIb3dldmVyLCBvbmUgY2FuIG9ubHkgc2VsZWN0IGxpbmVzIGZyb20gMCB0byBQSSwgc28gd2UgY29tcHV0ZSB0aGUNCiAgICogJ3NpZ25lZCcgYW5nbGUsIHdoZXJlIDAgaXMgdGhlIGhvcml6b250YWwgbGluZSAoMyBvJ2Nsb2NrKSwgYW5kICsvLSBQSS8yDQogICAqIGFyZSAxMiBhbmQgNiBvJ2Nsb2NrIHJlc3BlY3RpdmVseS4NCiAgICovDQogIGZ1bmN0aW9uIGNvbnRhaW5tZW50VGVzdChhcmMpIHsNCiAgICB2YXIgc3RhcnRBbmdsZSA9IHNpZ25lZEFuZ2xlKGFyYy5zdGFydEFuZ2xlKTsNCiAgICB2YXIgZW5kQW5nbGUgPSBzaWduZWRBbmdsZShhcmMuZW5kQW5nbGUpOw0KDQogICAgaWYgKHN0YXJ0QW5nbGUgPiBlbmRBbmdsZSkgew0KICAgIAl2YXIgdG1wID0gc3RhcnRBbmdsZTsNCiAgICAJc3RhcnRBbmdsZSA9IGVuZEFuZ2xlOw0KICAgIAllbmRBbmdsZSA9IHRtcDsNCiAgICB9DQoNCiAgICAvLyB0ZXN0IGlmIHNlZ21lbnQgYW5nbGUgaXMgY29udGFpbmVkIGluIGFuZ2xlIGludGVydmFsDQogICAgcmV0dXJuIGZ1bmN0aW9uKGEpIHsNCg0KICAgICAgaWYgKGEgPj0gc3RhcnRBbmdsZSAmJiBhIDw9IGVuZEFuZ2xlKSB7DQogICAgICAgIHJldHVybiB0cnVlOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHNlbGVjdGVkKCkgew0KICAgIHZhciBpZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhcmNzKSwNCiAgICAgICAgYnJ1c2hlZCA9IF9fLmRhdGE7DQoNCiAgICAvLyBHZXQgdGhlIGlkcyBvZiB0aGUgY3VycmVudGx5IGFjdGl2ZSBhcmNzLg0KICAgIGlkcyA9IGlkcy5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgcmV0dXJuICFpc05hTihkKTsNCiAgICB9KTsNCg0KICAgIGZ1bmN0aW9uIGNyb3NzZXNTdHJ1bShkLCBpZCkgew0KICAgICAgdmFyIGFyYyA9IGFyY3NbaWRdLA0KICAgICAgICAgIHRlc3QgPSBjb250YWlubWVudFRlc3QoYXJjKSwNCiAgICAgICAgICBkMSA9IGFyYy5kaW1zLmxlZnQsDQogICAgICAgICAgZDIgPSBhcmMuZGltcy5yaWdodCwNCiAgICAgICAgICB5MSA9IF9fLmRpbWVuc2lvbnNbZDFdLnlzY2FsZSwNCiAgICAgICAgICB5MiA9IF9fLmRpbWVuc2lvbnNbZDJdLnlzY2FsZSwNCiAgICAgICAgICBhID0gYXJjcy53aWR0aChpZCksDQogICAgICAgICAgYiA9IHkxKGRbZDFdKSAtIHkyKGRbZDJdKSwNCiAgICAgICAgICBjID0gaHlwb3RoZW51c2UoYSwgYiksDQogICAgICAgICAgYW5nbGUgPSBNYXRoLmFzaW4oYi9jKTsJLy8gcmFkIGluIFstUEkvMiwgUEkvMl0NCiAgICAgIHJldHVybiB0ZXN0KGFuZ2xlKTsNCiAgICB9DQoNCiAgICBpZiAoaWRzLmxlbmd0aCA9PT0gMCkgeyByZXR1cm4gYnJ1c2hlZDsgfQ0KDQogICAgcmV0dXJuIGJydXNoZWQuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgIHN3aXRjaChicnVzaC5wcmVkaWNhdGUpIHsNCiAgICAgIGNhc2UgIkFORCI6DQogICAgICAgIHJldHVybiBpZHMuZXZlcnkoZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGNyb3NzZXNTdHJ1bShkLCBpZCk7IH0pOw0KICAgICAgY2FzZSAiT1IiOg0KICAgICAgICByZXR1cm4gaWRzLnNvbWUoZnVuY3Rpb24oaWQpIHsgcmV0dXJuIGNyb3NzZXNTdHJ1bShkLCBpZCk7IH0pOw0KICAgICAgZGVmYXVsdDoNCiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGJydXNoIHByZWRpY2F0ZSAiICsgX18uYnJ1c2hQcmVkaWNhdGUpOw0KICAgICAgfQ0KICAgIH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gcmVtb3ZlU3RydW0oKSB7DQogICAgdmFyIGFyYyA9IGFyY3NbYXJjcy5hY3RpdmVdLA0KICAgICAgICBzdmcgPSBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5zZWxlY3QoImcjYXJjcyIpOw0KDQogICAgZGVsZXRlIGFyY3NbYXJjcy5hY3RpdmVdOw0KICAgIGFyY3MuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgIHN2Zy5zZWxlY3RBbGwoImxpbmUjYXJjLSIgKyBhcmMuZGltcy5pKS5yZW1vdmUoKTsNCiAgICBzdmcuc2VsZWN0QWxsKCJjaXJjbGUjYXJjLSIgKyBhcmMuZGltcy5pKS5yZW1vdmUoKTsNCiAgICBzdmcuc2VsZWN0QWxsKCJwYXRoI2FyYy0iICsgYXJjLmRpbXMuaSkucmVtb3ZlKCk7DQogIH0NCg0KICBmdW5jdGlvbiBvbkRyYWdFbmQoKSB7DQogICAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgICAgdmFyIGJydXNoZWQgPSBfXy5kYXRhLA0KICAgICAgICAgIGFyYyA9IGFyY3NbYXJjcy5hY3RpdmVdOw0KDQogICAgICAvLyBPa2F5LCBzb21ld2hhdCB1bmV4cGVjdGVkLCBidXQgbm90IHRvdGFsbHkgdW5zdXJwcmlzaW5nLCBhIG1vdXNjbGljayBpcw0KICAgICAgLy8gY29uc2lkZXJlZCBhIGRyYWcgd2l0aG91dCBtb3ZlLiBTbyB3ZSBoYXZlIHRvIGRlYWwgd2l0aCB0aGF0IGNhc2UNCiAgICAgIGlmIChhcmMgJiYgYXJjLnAxWzBdID09PSBhcmMucDJbMF0gJiYgYXJjLnAxWzFdID09PSBhcmMucDJbMV0pIHsNCiAgICAgICAgcmVtb3ZlU3RydW0oYXJjcyk7DQogICAgICB9DQoNCiAgICAgIGlmIChhcmMpIHsNCiAgICAJICB2YXIgYW5nbGUgPSBhcmNzLnN0YXJ0QW5nbGUoYXJjcy5hY3RpdmUpOw0KDQogICAgCSAgYXJjLnN0YXJ0QW5nbGUgPSBhbmdsZTsNCiAgICAgICAgICBhcmMuZW5kQW5nbGUgPSBhbmdsZTsNCiAgICAgICAgICBhcmMuYXJjDQogICAgICAgICAgICAub3V0ZXJSYWRpdXMoYXJjcy5sZW5ndGgoYXJjcy5hY3RpdmUpKQ0KICAgICAgICAgICAgLnN0YXJ0QW5nbGUoYW5nbGUpDQogICAgICAgICAgICAuZW5kQW5nbGUoYW5nbGUpOw0KICAgICAgfQ0KDQoNCiAgICAgIGJydXNoZWQgPSBzZWxlY3RlZChhcmNzKTsNCiAgICAgIGFyY3MuYWN0aXZlID0gdW5kZWZpbmVkOw0KICAgICAgX18uYnJ1c2hlZCA9IGJydXNoZWQ7DQogICAgICBwYy5yZW5kZXJCcnVzaGVkKCk7DQogICAgICBldmVudHMuYnJ1c2hlbmQuY2FsbChwYywgX18uYnJ1c2hlZCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGJydXNoUmVzZXQoYXJjcykgew0KICAgIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAgIHZhciBpZHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhcmNzKS5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gIWlzTmFOKGQpOw0KICAgICAgfSk7DQoNCiAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgYXJjcy5hY3RpdmUgPSBkOw0KICAgICAgICByZW1vdmVTdHJ1bShhcmNzKTsNCiAgICAgIH0pOw0KICAgICAgb25EcmFnRW5kKGFyY3MpKCk7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGluc3RhbGwoKSB7DQogICAgdmFyIGRyYWcgPSBkMy5iZWhhdmlvci5kcmFnKCk7DQoNCiAgICAvLyBNYXAgb2YgY3VycmVudCBhcmNzLiBhcmNzIGFyZSBzdG9yZWQgcGVyIHNlZ21lbnQgb2YgdGhlIFBDLiBBIHNlZ21lbnQsDQogICAgLy8gYmVpbmcgdGhlIGFyZWEgYmV0d2VlbiB0d28gYXhlcy4gVGhlIGxlZnQgbW9zdCBhcmVhIGlzIGluZGV4ZWQgYXQgMC4NCiAgICBhcmNzLmFjdGl2ZSA9IHVuZGVmaW5lZDsNCiAgICAvLyBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgUEMgc2VnbWVudCB3aGVyZSBjdXJyZW50bHkgYSBhcmMgaXMgYmVpbmcNCiAgICAvLyBwbGFjZWQuIE5PVEU6IGV2ZW4gdGhvdWdoIHRoZXkgYXJlIGV2ZW5seSBzcGFjZWQgaW4gb3VyIGN1cnJlbnQNCiAgICAvLyBpbXBsZW1lbnRhdGlvbiwgd2Uga2VlcCBmb3Igd2hlbiBub24tZXZlbiBzcGFjZWQgc2VnbWVudHMgYXJlIHN1cHBvcnRlZCBhcw0KICAgIC8vIHdlbGwuDQogICAgYXJjcy53aWR0aCA9IGZ1bmN0aW9uKGlkKSB7DQogICAgICB2YXIgYXJjID0gYXJjc1tpZF07DQoNCiAgICAgIGlmIChhcmMgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICByZXR1cm4gdW5kZWZpbmVkOw0KICAgICAgfQ0KDQogICAgICByZXR1cm4gYXJjLm1heFggLSBhcmMubWluWDsNCiAgICB9Ow0KDQogICAgLy8gcmV0dXJucyBhbmdsZXMgaW4gWy1QSS8yLCBQSS8yXQ0KICAgIGFuZ2xlID0gZnVuY3Rpb24ocDEsIHAyKSB7DQogICAgICAgIHZhciBhID0gcDFbMF0gLSBwMlswXSwNCiAgICAgICAgCWIgPSBwMVsxXSAtIHAyWzFdLA0KICAgICAgICAJYyA9IGh5cG90aGVudXNlKGEsIGIpOw0KDQogICAgICAgIHJldHVybiBNYXRoLmFzaW4oYi9jKTsNCiAgICB9DQoNCiAgICAvLyByZXR1cm5zIGFuZ2xlcyBpbiBbMCwgMiAqIFBJXQ0KICAgIGFyY3MuZW5kQW5nbGUgPSBmdW5jdGlvbihpZCkgew0KICAgIAl2YXIgYXJjID0gYXJjc1tpZF07DQogICAgCWlmIChhcmMgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KICAgIAl2YXIgc0FuZ2xlID0gYW5nbGUoYXJjLnAxLCBhcmMucDIpLA0KICAgIAkJdUFuZ2xlID0gLXNBbmdsZSArIE1hdGguUEkgLyAyOw0KDQogICAgCWlmIChhcmMucDFbMF0gPiBhcmMucDJbMF0pIHsNCiAgICAJCXVBbmdsZSA9IDIgKiBNYXRoLlBJIC0gdUFuZ2xlOw0KICAgIAl9DQoNCiAgICAJcmV0dXJuIHVBbmdsZTsNCiAgICB9DQoNCiAgICBhcmNzLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihpZCkgew0KICAgIAl2YXIgYXJjID0gYXJjc1tpZF07DQogICAgCWlmIChhcmMgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsNCiAgICAgICAgfQ0KDQogICAgCXZhciBzQW5nbGUgPSBhbmdsZShhcmMucDEsIGFyYy5wMyksDQogICAgCQl1QW5nbGUgPSAtc0FuZ2xlICsgTWF0aC5QSSAvIDI7DQoNCiAgICAJaWYgKGFyYy5wMVswXSA+IGFyYy5wM1swXSkgew0KICAgIAkJdUFuZ2xlID0gMiAqIE1hdGguUEkgLSB1QW5nbGU7DQogICAgCX0NCg0KICAgIAlyZXR1cm4gdUFuZ2xlOw0KICAgIH0NCg0KICAgIGFyY3MubGVuZ3RoID0gZnVuY3Rpb24oaWQpIHsNCiAgICAJdmFyIGFyYyA9IGFyY3NbaWRdOw0KDQogICAgICAgIGlmIChhcmMgPT09IHVuZGVmaW5lZCkgew0KICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7DQogICAgICAgIH0NCg0KICAgICAgICB2YXIgYSA9IGFyYy5wMVswXSAtIGFyYy5wMlswXSwNCiAgICAgICAgCWIgPSBhcmMucDFbMV0gLSBhcmMucDJbMV0sDQogICAgICAgIAljID0gaHlwb3RoZW51c2UoYSwgYik7DQoNCiAgICAgICAgcmV0dXJuKGMpOw0KICAgIH0NCg0KICAgIHBjLm9uKCJheGVzcmVvcmRlci5hcmNzIiwgZnVuY3Rpb24oKSB7DQogICAgICB2YXIgaWRzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXJjcykuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuICFpc05hTihkKTsNCiAgICAgIH0pOw0KDQogICAgICAvLyBDaGVja3MgaWYgdGhlIGZpcnN0IGRpbWVuc2lvbiBpcyBkaXJlY3RseSBsZWZ0IG9mIHRoZSBzZWNvbmQgZGltZW5zaW9uLg0KICAgICAgZnVuY3Rpb24gY29uc2VjdXRpdmUoZmlyc3QsIHNlY29uZCkgew0KICAgICAgICB2YXIgbGVuZ3RoID0gZDMua2V5cyhfXy5kaW1lbnNpb25zKS5sZW5ndGg7DQogICAgICAgIHJldHVybiBkMy5rZXlzKF9fLmRpbWVuc2lvbnMpLnNvbWUoZnVuY3Rpb24oZCwgaSkgew0KICAgICAgICAgIHJldHVybiAoZCA9PT0gZmlyc3QpDQogICAgICAgICAgICA/IGkgKyBpIDwgbGVuZ3RoICYmIF9fLmRpbWVuc2lvbnNbaSArIDFdID09PSBzZWNvbmQNCiAgICAgICAgICAgIDogZmFsc2U7DQogICAgICAgIH0pOw0KICAgICAgfQ0KDQogICAgICBpZiAoaWRzLmxlbmd0aCA+IDApIHsgLy8gV2UgaGF2ZSBzb21lIGFyY3MsIHdoaWNoIG1pZ2h0IG5lZWQgdG8gYmUgcmVtb3ZlZC4NCiAgICAgICAgaWRzLmZvckVhY2goZnVuY3Rpb24oZCkgew0KICAgICAgICAgIHZhciBkaW1zID0gYXJjc1tkXS5kaW1zOw0KICAgICAgICAgIGFyY3MuYWN0aXZlID0gZDsNCiAgICAgICAgICAvLyBJZiB0aGUgdHdvIGRpbWVuc2lvbnMgb2YgdGhlIGN1cnJlbnQgYXJjIGFyZSBub3QgbmV4dCB0byBlYWNoIG90aGVyDQogICAgICAgICAgLy8gYW55IG1vcmUsIHRoYW4gd2UnbGwgbmVlZCB0byByZW1vdmUgdGhlIGFyYy4gT3RoZXJ3aXNlIHdlIGtlZXAgaXQuDQogICAgICAgICAgaWYgKCFjb25zZWN1dGl2ZShkaW1zLmxlZnQsIGRpbXMucmlnaHQpKSB7DQogICAgICAgICAgICByZW1vdmVTdHJ1bShhcmNzKTsNCiAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBvbkRyYWdFbmQoYXJjcykoKTsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8vIEFkZCBhIG5ldyBzdmcgZ3JvdXAgaW4gd2hpY2ggd2UgZHJhdyB0aGUgYXJjcy4NCiAgICBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5hcHBlbmQoImciKQ0KICAgICAgLmF0dHIoImlkIiwgImFyY3MiKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIF9fLm1hcmdpbi5sZWZ0ICsgIiwiICsgX18ubWFyZ2luLnRvcCArICIpIik7DQoNCiAgICAvLyBJbnN0YWxsIHRoZSByZXF1aXJlZCBicnVzaFJlc2V0IGZ1bmN0aW9uDQogICAgcGMuYnJ1c2hSZXNldCA9IGJydXNoUmVzZXQoYXJjcyk7DQoNCiAgICBkcmFnDQogICAgICAub24oImRyYWdzdGFydCIsIG9uRHJhZ1N0YXJ0KGFyY3MpKQ0KICAgICAgLm9uKCJkcmFnIiwgb25EcmFnKGFyY3MpKQ0KICAgICAgLm9uKCJkcmFnZW5kIiwgb25EcmFnRW5kKGFyY3MpKTsNCg0KICAgIC8vIE5PVEU6IFRoZSBzdHlsaW5nIG5lZWRzIHRvIGJlIGRvbmUgaGVyZSBhbmQgbm90IGluIHRoZSBjc3MuIFRoaXMgaXMgYmVjYXVzZQ0KICAgIC8vICAgICAgIGZvciAxRCBicnVzaGluZywgdGhlIGNhbnZhcyBsYXllcnMgc2hvdWxkIG5vdCBsaXN0ZW4gdG8NCiAgICAvLyAgICAgICBwb2ludGVyLWV2ZW50cy4NCiAgICBzdHJ1bVJlY3QgPSBwYy5zZWxlY3Rpb24uc2VsZWN0KCJzdmciKS5pbnNlcnQoInJlY3QiLCAiZyNhcmNzIikNCiAgICAgIC5hdHRyKCJpZCIsICJhcmMtZXZlbnRzIikNCiAgICAgIC5hdHRyKCJ4IiwgX18ubWFyZ2luLmxlZnQpDQogICAgICAuYXR0cigieSIsIF9fLm1hcmdpbi50b3ApDQogICAgICAuYXR0cigid2lkdGgiLCB3KCkpDQogICAgICAuYXR0cigiaGVpZ2h0IiwgaCgpICsgMikNCiAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDApDQogICAgICAuY2FsbChkcmFnKTsNCiAgfQ0KDQogIGJydXNoLm1vZGVzWyJhbmd1bGFyIl0gPSB7DQogICAgaW5zdGFsbDogaW5zdGFsbCwNCiAgICB1bmluc3RhbGw6IGZ1bmN0aW9uKCkgew0KICAgICAgcGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIikuc2VsZWN0KCJnI2FyY3MiKS5yZW1vdmUoKTsNCiAgICAgIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpLnNlbGVjdCgicmVjdCNhcmMtZXZlbnRzIikucmVtb3ZlKCk7DQogICAgICBwYy5vbigiYXhlc3Jlb3JkZXIuYXJjcyIsIHVuZGVmaW5lZCk7DQogICAgICBkZWxldGUgcGMuYnJ1c2hSZXNldDsNCg0KICAgICAgc3RydW1SZWN0ID0gdW5kZWZpbmVkOw0KICAgIH0sDQogICAgc2VsZWN0ZWQ6IHNlbGVjdGVkLA0KICAgIGJydXNoU3RhdGU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyY3M7IH0NCiAgfTsNCg0KfSgpKTsNCnBjLmludGVyYWN0aXZlID0gZnVuY3Rpb24oKSB7DQogIGZsYWdzLmludGVyYWN0aXZlID0gdHJ1ZTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQovLyBleHBvc2UgYSBmZXcgb2JqZWN0cw0KcGMueHNjYWxlID0geHNjYWxlOw0KcGMuY3R4ID0gY3R4Ow0KcGMuY2FudmFzID0gY2FudmFzOw0KcGMuZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gZzsgfTsNCg0KLy8gcmVzY2FsZSBmb3IgaGVpZ2h0LCB3aWR0aCBhbmQgbWFyZ2lucw0KLy8gVE9ETyBjdXJyZW50bHkgYXNzdW1lcyBjaGFydCBpcyBicnVzaGFibGUsIGFuZCBkZXN0cm95cyBvbGQgYnJ1c2hlcw0KcGMucmVzaXplID0gZnVuY3Rpb24oKSB7DQogIC8vIHNlbGVjdGlvbiBzaXplDQogIHBjLnNlbGVjdGlvbi5zZWxlY3QoInN2ZyIpDQogICAgLmF0dHIoIndpZHRoIiwgX18ud2lkdGgpDQogICAgLmF0dHIoImhlaWdodCIsIF9fLmhlaWdodCkNCiAgcGMuc3ZnLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIF9fLm1hcmdpbi5sZWZ0ICsgIiwiICsgX18ubWFyZ2luLnRvcCArICIpIik7DQoNCiAgLy8gRklYTUU6IHRoZSBjdXJyZW50IGJydXNoIHN0YXRlIHNob3VsZCBwYXNzIHRocm91Z2gNCiAgaWYgKGZsYWdzLmJydXNoYWJsZSkgcGMuYnJ1c2hSZXNldCgpOw0KDQogIC8vIHNjYWxlcw0KICBwYy5hdXRvc2NhbGUoKTsNCg0KICAvLyBheGVzLCBkZXN0cm95cyBvbGQgYnJ1c2hlcy4NCiAgaWYgKGcpIHBjLmNyZWF0ZUF4ZXMoKTsNCiAgaWYgKGZsYWdzLmJydXNoYWJsZSkgcGMuYnJ1c2hhYmxlKCk7DQogIGlmIChmbGFncy5yZW9yZGVyYWJsZSkgcGMucmVvcmRlcmFibGUoKTsNCg0KICBldmVudHMucmVzaXplLmNhbGwodGhpcywge3dpZHRoOiBfXy53aWR0aCwgaGVpZ2h0OiBfXy5oZWlnaHQsIG1hcmdpbjogX18ubWFyZ2lufSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gaGlnaGxpZ2h0IGFuIGFycmF5IG9mIGRhdGENCnBjLmhpZ2hsaWdodCA9IGZ1bmN0aW9uKGRhdGEpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsNCiAgICByZXR1cm4gX18uaGlnaGxpZ2h0ZWQ7DQogIH0NCg0KICBfXy5oaWdobGlnaHRlZCA9IGRhdGE7DQogIHBjLmNsZWFyKCJoaWdobGlnaHQiKTsNCiAgZDMuc2VsZWN0QWxsKFtjYW52YXMuZm9yZWdyb3VuZCwgY2FudmFzLmJydXNoZWRdKS5jbGFzc2VkKCJmYWRlZCIsIHRydWUpOw0KICBkYXRhLmZvckVhY2gocGF0aF9oaWdobGlnaHQpOw0KICBldmVudHMuaGlnaGxpZ2h0LmNhbGwodGhpcywgZGF0YSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gY2xlYXIgaGlnaGxpZ2h0aW5nDQpwYy51bmhpZ2hsaWdodCA9IGZ1bmN0aW9uKCkgew0KICBfXy5oaWdobGlnaHRlZCA9IFtdOw0KICBwYy5jbGVhcigiaGlnaGxpZ2h0Iik7DQogIGQzLnNlbGVjdEFsbChbY2FudmFzLmZvcmVncm91bmQsIGNhbnZhcy5icnVzaGVkXSkuY2xhc3NlZCgiZmFkZWQiLCBmYWxzZSk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KLy8gY2FsY3VsYXRlIDJkIGludGVyc2VjdGlvbiBvZiBsaW5lIGEtPmIgd2l0aCBsaW5lIGMtPmQNCi8vIHBvaW50cyBhcmUgb2JqZWN0cyB3aXRoIHggYW5kIHkgcHJvcGVydGllcw0KcGMuaW50ZXJzZWN0aW9uID0gIGZ1bmN0aW9uKGEsIGIsIGMsIGQpIHsNCiAgcmV0dXJuIHsNCiAgICB4OiAoKGEueCAqIGIueSAtIGEueSAqIGIueCkgKiAoYy54IC0gZC54KSAtIChhLnggLSBiLngpICogKGMueCAqIGQueSAtIGMueSAqIGQueCkpIC8gKChhLnggLSBiLngpICogKGMueSAtIGQueSkgLSAoYS55IC0gYi55KSAqIChjLnggLSBkLngpKSwNCiAgICB5OiAoKGEueCAqIGIueSAtIGEueSAqIGIueCkgKiAoYy55IC0gZC55KSAtIChhLnkgLSBiLnkpICogKGMueCAqIGQueSAtIGMueSAqIGQueCkpIC8gKChhLnggLSBiLngpICogKGMueSAtIGQueSkgLSAoYS55IC0gYi55KSAqIChjLnggLSBkLngpKQ0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gcG9zaXRpb24oZCkgew0KICBpZiAoeHNjYWxlLnJhbmdlKCkubGVuZ3RoID09PSAwKSB7DQogICAgeHNjYWxlLnJhbmdlUG9pbnRzKFswLCB3KCldLCAxKTsNCiAgfQ0KICB2YXIgdiA9IGRyYWdnaW5nW2RdOw0KICByZXR1cm4gdiA9PSBudWxsID8geHNjYWxlKGQpIDogdjsNCn0NCg0KLy8gTWVyZ2VzIHRoZSBjYW52YXNlcyBhbmQgU1ZHIGVsZW1lbnRzIGludG8gb25lIGNhbnZhcyBlbGVtZW50IHdoaWNoIGlzIHRoZW4gcGFzc2VkIGludG8gdGhlIGNhbGxiYWNrDQovLyAoc28geW91IGNhbiBjaG9vc2UgdG8gc2F2ZSBpdCB0byBkaXNrLCBldGMuKQ0KcGMubWVyZ2VQYXJjb29yZHMgPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICAvLyBSZXRpbmEgZGlzcGxheSwgZXRjLg0KICB2YXIgZGV2aWNlUGl4ZWxSYXRpbyA9IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7DQoNCiAgLy8gQ3JlYXRlIGEgY2FudmFzIGVsZW1lbnQgdG8gc3RvcmUgdGhlIG1lcmdlZCBjYW52YXNlcw0KICB2YXIgbWVyZ2VkQ2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7DQogIG1lcmdlZENhbnZhcy53aWR0aCA9IHBjLmNhbnZhcy5mb3JlZ3JvdW5kLmNsaWVudFdpZHRoICogZGV2aWNlUGl4ZWxSYXRpbw0KICBtZXJnZWRDYW52YXMuaGVpZ2h0ID0gKHBjLmNhbnZhcy5mb3JlZ3JvdW5kLmNsaWVudEhlaWdodCArIDMwKSAqIGRldmljZVBpeGVsUmF0aW87DQogIG1lcmdlZENhbnZhcy5zdHlsZS53aWR0aCA9IG1lcmdlZENhbnZhcy53aWR0aCAvIGRldmljZVBpeGVsUmF0aW8gKyAicHgiOw0KICBtZXJnZWRDYW52YXMuc3R5bGUuaGVpZ2h0ID0gbWVyZ2VkQ2FudmFzLmhlaWdodCAvIGRldmljZVBpeGVsUmF0aW8gKyAicHgiOw0KDQogIC8vIEdpdmUgdGhlIGNhbnZhcyBhIHdoaXRlIGJhY2tncm91bmQNCiAgdmFyIGNvbnRleHQgPSBtZXJnZWRDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTsNCiAgY29udGV4dC5maWxsU3R5bGUgPSAiI2ZmZmZmZiI7DQogIGNvbnRleHQuZmlsbFJlY3QoMCwgMCwgbWVyZ2VkQ2FudmFzLndpZHRoLCBtZXJnZWRDYW52YXMuaGVpZ2h0KTsNCg0KICAvLyBNZXJnZSBhbGwgdGhlIGNhbnZhc2VzDQogIGZvciAodmFyIGtleSBpbiBwYy5jYW52YXMpIHsNCiAgICBjb250ZXh0LmRyYXdJbWFnZShwYy5jYW52YXNba2V5XSwgMCwgMjQgKiBkZXZpY2VQaXhlbFJhdGlvLCBtZXJnZWRDYW52YXMud2lkdGgsIG1lcmdlZENhbnZhcy5oZWlnaHQgLSAzMCAqIGRldmljZVBpeGVsUmF0aW8pOw0KICB9DQoNCiAgLy8gQWRkIFNWRyBlbGVtZW50cyB0byBjYW52YXMNCiAgdmFyIERPTVVSTCA9IHdpbmRvdy5VUkwgfHwgd2luZG93LndlYmtpdFVSTCB8fCB3aW5kb3c7DQogIHZhciBzZXJpYWxpemVyID0gbmV3IFhNTFNlcmlhbGl6ZXIoKTsNCiAgdmFyIHN2Z1N0ciA9IHNlcmlhbGl6ZXIuc2VyaWFsaXplVG9TdHJpbmcocGMuc2VsZWN0aW9uLnNlbGVjdCgic3ZnIilbMF1bMF0pOw0KDQogIC8vIENyZWF0ZSBhIERhdGEgVVJJLg0KICB2YXIgc3JjID0gJ2RhdGE6aW1hZ2Uvc3ZnK3htbDtiYXNlNjQsJyArIHdpbmRvdy5idG9hKHN2Z1N0cik7DQogIHZhciBpbWcgPSBuZXcgSW1hZ2UoKTsNCiAgaW1nLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHsNCiAgICBjb250ZXh0LmRyYXdJbWFnZShpbWcsIDAsIDAsIGltZy53aWR0aCAqIGRldmljZVBpeGVsUmF0aW8sIGltZy5oZWlnaHQgKiBkZXZpY2VQaXhlbFJhdGlvKTsNCiAgICBpZiAodHlwZW9mIGNhbGxiYWNrID09PSAiZnVuY3Rpb24iKSB7DQogICAgICBjYWxsYmFjayhtZXJnZWRDYW52YXMpOw0KICAgIH0NCiAgfTsNCiAgaW1nLnNyYyA9IHNyYzsNCn0NCnBjLnZlcnNpb24gPSAiMC43LjAiOw0KICAvLyB0aGlzIGRlc2NyaXB0aXZlIHRleHQgc2hvdWxkIGxpdmUgd2l0aCBvdGhlciBpbnRyb3NwZWN0aXZlIG1ldGhvZHMNCiAgcGMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuICJQYXJhbGxlbCBDb29yZGluYXRlczogIiArIGQzLmtleXMoX18uZGltZW5zaW9ucykubGVuZ3RoICsgIiBkaW1lbnNpb25zICgiICsgZDMua2V5cyhfXy5kYXRhWzBdKS5sZW5ndGggKyAiIHRvdGFsKSAsICIgKyBfXy5kYXRhLmxlbmd0aCArICIgcm93cyI7IH07DQoNCiAgcmV0dXJuIHBjOw0KfTsNCg0KZDMucmVuZGVyUXVldWUgPSAoZnVuY3Rpb24oZnVuYykgew0KICB2YXIgX3F1ZXVlID0gW10sICAgICAgICAgICAgICAgICAgLy8gZGF0YSB0byBiZSByZW5kZXJlZA0KICAgICAgX3JhdGUgPSAxMCwgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNhbGxzIHBlciBmcmFtZQ0KICAgICAgX2NsZWFyID0gZnVuY3Rpb24oKSB7fSwgICAgICAgLy8gY2xlYXJpbmcgZnVuY3Rpb24NCiAgICAgIF9pID0gMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgaXRlcmF0aW9uDQoNCiAgdmFyIHJxID0gZnVuY3Rpb24oZGF0YSkgew0KICAgIGlmIChkYXRhKSBycS5kYXRhKGRhdGEpOw0KICAgIHJxLmludmFsaWRhdGUoKTsNCiAgICBfY2xlYXIoKTsNCiAgICBycS5yZW5kZXIoKTsNCiAgfTsNCg0KICBycS5yZW5kZXIgPSBmdW5jdGlvbigpIHsNCiAgICBfaSA9IDA7DQogICAgdmFyIHZhbGlkID0gdHJ1ZTsNCiAgICBycS5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7IHZhbGlkID0gZmFsc2U7IH07DQoNCiAgICBmdW5jdGlvbiBkb0ZyYW1lKCkgew0KICAgICAgaWYgKCF2YWxpZCkgcmV0dXJuIHRydWU7DQogICAgICBpZiAoX2kgPiBfcXVldWUubGVuZ3RoKSByZXR1cm4gdHJ1ZTsNCg0KICAgICAgLy8gVHlwaWNhbCBkMyBiZWhhdmlvciBpcyB0byBwYXNzIGEgZGF0YSBpdGVtICphbmQqIGl0cyBpbmRleC4gQXMgdGhlDQogICAgICAvLyByZW5kZXIgcXVldWUgc3BsaXRzIHRoZSBvcmlnaW5hbCBkYXRhIHNldCwgd2UnbGwgaGF2ZSB0byBiZSBzbGlnaHRseQ0KICAgICAgLy8gbW9yZSBjYXJlZnVsbCBhYm91dCBwYXNzaW5nIHRoZSBjb3JyZWN0IGluZGV4IHdpdGggdGhlIGRhdGEgaXRlbS4NCiAgICAgIHZhciBlbmQgPSBNYXRoLm1pbihfaSArIF9yYXRlLCBfcXVldWUubGVuZ3RoKTsNCiAgICAgIGZvciAodmFyIGkgPSBfaTsgaSA8IGVuZDsgaSsrKSB7DQogICAgICAgIGZ1bmMoX3F1ZXVlW2ldLCBpKTsNCiAgICAgIH0NCiAgICAgIF9pICs9IF9yYXRlOw0KICAgIH0NCg0KICAgIGQzLnRpbWVyKGRvRnJhbWUpOw0KICB9Ow0KDQogIHJxLmRhdGEgPSBmdW5jdGlvbihkYXRhKSB7DQogICAgcnEuaW52YWxpZGF0ZSgpOw0KICAgIF9xdWV1ZSA9IGRhdGEuc2xpY2UoMCk7DQogICAgcmV0dXJuIHJxOw0KICB9Ow0KDQogIHJxLnJhdGUgPSBmdW5jdGlvbih2YWx1ZSkgew0KICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIF9yYXRlOw0KICAgIF9yYXRlID0gdmFsdWU7DQogICAgcmV0dXJuIHJxOw0KICB9Ow0KDQogIHJxLnJlbWFpbmluZyA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBfcXVldWUubGVuZ3RoIC0gX2k7DQogIH07DQoNCiAgLy8gY2xlYXIgdGhlIGNhbnZhcw0KICBycS5jbGVhciA9IGZ1bmN0aW9uKGZ1bmMpIHsNCiAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHsNCiAgICAgIF9jbGVhcigpOw0KICAgICAgcmV0dXJuIHJxOw0KICAgIH0NCiAgICBfY2xlYXIgPSBmdW5jOw0KICAgIHJldHVybiBycTsNCiAgfTsNCg0KICBycS5pbnZhbGlkYXRlID0gZnVuY3Rpb24oKSB7fTsNCg0KICByZXR1cm4gcnE7DQp9KTsNCg=="></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncGFyY29vcmRzJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0geyB9Ow0KDQogICAgdmFyIGRyYXcgPSBmdW5jdGlvbihlbCwgaW5zdGFuY2Upew0KDQogICAgICB2YXIgeCA9IGluc3RhbmNlLng7DQoNCiAgICAgIC8vdWdseSBidXQgY3VycmVudGx5IGhhdmUgdG8gY2xlYXIgb3V0DQogICAgICAvLyAgZWFjaCB0aW1lIHRvIGdldCBwcm9wZXIgcmVuZGVyDQogICAgICAvLyBkZWxldGUgYWxsIGNoaWxkcmVuIG9mIGVsDQogICAgICAvLyAgcG9zc2libHkgcmV2aXNpdCB0byBzZWUgaWYgd2Ugc2hvdWxkIGJlIGEgbGl0dGxlIG1vcmUgZGVsaWNhdGUNCiAgICAgIGQzLnNlbGVjdCggZWwgKS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsNCg0KICAgICAgLy8gaWYgaGVpZ2h0IG9yIHdpZHRoID0gMCB0aGVuIGJhaWwNCiAgICAgIC8vICAgdGhpcyBpcyBpbXBvcnRhbnQgZm9yIGZsZXhkYXNoYm9hcmQgYW5kIHRhYnNldHMNCiAgICAgIGlmKA0KICAgICAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCA9PT0gMCB8fA0KICAgICAgICBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgPT09IDANCiAgICAgICl7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCg0KICAgICAgLy8gY3JlYXRlIG91ciBwYXJhbGxlbCBjb29yZGluYXRlcw0KICAgICAgdmFyIHBhcmNvb3JkcyA9IGQzLnBhcmNvb3JkcygpKCIjIiArIGVsLmlkKQ0KICAgICAgICAuZGF0YSggeC5kYXRhICk7DQoNCiAgICAgIC8vIHVzZSBleHBhbmRvIHRvIGF0dGFjaCBwYXJjb29yZHMgdG8gdGhlIGVsZW1lbnQNCiAgICAgIC8vICB0aGlzIGR1cGxpY2F0ZXMgdGhlIHN0ZXAgYmVsb3cNCiAgICAgIC8vICBidXQgbWlnaHQgbWFrZSBpdCBlYXNpZXIgZm9yIGEgdXNlcg0KICAgICAgLy8gIHRvIG1hbmlwdWxhdGUgdGhlIHBhcmNvb3Jkcw0KICAgICAgLy8gIGlmIHRoZXkgYXJlIG5vdCBmYW1pbGlhciB3aXRoIHRoZQ0KICAgICAgLy8gIGludGVybmFscyBvZiBodG1sd2lkZ2V0cw0KICAgICAgZWwucGFyY29vcmRzID0gcGFyY29vcmRzOw0KICAgICAgLy8gYWxzbyBhdHRhY2ggdGhlIHBhcmFsbGVsIGNvb3JkaW5hdGVzIGFuZCB4IHRvIGluc3RhbmNlDQogICAgICBpbnN0YW5jZS5wYXJjb29yZHMgPSBwYXJjb29yZHM7DQoNCiAgICAgIC8vaWRlbnRpZnkgdGhlIGJydXNoZWQgZWxlbWVudHMgYW5kIHJldHVybiB0aG9zZSBkYXRhIElEcyB0byBSc2hpbnkNCiAgICAgIC8vdGhlIHBhcmNvb3Jkcy5vbigiYnJ1c2giLGZ1bmN0aW9uKGQpKXt9IG9ubHkgd29ya3Mgd2l0aCAxRC1heGVzIHNlbGVjdGlvbg0KICAgICAgaWYgKEhUTUxXaWRnZXRzLnNoaW55TW9kZSl7DQogICAgICAgIHBhcmNvb3Jkcy5vbigicmVuZGVyIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgdmFyIGlkcyA9IFtdOw0KICAgICAgICAgIGlmKHRoaXMuYnJ1c2hlZCgpKXsNCiAgICAgICAgICAgIGlkcyA9IHRoaXMuYnJ1c2hlZCgpLm1hcChmdW5jdGlvbihkKXsNCiAgICAgICAgICAgICAgcmV0dXJuIGQubmFtZXM7DQogICAgICAgICAgICB9KQ0KICAgICAgICAgIH0NCg0KICAgICAgICAgIC8vcmV0dXJuIHRoZSBicnVzaGVkIHJvdyBuYW1lcw0KICAgICAgICAgIGlmKFNoaW55Lm9uSW5wdXRDaGFuZ2Upew0KICAgICAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShlbC5pZCArICJfYnJ1c2hlZF9yb3dfbmFtZXMiLCBpZHMpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIC8vIHNlcGFyYXRlIGZyb20gYWJvdmUgU2hpbnkgaGFuZGxpbmcgZm9yIG5vdywNCiAgICAgIC8vICAgYnV0IGV2ZW50dWFsbHkgaW50ZWdyYXRlDQogICAgICB2YXIgY3Jvc3N0YWxrX3N1cHBvcnRlZCA9IHR5cGVvZihjcm9zc3RhbGspICE9PSAidW5kZWZpbmVkIiAmJg0KICAgICAgICAgIHR5cGVvZih4LmNyb3NzdGFsa19vcHRzKSAhPT0gInVuZGVmaW5lZCI7DQoNCiAgICAgIGlmKGNyb3NzdGFsa19zdXBwb3J0ZWQpIHsNCiAgICAgICAgdmFyIGN0X3NlbCA9IG5ldyBjcm9zc3RhbGsuU2VsZWN0aW9uSGFuZGxlKHguY3Jvc3N0YWxrX29wdHMuZ3JvdXApOw0KICAgICAgICBwYXJjb29yZHMub24oInJlbmRlciIsIGZ1bmN0aW9uKCkgew0KICAgICAgICAgIHZhciBpZHMgPSBbXTsNCiAgICAgICAgICBpZigNCiAgICAgICAgICAgIHRoaXMuYnJ1c2hlZCgpICYmDQogICAgICAgICAgICB0aGlzLmJydXNoZWQoKS5sZW5ndGggPCBwYXJjb29yZHMuZGF0YSgpLmxlbmd0aA0KICAgICAgICAgICl7DQogICAgICAgICAgICBpZHMgPSB0aGlzLmJydXNoZWQoKS5tYXAoZnVuY3Rpb24oZCl7DQogICAgICAgICAgICAgIHJldHVybiBkLmtleV87DQogICAgICAgICAgICB9KQ0KICAgICAgICAgICAgLy8gYWRkIGJydXNoZWQgdG8gZmlsdGVyDQogICAgICAgICAgICBjdF9zZWwuc2V0KGlkcyk7DQogICAgICAgICAgICB0aGlzLmhpZ2hsaWdodCh0aGlzLmJydXNoZWQoKSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBhcmNvb3Jkcy51bmhpZ2hsaWdodCgpOw0KICAgICAgICAgICAgLy8gaW5zdGVhZCBzZXQgdG8gZW1wdHkgYXJyYXkNCiAgICAgICAgICAgIC8vIGZpcnN0IGNoZWNrIHRvIG1ha2Ugc3VyZSBwYXJjb29yZHMgaW5pdGlhdGVkDQogICAgICAgICAgICAvLyAgYmVmb3JlIGNsZWFyaW5nDQogICAgICAgICAgICBpZih0eXBlb2YocGFyY29vcmRzLmJydXNoUmVzZXR0ZXIpICE9PSAidW5kZWZpbmVkIiAmJg0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID09PSAic2VsZiINCiAgICAgICAgICAgICkgew0KICAgICAgICAgICAgICAvLyBzZWVtcyB0aGlzIHNldHMgdG8gdW5kZWZpbmVkDQogICAgICAgICAgICAgIC8vICAgd2hpY2ggUGxvdGx5IGRvZXMgbm90IGN1cnJlbnRseSBoYW5kbGUNCiAgICAgICAgICAgICAgLy9jdF9zZWwuY2xlYXIoKTsNCiAgICAgICAgICAgICAgY3Rfc2VsLnNldChudWxsKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQoNCiAgICAgICAgfSk7DQogICAgICB9DQoNCg0KICAgICAgLy8gaGFuZGxlIGRpbWVuc2lvbnM7ICBpdCBhcHBlYXJzIHRoYXQgcGFyY29vcmRzDQogICAgICAvLyAgIGRldGVjdERpbWVuc2lvbnMgZG9lcyBub3QgcnVuIGlmIGN1c3RvbSBkaW1lbnNpb25zDQogICAgICAvLyAgIGFyZSBwcm92aWRlZCwgc28gd2UnbGwgbmVlZCB0byBkZXRlY3REaW1lbnNpb25zDQogICAgICAvLyAgIGFuZCB0aGVuIGluIGFueSB0aGF0IGFyZSBzcGVjaWZpZWQNCiAgICAgIGlmKCB4Lm9wdGlvbnMuZGltZW5zaW9ucyApew0KICAgICAgICBwYXJjb29yZHMuZGV0ZWN0RGltZW5zaW9ucygpOw0KICAgICAgICB2YXIgZGltcyA9IHBhcmNvb3Jkcy5kaW1lbnNpb25zKCk7DQogICAgICAgIC8vIHRoaXMgaXMgdWdseSBidXQgdHJ5aW5nIHRvIGF2b2lkIGRlcGVuZGVuY3kNCiAgICAgICAgLy8gT2JqZWN0LmFzc2lnbiBkaWQgbm90IHdvcmsgaW4gUlN0dWRpbw0KICAgICAgICBPYmplY3Qua2V5cyh4Lm9wdGlvbnMuZGltZW5zaW9ucykubWFwKGZ1bmN0aW9uKGspew0KICAgICAgICAgIE9iamVjdC5rZXlzKHgub3B0aW9ucy5kaW1lbnNpb25zW2tdKS5tYXAoZnVuY3Rpb24oa2spew0KICAgICAgICAgICAgZGltc1trXVtra10gPSB4Lm9wdGlvbnMuZGltZW5zaW9uc1trXVtra107DQogICAgICAgICAgfSkNCiAgICAgICAgfSkNCiAgICAgICAgeC5vcHRpb25zLmRpbWVuc2lvbnMgPSBkaW1zOw0KICAgICAgfQ0KDQogICAgICAvLyBjdXN0b21pemUgb3VyIHBhcmNvb3JkcyBhY2NvcmRpbmcgdG8gb3B0aW9ucw0KICAgICAgT2JqZWN0LmtleXMoIHgub3B0aW9ucyApLmZpbHRlcihmdW5jdGlvbihrKXsgcmV0dXJuIGsgIT09ICJyZW9yZGVyYWJsZSIgJiYgayAhPT0gImJydXNoTW9kZSIgJiYgayAhPT0gImJydXNoUHJlZGljYXRlIiAmJiBrIT09ICJjb2xvciIgJiYgayE9PSJyb3duYW1lcyJ9KS5tYXAoIGZ1bmN0aW9uKGspIHsNCiAgICAgICAgLy8gaWYgdGhlIGtleSBleGlzdHMgd2l0aGluIHBhcmNvb3Jkcw0KICAgICAgICBpZiAoIHBhcmNvb3Jkc1trXSApew0KICAgICAgICAgIGlmKCB0eXBlb2YgeC5vcHRpb25zW2tdID09PSAiYm9vbGVhbiIgKXsNCiAgICAgICAgICAgIHRyeSB7DQogICAgICAgICAgICAgIHBhcmNvb3Jkc1trXSgpOw0KICAgICAgICAgICAgfSBjYXRjaChlKSB7DQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIGRpZCBub3Qgd29yayBzbyBpZ25vcmUgZm9yIG5vdy4iICkNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgdHJ5ew0KICAgICAgICAgICAgICBwYXJjb29yZHNba10oIHgub3B0aW9uc1trXSApOw0KICAgICAgICAgICAgfSBjYXRjaChlKSB7DQogICAgICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIHdpdGggdmFsdWUgIiArIHgub3B0aW9uc1trXSArICJkaWQgbm90IHdvcmsgc28gaWdub3JlIGZvciBub3cuIiApDQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIGNvbnNvbGUubG9nKCAia2V5L29wdGlvbjogIiArIGsgKyAiIGlzIG5vdCBhdmFpbGFibGUgZm9yIGN1c3RvbWl6YXRpb24uIiApDQogICAgICAgIH0NCiAgICAgIH0pDQoNCg0KICAgICAgdmFyIGhpZGRlbl9heGVzID0gcGFyY29vcmRzLmhpZGVBeGlzKCkgfHwgW107DQogICAgICAvLyBhdCBvbmUgcG9pbnQgdGhvdWdodCBJIHNob3VsZA0KICAgICAgLy8gICByZW1vdmUgdGhpcyBiZWNhdXNlIG9mIGJ1ZyB3aXRoIGV4cGVyaW1lbnRhbCBkaW1lbnNpb25zDQogICAgICAvLyAgICBhbmQgaGFuZGxlIGZvciBub3cgYnkgcmVtb3Zpbmcgcm93bmFtZXMgZnJvbSB0aGUgZGF0YQ0KICAgICAgLy8gYnV0IGluc3RlYWQgSSBqdXN0IGhhZCB0byBtb3ZlIHRoaXMgcGllY2UgdG8gaGVyZQ0KICAgICAgaWYoIHR5cGVvZiB4Lm9wdGlvbnMucm93bmFtZXMgPT0gInVuZGVmaW5lZCIgfHwgeC5vcHRpb25zLnJvd25hbWVzID09PSBmYWxzZSApIHsNCiAgICAgICAgLy9yb3duYW1lcyA9IEYgc28gaGlkZSB0aGUgYXhpcw0KICAgICAgICBoaWRkZW5fYXhlcy5wdXNoKCJuYW1lcyIpOw0KICAgICAgfQ0KDQogICAgICAvLyBoaWRlIGNyb3NzdGFsayBrZXkgY29sdW1uDQogICAgICBpZihjcm9zc3RhbGtfc3VwcG9ydGVkKSB7DQogICAgICAgIGhpZGRlbl9heGVzLnB1c2goImtleV8iKTsNCiAgICAgIH0NCg0KICAgICAgcGFyY29vcmRzLmhpZGVBeGlzKGhpZGRlbl9heGVzKTsNCg0KICAgICAgLy8gY29sb3Igb3B0aW9uIHdpbGwgcmVxdWlyZSBzb21lIGN1c3RvbSBoYW5kbGluZw0KICAgICAgLy8gICBpZiBjb2xvciBpcyBhbiBvYmplY3Qgd2l0aCBjb2xvclNjYWxlIGFuZCBjb2xvckJ5DQogICAgICAvLyAgICB3aWxsIG5lZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIGVhY2ggb2YgdGhlIHVuaXF1ZSBncm91cCB2YWx1ZXMNCiAgICAgIC8vICAgIGFuZCBhc3NpZ24gYSBjb2xvcg0KICAgICAgaWYgKCB0eXBlb2YgeC5vcHRpb25zLmNvbG9yICE9PSAidW5kZWZpbmVkIiApIHsNCiAgICAgICAgdmFyIGNvbG9yOw0KICAgICAgICBpZiggeC5vcHRpb25zLmNvbG9yLmNvbnN0cnVjdG9yLm5hbWUgPT09ICJPYmplY3QiICkgew0KICAgICAgICAgIGNvbG9yU2NhbGUgPSB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSAgPyB4Lm9wdGlvbnMuY29sb3IuY29sb3JTY2FsZSA6IGQzLnNjYWxlLmNhdGVnb3J5MjBiKCk7DQogICAgICAgICAgdmFyIGNvbG9ycyA9IHt9Ow0KICAgICAgICAgIGQzLmtleXMoZDMubmVzdCgpLmtleShmdW5jdGlvbihkKXtyZXR1cm4gZFt4Lm9wdGlvbnMuY29sb3IuY29sb3JCeV19KS5tYXAoeC5kYXRhKSkubWFwKGZ1bmN0aW9uKGMpew0KICAgICAgICAgICAgY29sb3JzW2NdID0gY29sb3JTY2FsZShjKTsNCiAgICAgICAgICB9KQ0KDQogICAgICAgICAgY29sb3IgPSBmdW5jdGlvbihkKSB7DQogICAgICAgICAgICByZXR1cm4gY29sb3JzW2RbeC5vcHRpb25zLmNvbG9yLmNvbG9yQnldXTsNCiAgICAgICAgICB9Ow0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIC8vICAgY29sb3IgY2FuIGJlIGEgc2luZ2xlIHZhbHVlIGluIHdoaWNoIGFsbCBsaW5lcyB3aWxsIGJlIHNhbWUgY29sb3INCiAgICAgICAgICAvLyAgICBmb3IgdGhpcyB3ZSBkbyBub3QgbmVlZCB0byBkbyBhbnl0aGluZw0KICAgICAgICAgIGNvbG9yID0geC5vcHRpb25zLmNvbG9yOw0KICAgICAgICB9DQoNCiAgICAgICAgcGFyY29vcmRzLmNvbG9yKCBjb2xvciApOw0KICAgICAgfQ0KDQogICAgICAvLyBub3cgcmVuZGVyIG91ciBwYXJjb29yZHMNCiAgICAgIHBhcmNvb3Jkcw0KICAgICAgICAucmVuZGVyKCkNCg0KICAgICAgaWYoIHgub3B0aW9ucy5yZW9yZGVyYWJsZSApIHsNCiAgICAgICAgcGFyY29vcmRzLnJlb3JkZXJhYmxlKCk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBwYXJjb29yZHMuY3JlYXRlQXhlcygpOw0KICAgICAgfQ0KDQogICAgICBpZiggeC5vcHRpb25zLmJydXNoTW9kZSApIHsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoTW9kZSh4Lm9wdGlvbnMuYnJ1c2hNb2RlKTsNCiAgICAgICAgcGFyY29vcmRzLmJydXNoUHJlZGljYXRlKHgub3B0aW9ucy5icnVzaFByZWRpY2F0ZSk7DQogICAgICB9DQoNCiAgICAgIC8vIGlmIHJvd25hbWVzID0gVCB0aGVuIHJlbW92ZSBheGlzIHRpdGxlDQogICAgICBpZiggdHlwZW9mIHgub3B0aW9ucy5yb3duYW1lcyAhPT0gInVuZGVmaW5lZCIgJiYgeC5vcHRpb25zLnJvd25hbWVzID09PSB0cnVlICkgew0KICAgICAgICBkMy5zZWxlY3QoIiMiICsgZWwuaWQgKyAiIC5kaW1lbnNpb24gLmF4aXMgPiB0ZXh0IikucmVtb3ZlKCk7DQogICAgICB9DQoNCiAgICAgIC8vIHNsb3BweSBidXQgZm9yIG5vdyBsZXQncyBmb3JjZSB0ZXh0IHNtYWxsZXINCiAgICAgIC8vICAgPz8gaG93IGJlc3QgdG8gcHJvdmlkZSBwYXJhbWV0ZXIgaW4gUg0KICAgICAgZDMuc2VsZWN0QWxsKCIjIiArIGVsLmlkICsgIiBzdmcgdGV4dCIpDQogICAgICAgICAgLnN0eWxlKCJmb250LXNpemUiLCIxMHB4Iik7DQoNCiAgICAgIC8vIHNldCB1cCBhIGNvbnRhaW5lciBmb3IgdGFza3MgdG8gcGVyZm9ybSBhZnRlciBjb21wbGV0aW9uDQogICAgICAvLyAgb25lIGV4YW1wbGUgd291bGQgYmUgYWRkIGNhbGxiYWNrcyBmb3IgZXZlbnQgaGFuZGxpbmcNCiAgICAgIC8vICBzdHlsaW5nDQogICAgICBpZiAoISh0eXBlb2YgeC50YXNrcyA9PT0gInVuZGVmaW5lZCIgfHwgeC50YXNrcyA9PT0gbnVsbCkgKXsNCiAgICAgICAgaWYgKCAodHlwZW9mIHgudGFza3MubGVuZ3RoID09PSAidW5kZWZpbmVkIikgfHwNCiAgICAgICAgICh0eXBlb2YgeC50YXNrcyA9PT0gImZ1bmN0aW9uIiApICkgew0KICAgICAgICAgICAvLyBoYW5kbGUgYSBmdW5jdGlvbiBub3QgZW5jbG9zZWQgaW4gYXJyYXkNCiAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFibGUgdG8gcmVtb3ZlIG9uY2UgdXNpbmcganNvbmxpdGUNCiAgICAgICAgICAgeC50YXNrcyA9IFt4LnRhc2tzXTsNCiAgICAgICAgfQ0KICAgICAgICB4LnRhc2tzLm1hcChmdW5jdGlvbih0KXsNCiAgICAgICAgICAvLyBmb3IgZWFjaCB0YXNrcyBjYWxsIHRoZSB0YXNrIHdpdGggZWwgc3VwcGxpZWQgYXMgYHRoaXNgDQogICAgICAgICAgdC5jYWxsKHtlbDplbCxwYXJjb29yZHM6cGFyY29vcmRzLHg6eH0pOw0KICAgICAgICB9KTsNCiAgICAgIH0NCg0KICAgICAgLy8gbm93IHRoYXQgd2UgaGF2ZSBkcmF3biBhbmQgZXhlY3V0ZWQgdGFza3MNCiAgICAgIC8vICAgd2lyZSB1cCBjcm9zc3RhbGsgc2VsZWN0aW9uIGZyb20gb3V0c2lkZSBwYXJjb29yZHMNCiAgICAgIGlmKGNyb3NzdGFsa19zdXBwb3J0ZWQpIHsNCiAgICAgICAgY3Rfc2VsLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihzZWwpew0KICAgICAgICAgIGlmKCEoDQogICAgICAgICAgICB0eXBlb2YoY3Rfc2VsLnZhbHVlKSA9PT0gInVuZGVmaW5lZCIgfHwNCiAgICAgICAgICAgIGN0X3NlbC52YWx1ZSA9PT0gbnVsbCB8fA0KICAgICAgICAgICAgKEFycmF5LmlzQXJyYXkoY3Rfc2VsLnZhbHVlKSAmJiBjdF9zZWwudmFsdWUubGVuZ3RoID09PSAwKQ0KICAgICAgICAgICkpIHsNCiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IGN0X3NlbC52YWx1ZTsNCg0KICAgICAgICAgICAgLy8gaGFuZGxlIG5vbi1hcnJheSBzaW5nbGUtdmFsdWUNCiAgICAgICAgICAgIGlmKCFBcnJheS5pc0FycmF5KHNlbGVjdGVkKSkgew0KICAgICAgICAgICAgICBzZWxlY3RlZCA9IFtzZWxlY3RlZF07DQogICAgICAgICAgICB9DQogICAgICAgICAgICBpZihzZWwuc2VuZGVyID09PSBjdF9zZWwpew0KICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nIGZvciBub3cNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgIC8vIGNsZWFyIGJydXNoZXMNCiAgICAgICAgICAgICAgaWYocGFyY29vcmRzLmJydXNoZWQoKSl7DQogICAgICAgICAgICAgICAgLy8gbmFzdHkgd2F5IG9mIGRldGVybWluaW5nIHNvdXJjZSBvZiBicnVzaCByZXNldA0KICAgICAgICAgICAgICAgIC8vICAgbmVlZCB0aGlzIHRvIGtub3cgd2hldGhlciB0byBjaGFuZ2UNCiAgICAgICAgICAgICAgICAvLyAgIGNyb3NzdGFsayBzZWxlY3Rpb24gb3IgaWYgdGhlIGJydXNoIHJlc2V0DQogICAgICAgICAgICAgICAgLy8gICBpcyBhbiBvdXRjb21lIGNhdXNlZCBieSBzb21ldGhpbmcgb3RoZXIgdGhhbg0KICAgICAgICAgICAgICAgIC8vICAgdGhpcyBwYXJjb29yZHMgY2hhbmdpbmcgdGhlIHNlbGVjdGlvbg0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID0gIm90aGVyIjsNCiAgICAgICAgICAgICAgICBwYXJjb29yZHMuYnJ1c2hSZXNldCgpOw0KICAgICAgICAgICAgICAgIHBhcmNvb3Jkcy5icnVzaFJlc2V0dGVyID0gInNlbGYiOw0KICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgIC8vIHVzZSBoaWdobGlnaHQgdG8gc2hvdyB0aGUgc2VsZWN0aW9uDQogICAgICAgICAgICAgIHBhcmNvb3Jkcy5oaWdobGlnaHQocGFyY29vcmRzLmRhdGEoKS5maWx0ZXIoZnVuY3Rpb24oZCxpKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmluZGV4T2YoZC5rZXlfKSA+PSAwOw0KICAgICAgICAgICAgICB9KSk7DQogICAgICAgICAgICB9DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIHBhcmNvb3Jkcy51bmhpZ2hsaWdodCgpOw0KICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBpbnN0YW5jZTsNCg0KICAgIH07DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KDQogICAgICAgIC8vIGJhc2ljIGNoZWNrIG9mIGRhdGEgdG8gbWFrZSBzdXJlIHdlIHJlY2VpdmVkDQogICAgICAgIC8vICAgaW4gY29sdW1uIGZvcm1hdCBvciBvYmplY3Qgb2YgYXJyYXlzDQogICAgICAgIC8vICAgd2hpY2ggaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3Igb2YgaHRtbHdpZGdldHMNCiAgICAgICAgLy8gICByZWFzb24gZm9yIHRoaXMgY2hlY2sgaXMNCiAgICAgICAgLy8gICAgICBmdXR1cmUtcHJvb2ZpbmcgaWYgYmVoYXZpb3IgY2hhbmdlcw0KICAgICAgICAvLyAgICAgIHNvbWVvbmUgc3VwcGxpZXMgZGF0YSBpbiBhbiBhdHlwaWNhbCB3YXkNCiAgICAgICAgaWYoIHguZGF0YS5jb25zdHJ1Y3Rvci5uYW1lID09PSAiT2JqZWN0IiApew0KICAgICAgICAgIC8vIHVzZSBIVE1MV2lkZ2V0cyBmdW5jdGlvbiB0byBjb252ZXJ0IHRvIGFuIGFycmF5IG9mIG9iamVjdHMgKHJvdyBmb3JtYXQpDQogICAgICAgICAgeC5kYXRhID0gSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyggeC5kYXRhICkNCiAgICAgICAgfQ0KDQogICAgICAgIGluc3RhbmNlLnggPSB4Ow0KDQogICAgICAgIGluc3RhbmNlID0gZHJhdyhlbCwgaW5zdGFuY2UpOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICAvLyBvbmx5IHJlc2l6ZSBpZiBhdXRvcmVzaXplIHNldCB0byBUUlVFDQogICAgICAgIC8vICAgcmVzaXplIHdpbGwgY2F1c2UgdGhlIGVudGlyZSBwYXJjb29yZHMgdG8gcmUtcmVuZGVyDQogICAgICAgIC8vICAgc28gYnJ1c2hlZCBzZWxlY3Rpb25zLCBldGMuIHdpbGwgYmUgbG9zdA0KICAgICAgICAvLyAgIGFuZCBpbiBldmVudCBvZiBiaWdnZXIgZGF0YSwgZXhwZW5zaXZlIHJlLXJlbmRlcg0KICAgICAgICAvLyAgIHdpbGwgb2NjdXINCiAgICAgICAgaWYoaW5zdGFuY2UueC5hdXRvcmVzaXplKXsNCg0KICAgICAgICAgIGluc3RhbmNlID0gZHJhdyhlbCwgaW5zdGFuY2UpOw0KDQogICAgICAgIH0NCg0KICAgICAgfSwNCg0KICAgICAgaW5zdGFuY2U6IGluc3RhbmNlDQoNCiAgICB9Ow0KICB9DQp9KTsNCg=="></script>
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"></script>
</head>
<body>
<div id="cyl" class="btn-group btn-group-toggle" data-toggle="buttons">
<label class="btn btn-outline-primary"> <input type="radio" name="options" autocomplete="off" />4 </label> <label class="btn btn-outline-primary"> <input type="radio" name="options" autocomplete="off" />6 </label> <label class="btn btn-outline-primary"> <input type="radio" name="options" autocomplete="off" />8 </label>
</div>
<div id="htmlwidget-a6149e7ca1c5508083c2" class="parcoords html-widget" style="width:960px;height:350px;">
</div>
<script type="application/json" data-for="htmlwidget-a6149e7ca1c5508083c2">{"x":{"data":{"names":["Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant","Duster 360","Merc 240D","Merc 230","Merc 280","Merc 280C","Merc 450SE","Merc 450SL","Merc 450SLC","Cadillac Fleetwood","Lincoln Continental","Chrysler Imperial","Fiat 128","Honda Civic","Toyota Corolla","Toyota Corona","Dodge Challenger","AMC Javelin","Camaro Z28","Pontiac Firebird","Fiat X1-9","Porsche 914-2","Lotus Europa","Ford Pantera L","Ferrari Dino","Maserati Bora","Volvo 142E"],"mpg":[21,21,22.8,21.4,18.7,18.1,14.3,24.4,22.8,19.2,17.8,16.4,17.3,15.2,10.4,10.4,14.7,32.4,30.4,33.9,21.5,15.5,15.2,13.3,19.2,27.3,26,30.4,15.8,19.7,15,21.4],"cyl":[6,6,4,6,8,6,8,4,4,6,6,8,8,8,8,8,8,4,4,4,4,8,8,8,8,4,4,4,8,6,8,4],"disp":[160,160,108,258,360,225,360,146.7,140.8,167.6,167.6,275.8,275.8,275.8,472,460,440,78.7,75.7,71.1,120.1,318,304,350,400,79,120.3,95.1,351,145,301,121],"hp":[110,110,93,110,175,105,245,62,95,123,123,180,180,180,205,215,230,66,52,65,97,150,150,245,175,66,91,113,264,175,335,109],"drat":[3.9,3.9,3.85,3.08,3.15,2.76,3.21,3.69,3.92,3.92,3.92,3.07,3.07,3.07,2.93,3,3.23,4.08,4.93,4.22,3.7,2.76,3.15,3.73,3.08,4.08,4.43,3.77,4.22,3.62,3.54,4.11],"wt":[2.62,2.875,2.32,3.215,3.44,3.46,3.57,3.19,3.15,3.44,3.44,4.07,3.73,3.78,5.25,5.424,5.345,2.2,1.615,1.835,2.465,3.52,3.435,3.84,3.845,1.935,2.14,1.513,3.17,2.77,3.57,2.78],"qsec":[16.46,17.02,18.61,19.44,17.02,20.22,15.84,20,22.9,18.3,18.9,17.4,17.6,18,17.98,17.82,17.42,19.47,18.52,19.9,20.01,16.87,17.3,15.41,17.05,18.9,16.7,16.9,14.5,15.5,14.6,18.6],"vs":[0,0,1,1,0,1,0,1,1,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,0,1,0,0,0,1],"am":[1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1,1,1,1,1,1,1],"gear":[4,4,4,3,3,3,3,4,4,4,4,3,3,3,3,3,3,4,4,4,3,3,3,3,3,4,5,5,5,5,5,4],"carb":[4,4,1,1,2,1,4,2,2,4,4,3,3,3,4,4,4,1,2,1,1,2,2,4,2,1,2,2,4,6,8,2]},"options":{"rownames":true,"brushMode":"1D-axes","brushPredicate":"AND","reorderable":false,"margin":{"top":50,"bottom":50,"left":100,"right":50},"mode":false,"height":350},"autoresize":false,"tasks":null},"evals":[],"jsHooks":[]}</script>
<script>
$('#cyl input').change(function() {
var pc = HTMLWidgets.find('.parcoords').instance.parcoords
var selected = []
if($(this).prop('checked')) {
selected.push(+$(this).parent().text())
}
var filters = pc.outsideFilters() || {}
if(selected.length > 0) {
filters.cyl = selected
pc.outsideFilters(filters)
} else {
delete filters.cyl
pc.outsideFilters(filters)
}
// now update
pc.brushUpdated(pc.selected())
})
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment