Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active June 20, 2017 12:01
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/69a70ead46ebbb832c8d3114113e024f to your computer and use it in GitHub Desktop.
Save timelyportfolio/69a70ead46ebbb832c8d3114113e024f to your computer and use it in GitHub Desktop.
leaflet.extras sunburst
license: mit
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<link href="data:text/css;charset=utf-8,%2Esunburst%2Dmain%20%7B%0Awidth%3A%2090%25%3B%0Aheight%3A%20100%25%3B%0A%7D%0A%2Esunburst%2Dsidebar%20%7B%0Aposition%3A%20absolute%3B%0Aright%3A%2010px%3B%0Atop%3A%2010px%3B%0A%7D%0A%2Esunburst%2Dsequence%20%7B%0Awidth%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Atop%3A%200px%3B%0Aleft%3A%200px%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%2Esunburst%2Dlegend%20%7B%0Apadding%3A%2010px%200%200%203px%3B%0A%7D%0A%2Esunburst%2Dchart%20%7B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%0Aposition%3A%20absolute%3B%0Atop%3A%2070px%3B%0A%7D%0A%2Esunburst%2Dchart%20path%20%7B%0Astroke%3A%20%23fff%3B%0A%7D%0A%2Esunburst%2Dexplanation%20%7B%0Aposition%3A%20absolute%3B%0Atext%2Dalign%3A%20center%3B%0Acolor%3A%20%23666%3B%0Az%2Dindex%3A%20999%3B%0Afont%2Dsize%3A%202em%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9bmV3IEVycm9yKCJDYW5ub3QgZmluZCBtb2R1bGUgJyIrbysiJyIpO3Rocm93IGYuY29kZT0iTU9EVUxFX05PVF9GT1VORCIsZn12YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSh7MTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkocmVxdWlyZSgnZDMtZGlzcGF0Y2gnKSwgcmVxdWlyZSgnZDMtYXJyYXknKSwgcmVxdWlyZSgnZDMtZm9ybWF0JyksIHJlcXVpcmUoJ2QzLXNlbGVjdGlvbicpLCByZXF1aXJlKCdkMy1zY2FsZScpLCByZXF1aXJlKCdkMy1zaGFwZScpLCByZXF1aXJlKCdkMy1oaWVyYXJjaHknKSwgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy10cmFuc2l0aW9uJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydkMy1kaXNwYXRjaCcsICdkMy1hcnJheScsICdkMy1mb3JtYXQnLCAnZDMtc2VsZWN0aW9uJywgJ2QzLXNjYWxlJywgJ2QzLXNoYXBlJywgJ2QzLWhpZXJhcmNoeScsICdkMy1jb2xsZWN0aW9uJywgJ2QzLXRyYW5zaXRpb24nXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZDNEaXNwYXRjaCxkM0FycmF5LGQzRm9ybWF0LGQzU2VsZWN0aW9uLGQzU2NhbGUsZDNTaGFwZSxkM0hpZXJhcmNoeSxkM0NvbGxlY3Rpb24sZDNUcmFuc2l0aW9uKSB7ICd1c2Ugc3RyaWN0JzsNCg0KLy8gQ29waWVzIGEgdmFyaWFibGUgbnVtYmVyIG9mIG1ldGhvZHMgZnJvbSBzb3VyY2UgdG8gdGFyZ2V0Lg0KdmFyIHJlYmluZCA9IGZ1bmN0aW9uICh0YXJnZXQsIHNvdXJjZSkgew0KICB2YXIgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBtZXRob2Q7DQogIHdoaWxlICgrK2kgPCBuKSB0YXJnZXRbbWV0aG9kID0gYXJndW1lbnRzW2ldXSA9IGQzX3JlYmluZCh0YXJnZXQsIHNvdXJjZSwgc291cmNlW21ldGhvZF0pOw0KICByZXR1cm4gdGFyZ2V0Ow0KfTsNCg0KLy8gTWV0aG9kIGlzIGFzc3VtZWQgdG8gYmUgYSBzdGFuZGFyZCBEMyBnZXR0ZXItc2V0dGVyOg0KICAvLyBJZiBwYXNzZWQgd2l0aCBubyBhcmd1bWVudHMsIGdldHMgdGhlIHZhbHVlLg0KLy8gSWYgcGFzc2VkIHdpdGggYXJndW1lbnRzLCBzZXRzIHRoZSB2YWx1ZSBhbmQgcmV0dXJucyB0aGUgdGFyZ2V0Lg0KZnVuY3Rpb24gZDNfcmViaW5kKHRhcmdldCwgc291cmNlLCBtZXRob2QpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2YWx1ZSA9IG1ldGhvZC5hcHBseShzb3VyY2UsIGFyZ3VtZW50cyk7DQogICAgcmV0dXJuIHZhbHVlID09PSBzb3VyY2UgPyB0YXJnZXQgOiB2YWx1ZTsNCiAgfTsNCn0NCg0KdmFyIGRyYXcgPSBmdW5jdGlvbiAoZWwsIGluc3RhbmNlLCBkaXNwYXRjaF8pIHsNCiAgLy8gd291bGQgYmUgbXVjaCBuaWNlciB0byBpbXBsZW1lbnQgdHJhbnNpdGlvbnMvYW5pbWF0aW9uDQogIC8vIHJlbW92ZSBwcmV2aW91cyBpbiBjYXNlIG9mIFNoaW55L2R5bmFtaWMNCiAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC1jaGFydCBzdmciKS5yZW1vdmUoKTsNCg0KICB2YXIgeCA9IGluc3RhbmNlLng7DQogIHZhciBqc29uID0gaW5zdGFuY2UuanNvbjsNCiAgdmFyIGNoYXJ0ID0gaW5zdGFuY2UuY2hhcnQ7DQoNCiAgLy8gRGltZW5zaW9ucyBvZiBzdW5idXJzdA0KICB2YXIgd2lkdGggPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtICh4Lm9wdGlvbnMubGVnZW5kLncgPyB4Lm9wdGlvbnMubGVnZW5kLncgOiA3NSk7DQogIHZhciBoZWlnaHQgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgLSA3MDsNCiAgdmFyIHJhZGl1cyA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpIC8gMjsNCg0KICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiLnN1bmJ1cnN0LWNoYXJ0IikuYXBwZW5kKCJzdmciKQ0KICAgIC5zdHlsZSgid2lkdGgiLCB3aWR0aCArICJweCIpIC8vIHNob3VsZG50IGhhdmUgdG8gZG8gdGhpcw0KICAgIC5zdHlsZSgiaGVpZ2h0IiwgaGVpZ2h0ICsgInB4Iik7IC8vIHNob3VsZG50IGhhdmUgdG8gZG8gdGhpcw0KDQogIC8vIEJyZWFkY3J1bWIgZGltZW5zaW9uczogd2lkdGgsIGhlaWdodCwgc3BhY2luZywgd2lkdGggb2YgdGlwL3RhaWwuDQogIC8vICB0aGVzZSB3aWxsIGJlIHRoZSBkZWZhdWx0cw0KICB2YXIgYiA9IHsNCiAgICB3OiAwLCBoOiAzMCwgczogMywgdDogMTANCiAgfTsNCiAgLy8gIGlmIGJyZWFkY3J1bWIgaXMgcHJvdmlkZWQgaW4gdGhlIG9wdGlvbiwgd2Ugd2lsbCBvdmVyd3JpdGUNCiAgLy8gICB3aXRoIHdoYXQgaXMgcHJvdmlkZWQNCiAgT2JqZWN0LmtleXMoeC5vcHRpb25zLmJyZWFkY3J1bWIpLm1hcChmdW5jdGlvbihreSl7DQogICAgYltreV0gPSB4Lm9wdGlvbnMuYnJlYWRjcnVtYltreV07DQogIH0pOw0KLyoNCiAgLy8gTWFwcGluZyBvZiBzdGVwIG5hbWVzIHRvIGNvbG9ycy4NCiAgdmFyIGNvbG9ycyA9IHsNCiAgICAiaG9tZSI6ICIjNTY4N2QxIiwNCiAgICAicHJvZHVjdCI6ICIjN2I2MTVjIiwNCiAgICAic2VhcmNoIjogIiNkZTc4M2IiLA0KICAgICJhY2NvdW50IjogIiM2YWI5NzUiLA0KICAgICJvdGhlciI6ICIjYTE3M2QxIiwNCiAgICAiZW5kIjogIiNiYmJiYmIiDQogIH07DQoqLw0KDQogIHZhciBjb2xvcnMgPSBkM1NjYWxlLnNjYWxlT3JkaW5hbChkM1NjYWxlLnNjaGVtZUNhdGVnb3J5MjApOw0KDQogIGlmKHgub3B0aW9ucy5jb2xvcnMgIT09IG51bGwpew0KICAgIC8vIGlmIGFuIGFycmF5IHRoZW4gd2UgYXNzdW1lIHRoZSBjb2xvcnMNCiAgICAvLyAgcmVwcmVzZW50IGFuIGFycmF5IG9mIGhleGFkZWNpbWFsIGNvbG9ycyB0byBiZSB1c2VkDQogICAgaWYoQXJyYXkuaXNBcnJheSh4Lm9wdGlvbnMuY29sb3JzKSkgew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMucmFuZ2UoeC5vcHRpb25zLmNvbG9ycyk7DQogICAgICB9IGNhdGNoKGUpIHsNCg0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGlmIGFuIG9iamVjdCB3aXRoIHJhbmdlIHRoZW4gd2UgYXNzdW1lDQogICAgLy8gIHRoYXQgdGhpcyBpcyBhbiBhcnJheSBvZiBjb2xvcnMgdG8gYmUgdXNlZCBhcyByYW5nZQ0KICAgIGlmKHgub3B0aW9ucy5jb2xvcnMucmFuZ2Upew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMucmFuZ2UoeC5vcHRpb25zLmNvbG9ycy5yYW5nZSk7DQogICAgICB9IGNhdGNoKGUpIHsNCg0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIGlmIGFuIG9iamVjdCB3aXRoIGRvbWFpbiB0aGVuIHdlIGFzc3VtZQ0KICAgIC8vICB0aGF0IHRoaXMgaXMgYW4gYXJyYXkgb2YgY29sb3JzIHRvIGJlIHVzZWQgYXMgZG9tYWluDQogICAgLy8gIGZvciBtb3JlIHByZWNpc2UgY29udHJvbCBvZiB0aGUgY29sb3JzIGFzc2lnbmVkDQogICAgaWYoeC5vcHRpb25zLmNvbG9ycy5kb21haW4pew0KICAgICAgdHJ5ew0KICAgICAgICBjb2xvcnMuZG9tYWluKHgub3B0aW9ucy5jb2xvcnMuZG9tYWluKTsNCiAgICAgIH0gY2F0Y2goZSkgew0KDQogICAgICB9DQogICAgfQ0KDQogICAgLy8gaWYgYSBmdW5jdGlvbiB0aGVuIHNldCB0byB0aGUgZnVuY3Rpb24NCiAgICBpZih0eXBlb2YoeC5vcHRpb25zLmNvbG9ycykgPT09ICJmdW5jdGlvbiIpIHsNCiAgICAgIGNvbG9ycyA9IHgub3B0aW9ucy5jb2xvcnM7DQogICAgfQ0KICB9DQogIC8vIFRvdGFsIHNpemUgb2YgYWxsIHNlZ21lbnRzOyB3ZSBzZXQgdGhpcyBsYXRlciwgYWZ0ZXIgbG9hZGluZyB0aGUgZGF0YS4NCiAgdmFyIHRvdGFsU2l6ZSA9IDA7DQoNCiAgdmFyIHZpcyA9IGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtY2hhcnQiKS5zZWxlY3QoInN2ZyIpDQogICAgICAuYXBwZW5kKCJnIikNCiAgICAgIC5hdHRyKCJpZCIsIGVsLmlkICsgIi1jb250YWluZXIiKQ0KICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHdpZHRoIC8gMiArICIsIiArIGhlaWdodCAvIDIgKyAiKSIpOw0KDQogIHZhciBwYXJ0aXRpb25lciA9IGQzSGllcmFyY2h5LnBhcnRpdGlvbigpDQogICAgICAuc2l6ZShbMiAqIE1hdGguUEksIHJhZGl1cyAqIHJhZGl1c10pOw0KDQogIHZhciBhcmNfc2hhcGUgPSBkM1NoYXBlLmFyYygpDQogICAgICAuc3RhcnRBbmdsZShmdW5jdGlvbihkKSB7IHJldHVybiBkLngwOyB9KQ0KICAgICAgLmVuZEFuZ2xlKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQueDE7IH0pDQogICAgICAuaW5uZXJSYWRpdXMoZnVuY3Rpb24oZCkgeyByZXR1cm4gTWF0aC5zcXJ0KGQueTApOyB9KQ0KICAgICAgLm91dGVyUmFkaXVzKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIE1hdGguc3FydChkLnkxKTsgfSk7DQoNCiAgY3JlYXRlVmlzdWFsaXphdGlvbihqc29uKTsNCg0KICAvLyBzZXQgdXAgYSBjb250YWluZXIgZm9yIHRhc2tzIHRvIHBlcmZvcm0gYWZ0ZXIgY29tcGxldGlvbg0KICAvLyAgb25lIGV4YW1wbGUgd291bGQgYmUgYWRkIGNhbGxiYWNrcyBmb3IgZXZlbnQgaGFuZGxpbmcNCiAgLy8gIHN0eWxpbmcNCiAgaWYgKCEodHlwZW9mIHgudGFza3MgPT09ICJ1bmRlZmluZWQiKSApew0KICAgIGlmICggKHR5cGVvZiB4LnRhc2tzLmxlbmd0aCA9PT0gInVuZGVmaW5lZCIpIHx8DQogICAgICh0eXBlb2YgeC50YXNrcyA9PT0gImZ1bmN0aW9uIiApICkgew0KICAgICAgIC8vIGhhbmRsZSBhIGZ1bmN0aW9uIG5vdCBlbmNsb3NlZCBpbiBhcnJheQ0KICAgICAgIC8vIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSBvbmNlIHVzaW5nIGpzb25saXRlDQogICAgICAgeC50YXNrcyA9IFt4LnRhc2tzXTsNCiAgICB9DQogICAgeC50YXNrcy5tYXAoZnVuY3Rpb24odCl7DQogICAgICAvLyBmb3IgZWFjaCB0YXNrcyBjYWxsIHRoZSB0YXNrIHdpdGggZWwgc3VwcGxpZWQgYXMgYHRoaXNgDQogICAgICB0LmNhbGwoe2VsOmVsLHg6eCxpbnN0YW5jZTppbnN0YW5jZX0pOw0KICAgIH0pOw0KICB9DQoNCiAgLy8gTWFpbiBmdW5jdGlvbiB0byBkcmF3IGFuZCBzZXQgdXAgdGhlIHZpc3VhbGl6YXRpb24sIG9uY2Ugd2UgaGF2ZSB0aGUgZGF0YS4NCiAgZnVuY3Rpb24gY3JlYXRlVmlzdWFsaXphdGlvbihqc29uKSB7DQoNCiAgICAvLyBCYXNpYyBzZXR1cCBvZiBwYWdlIGVsZW1lbnRzLg0KICAgIGluaXRpYWxpemVCcmVhZGNydW1iVHJhaWwoKTsNCg0KICAgIC8vIEJvdW5kaW5nIGNpcmNsZSB1bmRlcm5lYXRoIHRoZSBzdW5idXJzdCwgdG8gbWFrZSBpdCBlYXNpZXIgdG8gZGV0ZWN0DQogICAgLy8gd2hlbiB0aGUgbW91c2UgbGVhdmVzIHRoZSBwYXJlbnQgZy4NCiAgICB2aXMuYXBwZW5kKCJjaXJjbGUiKQ0KICAgICAgICAuYXR0cigiciIsIHJhZGl1cykNCiAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMCk7DQoNCiAgICAvLyBUdXJuIHRoZSBkYXRhIGludG8gYSBkMyBoaWVyYXJjaHkgYW5kIGNhbGN1bGF0ZSB0aGUgc3Vtcy4NCiAgICB2YXIgcm9vdCA9IGQzSGllcmFyY2h5LmhpZXJhcmNoeShqc29uKQ0KICAgICAgICAuc3VtKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGRbeC5vcHRpb25zLnZhbHVlRmllbGQgfHwgInNpemUiXTsgfSk7DQoNCiAgICAvLyBjaGVjayBmb3Igc29ydCBmdW5jdGlvbg0KICAgIGlmKHgub3B0aW9ucy5zb3J0RnVuY3Rpb24pew0KICAgICAgcm9vdC5zb3J0KHgub3B0aW9ucy5zb3J0RnVuY3Rpb24pOw0KICAgIH0NCg0KICAgIC8vIEZvciBlZmZpY2llbmN5LCBmaWx0ZXIgbm9kZXMgdG8ga2VlcCBvbmx5IHRob3NlIGxhcmdlIGVub3VnaCB0byBzZWUuDQogICAgdmFyIG5vZGVzID0gcGFydGl0aW9uZXIocm9vdCkuZGVzY2VuZGFudHMoKQ0KICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgIHJldHVybiAoZC54MSAtIGQueDAgPiAwLjAwNSk7IC8vIDAuMDA1IHJhZGlhbnMgPSAwLjI5IGRlZ3JlZXMNCiAgICAgICAgfSk7DQoNCiAgICB2YXIgcGF0aCA9IHZpcy5kYXRhKFtqc29uXSkuc2VsZWN0QWxsKCJwYXRoIikNCiAgICAgICAgLmRhdGEobm9kZXMpDQogICAgICAgIC5lbnRlcigpLmFwcGVuZCgicGF0aCIpDQogICAgICAgIC5hdHRyKCJkaXNwbGF5IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kZXB0aCA/IG51bGwgOiAibm9uZSI7IH0pDQogICAgICAgIC5hdHRyKCJkIiwgYXJjX3NoYXBlKQ0KICAgICAgICAuYXR0cigiZmlsbC1ydWxlIiwgImV2ZW5vZGQiKQ0KICAgICAgICAuc3R5bGUoImZpbGwiLCBmdW5jdGlvbihkKSB7IHJldHVybiBjb2xvcnMuY2FsbCh0aGlzLCBkLmRhdGEubmFtZSk7IH0pDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpDQogICAgICAgIC5vbigibW91c2VvdmVyIiwgbW91c2VvdmVyKQ0KICAgICAgICAub24oImNsaWNrIiwgY2xpY2spOw0KDQogICAgLy8gQWRkIHRoZSBtb3VzZWxlYXZlIGhhbmRsZXIgdG8gdGhlIGJvdW5kaW5nIGNpcmNsZS4NCiAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIrIGVsLmlkICsgIi1jb250YWluZXIiKS5vbigibW91c2VsZWF2ZSIsIG1vdXNlbGVhdmUpOw0KDQogICAgLy8gR2V0IHRvdGFsIHNpemUgb2YgdGhlIHRyZWUgPSB2YWx1ZSBvZiByb290IG5vZGUgZnJvbSBwYXJ0aXRpb24uDQogICAgdG90YWxTaXplID0gcGF0aC5kYXR1bSgpLnZhbHVlOw0KDQogICAgZHJhd0xlZ2VuZChub2Rlcyk7DQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC10b2dnbGVsZWdlbmQiKS5vbigiY2xpY2siLCB0b2dnbGVMZWdlbmQpOw0KDQogICB9DQoNCiAgLy8gRmFkZSBhbGwgYnV0IHRoZSBjdXJyZW50IHNlcXVlbmNlLCBhbmQgc2hvdyBpdCBpbiB0aGUgYnJlYWRjcnVtYiB0cmFpbC4NCiAgZnVuY3Rpb24gbW91c2VvdmVyKGQpIHsNCg0KICAgIHZhciBwZXJjZW50YWdlID0gKDEwMCAqIGQudmFsdWUgLyB0b3RhbFNpemUpLnRvUHJlY2lzaW9uKDMpOw0KICAgIHZhciBwZXJjZW50YWdlU3RyaW5nID0gcGVyY2VudGFnZSArICIlIjsNCiAgICBpZiAocGVyY2VudGFnZSA8IDAuMSkgew0KICAgICAgcGVyY2VudGFnZVN0cmluZyA9ICI8IDAuMSUiOw0KICAgIH0NCg0KICAgIHZhciBjb3VudFN0cmluZyA9IFsNCiAgICAgICAgJzxzcGFuIHN0eWxlID0gImZvbnQtc2l6ZTouN2VtIj4nLA0KICAgICAgICBkM0Zvcm1hdC5mb3JtYXQoIjEuMnMiKShkLnZhbHVlKSArICcgb2YgJyArIGQzRm9ybWF0LmZvcm1hdCgiMS4ycyIpKHRvdGFsU2l6ZSksDQogICAgICAgICc8L3NwYW4+Jw0KICAgICAgXS5qb2luKCcnKTsNCg0KICAgIHZhciBleHBsYW5hdGlvblN0cmluZyA9ICIiOw0KICAgIGlmKHgub3B0aW9ucy5wZXJjZW50ICYmIHgub3B0aW9ucy5jb3VudCl7DQogICAgICBleHBsYW5hdGlvblN0cmluZyA9IHBlcmNlbnRhZ2VTdHJpbmcgKyAnPGJyLz4nICsgY291bnRTdHJpbmc7DQogICAgfSBlbHNlIGlmKHgub3B0aW9ucy5wZXJjZW50KXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0gcGVyY2VudGFnZVN0cmluZzsNCiAgICB9IGVsc2UgaWYoeC5vcHRpb25zLmNvdW50KXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0gY291bnRTdHJpbmc7DQogICAgfQ0KDQogICAgLy9pZiBleHBsYW5hdGlvbiBkZWZpbmVkIGluIFIgdGhlbiB1c2UgdGhpcyBpbnN0ZWFkDQogICAgaWYoeC5vcHRpb25zLmV4cGxhbmF0aW9uICE9PSBudWxsKXsNCiAgICAgIGV4cGxhbmF0aW9uU3RyaW5nID0geC5vcHRpb25zLmV4cGxhbmF0aW9uLmJpbmQodG90YWxTaXplKShkKTsNCiAgICB9DQoNCg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0QWxsKCIuc3VuYnVyc3QtZXhwbGFuYXRpb24iKQ0KICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiIikNCiAgICAgICAgLnN0eWxlKCJ0b3AiLCgoaGVpZ2h0IC0gNzApLzIpICsgInB4IikNCiAgICAgICAgLnN0eWxlKCJ3aWR0aCIsd2lkdGggKyAicHgiKQ0KICAgICAgICAuaHRtbChleHBsYW5hdGlvblN0cmluZyk7DQoNCiAgICB2YXIgc2VxdWVuY2VBcnJheSA9IGQuYW5jZXN0b3JzKCkucmV2ZXJzZSgpOw0KICAgIHNlcXVlbmNlQXJyYXkuc2hpZnQoKTsgLy8gcmVtb3ZlIHJvb3Qgbm9kZSBmcm9tIHRoZSBhcnJheQ0KDQogICAgY2hhcnQuX3NlbGVjdGlvbiA9IHNlcXVlbmNlQXJyYXkubWFwKA0KICAgICAgZnVuY3Rpb24oZCl7cmV0dXJuIGQuZGF0YS5uYW1lfQ0KICAgICk7DQogICAgZGlzcGF0Y2hfLmNhbGwoIm1vdXNlb3ZlciIsIGNoYXJ0Ll9zZWxlY3Rpb24pOw0KDQogICAgdXBkYXRlQnJlYWRjcnVtYnMoc2VxdWVuY2VBcnJheSwgcGVyY2VudGFnZVN0cmluZyk7DQoNCiAgICAvLyBGYWRlIGFsbCB0aGUgc2VnbWVudHMuDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3RBbGwoInBhdGgiKQ0KICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCAwLjMpOw0KDQogICAgLy8gVGhlbiBoaWdobGlnaHQgb25seSB0aG9zZSB0aGF0IGFyZSBhbiBhbmNlc3RvciBvZiB0aGUgY3VycmVudCBzZWdtZW50Lg0KICAgIHZpcy5zZWxlY3RBbGwoInBhdGgiKQ0KICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VxdWVuY2VBcnJheS5pbmRleE9mKG5vZGUpID49IDApOw0KICAgICAgICAgICAgICAgIH0pDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpOw0KICB9DQoNCiAgLy8gUmVzdG9yZSBldmVyeXRoaW5nIHRvIGZ1bGwgb3BhY2l0eSB3aGVuIG1vdmluZyBvZmYgdGhlIHZpc3VhbGl6YXRpb24uDQogIGZ1bmN0aW9uIG1vdXNlbGVhdmUoZCkgew0KDQogICAgZGlzcGF0Y2hfLmNhbGwoIm1vdXNlbGVhdmUiLCBjaGFydC5fc2VsZWN0aW9uKTsNCiAgICBjaGFydC5fc2VsZWN0aW9uID0gW107DQoNCiAgICAvLyBIaWRlIHRoZSBicmVhZGNydW1iIHRyYWlsDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLXRyYWlsIikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOw0KDQogICAgLy8gRGVhY3RpdmF0ZSBhbGwgc2VnbWVudHMgZHVyaW5nIHRyYW5zaXRpb24uDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3RBbGwoInBhdGgiKS5vbigibW91c2VvdmVyIiwgbnVsbCk7DQoNCiAgICAvLyBUcmFuc2l0aW9uIGVhY2ggc2VnbWVudCB0byBmdWxsIG9wYWNpdHkgYW5kIHRoZW4gcmVhY3RpdmF0ZSBpdC4NCiAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdEFsbCgicGF0aCIpDQogICAgICAgIC50cmFuc2l0aW9uKCkNCiAgICAgICAgLmR1cmF0aW9uKDEwMDApDQogICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIDEpDQogICAgICAgIC5vbigiZW5kIiwgZnVuY3Rpb24oKSB7DQogICAgICAgICAgZDNTZWxlY3Rpb24uc2VsZWN0KHRoaXMpLm9uKCJtb3VzZW92ZXIiLCBtb3VzZW92ZXIpOw0KICAgICAgICB9KTsNCg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0QWxsKCIuc3VuYnVyc3QtZXhwbGFuYXRpb24iKQ0KICAgICAgICAuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogIH0NCg0KICBmdW5jdGlvbiBjbGljayhkLGkpIHsNCiAgICB2YXIgc2VxdWVuY2VBcnJheSA9IGQuYW5jZXN0b3JzKCkucmV2ZXJzZSgpOw0KICAgIHNlcXVlbmNlQXJyYXkuc2hpZnQoKTsgLy8gcmVtb3ZlIHJvb3Qgbm9kZSBmcm9tIHRoZSBhcnJheQ0KDQogICAgZGlzcGF0Y2hfLmNhbGwoImNsaWNrIiwgc2VxdWVuY2VBcnJheS5tYXAoDQogICAgICBmdW5jdGlvbihkKXtyZXR1cm4gZC5kYXRhLm5hbWV9DQogICAgKSk7DQogIH0NCg0KICBmdW5jdGlvbiBpbml0aWFsaXplQnJlYWRjcnVtYlRyYWlsKCkgew0KICAgIC8vIEFkZCB0aGUgc3ZnIGFyZWEuDQogICAgdmFyIHRyYWlsID0gZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIi5zdW5idXJzdC1zZXF1ZW5jZSIpLmFwcGVuZCgic3ZnIikNCiAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpDQogICAgICAgIC8vLmF0dHIoImhlaWdodCIsIDUwKQ0KICAgICAgICAuYXR0cigiaWQiLCBlbC5pZCArICItdHJhaWwiKTsNCiAgICAvLyBBZGQgdGhlIGxhYmVsIGF0IHRoZSBlbmQsIGZvciB0aGUgcGVyY2VudGFnZS4NCiAgICB0cmFpbC5hcHBlbmQoInRleHQiKQ0KICAgICAgLmF0dHIoImlkIiwgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgIC5zdHlsZSgiZmlsbCIsICIjMDAwIik7DQogIH0NCg0KICAvLyBHZW5lcmF0ZSBhIHN0cmluZyB0aGF0IGRlc2NyaWJlcyB0aGUgcG9pbnRzIG9mIGEgYnJlYWRjcnVtYiBwb2x5Z29uLg0KICBmdW5jdGlvbiBicmVhZGNydW1iUG9pbnRzKGQsIGkpIHsNCiAgICB2YXIgcG9pbnRzID0gW107DQogICAgcG9pbnRzLnB1c2goIjAsMCIpOw0KICAgIGlmIChiLncgPD0gMCkgew0KICAgICAgLy8gY2FsY3VsYXRlIGJyZWFkY3J1bWIgd2lkdGggYmFzZWQgb24gc3RyaW5nIGxlbmd0aA0KICAgICAgcG9pbnRzLnB1c2goZC5zdHJpbmdfbGVuZ3RoICsgIiwwIik7DQogICAgICBwb2ludHMucHVzaChkLnN0cmluZ19sZW5ndGggKyBiLnQgKyAiLCIgKyAoYi5oIC8gMikpOw0KICAgICAgcG9pbnRzLnB1c2goZC5zdHJpbmdfbGVuZ3RoICsgIiwiICsgYi5oKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcG9pbnRzLnB1c2goYi53ICsgIiwwIik7DQogICAgICBwb2ludHMucHVzaChiLncgKyBiLnQgKyAiLCIgKyAoYi5oIC8gMikpOw0KICAgICAgcG9pbnRzLnB1c2goYi53ICsgIiwiICsgYi5oKTsNCiAgICB9DQogICAgcG9pbnRzLnB1c2goIjAsIiArIGIuaCk7DQoNCiAgICBpZiAoaSA+IDApIHsgLy8gTGVmdG1vc3QgYnJlYWRjcnVtYjsgZG9uJ3QgaW5jbHVkZSA2dGggdmVydGV4Lg0KICAgICAgcG9pbnRzLnB1c2goYi50ICsgIiwiICsgKGIuaCAvIDIpKTsNCiAgICB9DQogICAgcmV0dXJuIHBvaW50cy5qb2luKCIgIik7DQogIH0NCg0KICAvLyBVcGRhdGUgdGhlIGJyZWFkY3J1bWIgdHJhaWwgdG8gc2hvdyB0aGUgY3VycmVudCBzZXF1ZW5jZSBhbmQgcGVyY2VudGFnZS4NCiAgZnVuY3Rpb24gdXBkYXRlQnJlYWRjcnVtYnMobm9kZUFycmF5LCBwZXJjZW50YWdlU3RyaW5nKSB7DQoNCiAgICAvLyBEYXRhIGpvaW47IGtleSBmdW5jdGlvbiBjb21iaW5lcyBuYW1lIGFuZCBkZXB0aCAoPSBwb3NpdGlvbiBpbiBzZXF1ZW5jZSkuDQogICAgdmFyIGcgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKQ0KICAgICAgICAuc2VsZWN0QWxsKCJnIikNCiAgICAgICAgLmRhdGEobm9kZUFycmF5LCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEubmFtZSArIGQuZGVwdGg7IH0pOw0KDQogICAgLy8gQWRkIGJyZWFkY3J1bWIgYW5kIGxhYmVsIGZvciBlbnRlcmluZyBub2Rlcy4NCiAgICB2YXIgZW50ZXJpbmcgPSBnLmVudGVyKCkuYXBwZW5kKCJnIik7DQoNCg0KICAgIGlmIChiLncgPD0gMCkgew0KICAgICAgLy8gQ3JlYXRlIGEgbm9kZSBhcnJheSB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYnJlYWRjcnVtYiB3aWR0aHMNCiAgICAgIC8vIENhbGN1bGF0ZSBwb3NpdGlvbnMgb2YgYnJlYWRjcnVtYnMgYmFzZWQgb24gc3RyaW5nIGxlbmd0aHMNCiAgICAgIHZhciBjdXJyX2JyZWFkY3J1bWJfeCA9IDA7DQogICAgICBub2RlQXJyYXlbMF0uYnJlYWRjcnVtYl94ID0gMDsNCiAgICAgIG5vZGVBcnJheVswXS5icmVhZGNydW1iX2ggPSAwOw0KDQogICAgICBlbnRlcmluZy5hcHBlbmQoInBvbHlnb24iKQ0KICAgICAgICAgIC5zdHlsZSgiei1pbmRleCIsZnVuY3Rpb24oZCxpKSB7IHJldHVybig5OTktaSk7IH0pDQogICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gY29sb3JzLmNhbGwodGhpcywgZC5kYXRhLm5hbWUpOyB9KTsNCg0KICAgICAgZW50ZXJpbmcuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgICAuYXR0cigieCIsIGIudCArIDIpDQogICAgICAgICAgLmF0dHIoInkiLCBiLmggLyAyKQ0KICAgICAgICAgIC5hdHRyKCJkeSIsICIwLjM1ZW0iKQ0KICAgICAgICAgIC5hdHRyKCJ0ZXh0LWFuY2hvciIsICJsZWZ0IikNCiAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEubmFtZTsgfSk7DQoNCiAgICAgIC8vIFJlbW92ZSBleGl0aW5nIG5vZGVzLg0KICAgICAgZy5leGl0KCkucmVtb3ZlKCk7DQoNCiAgICAgIC8vIGxvb3AgdGhyb3VnaCBlYWNoIGcgZWxlbWVudA0KICAgICAgLy8gIGNhbGN1bGF0ZSBzdHJpbmcgbGVuZ3RoDQogICAgICAvLyAgZHJhdyB0aGUgYnJlYWRjcnVtYiBwb2x5Z29uDQogICAgICAvLyAgYW5kIGRldGVybWluZSBpZiBicmVhZGNydW1iIHNob3VsZCBiZSB3cmFwcGVkIHRvIG5leHQgcm93DQogICAgICBlbnRlcmluZy5tZXJnZShnKS5lYWNoKGZ1bmN0aW9uKGQsayl7DQogICAgICAgIHZhciBjcnVtYmcgPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7DQogICAgICAgIHZhciBteV9zdHJpbmdfbGVuZ3RoID0gY3J1bWJnLnNlbGVjdCgidGV4dCIpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDsNCiAgICAgICAgbm9kZUFycmF5W2tdLnN0cmluZ19sZW5ndGggPSBteV9zdHJpbmdfbGVuZ3RoICsgMTI7DQogICAgICAgIGNydW1iZy5zZWxlY3QoInBvbHlnb24iKS5hdHRyKCJwb2ludHMiLCBmdW5jdGlvbihkKXsNCiAgICAgICAgICByZXR1cm4gYnJlYWRjcnVtYlBvaW50cyhkLCBrKTsNCiAgICAgICAgfSk7DQogICAgICAgIHZhciBteV9nX2xlbmd0aCA9IGNydW1iZy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7DQogICAgICAgIGN1cnJfYnJlYWRjcnVtYl94ICs9IGs9PT0wID8gMCA6IG5vZGVBcnJheVtrLTFdLnN0cmluZ19sZW5ndGggKyBiLnM7DQogICAgICAgIG5vZGVBcnJheVtrXS5icmVhZGNydW1iX2ggPSBrPT09MCA/IDAgOiBub2RlQXJyYXlbay0xXS5icmVhZGNydW1iX2g7DQoNCiAgICAgICAgaWYgKGN1cnJfYnJlYWRjcnVtYl94ICsgbXlfZ19sZW5ndGggPiB3aWR0aCowLjk5KSB7DQogICAgICAgICAgbm9kZUFycmF5W2tdLmJyZWFkY3J1bWJfaCArPSBiLmg7ICAvLyBnb3QgdG8gbmV4dCBsaW5lDQogICAgICAgICAgY3Vycl9icmVhZGNydW1iX3ggPSBiLnQgKyBiLnM7ICAgICAvLyByZXN0YXJ0IGNvdW50ZXINCiAgICAgICAgfQ0KICAgICAgICBub2RlQXJyYXlba10uYnJlYWRjcnVtYl94ID0gY3Vycl9icmVhZGNydW1iX3g7DQogICAgICB9KTsNCg0KDQogICAgICAvLyBTZXQgcG9zaXRpb24gZm9yIGVudGVyaW5nIGFuZCB1cGRhdGluZyBub2Rlcy4NCiAgICAgIGVudGVyaW5nLm1lcmdlKGcpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGQuYnJlYWRjcnVtYl94ICsgIiwgIitkLmJyZWFkY3J1bWJfaCsiKSI7DQogICAgICB9KTsNCg0KDQogICAgICAvLyBOb3cgbW92ZSBhbmQgdXBkYXRlIHRoZSBwZXJjZW50YWdlIGF0IHRoZSBlbmQuDQogICAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgICAgICAuYXR0cigieCIsIGZ1bmN0aW9uKGQpew0KICAgICAgICAgICAgdmFyIGJlbmQgPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7DQogICAgICAgICAgICB2YXIgY3Vycl9icmVhZGNydW1iX3ggPSBub2RlQXJyYXlbbm9kZUFycmF5Lmxlbmd0aC0xXS5icmVhZGNydW1iX3ggKyAgbm9kZUFycmF5W25vZGVBcnJheS5sZW5ndGgtMV0uc3RyaW5nX2xlbmd0aCArIGIudCArIGIuczsNCiAgICAgICAgICAgIHZhciBteV9nX2xlbmd0aCA9IGJlbmQubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoOw0KDQogICAgICAgICAgICB2YXIgY3Vycl9icmVhZGNydW1iX2ggPSBub2RlQXJyYXlbbm9kZUFycmF5Lmxlbmd0aC0xXS5icmVhZGNydW1iX2ggKyBiLmgvMjsNCiAgICAgICAgICAgIGlmIChjdXJyX2JyZWFkY3J1bWJfeCArIG15X2dfbGVuZ3RoID4gd2lkdGgqMC45OSkgew0KICAgICAgICAgICAgICBjdXJyX2JyZWFkY3J1bWJfaCArPSBiLmggKyBiLmgvMjsNCiAgICAgICAgICAgICAgY3Vycl9icmVhZGNydW1iX3ggPSBiLnQgKyBiLnM7ICAgICAvLyByZXN0YXJ0IGNvdW50ZXINCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGJlbmQuZGF0dW0oew0KICAgICAgICAgICAgICAiYnJlYWRjcnVtYl94IjogY3Vycl9icmVhZGNydW1iX3gsDQogICAgICAgICAgICAgICJicmVhZGNydW1iX2giOiBjdXJyX2JyZWFkY3J1bWJfaA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gY3Vycl9icmVhZGNydW1iX3g7DQogICAgICAgICAgfSkNCiAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpe3JldHVybiBkLmJyZWFkY3J1bWJfaH0pDQogICAgICAgICAgLmF0dHIoImR5IiwgIjAuMzVlbSIpDQogICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgInN0YXJ0IikNCiAgICAgICAgICAudGV4dChwZXJjZW50YWdlU3RyaW5nKTsNCg0KDQogICAgfSBlbHNlIHsNCiAgICAgIGVudGVyaW5nLmFwcGVuZCgicG9seWdvbiIpDQogICAgICAgICAgLmF0dHIoInBvaW50cyIsIGJyZWFkY3J1bWJQb2ludHMpDQogICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gY29sb3JzLmNhbGwodGhpcywgZC5kYXRhLm5hbWUpOyB9KTsNCg0KICAgICAgZW50ZXJpbmcuYXBwZW5kKCJ0ZXh0IikNCiAgICAgICAgICAuYXR0cigieCIsIChiLncgKyBiLnQpIC8gMikNCiAgICAgICAgICAuYXR0cigieSIsIGIuaCAvIDIpDQogICAgICAgICAgLmF0dHIoImR5IiwgIjAuMzVlbSIpDQogICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgIm1pZGRsZSIpDQogICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kYXRhLm5hbWU7IH0pOw0KDQogICAgICAvLyBTZXQgcG9zaXRpb24gZm9yIGVudGVyaW5nIGFuZCB1cGRhdGluZyBub2Rlcy4NCiAgICAgIGVudGVyaW5nLm1lcmdlKGcpLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIGkgKiAoYi53ICsgYi5zKSArICIsIDApIjsNCiAgICAgIH0pOw0KDQogICAgICAvLyBSZW1vdmUgZXhpdGluZyBub2Rlcy4NCiAgICAgIGcuZXhpdCgpLnJlbW92ZSgpOw0KDQogICAgICAvLyBOb3cgbW92ZSBhbmQgdXBkYXRlIHRoZSBwZXJjZW50YWdlIGF0IHRoZSBlbmQuDQogICAgICBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiIyIgKyBlbC5pZCArICItdHJhaWwiKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLWVuZGxhYmVsIikNCiAgICAgICAgICAuYXR0cigieCIsIChub2RlQXJyYXkubGVuZ3RoICsgMC41KSAqIChiLncgKyBiLnMpKQ0KICAgICAgICAgIC5hdHRyKCJ5IiwgYi5oIC8gMikNCiAgICAgICAgICAuYXR0cigiZHkiLCAiMC4zNWVtIikNCiAgICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIikNCiAgICAgICAgICAudGV4dChwZXJjZW50YWdlU3RyaW5nKTsNCg0KICAgIH0NCg0KICAgIC8vIE1ha2UgdGhlIGJyZWFkY3J1bWIgdHJhaWwgdmlzaWJsZSwgaWYgaXQncyBoaWRkZW4uDQogICAgZDNTZWxlY3Rpb24uc2VsZWN0KGVsKS5zZWxlY3QoIiMiICsgZWwuaWQgKyAiLXRyYWlsIikNCiAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgIiIpOw0KDQogIH0NCg0KICBmdW5jdGlvbiBkcmF3TGVnZW5kKG5vZGVzKSB7DQoNCiAgICAvLyBEaW1lbnNpb25zIG9mIGxlZ2VuZCBpdGVtOiB3aWR0aCwgaGVpZ2h0LCBzcGFjaW5nLCByYWRpdXMgb2Ygcm91bmRlZCByZWN0Lg0KICAgIHZhciBsaSA9IHsNCiAgICAgIHc6IDc1LCBoOiAzMCwgczogMywgcjogMw0KICAgIH07DQoNCiAgICAvLyAgaWYgbGVnZW5kIGlzIHByb3ZpZGVkIGluIHRoZSBvcHRpb24sIHdlIHdpbGwgb3ZlcndyaXRlDQogICAgLy8gICB3aXRoIHdoYXQgaXMgcHJvdmlkZWQNCiAgICBPYmplY3Qua2V5cyh4Lm9wdGlvbnMubGVnZW5kKS5tYXAoZnVuY3Rpb24oa3kpew0KICAgICAgbGlba3ldID0geC5vcHRpb25zLmxlZ2VuZFtreV07DQogICAgfSk7DQoNCiAgICAvLyByZW1vdmUgaWYgYWxyZWFkeSBkcmF3bg0KICAgIGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtbGVnZW5kIHN2ZyIpLnJlbW92ZSgpOw0KDQogICAgLy8gZ2V0IGxhYmVscyBmcm9tIG5vZGUgbmFtZXMNCiAgICB2YXIgbGFiZWxzID0gZDNDb2xsZWN0aW9uLm5lc3QoKQ0KICAgICAgLmtleShmdW5jdGlvbihkKSB7cmV0dXJuIGQuZGF0YS5uYW1lfSkNCiAgICAgIC5lbnRyaWVzKA0KICAgICAgICBub2Rlcy5zb3J0KA0KICAgICAgICAgIGZ1bmN0aW9uKGEsYikge3JldHVybiBkM0FycmF5LmFzY2VuZGluZyhhLmRlcHRoLGIuZGVwdGgpfQ0KICAgICAgICApDQogICAgICApDQogICAgICAubWFwKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgcmV0dXJuIGQudmFsdWVzWzBdOw0KICAgICAgfSkNCiAgICAgIC5maWx0ZXIoZnVuY3Rpb24oZCkgew0KICAgICAgICByZXR1cm4gZC5kYXRhLm5hbWUgIT09ICJyb290IjsNCiAgICAgIH0pOw0KDQogICAgdmFyIGxlZ2VuZCA9IGQzU2VsZWN0aW9uLnNlbGVjdChlbCkuc2VsZWN0KCIuc3VuYnVyc3QtbGVnZW5kIikuYXBwZW5kKCJzdmciKQ0KICAgICAgICAuYXR0cigid2lkdGgiLCBsaS53KQ0KICAgICAgICAuYXR0cigiaGVpZ2h0IiwgbGFiZWxzLmxlbmd0aCAqIChsaS5oICsgbGkucykpOw0KDQogICAgdmFyIGcgPSBsZWdlbmQuc2VsZWN0QWxsKCJnIikNCiAgICAgICAgLmRhdGEoIGZ1bmN0aW9uKCl7DQogICAgICAgICAgaWYoeC5vcHRpb25zLmxlZ2VuZE9yZGVyICE9PSBudWxsKXsNCiAgICAgICAgICAgIHJldHVybiB4Lm9wdGlvbnMubGVnZW5kT3JkZXIubWFwKGZ1bmN0aW9uKGQpIHsNCiAgICAgICAgICAgICAgcmV0dXJuIGxhYmVscy5maWx0ZXIoZnVuY3Rpb24oZGQpIHtyZXR1cm4gZGQuZGF0YS5uYW1lID09PSBkIH0pWzBdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIC8vIGdldCBzb3J0ZWQgYnkgdG9wIGxldmVsDQogICAgICAgICAgICByZXR1cm4gbGFiZWxzOw0KICAgICAgICAgIH0NCiAgICAgICAgfSkNCiAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikNCiAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQsIGkpIHsNCiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyBpICogKGxpLmggKyBsaS5zKSArICIpIjsNCiAgICAgICAgICAgICB9KTsNCg0KICAgIGcuYXBwZW5kKCJyZWN0IikNCiAgICAgICAgLmF0dHIoInJ4IiwgbGkucikNCiAgICAgICAgLmF0dHIoInJ5IiwgbGkucikNCiAgICAgICAgLmF0dHIoIndpZHRoIiwgbGkudykNCiAgICAgICAgLmF0dHIoImhlaWdodCIsIGxpLmgpDQogICAgICAgIC5zdHlsZSgiZmlsbCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGNvbG9ycy5jYWxsKHRoaXMsIGQuZGF0YS5uYW1lKTsgfSk7DQoNCiAgICBnLmFwcGVuZCgidGV4dCIpDQogICAgICAgIC5hdHRyKCJ4IiwgbGkudyAvIDIpDQogICAgICAgIC5hdHRyKCJ5IiwgbGkuaCAvIDIpDQogICAgICAgIC5hdHRyKCJkeSIsICIwLjM1ZW0iKQ0KICAgICAgICAuYXR0cigidGV4dC1hbmNob3IiLCAibWlkZGxlIikNCiAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kYXRhLm5hbWU7IH0pOw0KICB9DQoNCiAgZnVuY3Rpb24gdG9nZ2xlTGVnZW5kKCkgew0KICAgIHZhciBsZWdlbmQgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZWwpLnNlbGVjdCgiLnN1bmJ1cnN0LWxlZ2VuZCIpOw0KICAgIGlmIChsZWdlbmQuc3R5bGUoInZpc2liaWxpdHkiKSA9PSAiaGlkZGVuIikgew0KICAgICAgbGVnZW5kLnN0eWxlKCJ2aXNpYmlsaXR5IiwgIiIpOw0KICAgIH0gZWxzZSB7DQogICAgICBsZWdlbmQuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgSFRNTFdpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHM7DQoNCkhUTUxXaWRnZXRzLndpZGdldCh7DQoNCiAgbmFtZTogJ3N1bmJ1cnN0JywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgdmFyIGluc3RhbmNlID0ge307DQoNCiAgICBpbnN0YW5jZS5jaGFydCA9IHt9Ow0KDQogICAgdmFyIGRpc3BhdGNoXyA9IGQzRGlzcGF0Y2guZGlzcGF0Y2goIm1vdXNlb3ZlciIsIm1vdXNlbGVhdmUiLCJjbGljayIpOw0KICAgIHJlYmluZChpbnN0YW5jZS5jaGFydCwgZGlzcGF0Y2hfLCAnb24nKTsNCg0KICAgIC8vIFRha2UgYSAyLWNvbHVtbiBDU1YgYW5kIHRyYW5zZm9ybSBpdCBpbnRvIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBzdWl0YWJsZQ0KICAgIC8vIGZvciBhIHBhcnRpdGlvbiBsYXlvdXQuIFRoZSBmaXJzdCBjb2x1bW4gaXMgYSBzZXF1ZW5jZSBvZiBzdGVwIG5hbWVzLCBmcm9tDQogICAgLy8gcm9vdCB0byBsZWFmLCBzZXBhcmF0ZWQgYnkgaHlwaGVucy4gVGhlIHNlY29uZCBjb2x1bW4gaXMgYSBjb3VudCBvZiBob3cNCiAgICAvLyBvZnRlbiB0aGF0IHNlcXVlbmNlIG9jY3VycmVkLg0KICAgIGZ1bmN0aW9uIGJ1aWxkSGllcmFyY2h5KGNzdikgew0KICAgICAgdmFyIHJvb3QgPSB7Im5hbWUiOiAicm9vdCIsICJjaGlsZHJlbiI6IFtdfTsNCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3N2Lmxlbmd0aDsgaSsrKSB7DQogICAgICAgIHZhciBzZXF1ZW5jZSA9IGNzdltpXVswXTsNCiAgICAgICAgdmFyIHNpemUgPSArY3N2W2ldWzFdOw0KICAgICAgICBpZiAoaXNOYU4oc2l6ZSkpIHsgLy8gZS5nLiBpZiB0aGlzIGlzIGEgaGVhZGVyIHJvdw0KICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICB9DQogICAgICAgIHZhciBwYXJ0cyA9IHNlcXVlbmNlLnNwbGl0KCItIik7DQogICAgICAgIHZhciBjdXJyZW50Tm9kZSA9IHJvb3Q7DQogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHsNCiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBjdXJyZW50Tm9kZVsiY2hpbGRyZW4iXTsNCiAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBwYXJ0c1tqXTsNCiAgICAgICAgICB2YXIgY2hpbGROb2RlOw0KICAgICAgICAgIGlmIChqICsgMSA8IHBhcnRzLmxlbmd0aCkgew0KICAgICAgIC8vIE5vdCB5ZXQgYXQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2U7IG1vdmUgZG93biB0aGUgdHJlZS4NCiAgICAgCXZhciBmb3VuZENoaWxkID0gZmFsc2U7DQogICAgIAlmb3IgKHZhciBrID0gMDsgayA8IGNoaWxkcmVuLmxlbmd0aDsgaysrKSB7DQogICAgIAkgIGlmIChjaGlsZHJlbltrXVsibmFtZSJdID09IG5vZGVOYW1lKSB7DQogICAgIAkgICAgY2hpbGROb2RlID0gY2hpbGRyZW5ba107DQogICAgIAkgICAgZm91bmRDaGlsZCA9IHRydWU7DQogICAgIAkgICAgYnJlYWs7DQogICAgIAkgIH0NCiAgICAgCX0NCiAgICAgIC8vIElmIHdlIGRvbid0IGFscmVhZHkgaGF2ZSBhIGNoaWxkIG5vZGUgZm9yIHRoaXMgYnJhbmNoLCBjcmVhdGUgaXQuDQogICAgIAlpZiAoIWZvdW5kQ2hpbGQpIHsNCiAgICAgCSAgY2hpbGROb2RlID0geyJuYW1lIjogbm9kZU5hbWUsICJjaGlsZHJlbiI6IFtdfTsNCiAgICAgCSAgY2hpbGRyZW4ucHVzaChjaGlsZE5vZGUpOw0KICAgICAJfQ0KICAgICAJY3VycmVudE5vZGUgPSBjaGlsZE5vZGU7DQogICAgICAgICAgfSBlbHNlIHsNCiAgICAgCS8vIFJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc2VxdWVuY2U7IGNyZWF0ZSBhIGxlYWYgbm9kZS4NCiAgICAgCWNoaWxkTm9kZSA9IHsibmFtZSI6IG5vZGVOYW1lLCAic2l6ZSI6IHNpemV9Ow0KICAgICAJY2hpbGRyZW4ucHVzaChjaGlsZE5vZGUpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgcmV0dXJuIHJvb3Q7DQoNCiAgICB9DQoNCiAgICByZXR1cm4gew0KDQogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgew0KDQogICAgICAgIGluc3RhbmNlLnggPSB4Ow0KDQogICAgICAgIC8vIHguZGF0YSBzaG91bGQgYmUgYSBkYXRhLmZyYW1lIGluIFIgc28gYW4gSmF2YXNjcmlwdCBPYmplY3Qgb2YgT2JqZWN0cw0KICAgICAgICAvLyAgICAgYnV0IGJ1aWxkSGllcmFyY2h5IGV4cGVjdHMgYW4gQXJyYXkgb2YgQXJyYXlzDQogICAgICAgIC8vICAgICBzbyB1c2UgZDMuemlwIGFuZCBhcHBseSB0byBkbyB0aGlzDQogICAgICAgIHZhciBqc29uID0gW107DQogICAgICAgIGlmKHR5cGVvZih4LmNzdmRhdGEpICE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAganNvbiA9IGJ1aWxkSGllcmFyY2h5KA0KICAgICAgICAgICAgZDNBcnJheS56aXAuYXBwbHkoDQogICAgICAgICAgICAgIG51bGwsDQogICAgICAgICAgICAgIE9iamVjdC5rZXlzKHguY3N2ZGF0YSkubWFwKGZ1bmN0aW9uKGt5KXtyZXR1cm4geC5jc3ZkYXRhW2t5XX0pDQogICAgICAgICAgICApDQogICAgICAgICAgKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICBqc29uID0geC5kYXRhOw0KICAgICAgICB9DQogICAgICAgIGluc3RhbmNlLmpzb24gPSBqc29uOw0KDQogICAgICAgIGRyYXcoZWwsIGluc3RhbmNlLCBkaXNwYXRjaF8pOw0KDQogICAgICB9LA0KDQogICAgICByZXNpemU6IGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsNCg0KICAgICAgICBkcmF3KGVsLCBpbnN0YW5jZSwgZGlzcGF0Y2hfKTsNCg0KICAgICAgfSwNCg0KICAgICAgaW5zdGFuY2U6IGluc3RhbmNlDQoNCiAgICB9Ow0KICB9DQp9KTsNCg0KfSkpKTsNCg0KfSx7ImQzLWFycmF5IjoyLCJkMy1jb2xsZWN0aW9uIjozLCJkMy1kaXNwYXRjaCI6NSwiZDMtZm9ybWF0Ijo3LCJkMy1oaWVyYXJjaHkiOjgsImQzLXNjYWxlIjoxMSwiZDMtc2VsZWN0aW9uIjoxMiwiZDMtc2hhcGUiOjEzLCJkMy10cmFuc2l0aW9uIjoxN31dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1hcnJheS8gVmVyc2lvbiAxLjIuMC4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgYXNjZW5kaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47DQp9Ow0KDQp2YXIgYmlzZWN0b3IgPSBmdW5jdGlvbihjb21wYXJlKSB7DQogIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7DQogIHJldHVybiB7DQogICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7DQogICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOw0KICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7DQogICAgICB3aGlsZSAobG8gPCBoaSkgew0KICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsNCiAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsNCiAgICAgICAgZWxzZSBoaSA9IG1pZDsNCiAgICAgIH0NCiAgICAgIHJldHVybiBsbzsNCiAgICB9LA0KICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsNCiAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7DQogICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsNCiAgICAgIHdoaWxlIChsbyA8IGhpKSB7DQogICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOw0KICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7DQogICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIGxvOw0KICAgIH0NCiAgfTsNCn07DQoNCmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoZikgew0KICByZXR1cm4gZnVuY3Rpb24oZCwgeCkgew0KICAgIHJldHVybiBhc2NlbmRpbmcoZihkKSwgeCk7DQogIH07DQp9DQoNCnZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpOw0KdmFyIGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0Ow0KdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDsNCg0KdmFyIHBhaXJzID0gZnVuY3Rpb24oYXJyYXksIGYpIHsNCiAgaWYgKGYgPT0gbnVsbCkgZiA9IHBhaXI7DQogIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7DQogIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBmKHAsIHAgPSBhcnJheVsrK2ldKTsNCiAgcmV0dXJuIHBhaXJzOw0KfTsNCg0KZnVuY3Rpb24gcGFpcihhLCBiKSB7DQogIHJldHVybiBbYSwgYl07DQp9DQoNCnZhciBjcm9zcyA9IGZ1bmN0aW9uKHZhbHVlczAsIHZhbHVlczEsIHJlZHVjZSkgew0KICB2YXIgbjAgPSB2YWx1ZXMwLmxlbmd0aCwNCiAgICAgIG4xID0gdmFsdWVzMS5sZW5ndGgsDQogICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobjAgKiBuMSksDQogICAgICBpMCwNCiAgICAgIGkxLA0KICAgICAgaSwNCiAgICAgIHZhbHVlMDsNCg0KICBpZiAocmVkdWNlID09IG51bGwpIHJlZHVjZSA9IHBhaXI7DQoNCiAgZm9yIChpMCA9IGkgPSAwOyBpMCA8IG4wOyArK2kwKSB7DQogICAgZm9yICh2YWx1ZTAgPSB2YWx1ZXMwW2kwXSwgaTEgPSAwOyBpMSA8IG4xOyArK2kxLCArK2kpIHsNCiAgICAgIHZhbHVlc1tpXSA9IHJlZHVjZSh2YWx1ZTAsIHZhbHVlczFbaTFdKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gdmFsdWVzOw0KfTsNCg0KdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsNCn07DQoNCnZhciBudW1iZXIgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7DQp9Ow0KDQp2YXIgdmFyaWFuY2UgPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgbSA9IDAsDQogICAgICBpID0gLTEsDQogICAgICBtZWFuID0gMCwNCiAgICAgIHZhbHVlLA0KICAgICAgZGVsdGEsDQogICAgICBzdW0gPSAwOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkgew0KICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsNCiAgICAgICAgbWVhbiArPSBkZWx0YSAvICsrbTsNCiAgICAgICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgew0KICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsNCiAgICAgICAgbWVhbiArPSBkZWx0YSAvICsrbTsNCiAgICAgICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgaWYgKG0gPiAxKSByZXR1cm4gc3VtIC8gKG0gLSAxKTsNCn07DQoNCnZhciBkZXZpYXRpb24gPSBmdW5jdGlvbihhcnJheSwgZikgew0KICB2YXIgdiA9IHZhcmlhbmNlKGFycmF5LCBmKTsNCiAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2Ow0KfTsNCg0KdmFyIGV4dGVudCA9IGZ1bmN0aW9uKHZhbHVlcywgdmFsdWVvZikgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsDQogICAgICBpID0gLTEsDQogICAgICB2YWx1ZSwNCiAgICAgIG1pbiwNCiAgICAgIG1heDsNCg0KICBpZiAodmFsdWVvZiA9PSBudWxsKSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4NCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsNCiAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7DQogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuDQogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkgew0KICAgICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTsNCiAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZWxzZSB7DQogICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4NCiAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgew0KICAgICAgICBtaW4gPSBtYXggPSB2YWx1ZTsNCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4NCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwpIHsNCiAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7DQogICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBbbWluLCBtYXhdOw0KfTsNCg0KdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KDQp2YXIgc2xpY2UgPSBhcnJheS5zbGljZTsNCnZhciBtYXAgPSBhcnJheS5tYXA7DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KdmFyIGlkZW50aXR5ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4geDsNCn07DQoNCnZhciByYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsNCg0KICB2YXIgaSA9IC0xLA0KICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsDQogICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsNCg0KICB3aGlsZSAoKytpIDwgbikgew0KICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDsNCiAgfQ0KDQogIHJldHVybiByYW5nZTsNCn07DQoNCnZhciBlMTAgPSBNYXRoLnNxcnQoNTApOw0KdmFyIGU1ID0gTWF0aC5zcXJ0KDEwKTsNCnZhciBlMiA9IE1hdGguc3FydCgyKTsNCg0KdmFyIHRpY2tzID0gZnVuY3Rpb24oc3RhcnQsIHN0b3AsIGNvdW50KSB7DQogIHZhciByZXZlcnNlID0gc3RvcCA8IHN0YXJ0LA0KICAgICAgaSA9IC0xLA0KICAgICAgbiwNCiAgICAgIHRpY2tzLA0KICAgICAgc3RlcDsNCg0KICBpZiAocmV2ZXJzZSkgbiA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBuOw0KDQogIGlmICgoc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KSkgPT09IDAgfHwgIWlzRmluaXRlKHN0ZXApKSByZXR1cm4gW107DQoNCiAgaWYgKHN0ZXAgPiAwKSB7DQogICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTsNCiAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wIC8gc3RlcCk7DQogICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSk7DQogICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0ICsgaSkgKiBzdGVwOw0KICB9IGVsc2Ugew0KICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOw0KICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAqIHN0ZXApOw0KICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpOw0KICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCAtIGkpIC8gc3RlcDsNCiAgfQ0KDQogIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7DQoNCiAgcmV0dXJuIHRpY2tzOw0KfTsNCg0KZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHsNCiAgdmFyIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSwNCiAgICAgIHBvd2VyID0gTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwKSAvIE1hdGguTE4xMCksDQogICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpOw0KICByZXR1cm4gcG93ZXIgPj0gMA0KICAgICAgPyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKSAqIE1hdGgucG93KDEwLCBwb3dlcikNCiAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7DQp9DQoNCmZ1bmN0aW9uIHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCkgew0KICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLA0KICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSwNCiAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsNCiAgaWYgKGVycm9yID49IGUxMCkgc3RlcDEgKj0gMTA7DQogIGVsc2UgaWYgKGVycm9yID49IGU1KSBzdGVwMSAqPSA1Ow0KICBlbHNlIGlmIChlcnJvciA+PSBlMikgc3RlcDEgKj0gMjsNCiAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxOw0KfQ0KDQp2YXIgc3R1cmdlcyA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIpICsgMTsNCn07DQoNCnZhciBoaXN0b2dyYW0gPSBmdW5jdGlvbigpIHsNCiAgdmFyIHZhbHVlID0gaWRlbnRpdHksDQogICAgICBkb21haW4gPSBleHRlbnQsDQogICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzOw0KDQogIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7DQogICAgdmFyIGksDQogICAgICAgIG4gPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgeCwNCiAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOw0KDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgdmFsdWVzW2ldID0gdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSk7DQogICAgfQ0KDQogICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksDQogICAgICAgIHgwID0geHpbMF0sDQogICAgICAgIHgxID0geHpbMV0sDQogICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTsNCg0KICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuDQogICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgew0KICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTsNCiAgICAgIHR6ID0gcmFuZ2UoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIE1hdGguZmxvb3IoeDEgLyB0eikgKiB0eiwgdHopOyAvLyBleGNsdXNpdmUNCiAgICB9DQoNCiAgICAvLyBSZW1vdmUgYW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLg0KICAgIHZhciBtID0gdHoubGVuZ3RoOw0KICAgIHdoaWxlICh0elswXSA8PSB4MCkgdHouc2hpZnQoKSwgLS1tOw0KICAgIHdoaWxlICh0elttIC0gMV0gPiB4MSkgdHoucG9wKCksIC0tbTsNCg0KICAgIHZhciBiaW5zID0gbmV3IEFycmF5KG0gKyAxKSwNCiAgICAgICAgYmluOw0KDQogICAgLy8gSW5pdGlhbGl6ZSBiaW5zLg0KICAgIGZvciAoaSA9IDA7IGkgPD0gbTsgKytpKSB7DQogICAgICBiaW4gPSBiaW5zW2ldID0gW107DQogICAgICBiaW4ueDAgPSBpID4gMCA/IHR6W2kgLSAxXSA6IHgwOw0KICAgICAgYmluLngxID0gaSA8IG0gPyB0eltpXSA6IHgxOw0KICAgIH0NCg0KICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFueSBvdXRzaWRlIHRoZSBkb21haW4uDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgeCA9IHZhbHVlc1tpXTsNCiAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHsNCiAgICAgICAgYmluc1tiaXNlY3RSaWdodCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7DQogICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIGJpbnM7DQogIH0NCg0KICBoaXN0b2dyYW0udmFsdWUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHZhbHVlOw0KICB9Ow0KDQogIGhpc3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoW19bMF0sIF9bMV1dKSwgaGlzdG9ncmFtKSA6IGRvbWFpbjsNCiAgfTsNCg0KICBoaXN0b2dyYW0udGhyZXNob2xkcyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDsNCiAgfTsNCg0KICByZXR1cm4gaGlzdG9ncmFtOw0KfTsNCg0KdmFyIHF1YW50aWxlID0gZnVuY3Rpb24odmFsdWVzLCBwLCB2YWx1ZW9mKSB7DQogIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXI7DQogIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuOw0KICBpZiAoKHAgPSArcCkgPD0gMCB8fCBuIDwgMikgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1swXSwgMCwgdmFsdWVzKTsNCiAgaWYgKHAgPj0gMSkgcmV0dXJuICt2YWx1ZW9mKHZhbHVlc1tuIC0gMV0sIG4gLSAxLCB2YWx1ZXMpOw0KICB2YXIgbiwNCiAgICAgIGkgPSAobiAtIDEpICogcCwNCiAgICAgIGkwID0gTWF0aC5mbG9vcihpKSwNCiAgICAgIHZhbHVlMCA9ICt2YWx1ZW9mKHZhbHVlc1tpMF0sIGkwLCB2YWx1ZXMpLA0KICAgICAgdmFsdWUxID0gK3ZhbHVlb2YodmFsdWVzW2kwICsgMV0sIGkwICsgMSwgdmFsdWVzKTsNCiAgcmV0dXJuIHZhbHVlMCArICh2YWx1ZTEgLSB2YWx1ZTApICogKGkgLSBpMCk7DQp9Ow0KDQp2YXIgZnJlZWRtYW5EaWFjb25pcyA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgdmFsdWVzID0gbWFwLmNhbGwodmFsdWVzLCBudW1iZXIpLnNvcnQoYXNjZW5kaW5nKTsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgyICogKHF1YW50aWxlKHZhbHVlcywgMC43NSkgLSBxdWFudGlsZSh2YWx1ZXMsIDAuMjUpKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBzY290dCA9IGZ1bmN0aW9uKHZhbHVlcywgbWluLCBtYXgpIHsNCiAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24odmFsdWVzKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsNCn07DQoNCnZhciBtYXggPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgaSA9IC0xLA0KICAgICAgdmFsdWUsDQogICAgICBtYXg7DQoNCiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuDQogICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7DQogICAgICAgIG1heCA9IHZhbHVlOw0KICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLg0KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPiBtYXgpIHsNCiAgICAgICAgICAgIG1heCA9IHZhbHVlOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuDQogICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsNCiAgICAgICAgbWF4ID0gdmFsdWU7DQogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuDQogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7DQogICAgICAgICAgICBtYXggPSB2YWx1ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbWF4Ow0KfTsNCg0KdmFyIG1lYW4gPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgbSA9IG4sDQogICAgICBpID0gLTEsDQogICAgICB2YWx1ZSwNCiAgICAgIHN1bSA9IDA7DQoNCiAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlc1tpXSkpKSBzdW0gKz0gdmFsdWU7DQogICAgICBlbHNlIC0tbTsNCiAgICB9DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpKSBzdW0gKz0gdmFsdWU7DQogICAgICBlbHNlIC0tbTsNCiAgICB9DQogIH0NCg0KICBpZiAobSkgcmV0dXJuIHN1bSAvIG07DQp9Ow0KDQp2YXIgbWVkaWFuID0gZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIHZhbHVlLA0KICAgICAgbnVtYmVycyA9IFtdOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlcih2YWx1ZXNbaV0pKSkgew0KICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHsNCiAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gcXVhbnRpbGUobnVtYmVycy5zb3J0KGFzY2VuZGluZyksIDAuNSk7DQp9Ow0KDQp2YXIgbWVyZ2UgPSBmdW5jdGlvbihhcnJheXMpIHsNCiAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLA0KICAgICAgbSwNCiAgICAgIGkgPSAtMSwNCiAgICAgIGogPSAwLA0KICAgICAgbWVyZ2VkLA0KICAgICAgYXJyYXk7DQoNCiAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDsNCiAgbWVyZ2VkID0gbmV3IEFycmF5KGopOw0KDQogIHdoaWxlICgtLW4gPj0gMCkgew0KICAgIGFycmF5ID0gYXJyYXlzW25dOw0KICAgIG0gPSBhcnJheS5sZW5ndGg7DQogICAgd2hpbGUgKC0tbSA+PSAwKSB7DQogICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21dOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBtZXJnZWQ7DQp9Ow0KDQp2YXIgbWluID0gZnVuY3Rpb24odmFsdWVzLCB2YWx1ZW9mKSB7DQogIHZhciBuID0gdmFsdWVzLmxlbmd0aCwNCiAgICAgIGkgPSAtMSwNCiAgICAgIHZhbHVlLA0KICAgICAgbWluOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLg0KICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgew0KICAgICAgICBtaW4gPSB2YWx1ZTsNCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4NCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIG1pbiA+IHZhbHVlKSB7DQogICAgICAgICAgICBtaW4gPSB2YWx1ZTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICBlbHNlIHsNCiAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLg0KICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7DQogICAgICAgIG1pbiA9IHZhbHVlOw0KICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLg0KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgew0KICAgICAgICAgICAgbWluID0gdmFsdWU7DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG1pbjsNCn07DQoNCnZhciBwZXJtdXRlID0gZnVuY3Rpb24oYXJyYXksIGluZGV4ZXMpIHsNCiAgdmFyIGkgPSBpbmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7DQogIHdoaWxlIChpLS0pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07DQogIHJldHVybiBwZXJtdXRlczsNCn07DQoNCnZhciBzY2FuID0gZnVuY3Rpb24odmFsdWVzLCBjb21wYXJlKSB7DQogIGlmICghKG4gPSB2YWx1ZXMubGVuZ3RoKSkgcmV0dXJuOw0KICB2YXIgbiwNCiAgICAgIGkgPSAwLA0KICAgICAgaiA9IDAsDQogICAgICB4aSwNCiAgICAgIHhqID0gdmFsdWVzW2pdOw0KDQogIGlmIChjb21wYXJlID09IG51bGwpIGNvbXBhcmUgPSBhc2NlbmRpbmc7DQoNCiAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICBpZiAoY29tcGFyZSh4aSA9IHZhbHVlc1tpXSwgeGopIDwgMCB8fCBjb21wYXJlKHhqLCB4aikgIT09IDApIHsNCiAgICAgIHhqID0geGksIGogPSBpOw0KICAgIH0NCiAgfQ0KDQogIGlmIChjb21wYXJlKHhqLCB4aikgPT09IDApIHJldHVybiBqOw0KfTsNCg0KdmFyIHNodWZmbGUgPSBmdW5jdGlvbihhcnJheSwgaTAsIGkxKSB7DQogIHZhciBtID0gKGkxID09IG51bGwgPyBhcnJheS5sZW5ndGggOiBpMSkgLSAoaTAgPSBpMCA9PSBudWxsID8gMCA6ICtpMCksDQogICAgICB0LA0KICAgICAgaTsNCg0KICB3aGlsZSAobSkgew0KICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsNCiAgICB0ID0gYXJyYXlbbSArIGkwXTsNCiAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTsNCiAgICBhcnJheVtpICsgaTBdID0gdDsNCiAgfQ0KDQogIHJldHVybiBhcnJheTsNCn07DQoNCnZhciBzdW0gPSBmdW5jdGlvbih2YWx1ZXMsIHZhbHVlb2YpIHsNCiAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLA0KICAgICAgaSA9IC0xLA0KICAgICAgdmFsdWUsDQogICAgICBzdW0gPSAwOw0KDQogIGlmICh2YWx1ZW9mID09IG51bGwpIHsNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgaWYgKHZhbHVlID0gK3ZhbHVlc1tpXSkgc3VtICs9IHZhbHVlOyAvLyBOb3RlOiB6ZXJvIGFuZCBudWxsIGFyZSBlcXVpdmFsZW50Lg0KICAgIH0NCiAgfQ0KDQogIGVsc2Ugew0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAodmFsdWUgPSArdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpIHN1bSArPSB2YWx1ZTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3VtOw0KfTsNCg0KdmFyIHRyYW5zcG9zZSA9IGZ1bmN0aW9uKG1hdHJpeCkgew0KICBpZiAoIShuID0gbWF0cml4Lmxlbmd0aCkpIHJldHVybiBbXTsNCiAgZm9yICh2YXIgaSA9IC0xLCBtID0gbWluKG1hdHJpeCwgbGVuZ3RoKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgew0KICAgIGZvciAodmFyIGogPSAtMSwgbiwgcm93ID0gdHJhbnNwb3NlW2ldID0gbmV3IEFycmF5KG4pOyArK2ogPCBuOykgew0KICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldOw0KICAgIH0NCiAgfQ0KICByZXR1cm4gdHJhbnNwb3NlOw0KfTsNCg0KZnVuY3Rpb24gbGVuZ3RoKGQpIHsNCiAgcmV0dXJuIGQubGVuZ3RoOw0KfQ0KDQp2YXIgemlwID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0cmFuc3Bvc2UoYXJndW1lbnRzKTsNCn07DQoNCmV4cG9ydHMuYmlzZWN0ID0gYmlzZWN0UmlnaHQ7DQpleHBvcnRzLmJpc2VjdFJpZ2h0ID0gYmlzZWN0UmlnaHQ7DQpleHBvcnRzLmJpc2VjdExlZnQgPSBiaXNlY3RMZWZ0Ow0KZXhwb3J0cy5hc2NlbmRpbmcgPSBhc2NlbmRpbmc7DQpleHBvcnRzLmJpc2VjdG9yID0gYmlzZWN0b3I7DQpleHBvcnRzLmNyb3NzID0gY3Jvc3M7DQpleHBvcnRzLmRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nOw0KZXhwb3J0cy5kZXZpYXRpb24gPSBkZXZpYXRpb247DQpleHBvcnRzLmV4dGVudCA9IGV4dGVudDsNCmV4cG9ydHMuaGlzdG9ncmFtID0gaGlzdG9ncmFtOw0KZXhwb3J0cy50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzID0gZnJlZWRtYW5EaWFjb25pczsNCmV4cG9ydHMudGhyZXNob2xkU2NvdHQgPSBzY290dDsNCmV4cG9ydHMudGhyZXNob2xkU3R1cmdlcyA9IHN0dXJnZXM7DQpleHBvcnRzLm1heCA9IG1heDsNCmV4cG9ydHMubWVhbiA9IG1lYW47DQpleHBvcnRzLm1lZGlhbiA9IG1lZGlhbjsNCmV4cG9ydHMubWVyZ2UgPSBtZXJnZTsNCmV4cG9ydHMubWluID0gbWluOw0KZXhwb3J0cy5wYWlycyA9IHBhaXJzOw0KZXhwb3J0cy5wZXJtdXRlID0gcGVybXV0ZTsNCmV4cG9ydHMucXVhbnRpbGUgPSBxdWFudGlsZTsNCmV4cG9ydHMucmFuZ2UgPSByYW5nZTsNCmV4cG9ydHMuc2NhbiA9IHNjYW47DQpleHBvcnRzLnNodWZmbGUgPSBzaHVmZmxlOw0KZXhwb3J0cy5zdW0gPSBzdW07DQpleHBvcnRzLnRpY2tzID0gdGlja3M7DQpleHBvcnRzLnRpY2tJbmNyZW1lbnQgPSB0aWNrSW5jcmVtZW50Ow0KZXhwb3J0cy50aWNrU3RlcCA9IHRpY2tTdGVwOw0KZXhwb3J0cy50cmFuc3Bvc2UgPSB0cmFuc3Bvc2U7DQpleHBvcnRzLnZhcmlhbmNlID0gdmFyaWFuY2U7DQpleHBvcnRzLnppcCA9IHppcDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWNvbGxlY3Rpb24vIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHByZWZpeCA9ICIkIjsNCg0KZnVuY3Rpb24gTWFwKCkge30NCg0KTWFwLnByb3RvdHlwZSA9IG1hcC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBNYXAsDQogIGhhczogZnVuY3Rpb24oa2V5KSB7DQogICAgcmV0dXJuIChwcmVmaXggKyBrZXkpIGluIHRoaXM7DQogIH0sDQogIGdldDogZnVuY3Rpb24oa2V5KSB7DQogICAgcmV0dXJuIHRoaXNbcHJlZml4ICsga2V5XTsNCiAgfSwNCiAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7DQogICAgdGhpc1twcmVmaXggKyBrZXldID0gdmFsdWU7DQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24oa2V5KSB7DQogICAgdmFyIHByb3BlcnR5ID0gcHJlZml4ICsga2V5Ow0KICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsNCiAgfSwNCiAgY2xlYXI6IGZ1bmN0aW9uKCkgew0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBkZWxldGUgdGhpc1twcm9wZXJ0eV07DQogIH0sDQogIGtleXM6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBrZXlzID0gW107DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGtleXMucHVzaChwcm9wZXJ0eS5zbGljZSgxKSk7DQogICAgcmV0dXJuIGtleXM7DQogIH0sDQogIHZhbHVlczogZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlcyA9IFtdOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7DQogICAgcmV0dXJuIHZhbHVlczsNCiAgfSwNCiAgZW50cmllczogZnVuY3Rpb24oKSB7DQogICAgdmFyIGVudHJpZXMgPSBbXTsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTsNCiAgICByZXR1cm4gZW50cmllczsNCiAgfSwNCiAgc2l6ZTogZnVuY3Rpb24oKSB7DQogICAgdmFyIHNpemUgPSAwOw0KICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSArK3NpemU7DQogICAgcmV0dXJuIHNpemU7DQogIH0sDQogIGVtcHR5OiBmdW5jdGlvbigpIHsNCiAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgcmV0dXJuIGZhbHNlOw0KICAgIHJldHVybiB0cnVlOw0KICB9LA0KICBlYWNoOiBmdW5jdGlvbihmKSB7DQogICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTsNCiAgfQ0KfTsNCg0KZnVuY3Rpb24gbWFwKG9iamVjdCwgZikgew0KICB2YXIgbWFwID0gbmV3IE1hcDsNCg0KICAvLyBDb3B5IGNvbnN0cnVjdG9yLg0KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOw0KDQogIC8vIEluZGV4IGFycmF5IGJ5IG51bWVyaWMgaW5kZXggb3Igc3BlY2lmaWVkIGtleSBmdW5jdGlvbi4NCiAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7DQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IG9iamVjdC5sZW5ndGgsDQogICAgICAgIG87DQoNCiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChpLCBvYmplY3RbaV0pOw0KICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoZihvID0gb2JqZWN0W2ldLCBpLCBvYmplY3QpLCBvKTsNCiAgfQ0KDQogIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4NCiAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOw0KDQogIHJldHVybiBtYXA7DQp9DQoNCnZhciBuZXN0ID0gZnVuY3Rpb24oKSB7DQogIHZhciBrZXlzID0gW10sDQogICAgICBzb3J0S2V5cyA9IFtdLA0KICAgICAgc29ydFZhbHVlcywNCiAgICAgIHJvbGx1cCwNCiAgICAgIG5lc3Q7DQoNCiAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgew0KICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHJvbGx1cCAhPSBudWxsDQogICAgICAgID8gcm9sbHVwKGFycmF5KSA6IChzb3J0VmFsdWVzICE9IG51bGwNCiAgICAgICAgPyBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpDQogICAgICAgIDogYXJyYXkpOw0KDQogICAgdmFyIGkgPSAtMSwNCiAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCwNCiAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwNCiAgICAgICAga2V5VmFsdWUsDQogICAgICAgIHZhbHVlLA0KICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCgpLA0KICAgICAgICB2YWx1ZXMsDQogICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOw0KDQogICAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICAgIGlmICh2YWx1ZXMgPSB2YWx1ZXNCeUtleS5nZXQoa2V5VmFsdWUgPSBrZXkodmFsdWUgPSBhcnJheVtpXSkgKyAiIikpIHsNCiAgICAgICAgdmFsdWVzLnB1c2godmFsdWUpOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgdmFsdWVzQnlLZXkuc2V0KGtleVZhbHVlLCBbdmFsdWVdKTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICB2YWx1ZXNCeUtleS5lYWNoKGZ1bmN0aW9uKHZhbHVlcywga2V5KSB7DQogICAgICBzZXRSZXN1bHQocmVzdWx0LCBrZXksIGFwcGx5KHZhbHVlcywgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSk7DQogICAgfSk7DQoNCiAgICByZXR1cm4gcmVzdWx0Ow0KICB9DQoNCiAgZnVuY3Rpb24gZW50cmllcyhtYXAkJDEsIGRlcHRoKSB7DQogICAgaWYgKCsrZGVwdGggPiBrZXlzLmxlbmd0aCkgcmV0dXJuIG1hcCQkMTsNCiAgICB2YXIgYXJyYXksIHNvcnRLZXkgPSBzb3J0S2V5c1tkZXB0aCAtIDFdOw0KICAgIGlmIChyb2xsdXAgIT0gbnVsbCAmJiBkZXB0aCA+PSBrZXlzLmxlbmd0aCkgYXJyYXkgPSBtYXAkJDEuZW50cmllcygpOw0KICAgIGVsc2UgYXJyYXkgPSBbXSwgbWFwJCQxLmVhY2goZnVuY3Rpb24odiwgaykgeyBhcnJheS5wdXNoKHtrZXk6IGssIHZhbHVlczogZW50cmllcyh2LCBkZXB0aCl9KTsgfSk7DQogICAgcmV0dXJuIHNvcnRLZXkgIT0gbnVsbCA/IGFycmF5LnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gc29ydEtleShhLmtleSwgYi5rZXkpOyB9KSA6IGFycmF5Ow0KICB9DQoNCiAgcmV0dXJuIG5lc3QgPSB7DQogICAgb2JqZWN0OiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU9iamVjdCwgc2V0T2JqZWN0KTsgfSwNCiAgICBtYXA6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LA0KICAgIGVudHJpZXM6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBlbnRyaWVzKGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCksIDApOyB9LA0KICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LA0KICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LA0KICAgIHNvcnRWYWx1ZXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRWYWx1ZXMgPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sDQogICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9DQogIH07DQp9Ow0KDQpmdW5jdGlvbiBjcmVhdGVPYmplY3QoKSB7DQogIHJldHVybiB7fTsNCn0NCg0KZnVuY3Rpb24gc2V0T2JqZWN0KG9iamVjdCwga2V5LCB2YWx1ZSkgew0KICBvYmplY3Rba2V5XSA9IHZhbHVlOw0KfQ0KDQpmdW5jdGlvbiBjcmVhdGVNYXAoKSB7DQogIHJldHVybiBtYXAoKTsNCn0NCg0KZnVuY3Rpb24gc2V0TWFwKG1hcCQkMSwga2V5LCB2YWx1ZSkgew0KICBtYXAkJDEuc2V0KGtleSwgdmFsdWUpOw0KfQ0KDQpmdW5jdGlvbiBTZXQoKSB7fQ0KDQp2YXIgcHJvdG8gPSBtYXAucHJvdG90eXBlOw0KDQpTZXQucHJvdG90eXBlID0gc2V0LnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFNldCwNCiAgaGFzOiBwcm90by5oYXMsDQogIGFkZDogZnVuY3Rpb24odmFsdWUpIHsNCiAgICB2YWx1ZSArPSAiIjsNCiAgICB0aGlzW3ByZWZpeCArIHZhbHVlXSA9IHZhbHVlOw0KICAgIHJldHVybiB0aGlzOw0KICB9LA0KICByZW1vdmU6IHByb3RvLnJlbW92ZSwNCiAgY2xlYXI6IHByb3RvLmNsZWFyLA0KICB2YWx1ZXM6IHByb3RvLmtleXMsDQogIHNpemU6IHByb3RvLnNpemUsDQogIGVtcHR5OiBwcm90by5lbXB0eSwNCiAgZWFjaDogcHJvdG8uZWFjaA0KfTsNCg0KZnVuY3Rpb24gc2V0KG9iamVjdCwgZikgew0KICB2YXIgc2V0ID0gbmV3IFNldDsNCg0KICAvLyBDb3B5IGNvbnN0cnVjdG9yLg0KICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7DQoNCiAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5Lg0KICBlbHNlIGlmIChvYmplY3QpIHsNCiAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDsNCiAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pOw0KICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOw0KICB9DQoNCiAgcmV0dXJuIHNldDsNCn0NCg0KdmFyIGtleXMgPSBmdW5jdGlvbihtYXApIHsNCiAgdmFyIGtleXMgPSBbXTsNCiAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7DQogIHJldHVybiBrZXlzOw0KfTsNCg0KdmFyIHZhbHVlcyA9IGZ1bmN0aW9uKG1hcCkgew0KICB2YXIgdmFsdWVzID0gW107DQogIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTsNCiAgcmV0dXJuIHZhbHVlczsNCn07DQoNCnZhciBlbnRyaWVzID0gZnVuY3Rpb24obWFwKSB7DQogIHZhciBlbnRyaWVzID0gW107DQogIGZvciAodmFyIGtleSBpbiBtYXApIGVudHJpZXMucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XX0pOw0KICByZXR1cm4gZW50cmllczsNCn07DQoNCmV4cG9ydHMubmVzdCA9IG5lc3Q7DQpleHBvcnRzLnNldCA9IHNldDsNCmV4cG9ydHMubWFwID0gbWFwOw0KZXhwb3J0cy5rZXlzID0ga2V5czsNCmV4cG9ydHMudmFsdWVzID0gdmFsdWVzOw0KZXhwb3J0cy5lbnRyaWVzID0gZW50cmllczsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWNvbG9yLyBWZXJzaW9uIDEuMC4zLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBkZWZpbmUgPSBmdW5jdGlvbihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7DQogIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOw0KICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsNCn07DQoNCmZ1bmN0aW9uIGV4dGVuZChwYXJlbnQsIGRlZmluaXRpb24pIHsNCiAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7DQogIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsNCiAgcmV0dXJuIHByb3RvdHlwZTsNCn0NCg0KZnVuY3Rpb24gQ29sb3IoKSB7fQ0KDQp2YXIgZGFya2VyID0gMC43Ow0KdmFyIGJyaWdodGVyID0gMSAvIGRhcmtlcjsNCg0KdmFyIHJlSSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIjsNCnZhciByZU4gPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIjsNCnZhciByZVAgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiI7DQp2YXIgcmVIZXgzID0gL14jKFswLTlhLWZdezN9KSQvOw0KdmFyIHJlSGV4NiA9IC9eIyhbMC05YS1mXXs2fSkkLzsNCnZhciByZVJnYkludGVnZXIgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZUksIHJlSSwgcmVJXSArICJcXCkkIik7DQp2YXIgcmVSZ2JQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVQLCByZVAsIHJlUF0gKyAiXFwpJCIpOw0KdmFyIHJlUmdiYUludGVnZXIgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVJLCByZUksIHJlSSwgcmVOXSArICJcXCkkIik7DQp2YXIgcmVSZ2JhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZVAsIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsNCnZhciByZUhzbFBlcmNlbnQgPSBuZXcgUmVnRXhwKCJeaHNsXFwoIiArIFtyZU4sIHJlUCwgcmVQXSArICJcXCkkIik7DQp2YXIgcmVIc2xhUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5oc2xhXFwoIiArIFtyZU4sIHJlUCwgcmVQLCByZU5dICsgIlxcKSQiKTsNCg0KdmFyIG5hbWVkID0gew0KICBhbGljZWJsdWU6IDB4ZjBmOGZmLA0KICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LA0KICBhcXVhOiAweDAwZmZmZiwNCiAgYXF1YW1hcmluZTogMHg3ZmZmZDQsDQogIGF6dXJlOiAweGYwZmZmZiwNCiAgYmVpZ2U6IDB4ZjVmNWRjLA0KICBiaXNxdWU6IDB4ZmZlNGM0LA0KICBibGFjazogMHgwMDAwMDAsDQogIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwNCiAgYmx1ZTogMHgwMDAwZmYsDQogIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLA0KICBicm93bjogMHhhNTJhMmEsDQogIGJ1cmx5d29vZDogMHhkZWI4ODcsDQogIGNhZGV0Ymx1ZTogMHg1ZjllYTAsDQogIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLA0KICBjaG9jb2xhdGU6IDB4ZDI2OTFlLA0KICBjb3JhbDogMHhmZjdmNTAsDQogIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwNCiAgY29ybnNpbGs6IDB4ZmZmOGRjLA0KICBjcmltc29uOiAweGRjMTQzYywNCiAgY3lhbjogMHgwMGZmZmYsDQogIGRhcmtibHVlOiAweDAwMDA4YiwNCiAgZGFya2N5YW46IDB4MDA4YjhiLA0KICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwNCiAgZGFya2dyYXk6IDB4YTlhOWE5LA0KICBkYXJrZ3JlZW46IDB4MDA2NDAwLA0KICBkYXJrZ3JleTogMHhhOWE5YTksDQogIGRhcmtraGFraTogMHhiZGI3NmIsDQogIGRhcmttYWdlbnRhOiAweDhiMDA4YiwNCiAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLA0KICBkYXJrb3JhbmdlOiAweGZmOGMwMCwNCiAgZGFya29yY2hpZDogMHg5OTMyY2MsDQogIGRhcmtyZWQ6IDB4OGIwMDAwLA0KICBkYXJrc2FsbW9uOiAweGU5OTY3YSwNCiAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwNCiAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsDQogIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLA0KICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwNCiAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsDQogIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLA0KICBkZWVwcGluazogMHhmZjE0OTMsDQogIGRlZXBza3libHVlOiAweDAwYmZmZiwNCiAgZGltZ3JheTogMHg2OTY5NjksDQogIGRpbWdyZXk6IDB4Njk2OTY5LA0KICBkb2RnZXJibHVlOiAweDFlOTBmZiwNCiAgZmlyZWJyaWNrOiAweGIyMjIyMiwNCiAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLA0KICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsDQogIGZ1Y2hzaWE6IDB4ZmYwMGZmLA0KICBnYWluc2Jvcm86IDB4ZGNkY2RjLA0KICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwNCiAgZ29sZDogMHhmZmQ3MDAsDQogIGdvbGRlbnJvZDogMHhkYWE1MjAsDQogIGdyYXk6IDB4ODA4MDgwLA0KICBncmVlbjogMHgwMDgwMDAsDQogIGdyZWVueWVsbG93OiAweGFkZmYyZiwNCiAgZ3JleTogMHg4MDgwODAsDQogIGhvbmV5ZGV3OiAweGYwZmZmMCwNCiAgaG90cGluazogMHhmZjY5YjQsDQogIGluZGlhbnJlZDogMHhjZDVjNWMsDQogIGluZGlnbzogMHg0YjAwODIsDQogIGl2b3J5OiAweGZmZmZmMCwNCiAga2hha2k6IDB4ZjBlNjhjLA0KICBsYXZlbmRlcjogMHhlNmU2ZmEsDQogIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LA0KICBsYXduZ3JlZW46IDB4N2NmYzAwLA0KICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLA0KICBsaWdodGJsdWU6IDB4YWRkOGU2LA0KICBsaWdodGNvcmFsOiAweGYwODA4MCwNCiAgbGlnaHRjeWFuOiAweGUwZmZmZiwNCiAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLA0KICBsaWdodGdyYXk6IDB4ZDNkM2QzLA0KICBsaWdodGdyZWVuOiAweDkwZWU5MCwNCiAgbGlnaHRncmV5OiAweGQzZDNkMywNCiAgbGlnaHRwaW5rOiAweGZmYjZjMSwNCiAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLA0KICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwNCiAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwNCiAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LA0KICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksDQogIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwNCiAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLA0KICBsaW1lOiAweDAwZmYwMCwNCiAgbGltZWdyZWVuOiAweDMyY2QzMiwNCiAgbGluZW46IDB4ZmFmMGU2LA0KICBtYWdlbnRhOiAweGZmMDBmZiwNCiAgbWFyb29uOiAweDgwMDAwMCwNCiAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsDQogIG1lZGl1bWJsdWU6IDB4MDAwMGNkLA0KICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLA0KICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLA0KICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsDQogIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsDQogIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwNCiAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywNCiAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwNCiAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwNCiAgbWludGNyZWFtOiAweGY1ZmZmYSwNCiAgbWlzdHlyb3NlOiAweGZmZTRlMSwNCiAgbW9jY2FzaW46IDB4ZmZlNGI1LA0KICBuYXZham93aGl0ZTogMHhmZmRlYWQsDQogIG5hdnk6IDB4MDAwMDgwLA0KICBvbGRsYWNlOiAweGZkZjVlNiwNCiAgb2xpdmU6IDB4ODA4MDAwLA0KICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLA0KICBvcmFuZ2U6IDB4ZmZhNTAwLA0KICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLA0KICBvcmNoaWQ6IDB4ZGE3MGQ2LA0KICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwNCiAgcGFsZWdyZWVuOiAweDk4ZmI5OCwNCiAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsDQogIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLA0KICBwYXBheWF3aGlwOiAweGZmZWZkNSwNCiAgcGVhY2hwdWZmOiAweGZmZGFiOSwNCiAgcGVydTogMHhjZDg1M2YsDQogIHBpbms6IDB4ZmZjMGNiLA0KICBwbHVtOiAweGRkYTBkZCwNCiAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsDQogIHB1cnBsZTogMHg4MDAwODAsDQogIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LA0KICByZWQ6IDB4ZmYwMDAwLA0KICByb3N5YnJvd246IDB4YmM4ZjhmLA0KICByb3lhbGJsdWU6IDB4NDE2OWUxLA0KICBzYWRkbGVicm93bjogMHg4YjQ1MTMsDQogIHNhbG1vbjogMHhmYTgwNzIsDQogIHNhbmR5YnJvd246IDB4ZjRhNDYwLA0KICBzZWFncmVlbjogMHgyZThiNTcsDQogIHNlYXNoZWxsOiAweGZmZjVlZSwNCiAgc2llbm5hOiAweGEwNTIyZCwNCiAgc2lsdmVyOiAweGMwYzBjMCwNCiAgc2t5Ymx1ZTogMHg4N2NlZWIsDQogIHNsYXRlYmx1ZTogMHg2YTVhY2QsDQogIHNsYXRlZ3JheTogMHg3MDgwOTAsDQogIHNsYXRlZ3JleTogMHg3MDgwOTAsDQogIHNub3c6IDB4ZmZmYWZhLA0KICBzcHJpbmdncmVlbjogMHgwMGZmN2YsDQogIHN0ZWVsYmx1ZTogMHg0NjgyYjQsDQogIHRhbjogMHhkMmI0OGMsDQogIHRlYWw6IDB4MDA4MDgwLA0KICB0aGlzdGxlOiAweGQ4YmZkOCwNCiAgdG9tYXRvOiAweGZmNjM0NywNCiAgdHVycXVvaXNlOiAweDQwZTBkMCwNCiAgdmlvbGV0OiAweGVlODJlZSwNCiAgd2hlYXQ6IDB4ZjVkZWIzLA0KICB3aGl0ZTogMHhmZmZmZmYsDQogIHdoaXRlc21va2U6IDB4ZjVmNWY1LA0KICB5ZWxsb3c6IDB4ZmZmZjAwLA0KICB5ZWxsb3dncmVlbjogMHg5YWNkMzINCn07DQoNCmRlZmluZShDb2xvciwgY29sb3IsIHsNCiAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5yZ2IoKSArICIiOw0KICB9DQp9KTsNCg0KZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7DQogIHZhciBtOw0KICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOw0KICByZXR1cm4gKG0gPSByZUhleDMuZXhlYyhmb3JtYXQpKSA/IChtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBuZXcgUmdiKChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4MGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSkgLy8gI2YwMA0KICAgICAgOiAobSA9IHJlSGV4Ni5leGVjKGZvcm1hdCkpID8gcmdibihwYXJzZUludChtWzFdLCAxNikpIC8vICNmZjAwMDANCiAgICAgIDogKG0gPSByZVJnYkludGVnZXIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkNCiAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkNCiAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQ0KICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IHJnYmEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkNCiAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpDQogICAgICA6IChtID0gcmVIc2xhUGVyY2VudC5leGVjKGZvcm1hdCkpID8gaHNsYShtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpDQogICAgICA6IG5hbWVkLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuKG5hbWVkW2Zvcm1hdF0pDQogICAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IoTmFOLCBOYU4sIE5hTiwgMCkNCiAgICAgIDogbnVsbDsNCn0NCg0KZnVuY3Rpb24gcmdibihuKSB7DQogIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7DQp9DQoNCmZ1bmN0aW9uIHJnYmEociwgZywgYiwgYSkgew0KICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47DQogIHJldHVybiBuZXcgUmdiKHIsIGcsIGIsIGEpOw0KfQ0KDQpmdW5jdGlvbiByZ2JDb252ZXJ0KG8pIHsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOw0KICBpZiAoIW8pIHJldHVybiBuZXcgUmdiOw0KICBvID0gby5yZ2IoKTsNCiAgcmV0dXJuIG5ldyBSZ2Ioby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIFJnYihyLCBnLCBiLCBvcGFjaXR5KSB7DQogIHRoaXMuciA9ICtyOw0KICB0aGlzLmcgPSArZzsNCiAgdGhpcy5iID0gK2I7DQogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Ow0KfQ0KDQpkZWZpbmUoUmdiLCByZ2IsIGV4dGVuZChDb2xvciwgew0KICBicmlnaHRlcjogZnVuY3Rpb24oaykgew0KICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsNCiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IFJnYih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICByZ2I6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzOw0KICB9LA0KICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuICgwIDw9IHRoaXMuciAmJiB0aGlzLnIgPD0gMjU1KQ0KICAgICAgICAmJiAoMCA8PSB0aGlzLmcgJiYgdGhpcy5nIDw9IDI1NSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpDQogICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsNCiAgICByZXR1cm4gKGEgPT09IDEgPyAicmdiKCIgOiAicmdiYSgiKQ0KICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICINCiAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiDQogICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpDQogICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7DQogIH0NCn0pKTsNCg0KZnVuY3Rpb24gaHNsYShoLCBzLCBsLCBhKSB7DQogIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjsNCiAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47DQogIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjsNCiAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgYSk7DQp9DQoNCmZ1bmN0aW9uIGhzbENvbnZlcnQobykgew0KICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG5ldyBIc2woby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yKSkgbyA9IGNvbG9yKG8pOw0KICBpZiAoIW8pIHJldHVybiBuZXcgSHNsOw0KICBpZiAobyBpbnN0YW5jZW9mIEhzbCkgcmV0dXJuIG87DQogIG8gPSBvLnJnYigpOw0KICB2YXIgciA9IG8uciAvIDI1NSwNCiAgICAgIGcgPSBvLmcgLyAyNTUsDQogICAgICBiID0gby5iIC8gMjU1LA0KICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksDQogICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwNCiAgICAgIGggPSBOYU4sDQogICAgICBzID0gbWF4IC0gbWluLA0KICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsNCiAgaWYgKHMpIHsNCiAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjsNCiAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7DQogICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0Ow0KICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47DQogICAgaCAqPSA2MDsNCiAgfSBlbHNlIHsNCiAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsNCiAgfQ0KICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gSHNsKGgsIHMsIGwsIG9wYWNpdHkpIHsNCiAgdGhpcy5oID0gK2g7DQogIHRoaXMucyA9ICtzOw0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShIc2wsIGhzbCwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOw0KICAgIHJldHVybiBuZXcgSHNsKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCwNCiAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLA0KICAgICAgICBsID0gdGhpcy5sLA0KICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLA0KICAgICAgICBtMSA9IDIgKiBsIC0gbTI7DQogICAgcmV0dXJuIG5ldyBSZ2IoDQogICAgICBoc2wycmdiKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksDQogICAgICBoc2wycmdiKGgsIG0xLCBtMiksDQogICAgICBoc2wycmdiKGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwNCiAgICAgIHRoaXMub3BhY2l0eQ0KICAgICk7DQogIH0sDQogIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpDQogICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkNCiAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsNCiAgfQ0KfSkpOw0KDQovKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovDQpmdW5jdGlvbiBoc2wycmdiKGgsIG0xLCBtMikgew0KICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwDQogICAgICA6IGggPCAxODAgPyBtMg0KICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MA0KICAgICAgOiBtMSkgKiAyNTU7DQp9DQoNCnZhciBkZWcycmFkID0gTWF0aC5QSSAvIDE4MDsNCnZhciByYWQyZGVnID0gMTgwIC8gTWF0aC5QSTsNCg0KdmFyIEtuID0gMTg7DQp2YXIgWG4gPSAwLjk1MDQ3MDsNCnZhciBZbiA9IDE7DQp2YXIgWm4gPSAxLjA4ODgzMDsNCnZhciB0MCA9IDQgLyAyOTsNCnZhciB0MSA9IDYgLyAyOTsNCnZhciB0MiA9IDMgKiB0MSAqIHQxOw0KdmFyIHQzID0gdDEgKiB0MSAqIHQxOw0KDQpmdW5jdGlvbiBsYWJDb252ZXJ0KG8pIHsNCiAgaWYgKG8gaW5zdGFuY2VvZiBMYWIpIHJldHVybiBuZXcgTGFiKG8ubCwgby5hLCBvLmIsIG8ub3BhY2l0eSk7DQogIGlmIChvIGluc3RhbmNlb2YgSGNsKSB7DQogICAgdmFyIGggPSBvLmggKiBkZWcycmFkOw0KICAgIHJldHVybiBuZXcgTGFiKG8ubCwgTWF0aC5jb3MoaCkgKiBvLmMsIE1hdGguc2luKGgpICogby5jLCBvLm9wYWNpdHkpOw0KICB9DQogIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTsNCiAgdmFyIGIgPSByZ2IyeHl6KG8uciksDQogICAgICBhID0gcmdiMnh5eihvLmcpLA0KICAgICAgbCA9IHJnYjJ4eXooby5iKSwNCiAgICAgIHggPSB4eXoybGFiKCgwLjQxMjQ1NjQgKiBiICsgMC4zNTc1NzYxICogYSArIDAuMTgwNDM3NSAqIGwpIC8gWG4pLA0KICAgICAgeSA9IHh5ejJsYWIoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiksDQogICAgICB6ID0geHl6MmxhYigoMC4wMTkzMzM5ICogYiArIDAuMTE5MTkyMCAqIGEgKyAwLjk1MDMwNDEgKiBsKSAvIFpuKTsNCiAgcmV0dXJuIG5ldyBMYWIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gTGFiKGwsIGEsIGIsIG9wYWNpdHkpIHsNCiAgdGhpcy5sID0gK2w7DQogIHRoaXMuYSA9ICthOw0KICB0aGlzLmIgPSArYjsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShMYWIsIGxhYiwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sICsgS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgZGFya2VyOiBmdW5jdGlvbihrKSB7DQogICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsDQogICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsDQogICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7DQogICAgeSA9IFluICogbGFiMnh5eih5KTsNCiAgICB4ID0gWG4gKiBsYWIyeHl6KHgpOw0KICAgIHogPSBabiAqIGxhYjJ4eXooeik7DQogICAgcmV0dXJuIG5ldyBSZ2IoDQogICAgICB4eXoycmdiKCAzLjI0MDQ1NDIgKiB4IC0gMS41MzcxMzg1ICogeSAtIDAuNDk4NTMxNCAqIHopLCAvLyBENjUgLT4gc1JHQg0KICAgICAgeHl6MnJnYigtMC45NjkyNjYwICogeCArIDEuODc2MDEwOCAqIHkgKyAwLjA0MTU1NjAgKiB6KSwNCiAgICAgIHh5ejJyZ2IoIDAuMDU1NjQzNCAqIHggLSAwLjIwNDAyNTkgKiB5ICsgMS4wNTcyMjUyICogeiksDQogICAgICB0aGlzLm9wYWNpdHkNCiAgICApOw0KICB9DQp9KSk7DQoNCmZ1bmN0aW9uIHh5ejJsYWIodCkgew0KICByZXR1cm4gdCA+IHQzID8gTWF0aC5wb3codCwgMSAvIDMpIDogdCAvIHQyICsgdDA7DQp9DQoNCmZ1bmN0aW9uIGxhYjJ4eXoodCkgew0KICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTsNCn0NCg0KZnVuY3Rpb24geHl6MnJnYih4KSB7DQogIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOw0KfQ0KDQpmdW5jdGlvbiByZ2IyeHl6KHgpIHsNCiAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7DQp9DQoNCmZ1bmN0aW9uIGhjbENvbnZlcnQobykgew0KICBpZiAobyBpbnN0YW5jZW9mIEhjbCkgcmV0dXJuIG5ldyBIY2woby5oLCBvLmMsIG8ubCwgby5vcGFjaXR5KTsNCiAgaWYgKCEobyBpbnN0YW5jZW9mIExhYikpIG8gPSBsYWJDb252ZXJ0KG8pOw0KICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogcmFkMmRlZzsNCiAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gaGNsKGgsIGMsIGwsIG9wYWNpdHkpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoY2xDb252ZXJ0KGgpIDogbmV3IEhjbChoLCBjLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7DQp9DQoNCmZ1bmN0aW9uIEhjbChoLCBjLCBsLCBvcGFjaXR5KSB7DQogIHRoaXMuaCA9ICtoOw0KICB0aGlzLmMgPSArYzsNCiAgdGhpcy5sID0gK2w7DQogIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5Ow0KfQ0KDQpkZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwgew0KICBicmlnaHRlcjogZnVuY3Rpb24oaykgew0KICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIGRhcmtlcjogZnVuY3Rpb24oaykgew0KICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgLSBLbiAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMub3BhY2l0eSk7DQogIH0sDQogIHJnYjogZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGxhYkNvbnZlcnQodGhpcykucmdiKCk7DQogIH0NCn0pKTsNCg0KdmFyIEEgPSAtMC4xNDg2MTsNCnZhciBCID0gKzEuNzgyNzc7DQp2YXIgQyA9IC0wLjI5MjI3Ow0KdmFyIEQgPSAtMC45MDY0OTsNCnZhciBFID0gKzEuOTcyOTQ7DQp2YXIgRUQgPSBFICogRDsNCnZhciBFQiA9IEUgKiBCOw0KdmFyIEJDX0RBID0gQiAqIEMgLSBEICogQTsNCg0KZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydChvKSB7DQogIGlmIChvIGluc3RhbmNlb2YgQ3ViZWhlbGl4KSByZXR1cm4gbmV3IEN1YmVoZWxpeChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOw0KICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7DQogIHZhciByID0gby5yIC8gMjU1LA0KICAgICAgZyA9IG8uZyAvIDI1NSwNCiAgICAgIGIgPSBvLmIgLyAyNTUsDQogICAgICBsID0gKEJDX0RBICogYiArIEVEICogciAtIEVCICogZykgLyAoQkNfREEgKyBFRCAtIEVCKSwNCiAgICAgIGJsID0gYiAtIGwsDQogICAgICBrID0gKEUgKiAoZyAtIGwpIC0gQyAqIGJsKSAvIEQsDQogICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSAqIGwgKiAoMSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTENCiAgICAgIGggPSBzID8gTWF0aC5hdGFuMihrLCBibCkgKiByYWQyZGVnIC0gMTIwIDogTmFOOw0KICByZXR1cm4gbmV3IEN1YmVoZWxpeChoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpOw0KfQ0KDQpmdW5jdGlvbiBjdWJlaGVsaXgoaCwgcywgbCwgb3BhY2l0eSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVoZWxpeENvbnZlcnQoaCkgOiBuZXcgQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsNCn0NCg0KZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsNCiAgdGhpcy5oID0gK2g7DQogIHRoaXMucyA9ICtzOw0KICB0aGlzLmwgPSArbDsNCiAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7DQp9DQoNCmRlZmluZShDdWJlaGVsaXgsIGN1YmVoZWxpeCwgZXh0ZW5kKENvbG9yLCB7DQogIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7DQogICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyIDogTWF0aC5wb3coYnJpZ2h0ZXIsIGspOw0KICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOw0KICB9LA0KICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsNCiAgICBrID0gayA9PSBudWxsID8gZGFya2VyIDogTWF0aC5wb3coZGFya2VyLCBrKTsNCiAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsNCiAgfSwNCiAgcmdiOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkLA0KICAgICAgICBsID0gK3RoaXMubCwNCiAgICAgICAgYSA9IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zICogbCAqICgxIC0gbCksDQogICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSwNCiAgICAgICAgc2luaCA9IE1hdGguc2luKGgpOw0KICAgIHJldHVybiBuZXcgUmdiKA0KICAgICAgMjU1ICogKGwgKyBhICogKEEgKiBjb3NoICsgQiAqIHNpbmgpKSwNCiAgICAgIDI1NSAqIChsICsgYSAqIChDICogY29zaCArIEQgKiBzaW5oKSksDQogICAgICAyNTUgKiAobCArIGEgKiAoRSAqIGNvc2gpKSwNCiAgICAgIHRoaXMub3BhY2l0eQ0KICAgICk7DQogIH0NCn0pKTsNCg0KZXhwb3J0cy5jb2xvciA9IGNvbG9yOw0KZXhwb3J0cy5yZ2IgPSByZ2I7DQpleHBvcnRzLmhzbCA9IGhzbDsNCmV4cG9ydHMubGFiID0gbGFiOw0KZXhwb3J0cy5oY2wgPSBoY2w7DQpleHBvcnRzLmN1YmVoZWxpeCA9IGN1YmVoZWxpeDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWRpc3BhdGNoLyBWZXJzaW9uIDEuMC4zLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCnZhciBub29wID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTsNCg0KZnVuY3Rpb24gZGlzcGF0Y2goKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7DQogICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArICIiKSB8fCAodCBpbiBfKSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsNCiAgICBfW3RdID0gW107DQogIH0NCiAgcmV0dXJuIG5ldyBEaXNwYXRjaChfKTsNCn0NCg0KZnVuY3Rpb24gRGlzcGF0Y2goXykgew0KICB0aGlzLl8gPSBfOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7DQogIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7DQogICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOw0KICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7DQogICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHQpOw0KICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07DQogIH0pOw0KfQ0KDQpEaXNwYXRjaC5wcm90b3R5cGUgPSBkaXNwYXRjaC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCwNCiAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgew0KICAgIHZhciBfID0gdGhpcy5fLA0KICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyAiIiwgXyksDQogICAgICAgIHQsDQogICAgICAgIGkgPSAtMSwNCiAgICAgICAgbiA9IFQubGVuZ3RoOw0KDQogICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4NCiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0Ow0KICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4NCiAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLg0KICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOw0KICAgIHdoaWxlICgrK2kgPCBuKSB7DQogICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spOw0KICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7DQogICAgfQ0KDQogICAgcmV0dXJuIHRoaXM7DQogIH0sDQogIGNvcHk6IGZ1bmN0aW9uKCkgew0KICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87DQogICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpOw0KICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7DQogIH0sDQogIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHsNCiAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07DQogICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7DQogICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOw0KICB9LA0KICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykgew0KICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOw0KICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7DQogIH0NCn07DQoNCmZ1bmN0aW9uIGdldCh0eXBlLCBuYW1lKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7DQogICAgICByZXR1cm4gYy52YWx1ZTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gc2V0KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7DQogIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsNCiAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7DQogICAgICB0eXBlW2ldID0gbm9vcCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsNCiAgcmV0dXJuIHR5cGU7DQp9DQoNCmV4cG9ydHMuZGlzcGF0Y2ggPSBkaXNwYXRjaDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWVhc2UvIFZlcnNpb24gMS4wLjMuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KZnVuY3Rpb24gbGluZWFyKHQpIHsNCiAgcmV0dXJuICt0Ow0KfQ0KDQpmdW5jdGlvbiBxdWFkSW4odCkgew0KICByZXR1cm4gdCAqIHQ7DQp9DQoNCmZ1bmN0aW9uIHF1YWRPdXQodCkgew0KICByZXR1cm4gdCAqICgyIC0gdCk7DQp9DQoNCmZ1bmN0aW9uIHF1YWRJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsNCn0NCg0KZnVuY3Rpb24gY3ViaWNJbih0KSB7DQogIHJldHVybiB0ICogdCAqIHQ7DQp9DQoNCmZ1bmN0aW9uIGN1YmljT3V0KHQpIHsNCiAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTsNCn0NCg0KZnVuY3Rpb24gY3ViaWNJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7DQp9DQoNCnZhciBleHBvbmVudCA9IDM7DQoNCnZhciBwb2x5SW4gPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsNCiAgZSA9ICtlOw0KDQogIGZ1bmN0aW9uIHBvbHlJbih0KSB7DQogICAgcmV0dXJuIE1hdGgucG93KHQsIGUpOw0KICB9DQoNCiAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOw0KDQogIHJldHVybiBwb2x5SW47DQp9KShleHBvbmVudCk7DQoNCnZhciBwb2x5T3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7DQogIGUgPSArZTsNCg0KICBmdW5jdGlvbiBwb2x5T3V0KHQpIHsNCiAgICByZXR1cm4gMSAtIE1hdGgucG93KDEgLSB0LCBlKTsNCiAgfQ0KDQogIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207DQoNCiAgcmV0dXJuIHBvbHlPdXQ7DQp9KShleHBvbmVudCk7DQoNCnZhciBwb2x5SW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsNCiAgZSA9ICtlOw0KDQogIGZ1bmN0aW9uIHBvbHlJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUpKSAvIDI7DQogIH0NCg0KICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207DQoNCiAgcmV0dXJuIHBvbHlJbk91dDsNCn0pKGV4cG9uZW50KTsNCg0KdmFyIHBpID0gTWF0aC5QSTsNCnZhciBoYWxmUGkgPSBwaSAvIDI7DQoNCmZ1bmN0aW9uIHNpbkluKHQpIHsNCiAgcmV0dXJuIDEgLSBNYXRoLmNvcyh0ICogaGFsZlBpKTsNCn0NCg0KZnVuY3Rpb24gc2luT3V0KHQpIHsNCiAgcmV0dXJuIE1hdGguc2luKHQgKiBoYWxmUGkpOw0KfQ0KDQpmdW5jdGlvbiBzaW5Jbk91dCh0KSB7DQogIHJldHVybiAoMSAtIE1hdGguY29zKHBpICogdCkpIC8gMjsNCn0NCg0KZnVuY3Rpb24gZXhwSW4odCkgew0KICByZXR1cm4gTWF0aC5wb3coMiwgMTAgKiB0IC0gMTApOw0KfQ0KDQpmdW5jdGlvbiBleHBPdXQodCkgew0KICByZXR1cm4gMSAtIE1hdGgucG93KDIsIC0xMCAqIHQpOw0KfQ0KDQpmdW5jdGlvbiBleHBJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KDIsIDEwICogdCAtIDEwKSA6IDIgLSBNYXRoLnBvdygyLCAxMCAtIDEwICogdCkpIC8gMjsNCn0NCg0KZnVuY3Rpb24gY2lyY2xlSW4odCkgew0KICByZXR1cm4gMSAtIE1hdGguc3FydCgxIC0gdCAqIHQpOw0KfQ0KDQpmdW5jdGlvbiBjaXJjbGVPdXQodCkgew0KICByZXR1cm4gTWF0aC5zcXJ0KDEgLSAtLXQgKiB0KTsNCn0NCg0KZnVuY3Rpb24gY2lyY2xlSW5PdXQodCkgew0KICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCkgOiBNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSAvIDI7DQp9DQoNCnZhciBiMSA9IDQgLyAxMTsNCnZhciBiMiA9IDYgLyAxMTsNCnZhciBiMyA9IDggLyAxMTsNCnZhciBiNCA9IDMgLyA0Ow0KdmFyIGI1ID0gOSAvIDExOw0KdmFyIGI2ID0gMTAgLyAxMTsNCnZhciBiNyA9IDE1IC8gMTY7DQp2YXIgYjggPSAyMSAvIDIyOw0KdmFyIGI5ID0gNjMgLyA2NDsNCnZhciBiMCA9IDEgLyBiMSAvIGIxOw0KDQpmdW5jdGlvbiBib3VuY2VJbih0KSB7DQogIHJldHVybiAxIC0gYm91bmNlT3V0KDEgLSB0KTsNCn0NCg0KZnVuY3Rpb24gYm91bmNlT3V0KHQpIHsNCiAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAtPSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICogKHQgLT0gYjgpICogdCArIGI5Ow0KfQ0KDQpmdW5jdGlvbiBib3VuY2VJbk91dCh0KSB7DQogIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBib3VuY2VPdXQoMSAtIHQpIDogYm91bmNlT3V0KHQgLSAxKSArIDEpIC8gMjsNCn0NCg0KdmFyIG92ZXJzaG9vdCA9IDEuNzAxNTg7DQoNCnZhciBiYWNrSW4gPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsNCiAgcyA9ICtzOw0KDQogIGZ1bmN0aW9uIGJhY2tJbih0KSB7DQogICAgcmV0dXJuIHQgKiB0ICogKChzICsgMSkgKiB0IC0gcyk7DQogIH0NCg0KICBiYWNrSW4ub3ZlcnNob290ID0gY3VzdG9tOw0KDQogIHJldHVybiBiYWNrSW47DQp9KShvdmVyc2hvb3QpOw0KDQp2YXIgYmFja091dCA9IChmdW5jdGlvbiBjdXN0b20ocykgew0KICBzID0gK3M7DQoNCiAgZnVuY3Rpb24gYmFja091dCh0KSB7DQogICAgcmV0dXJuIC0tdCAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDE7DQogIH0NCg0KICBiYWNrT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTsNCg0KICByZXR1cm4gYmFja091dDsNCn0pKG92ZXJzaG9vdCk7DQoNCnZhciBiYWNrSW5PdXQgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsNCiAgcyA9ICtzOw0KDQogIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCAqPSAyKSA8IDEgPyB0ICogdCAqICgocyArIDEpICogdCAtIHMpIDogKHQgLT0gMikgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAyKSAvIDI7DQogIH0NCg0KICBiYWNrSW5PdXQub3ZlcnNob290ID0gY3VzdG9tOw0KDQogIHJldHVybiBiYWNrSW5PdXQ7DQp9KShvdmVyc2hvb3QpOw0KDQp2YXIgdGF1ID0gMiAqIE1hdGguUEk7DQp2YXIgYW1wbGl0dWRlID0gMTsNCnZhciBwZXJpb2QgPSAwLjM7DQoNCnZhciBlbGFzdGljSW4gPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHsNCiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7DQoNCiAgZnVuY3Rpb24gZWxhc3RpY0luKHQpIHsNCiAgICByZXR1cm4gYSAqIE1hdGgucG93KDIsIDEwICogLS10KSAqIE1hdGguc2luKChzIC0gdCkgLyBwKTsNCiAgfQ0KDQogIGVsYXN0aWNJbi5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07DQogIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07DQoNCiAgcmV0dXJuIGVsYXN0aWNJbjsNCn0pKGFtcGxpdHVkZSwgcGVyaW9kKTsNCg0KdmFyIGVsYXN0aWNPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHsNCiAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSk7DQoNCiAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7DQogICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApOw0KICB9DQoNCiAgZWxhc3RpY091dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07DQogIGVsYXN0aWNPdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9Ow0KDQogIHJldHVybiBlbGFzdGljT3V0Ow0KfSkoYW1wbGl0dWRlLCBwZXJpb2QpOw0KDQp2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7DQogIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpOw0KDQogIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7DQogICAgcmV0dXJuICgodCA9IHQgKiAyIC0gMSkgPCAwDQogICAgICAgID8gYSAqIE1hdGgucG93KDIsIDEwICogdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCkNCiAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7DQogIH0NCg0KICBlbGFzdGljSW5PdXQuYW1wbGl0dWRlID0gZnVuY3Rpb24oYSkgeyByZXR1cm4gY3VzdG9tKGEsIHAgKiB0YXUpOyB9Ow0KICBlbGFzdGljSW5PdXQucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9Ow0KDQogIHJldHVybiBlbGFzdGljSW5PdXQ7DQp9KShhbXBsaXR1ZGUsIHBlcmlvZCk7DQoNCmV4cG9ydHMuZWFzZUxpbmVhciA9IGxpbmVhcjsNCmV4cG9ydHMuZWFzZVF1YWQgPSBxdWFkSW5PdXQ7DQpleHBvcnRzLmVhc2VRdWFkSW4gPSBxdWFkSW47DQpleHBvcnRzLmVhc2VRdWFkT3V0ID0gcXVhZE91dDsNCmV4cG9ydHMuZWFzZVF1YWRJbk91dCA9IHF1YWRJbk91dDsNCmV4cG9ydHMuZWFzZUN1YmljID0gY3ViaWNJbk91dDsNCmV4cG9ydHMuZWFzZUN1YmljSW4gPSBjdWJpY0luOw0KZXhwb3J0cy5lYXNlQ3ViaWNPdXQgPSBjdWJpY091dDsNCmV4cG9ydHMuZWFzZUN1YmljSW5PdXQgPSBjdWJpY0luT3V0Ow0KZXhwb3J0cy5lYXNlUG9seSA9IHBvbHlJbk91dDsNCmV4cG9ydHMuZWFzZVBvbHlJbiA9IHBvbHlJbjsNCmV4cG9ydHMuZWFzZVBvbHlPdXQgPSBwb2x5T3V0Ow0KZXhwb3J0cy5lYXNlUG9seUluT3V0ID0gcG9seUluT3V0Ow0KZXhwb3J0cy5lYXNlU2luID0gc2luSW5PdXQ7DQpleHBvcnRzLmVhc2VTaW5JbiA9IHNpbkluOw0KZXhwb3J0cy5lYXNlU2luT3V0ID0gc2luT3V0Ow0KZXhwb3J0cy5lYXNlU2luSW5PdXQgPSBzaW5Jbk91dDsNCmV4cG9ydHMuZWFzZUV4cCA9IGV4cEluT3V0Ow0KZXhwb3J0cy5lYXNlRXhwSW4gPSBleHBJbjsNCmV4cG9ydHMuZWFzZUV4cE91dCA9IGV4cE91dDsNCmV4cG9ydHMuZWFzZUV4cEluT3V0ID0gZXhwSW5PdXQ7DQpleHBvcnRzLmVhc2VDaXJjbGUgPSBjaXJjbGVJbk91dDsNCmV4cG9ydHMuZWFzZUNpcmNsZUluID0gY2lyY2xlSW47DQpleHBvcnRzLmVhc2VDaXJjbGVPdXQgPSBjaXJjbGVPdXQ7DQpleHBvcnRzLmVhc2VDaXJjbGVJbk91dCA9IGNpcmNsZUluT3V0Ow0KZXhwb3J0cy5lYXNlQm91bmNlID0gYm91bmNlT3V0Ow0KZXhwb3J0cy5lYXNlQm91bmNlSW4gPSBib3VuY2VJbjsNCmV4cG9ydHMuZWFzZUJvdW5jZU91dCA9IGJvdW5jZU91dDsNCmV4cG9ydHMuZWFzZUJvdW5jZUluT3V0ID0gYm91bmNlSW5PdXQ7DQpleHBvcnRzLmVhc2VCYWNrID0gYmFja0luT3V0Ow0KZXhwb3J0cy5lYXNlQmFja0luID0gYmFja0luOw0KZXhwb3J0cy5lYXNlQmFja091dCA9IGJhY2tPdXQ7DQpleHBvcnRzLmVhc2VCYWNrSW5PdXQgPSBiYWNrSW5PdXQ7DQpleHBvcnRzLmVhc2VFbGFzdGljID0gZWxhc3RpY091dDsNCmV4cG9ydHMuZWFzZUVsYXN0aWNJbiA9IGVsYXN0aWNJbjsNCmV4cG9ydHMuZWFzZUVsYXN0aWNPdXQgPSBlbGFzdGljT3V0Ow0KZXhwb3J0cy5lYXNlRWxhc3RpY0luT3V0ID0gZWxhc3RpY0luT3V0Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSw3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtZm9ybWF0LyBWZXJzaW9uIDEuMi4wLiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cykgeyAndXNlIHN0cmljdCc7DQoNCi8vIENvbXB1dGVzIHRoZSBkZWNpbWFsIGNvZWZmaWNpZW50IGFuZCBleHBvbmVudCBvZiB0aGUgc3BlY2lmaWVkIG51bWJlciB4IHdpdGgNCi8vIHNpZ25pZmljYW50IGRpZ2l0cyBwLCB3aGVyZSB4IGlzIHBvc2l0aXZlIGFuZCBwIGlzIGluIFsxLCAyMV0gb3IgdW5kZWZpbmVkLg0KLy8gRm9yIGV4YW1wbGUsIGZvcm1hdERlY2ltYWwoMS4yMykgcmV0dXJucyBbIjEyMyIsIDBdLg0KdmFyIGZvcm1hdERlY2ltYWwgPSBmdW5jdGlvbih4LCBwKSB7DQogIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkNCiAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTsNCg0KICAvLyBUaGUgc3RyaW5nIHJldHVybmVkIGJ5IHRvRXhwb25lbnRpYWwgZWl0aGVyIGhhcyB0aGUgZm9ybSBcZFwuXGQrZVstK11cZCsNCiAgLy8gKGUuZy4sIDEuMmUrMykgb3IgdGhlIGZvcm0gXGRlWy0rXVxkKyAoZS5nLiwgMWUrMykuDQogIHJldHVybiBbDQogICAgY29lZmZpY2llbnQubGVuZ3RoID4gMSA/IGNvZWZmaWNpZW50WzBdICsgY29lZmZpY2llbnQuc2xpY2UoMikgOiBjb2VmZmljaWVudCwNCiAgICAreC5zbGljZShpICsgMSkNCiAgXTsNCn07DQoNCnZhciBleHBvbmVudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIHggPSBmb3JtYXREZWNpbWFsKE1hdGguYWJzKHgpKSwgeCA/IHhbMV0gOiBOYU47DQp9Ow0KDQp2YXIgZm9ybWF0R3JvdXAgPSBmdW5jdGlvbihncm91cGluZywgdGhvdXNhbmRzKSB7DQogIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHsNCiAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwNCiAgICAgICAgdCA9IFtdLA0KICAgICAgICBqID0gMCwNCiAgICAgICAgZyA9IGdyb3VwaW5nWzBdLA0KICAgICAgICBsZW5ndGggPSAwOw0KDQogICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7DQogICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsNCiAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpOw0KICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOw0KICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsNCiAgICB9DQoNCiAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOw0KICB9Ow0KfTsNCg0KdmFyIGZvcm1hdE51bWVyYWxzID0gZnVuY3Rpb24obnVtZXJhbHMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7DQogICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoL1swLTldL2csIGZ1bmN0aW9uKGkpIHsNCiAgICAgIHJldHVybiBudW1lcmFsc1sraV07DQogICAgfSk7DQogIH07DQp9Ow0KDQp2YXIgZm9ybWF0RGVmYXVsdCA9IGZ1bmN0aW9uKHgsIHApIHsNCiAgeCA9IHgudG9QcmVjaXNpb24ocCk7DQoNCiAgb3V0OiBmb3IgKHZhciBuID0geC5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgew0KICAgIHN3aXRjaCAoeFtpXSkgew0KICAgICAgY2FzZSAiLiI6IGkwID0gaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsNCiAgICAgIGNhc2UgImUiOiBicmVhayBvdXQ7DQogICAgICBkZWZhdWx0OiBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBpMCA+IDAgPyB4LnNsaWNlKDAsIGkwKSArIHguc2xpY2UoaTEgKyAxKSA6IHg7DQp9Ow0KDQp2YXIgcHJlZml4RXhwb25lbnQ7DQoNCnZhciBmb3JtYXRQcmVmaXhBdXRvID0gZnVuY3Rpb24oeCwgcCkgew0KICB2YXIgZCA9IGZvcm1hdERlY2ltYWwoeCwgcCk7DQogIGlmICghZCkgcmV0dXJuIHggKyAiIjsNCiAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSwNCiAgICAgIGV4cG9uZW50ID0gZFsxXSwNCiAgICAgIGkgPSBleHBvbmVudCAtIChwcmVmaXhFeHBvbmVudCA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwNCiAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7DQogIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQNCiAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQ0KICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgIi4iICsgY29lZmZpY2llbnQuc2xpY2UoaSkNCiAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCh4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQ0KfTsNCg0KdmFyIGZvcm1hdFJvdW5kZWQgPSBmdW5jdGlvbih4LCBwKSB7DQogIHZhciBkID0gZm9ybWF0RGVjaW1hbCh4LCBwKTsNCiAgaWYgKCFkKSByZXR1cm4geCArICIiOw0KICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLA0KICAgICAgZXhwb25lbnQgPSBkWzFdOw0KICByZXR1cm4gZXhwb25lbnQgPCAwID8gIjAuIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oIjAiKSArIGNvZWZmaWNpZW50DQogICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpDQogICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbigiMCIpOw0KfTsNCg0KdmFyIGZvcm1hdFR5cGVzID0gew0KICAiIjogZm9ybWF0RGVmYXVsdCwNCiAgIiUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiAoeCAqIDEwMCkudG9GaXhlZChwKTsgfSwNCiAgImIiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LA0KICAiYyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyAiIjsgfSwNCiAgImQiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSwNCiAgImUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sDQogICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LA0KICAiZyI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sDQogICJvIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSwNCiAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApOyB9LA0KICAiciI6IGZvcm1hdFJvdW5kZWQsDQogICJzIjogZm9ybWF0UHJlZml4QXV0bywNCiAgIlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9LA0KICAieCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9DQp9Ow0KDQovLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdDQp2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXC1cKCBdKT8oWyQjXSk/KDApPyhcZCspPygsKT8oXC5cZCspPyhbYS16JV0pPyQvaTsNCg0KZnVuY3Rpb24gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcikgew0KICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KfQ0KDQpmb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZg0KDQpmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7DQogIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIiArIHNwZWNpZmllcik7DQoNCiAgdmFyIG1hdGNoLA0KICAgICAgZmlsbCA9IG1hdGNoWzFdIHx8ICIgIiwNCiAgICAgIGFsaWduID0gbWF0Y2hbMl0gfHwgIj4iLA0KICAgICAgc2lnbiA9IG1hdGNoWzNdIHx8ICItIiwNCiAgICAgIHN5bWJvbCA9IG1hdGNoWzRdIHx8ICIiLA0KICAgICAgemVybyA9ICEhbWF0Y2hbNV0sDQogICAgICB3aWR0aCA9IG1hdGNoWzZdICYmICttYXRjaFs2XSwNCiAgICAgIGNvbW1hID0gISFtYXRjaFs3XSwNCiAgICAgIHByZWNpc2lvbiA9IG1hdGNoWzhdICYmICttYXRjaFs4XS5zbGljZSgxKSwNCiAgICAgIHR5cGUgPSBtYXRjaFs5XSB8fCAiIjsNCg0KICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuDQogIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsNCg0KICAvLyBNYXAgaW52YWxpZCB0eXBlcyB0byB0aGUgZGVmYXVsdCBmb3JtYXQuDQogIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgdHlwZSA9ICIiOw0KDQogIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLg0KICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7DQoNCiAgdGhpcy5maWxsID0gZmlsbDsNCiAgdGhpcy5hbGlnbiA9IGFsaWduOw0KICB0aGlzLnNpZ24gPSBzaWduOw0KICB0aGlzLnN5bWJvbCA9IHN5bWJvbDsNCiAgdGhpcy56ZXJvID0gemVybzsNCiAgdGhpcy53aWR0aCA9IHdpZHRoOw0KICB0aGlzLmNvbW1hID0gY29tbWE7DQogIHRoaXMucHJlY2lzaW9uID0gcHJlY2lzaW9uOw0KICB0aGlzLnR5cGUgPSB0eXBlOw0KfQ0KDQpGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmZpbGwNCiAgICAgICsgdGhpcy5hbGlnbg0KICAgICAgKyB0aGlzLnNpZ24NCiAgICAgICsgdGhpcy5zeW1ib2wNCiAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQ0KICAgICAgKyAodGhpcy53aWR0aCA9PSBudWxsID8gIiIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpDQogICAgICArICh0aGlzLmNvbW1hID8gIiwiIDogIiIpDQogICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQ0KICAgICAgKyB0aGlzLnR5cGU7DQp9Ow0KDQp2YXIgaWRlbnRpdHkgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiB4Ow0KfTsNCg0KdmFyIHByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOw0KDQp2YXIgZm9ybWF0TG9jYWxlID0gZnVuY3Rpb24obG9jYWxlKSB7DQogIHZhciBncm91cCA9IGxvY2FsZS5ncm91cGluZyAmJiBsb2NhbGUudGhvdXNhbmRzID8gZm9ybWF0R3JvdXAobG9jYWxlLmdyb3VwaW5nLCBsb2NhbGUudGhvdXNhbmRzKSA6IGlkZW50aXR5LA0KICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksDQogICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwsDQogICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA/IGZvcm1hdE51bWVyYWxzKGxvY2FsZS5udW1lcmFscykgOiBpZGVudGl0eSwNCiAgICAgIHBlcmNlbnQgPSBsb2NhbGUucGVyY2VudCB8fCAiJSI7DQoNCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikgew0KICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpOw0KDQogICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCwNCiAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sDQogICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwNCiAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCwNCiAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLA0KICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwNCiAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsDQogICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sDQogICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTsNCg0KICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4Lg0KICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLg0KICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzBdIDogc3ltYm9sID09PSAiIyIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/ICIwIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLA0KICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7DQoNCiAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlPw0KICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPw0KICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/DQogICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlc1t0eXBlXSwNCiAgICAgICAgbWF5YmVTdWZmaXggPSAhdHlwZSB8fCAvW2RlZmdwcnMlXS8udGVzdCh0eXBlKTsNCg0KICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCwNCiAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLg0KICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS4NCiAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uDQogICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikNCiAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpDQogICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOw0KDQogICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7DQogICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsDQogICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsDQogICAgICAgICAgaSwgbiwgYzsNCg0KICAgICAgaWYgKHR5cGUgPT09ICJjIikgew0KICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7DQogICAgICAgIHZhbHVlID0gIiI7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsNCg0KICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuDQogICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwOw0KICAgICAgICB2YWx1ZSA9IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOw0KDQogICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gZHVyaW5nIGZvcm1hdHRpbmcsIHRyZWF0IGFzIHBvc2l0aXZlLg0KICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDApIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsNCg0KICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4NCiAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSAiKCIgPyBzaWduIDogIi0iKSA6IHNpZ24gPT09ICItIiB8fCBzaWduID09PSAiKCIgPyAiIiA6IHNpZ24pICsgdmFsdWVQcmVmaXg7DQogICAgICAgIHZhbHVlU3VmZml4ID0gdmFsdWVTdWZmaXggKyAodHlwZSA9PT0gInMiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiAiIikgKyAodmFsdWVOZWdhdGl2ZSAmJiBzaWduID09PSAiKCIgPyAiKSIgOiAiIik7DQoNCiAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmUNCiAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuDQogICAgICAgIGlmIChtYXliZVN1ZmZpeCkgew0KICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDsNCiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7DQogICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4Ow0KICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsNCg0KICAgICAgLy8gQ29tcHV0ZSB0aGUgcGFkZGluZy4NCiAgICAgIHZhciBsZW5ndGggPSB2YWx1ZVByZWZpeC5sZW5ndGggKyB2YWx1ZS5sZW5ndGggKyB2YWx1ZVN1ZmZpeC5sZW5ndGgsDQogICAgICAgICAgcGFkZGluZyA9IGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSA6ICIiOw0KDQogICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgIjAiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuDQogICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsNCg0KICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuDQogICAgICBzd2l0Y2ggKGFsaWduKSB7DQogICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOw0KICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsNCiAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7DQogICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7DQogICAgICB9DQoNCiAgICAgIHJldHVybiBudW1lcmFscyh2YWx1ZSk7DQogICAgfQ0KDQogICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7DQogICAgICByZXR1cm4gc3BlY2lmaWVyICsgIiI7DQogICAgfTsNCg0KICAgIHJldHVybiBmb3JtYXQ7DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSkgew0KICAgIHZhciBmID0gbmV3Rm9ybWF0KChzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSwgc3BlY2lmaWVyLnR5cGUgPSAiZiIsIHNwZWNpZmllcikpLA0KICAgICAgICBlID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQodmFsdWUpIC8gMykpKSAqIDMsDQogICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLA0KICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdOw0KICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgew0KICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIHsNCiAgICBmb3JtYXQ6IG5ld0Zvcm1hdCwNCiAgICBmb3JtYXRQcmVmaXg6IGZvcm1hdFByZWZpeA0KICB9Ow0KfTsNCg0KdmFyIGxvY2FsZTsNCg0KDQoNCmRlZmF1bHRMb2NhbGUoew0KICBkZWNpbWFsOiAiLiIsDQogIHRob3VzYW5kczogIiwiLA0KICBncm91cGluZzogWzNdLA0KICBjdXJyZW5jeTogWyIkIiwgIiJdDQp9KTsNCg0KZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7DQogIGxvY2FsZSA9IGZvcm1hdExvY2FsZShkZWZpbml0aW9uKTsNCiAgZXhwb3J0cy5mb3JtYXQgPSBsb2NhbGUuZm9ybWF0Ow0KICBleHBvcnRzLmZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7DQogIHJldHVybiBsb2NhbGU7DQp9DQoNCnZhciBwcmVjaXNpb25GaXhlZCA9IGZ1bmN0aW9uKHN0ZXApIHsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudChNYXRoLmFicyhzdGVwKSkpOw0KfTsNCg0KdmFyIHByZWNpc2lvblByZWZpeCA9IGZ1bmN0aW9uKHN0ZXAsIHZhbHVlKSB7DQogIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7DQp9Ow0KDQp2YXIgcHJlY2lzaW9uUm91bmQgPSBmdW5jdGlvbihzdGVwLCBtYXgpIHsNCiAgc3RlcCA9IE1hdGguYWJzKHN0ZXApLCBtYXggPSBNYXRoLmFicyhtYXgpIC0gc3RlcDsNCiAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cG9uZW50KG1heCkgLSBleHBvbmVudChzdGVwKSkgKyAxOw0KfTsNCg0KZXhwb3J0cy5mb3JtYXREZWZhdWx0TG9jYWxlID0gZGVmYXVsdExvY2FsZTsNCmV4cG9ydHMuZm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlOw0KZXhwb3J0cy5mb3JtYXRTcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXI7DQpleHBvcnRzLnByZWNpc2lvbkZpeGVkID0gcHJlY2lzaW9uRml4ZWQ7DQpleHBvcnRzLnByZWNpc2lvblByZWZpeCA9IHByZWNpc2lvblByZWZpeDsNCmV4cG9ydHMucHJlY2lzaW9uUm91bmQgPSBwcmVjaXNpb25Sb3VuZDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sODpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLWhpZXJhcmNoeS8gVmVyc2lvbiAxLjEuNS4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbihhLCBiKSB7DQogIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjsNCn0NCg0KZnVuY3Rpb24gbWVhblgoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShtZWFuWFJlZHVjZSwgMCkgLyBjaGlsZHJlbi5sZW5ndGg7DQp9DQoNCmZ1bmN0aW9uIG1lYW5YUmVkdWNlKHgsIGMpIHsNCiAgcmV0dXJuIHggKyBjLng7DQp9DQoNCmZ1bmN0aW9uIG1heFkoY2hpbGRyZW4pIHsNCiAgcmV0dXJuIDEgKyBjaGlsZHJlbi5yZWR1Y2UobWF4WVJlZHVjZSwgMCk7DQp9DQoNCmZ1bmN0aW9uIG1heFlSZWR1Y2UoeSwgYykgew0KICByZXR1cm4gTWF0aC5tYXgoeSwgYy55KTsNCn0NCg0KZnVuY3Rpb24gbGVhZkxlZnQobm9kZSkgew0KICB2YXIgY2hpbGRyZW47DQogIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlblswXTsNCiAgcmV0dXJuIG5vZGU7DQp9DQoNCmZ1bmN0aW9uIGxlYWZSaWdodChub2RlKSB7DQogIHZhciBjaGlsZHJlbjsNCiAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdOw0KICByZXR1cm4gbm9kZTsNCn0NCg0KdmFyIGNsdXN0ZXIgPSBmdW5jdGlvbigpIHsNCiAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIG5vZGVTaXplID0gZmFsc2U7DQoNCiAgZnVuY3Rpb24gY2x1c3Rlcihyb290KSB7DQogICAgdmFyIHByZXZpb3VzTm9kZSwNCiAgICAgICAgeCA9IDA7DQoNCiAgICAvLyBGaXJzdCB3YWxrLCBjb21wdXRpbmcgdGhlIGluaXRpYWwgeCAmIHkgdmFsdWVzLg0KICAgIHJvb3QuZWFjaEFmdGVyKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogICAgICBpZiAoY2hpbGRyZW4pIHsNCiAgICAgICAgbm9kZS54ID0gbWVhblgoY2hpbGRyZW4pOw0KICAgICAgICBub2RlLnkgPSBtYXhZKGNoaWxkcmVuKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG5vZGUueCA9IHByZXZpb3VzTm9kZSA/IHggKz0gc2VwYXJhdGlvbihub2RlLCBwcmV2aW91c05vZGUpIDogMDsNCiAgICAgICAgbm9kZS55ID0gMDsNCiAgICAgICAgcHJldmlvdXNOb2RlID0gbm9kZTsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIHZhciBsZWZ0ID0gbGVhZkxlZnQocm9vdCksDQogICAgICAgIHJpZ2h0ID0gbGVhZlJpZ2h0KHJvb3QpLA0KICAgICAgICB4MCA9IGxlZnQueCAtIHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwNCiAgICAgICAgeDEgPSByaWdodC54ICsgc2VwYXJhdGlvbihyaWdodCwgbGVmdCkgLyAyOw0KDQogICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuDQogICAgcmV0dXJuIHJvb3QuZWFjaEFmdGVyKG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkgew0KICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBkeDsNCiAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7DQogICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBkeDsNCiAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5Ow0KICAgIH0pOw0KICB9DQoNCiAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCBjbHVzdGVyKSA6IHNlcGFyYXRpb247DQogIH07DQoNCiAgY2x1c3Rlci5zaXplID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTsNCiAgfTsNCg0KICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpOw0KICB9Ow0KDQogIHJldHVybiBjbHVzdGVyOw0KfTsNCg0KZnVuY3Rpb24gY291bnQobm9kZSkgew0KICB2YXIgc3VtID0gMCwNCiAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwNCiAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7DQogIGlmICghaSkgc3VtID0gMTsNCiAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTsNCiAgbm9kZS52YWx1ZSA9IHN1bTsNCn0NCg0KdmFyIG5vZGVfY291bnQgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaEFmdGVyKGNvdW50KTsNCn07DQoNCnZhciBub2RlX2VhY2ggPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuOw0KICBkbyB7DQogICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107DQogICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7DQogICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOw0KICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7DQogICAgICB9DQogICAgfQ0KICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7DQogIHJldHVybiB0aGlzOw0KfTsNCg0KdmFyIG5vZGVfZWFjaEJlZm9yZSA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIGNoaWxkcmVuLCBpOw0KICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7DQogICAgY2FsbGJhY2sobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsNCiAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7DQogICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsNCiAgICB9DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgbm9kZV9lYWNoQWZ0ZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgew0KICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBuZXh0ID0gW10sIGNoaWxkcmVuLCBpLCBuOw0KICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7DQogICAgbmV4dC5wdXNoKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47DQogICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsNCiAgICB9DQogIH0NCiAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7DQogICAgY2FsbGJhY2sobm9kZSk7DQogIH0NCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgbm9kZV9zdW0gPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgew0KICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLA0KICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sDQogICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7DQogICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7DQogICAgbm9kZS52YWx1ZSA9IHN1bTsNCiAgfSk7DQp9Ow0KDQp2YXIgbm9kZV9zb3J0ID0gZnVuY3Rpb24oY29tcGFyZSkgew0KICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICBpZiAobm9kZS5jaGlsZHJlbikgew0KICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpOw0KICAgIH0NCiAgfSk7DQp9Ow0KDQp2YXIgbm9kZV9wYXRoID0gZnVuY3Rpb24oZW5kKSB7DQogIHZhciBzdGFydCA9IHRoaXMsDQogICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3Ioc3RhcnQsIGVuZCksDQogICAgICBub2RlcyA9IFtzdGFydF07DQogIHdoaWxlIChzdGFydCAhPT0gYW5jZXN0b3IpIHsNCiAgICBzdGFydCA9IHN0YXJ0LnBhcmVudDsNCiAgICBub2Rlcy5wdXNoKHN0YXJ0KTsNCiAgfQ0KICB2YXIgayA9IG5vZGVzLmxlbmd0aDsNCiAgd2hpbGUgKGVuZCAhPT0gYW5jZXN0b3IpIHsNCiAgICBub2Rlcy5zcGxpY2UoaywgMCwgZW5kKTsNCiAgICBlbmQgPSBlbmQucGFyZW50Ow0KICB9DQogIHJldHVybiBub2RlczsNCn07DQoNCmZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgew0KICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7DQogIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLA0KICAgICAgYk5vZGVzID0gYi5hbmNlc3RvcnMoKSwNCiAgICAgIGMgPSBudWxsOw0KICBhID0gYU5vZGVzLnBvcCgpOw0KICBiID0gYk5vZGVzLnBvcCgpOw0KICB3aGlsZSAoYSA9PT0gYikgew0KICAgIGMgPSBhOw0KICAgIGEgPSBhTm9kZXMucG9wKCk7DQogICAgYiA9IGJOb2Rlcy5wb3AoKTsNCiAgfQ0KICByZXR1cm4gYzsNCn0NCg0KdmFyIG5vZGVfYW5jZXN0b3JzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07DQogIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHsNCiAgICBub2Rlcy5wdXNoKG5vZGUpOw0KICB9DQogIHJldHVybiBub2RlczsNCn07DQoNCnZhciBub2RlX2Rlc2NlbmRhbnRzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlcyA9IFtdOw0KICB0aGlzLmVhY2goZnVuY3Rpb24obm9kZSkgew0KICAgIG5vZGVzLnB1c2gobm9kZSk7DQogIH0pOw0KICByZXR1cm4gbm9kZXM7DQp9Ow0KDQp2YXIgbm9kZV9sZWF2ZXMgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGxlYXZlcyA9IFtdOw0KICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgew0KICAgIGlmICghbm9kZS5jaGlsZHJlbikgew0KICAgICAgbGVhdmVzLnB1c2gobm9kZSk7DQogICAgfQ0KICB9KTsNCiAgcmV0dXJuIGxlYXZlczsNCn07DQoNCnZhciBub2RlX2xpbmtzID0gZnVuY3Rpb24oKSB7DQogIHZhciByb290ID0gdGhpcywgbGlua3MgPSBbXTsNCiAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb27igJl0IGluY2x1ZGUgdGhlIHJvb3TigJlzIHBhcmVudCwgaWYgYW55Lg0KICAgICAgbGlua3MucHVzaCh7c291cmNlOiBub2RlLnBhcmVudCwgdGFyZ2V0OiBub2RlfSk7DQogICAgfQ0KICB9KTsNCiAgcmV0dXJuIGxpbmtzOw0KfTsNCg0KZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7DQogIHZhciByb290ID0gbmV3IE5vZGUoZGF0YSksDQogICAgICB2YWx1ZWQgPSArZGF0YS52YWx1ZSAmJiAocm9vdC52YWx1ZSA9IGRhdGEudmFsdWUpLA0KICAgICAgbm9kZSwNCiAgICAgIG5vZGVzID0gW3Jvb3RdLA0KICAgICAgY2hpbGQsDQogICAgICBjaGlsZHMsDQogICAgICBpLA0KICAgICAgbjsNCg0KICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgY2hpbGRyZW4gPSBkZWZhdWx0Q2hpbGRyZW47DQoNCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgew0KICAgIGlmICh2YWx1ZWQpIG5vZGUudmFsdWUgPSArbm9kZS5kYXRhLnZhbHVlOw0KICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4obm9kZS5kYXRhKSkgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkgew0KICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTsNCiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgew0KICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBOb2RlKGNoaWxkc1tpXSkpOw0KICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOw0KICAgICAgICBjaGlsZC5kZXB0aCA9IG5vZGUuZGVwdGggKyAxOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7DQp9DQoNCmZ1bmN0aW9uIG5vZGVfY29weSgpIHsNCiAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTsNCn0NCg0KZnVuY3Rpb24gZGVmYXVsdENoaWxkcmVuKGQpIHsNCiAgcmV0dXJuIGQuY2hpbGRyZW47DQp9DQoNCmZ1bmN0aW9uIGNvcHlEYXRhKG5vZGUpIHsNCiAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7DQp9DQoNCmZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkgew0KICB2YXIgaGVpZ2h0ID0gMDsNCiAgZG8gbm9kZS5oZWlnaHQgPSBoZWlnaHQ7DQogIHdoaWxlICgobm9kZSA9IG5vZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpOw0KfQ0KDQpmdW5jdGlvbiBOb2RlKGRhdGEpIHsNCiAgdGhpcy5kYXRhID0gZGF0YTsNCiAgdGhpcy5kZXB0aCA9DQogIHRoaXMuaGVpZ2h0ID0gMDsNCiAgdGhpcy5wYXJlbnQgPSBudWxsOw0KfQ0KDQpOb2RlLnByb3RvdHlwZSA9IGhpZXJhcmNoeS5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBOb2RlLA0KICBjb3VudDogbm9kZV9jb3VudCwNCiAgZWFjaDogbm9kZV9lYWNoLA0KICBlYWNoQWZ0ZXI6IG5vZGVfZWFjaEFmdGVyLA0KICBlYWNoQmVmb3JlOiBub2RlX2VhY2hCZWZvcmUsDQogIHN1bTogbm9kZV9zdW0sDQogIHNvcnQ6IG5vZGVfc29ydCwNCiAgcGF0aDogbm9kZV9wYXRoLA0KICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzLA0KICBkZXNjZW5kYW50czogbm9kZV9kZXNjZW5kYW50cywNCiAgbGVhdmVzOiBub2RlX2xlYXZlcywNCiAgbGlua3M6IG5vZGVfbGlua3MsDQogIGNvcHk6IG5vZGVfY29weQ0KfTsNCg0KdmFyIHNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOw0KDQpmdW5jdGlvbiBzaHVmZmxlKGFycmF5KSB7DQogIHZhciBtID0gYXJyYXkubGVuZ3RoLA0KICAgICAgdCwNCiAgICAgIGk7DQoNCiAgd2hpbGUgKG0pIHsNCiAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7DQogICAgdCA9IGFycmF5W21dOw0KICAgIGFycmF5W21dID0gYXJyYXlbaV07DQogICAgYXJyYXlbaV0gPSB0Ow0KICB9DQoNCiAgcmV0dXJuIGFycmF5Ow0KfQ0KDQp2YXIgZW5jbG9zZSA9IGZ1bmN0aW9uKGNpcmNsZXMpIHsNCiAgdmFyIGkgPSAwLCBuID0gKGNpcmNsZXMgPSBzaHVmZmxlKHNsaWNlLmNhbGwoY2lyY2xlcykpKS5sZW5ndGgsIEIgPSBbXSwgcCwgZTsNCg0KICB3aGlsZSAoaSA8IG4pIHsNCiAgICBwID0gY2lyY2xlc1tpXTsNCiAgICBpZiAoZSAmJiBlbmNsb3Nlc1dlYWsoZSwgcCkpICsraTsNCiAgICBlbHNlIGUgPSBlbmNsb3NlQmFzaXMoQiA9IGV4dGVuZEJhc2lzKEIsIHApKSwgaSA9IDA7DQogIH0NCg0KICByZXR1cm4gZTsNCn07DQoNCmZ1bmN0aW9uIGV4dGVuZEJhc2lzKEIsIHApIHsNCiAgdmFyIGksIGo7DQoNCiAgaWYgKGVuY2xvc2VzV2Vha0FsbChwLCBCKSkgcmV0dXJuIFtwXTsNCg0KICAvLyBJZiB3ZSBnZXQgaGVyZSB0aGVuIEIgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBlbGVtZW50Lg0KICBmb3IgKGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgew0KICAgIGlmIChlbmNsb3Nlc05vdChwLCBCW2ldKQ0KICAgICAgICAmJiBlbmNsb3Nlc1dlYWtBbGwoZW5jbG9zZUJhc2lzMihCW2ldLCBwKSwgQikpIHsNCiAgICAgIHJldHVybiBbQltpXSwgcF07DQogICAgfQ0KICB9DQoNCiAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuDQogIGZvciAoaSA9IDA7IGkgPCBCLmxlbmd0aCAtIDE7ICsraSkgew0KICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5ndGg7ICsraikgew0KICAgICAgaWYgKGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgQltqXSksIHApDQogICAgICAgICAgJiYgZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2ldLCBwKSwgQltqXSkNCiAgICAgICAgICAmJiBlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbal0sIHApLCBCW2ldKQ0KICAgICAgICAgICYmIGVuY2xvc2VzV2Vha0FsbChlbmNsb3NlQmFzaXMzKEJbaV0sIEJbal0sIHApLCBCKSkgew0KICAgICAgICByZXR1cm4gW0JbaV0sIEJbal0sIHBdOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuDQogIHRocm93IG5ldyBFcnJvcjsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZXNOb3QoYSwgYikgew0KICB2YXIgZHIgPSBhLnIgLSBiLnIsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsNCiAgcmV0dXJuIGRyIDwgMCB8fCBkciAqIGRyIDwgZHggKiBkeCArIGR5ICogZHk7DQp9DQoNCmZ1bmN0aW9uIGVuY2xvc2VzV2VhayhhLCBiKSB7DQogIHZhciBkciA9IGEuciAtIGIuciArIDFlLTYsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsNCiAgcmV0dXJuIGRyID4gMCAmJiBkciAqIGRyID4gZHggKiBkeCArIGR5ICogZHk7DQp9DQoNCmZ1bmN0aW9uIGVuY2xvc2VzV2Vha0FsbChhLCBCKSB7DQogIGZvciAodmFyIGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgew0KICAgIGlmICghZW5jbG9zZXNXZWFrKGEsIEJbaV0pKSB7DQogICAgICByZXR1cm4gZmFsc2U7DQogICAgfQ0KICB9DQogIHJldHVybiB0cnVlOw0KfQ0KDQpmdW5jdGlvbiBlbmNsb3NlQmFzaXMoQikgew0KICBzd2l0Y2ggKEIubGVuZ3RoKSB7DQogICAgY2FzZSAxOiByZXR1cm4gZW5jbG9zZUJhc2lzMShCWzBdKTsNCiAgICBjYXNlIDI6IHJldHVybiBlbmNsb3NlQmFzaXMyKEJbMF0sIEJbMV0pOw0KICAgIGNhc2UgMzogcmV0dXJuIGVuY2xvc2VCYXNpczMoQlswXSwgQlsxXSwgQlsyXSk7DQogIH0NCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMShhKSB7DQogIHJldHVybiB7DQogICAgeDogYS54LA0KICAgIHk6IGEueSwNCiAgICByOiBhLnINCiAgfTsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMihhLCBiKSB7DQogIHZhciB4MSA9IGEueCwgeTEgPSBhLnksIHIxID0gYS5yLA0KICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwNCiAgICAgIHgyMSA9IHgyIC0geDEsIHkyMSA9IHkyIC0geTEsIHIyMSA9IHIyIC0gcjEsDQogICAgICBsID0gTWF0aC5zcXJ0KHgyMSAqIHgyMSArIHkyMSAqIHkyMSk7DQogIHJldHVybiB7DQogICAgeDogKHgxICsgeDIgKyB4MjEgLyBsICogcjIxKSAvIDIsDQogICAgeTogKHkxICsgeTIgKyB5MjEgLyBsICogcjIxKSAvIDIsDQogICAgcjogKGwgKyByMSArIHIyKSAvIDINCiAgfTsNCn0NCg0KZnVuY3Rpb24gZW5jbG9zZUJhc2lzMyhhLCBiLCBjKSB7DQogIHZhciB4MSA9IGEueCwgeTEgPSBhLnksIHIxID0gYS5yLA0KICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwNCiAgICAgIHgzID0gYy54LCB5MyA9IGMueSwgcjMgPSBjLnIsDQogICAgICBhMiA9IHgxIC0geDIsDQogICAgICBhMyA9IHgxIC0geDMsDQogICAgICBiMiA9IHkxIC0geTIsDQogICAgICBiMyA9IHkxIC0geTMsDQogICAgICBjMiA9IHIyIC0gcjEsDQogICAgICBjMyA9IHIzIC0gcjEsDQogICAgICBkMSA9IHgxICogeDEgKyB5MSAqIHkxIC0gcjEgKiByMSwNCiAgICAgIGQyID0gZDEgLSB4MiAqIHgyIC0geTIgKiB5MiArIHIyICogcjIsDQogICAgICBkMyA9IGQxIC0geDMgKiB4MyAtIHkzICogeTMgKyByMyAqIHIzLA0KICAgICAgYWIgPSBhMyAqIGIyIC0gYTIgKiBiMywNCiAgICAgIHhhID0gKGIyICogZDMgLSBiMyAqIGQyKSAvIChhYiAqIDIpIC0geDEsDQogICAgICB4YiA9IChiMyAqIGMyIC0gYjIgKiBjMykgLyBhYiwNCiAgICAgIHlhID0gKGEzICogZDIgLSBhMiAqIGQzKSAvIChhYiAqIDIpIC0geTEsDQogICAgICB5YiA9IChhMiAqIGMzIC0gYTMgKiBjMikgLyBhYiwNCiAgICAgIEEgPSB4YiAqIHhiICsgeWIgKiB5YiAtIDEsDQogICAgICBCID0gMiAqIChyMSArIHhhICogeGIgKyB5YSAqIHliKSwNCiAgICAgIEMgPSB4YSAqIHhhICsgeWEgKiB5YSAtIHIxICogcjEsDQogICAgICByID0gLShBID8gKEIgKyBNYXRoLnNxcnQoQiAqIEIgLSA0ICogQSAqIEMpKSAvICgyICogQSkgOiBDIC8gQik7DQogIHJldHVybiB7DQogICAgeDogeDEgKyB4YSArIHhiICogciwNCiAgICB5OiB5MSArIHlhICsgeWIgKiByLA0KICAgIHI6IHINCiAgfTsNCn0NCg0KZnVuY3Rpb24gcGxhY2UoYSwgYiwgYykgew0KICB2YXIgYXggPSBhLngsDQogICAgICBheSA9IGEueSwNCiAgICAgIGRhID0gYi5yICsgYy5yLA0KICAgICAgZGIgPSBhLnIgKyBjLnIsDQogICAgICBkeCA9IGIueCAtIGF4LA0KICAgICAgZHkgPSBiLnkgLSBheSwNCiAgICAgIGRjID0gZHggKiBkeCArIGR5ICogZHk7DQogIGlmIChkYykgew0KICAgIHZhciB4ID0gMC41ICsgKChkYiAqPSBkYikgLSAoZGEgKj0gZGEpKSAvICgyICogZGMpLA0KICAgICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIDIgKiBkYSAqIChkYiArIGRjKSAtIChkYiAtPSBkYykgKiBkYiAtIGRhICogZGEpKSAvICgyICogZGMpOw0KICAgIGMueCA9IGF4ICsgeCAqIGR4ICsgeSAqIGR5Ow0KICAgIGMueSA9IGF5ICsgeCAqIGR5IC0geSAqIGR4Ow0KICB9IGVsc2Ugew0KICAgIGMueCA9IGF4ICsgZGI7DQogICAgYy55ID0gYXk7DQogIH0NCn0NCg0KZnVuY3Rpb24gaW50ZXJzZWN0cyhhLCBiKSB7DQogIHZhciBkeCA9IGIueCAtIGEueCwNCiAgICAgIGR5ID0gYi55IC0gYS55LA0KICAgICAgZHIgPSBhLnIgKyBiLnI7DQogIHJldHVybiBkciAqIGRyIC0gMWUtNiA+IGR4ICogZHggKyBkeSAqIGR5Ow0KfQ0KDQpmdW5jdGlvbiBzY29yZShub2RlKSB7DQogIHZhciBhID0gbm9kZS5fLA0KICAgICAgYiA9IG5vZGUubmV4dC5fLA0KICAgICAgYWIgPSBhLnIgKyBiLnIsDQogICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsDQogICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7DQogIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsNCn0NCg0KZnVuY3Rpb24gTm9kZSQxKGNpcmNsZSkgew0KICB0aGlzLl8gPSBjaXJjbGU7DQogIHRoaXMubmV4dCA9IG51bGw7DQogIHRoaXMucHJldmlvdXMgPSBudWxsOw0KfQ0KDQpmdW5jdGlvbiBwYWNrRW5jbG9zZShjaXJjbGVzKSB7DQogIGlmICghKG4gPSBjaXJjbGVzLmxlbmd0aCkpIHJldHVybiAwOw0KDQogIHZhciBhLCBiLCBjLCBuLCBhYSwgY2EsIGksIGosIGssIHNqLCBzazsNCg0KICAvLyBQbGFjZSB0aGUgZmlyc3QgY2lyY2xlLg0KICBhID0gY2lyY2xlc1swXSwgYS54ID0gMCwgYS55ID0gMDsNCiAgaWYgKCEobiA+IDEpKSByZXR1cm4gYS5yOw0KDQogIC8vIFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLg0KICBiID0gY2lyY2xlc1sxXSwgYS54ID0gLWIuciwgYi54ID0gYS5yLCBiLnkgPSAwOw0KICBpZiAoIShuID4gMikpIHJldHVybiBhLnIgKyBiLnI7DQoNCiAgLy8gUGxhY2UgdGhlIHRoaXJkIGNpcmNsZS4NCiAgcGxhY2UoYiwgYSwgYyA9IGNpcmNsZXNbMl0pOw0KDQogIC8vIEluaXRpYWxpemUgdGhlIGZyb250LWNoYWluIHVzaW5nIHRoZSBmaXJzdCB0aHJlZSBjaXJjbGVzIGEsIGIgYW5kIGMuDQogIGEgPSBuZXcgTm9kZSQxKGEpLCBiID0gbmV3IE5vZGUkMShiKSwgYyA9IG5ldyBOb2RlJDEoYyk7DQogIGEubmV4dCA9IGMucHJldmlvdXMgPSBiOw0KICBiLm5leHQgPSBhLnByZXZpb3VzID0gYzsNCiAgYy5uZXh0ID0gYi5wcmV2aW91cyA9IGE7DQoNCiAgLy8gQXR0ZW1wdCB0byBwbGFjZSBlYWNoIHJlbWFpbmluZyBjaXJjbGXigKYNCiAgcGFjazogZm9yIChpID0gMzsgaSA8IG47ICsraSkgew0KICAgIHBsYWNlKGEuXywgYi5fLCBjID0gY2lyY2xlc1tpXSksIGMgPSBuZXcgTm9kZSQxKGMpOw0KDQogICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55Lg0KICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uDQogICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLg0KICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yOw0KICAgIGRvIHsNCiAgICAgIGlmIChzaiA8PSBzaykgew0KICAgICAgICBpZiAoaW50ZXJzZWN0cyhqLl8sIGMuXykpIHsNCiAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTsNCiAgICAgICAgICBjb250aW51ZSBwYWNrOw0KICAgICAgICB9DQogICAgICAgIHNqICs9IGouXy5yLCBqID0gai5uZXh0Ow0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgaWYgKGludGVyc2VjdHMoay5fLCBjLl8pKSB7DQogICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlvdXMgPSBhLCAtLWk7DQogICAgICAgICAgY29udGludWUgcGFjazsNCiAgICAgICAgfQ0KICAgICAgICBzayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7DQogICAgICB9DQogICAgfSB3aGlsZSAoaiAhPT0gay5uZXh0KTsNCg0KICAgIC8vIFN1Y2Nlc3MhIEluc2VydCB0aGUgbmV3IGNpcmNsZSBjIGJldHdlZW4gYSBhbmQgYi4NCiAgICBjLnByZXZpb3VzID0gYSwgYy5uZXh0ID0gYiwgYS5uZXh0ID0gYi5wcmV2aW91cyA9IGIgPSBjOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGNsb3Nlc3QgY2lyY2xlIHBhaXIgdG8gdGhlIGNlbnRyb2lkLg0KICAgIGFhID0gc2NvcmUoYSk7DQogICAgd2hpbGUgKChjID0gYy5uZXh0KSAhPT0gYikgew0KICAgICAgaWYgKChjYSA9IHNjb3JlKGMpKSA8IGFhKSB7DQogICAgICAgIGEgPSBjLCBhYSA9IGNhOw0KICAgICAgfQ0KICAgIH0NCiAgICBiID0gYS5uZXh0Ow0KICB9DQoNCiAgLy8gQ29tcHV0ZSB0aGUgZW5jbG9zaW5nIGNpcmNsZSBvZiB0aGUgZnJvbnQgY2hhaW4uDQogIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTsNCg0KICAvLyBUcmFuc2xhdGUgdGhlIGNpcmNsZXMgdG8gcHV0IHRoZSBlbmNsb3NpbmcgY2lyY2xlIGFyb3VuZCB0aGUgb3JpZ2luLg0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsNCg0KICByZXR1cm4gYy5yOw0KfQ0KDQp2YXIgc2libGluZ3MgPSBmdW5jdGlvbihjaXJjbGVzKSB7DQogIHBhY2tFbmNsb3NlKGNpcmNsZXMpOw0KICByZXR1cm4gY2lyY2xlczsNCn07DQoNCmZ1bmN0aW9uIG9wdGlvbmFsKGYpIHsNCiAgcmV0dXJuIGYgPT0gbnVsbCA/IG51bGwgOiByZXF1aXJlZChmKTsNCn0NCg0KZnVuY3Rpb24gcmVxdWlyZWQoZikgew0KICBpZiAodHlwZW9mIGYgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsNCiAgcmV0dXJuIGY7DQp9DQoNCmZ1bmN0aW9uIGNvbnN0YW50WmVybygpIHsNCiAgcmV0dXJuIDA7DQp9DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyhkKSB7DQogIHJldHVybiBNYXRoLnNxcnQoZC52YWx1ZSk7DQp9DQoNCnZhciBpbmRleCA9IGZ1bmN0aW9uKCkgew0KICB2YXIgcmFkaXVzID0gbnVsbCwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIHBhZGRpbmcgPSBjb25zdGFudFplcm87DQoNCiAgZnVuY3Rpb24gcGFjayhyb290KSB7DQogICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7DQogICAgaWYgKHJhZGl1cykgew0KICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYocmFkaXVzKSkNCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKQ0KICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKDEpKTsNCiAgICB9IGVsc2Ugew0KICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cykpDQogICAgICAgICAgLmVhY2hBZnRlcihwYWNrQ2hpbGRyZW4oY29uc3RhbnRaZXJvLCAxKSkNCiAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCByb290LnIgLyBNYXRoLm1pbihkeCwgZHkpKSkNCiAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZChNYXRoLm1pbihkeCwgZHkpIC8gKDIgKiByb290LnIpKSk7DQogICAgfQ0KICAgIHJldHVybiByb290Ow0KICB9DQoNCiAgcGFjay5yYWRpdXMgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gb3B0aW9uYWwoeCksIHBhY2spIDogcmFkaXVzOw0KICB9Ow0KDQogIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYWNrKSA6IFtkeCwgZHldOw0KICB9Ow0KDQogIHBhY2sucGFkZGluZyA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQoK3gpLCBwYWNrKSA6IHBhZGRpbmc7DQogIH07DQoNCiAgcmV0dXJuIHBhY2s7DQp9Ow0KDQpmdW5jdGlvbiByYWRpdXNMZWFmKHJhZGl1cykgew0KICByZXR1cm4gZnVuY3Rpb24obm9kZSkgew0KICAgIGlmICghbm9kZS5jaGlsZHJlbikgew0KICAgICAgbm9kZS5yID0gTWF0aC5tYXgoMCwgK3JhZGl1cyhub2RlKSB8fCAwKTsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHBhY2tDaGlsZHJlbihwYWRkaW5nLCBrKSB7DQogIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgew0KICAgICAgdmFyIGNoaWxkcmVuLA0KICAgICAgICAgIGksDQogICAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwNCiAgICAgICAgICByID0gcGFkZGluZyhub2RlKSAqIGsgfHwgMCwNCiAgICAgICAgICBlOw0KDQogICAgICBpZiAocikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hpbGRyZW5baV0uciArPSByOw0KICAgICAgZSA9IHBhY2tFbmNsb3NlKGNoaWxkcmVuKTsNCiAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yIC09IHI7DQogICAgICBub2RlLnIgPSBlICsgcjsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHRyYW5zbGF0ZUNoaWxkKGspIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsNCiAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7DQogICAgbm9kZS5yICo9IGs7DQogICAgaWYgKHBhcmVudCkgew0KICAgICAgbm9kZS54ID0gcGFyZW50LnggKyBrICogbm9kZS54Ow0KICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55Ow0KICAgIH0NCiAgfTsNCn0NCg0KdmFyIHJvdW5kTm9kZSA9IGZ1bmN0aW9uKG5vZGUpIHsNCiAgbm9kZS54MCA9IE1hdGgucm91bmQobm9kZS54MCk7DQogIG5vZGUueTAgPSBNYXRoLnJvdW5kKG5vZGUueTApOw0KICBub2RlLngxID0gTWF0aC5yb3VuZChub2RlLngxKTsNCiAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7DQp9Ow0KDQp2YXIgdHJlZW1hcERpY2UgPSBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwNCiAgICAgIG5vZGUsDQogICAgICBpID0gLTEsDQogICAgICBuID0gbm9kZXMubGVuZ3RoLA0KICAgICAgayA9IHBhcmVudC52YWx1ZSAmJiAoeDEgLSB4MCkgLyBwYXJlbnQudmFsdWU7DQoNCiAgd2hpbGUgKCsraSA8IG4pIHsNCiAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxOw0KICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrOw0KICB9DQp9Ow0KDQp2YXIgcGFydGl0aW9uID0gZnVuY3Rpb24oKSB7DQogIHZhciBkeCA9IDEsDQogICAgICBkeSA9IDEsDQogICAgICBwYWRkaW5nID0gMCwNCiAgICAgIHJvdW5kID0gZmFsc2U7DQoNCiAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsNCiAgICB2YXIgbiA9IHJvb3QuaGVpZ2h0ICsgMTsNCiAgICByb290LngwID0NCiAgICByb290LnkwID0gcGFkZGluZzsNCiAgICByb290LngxID0gZHg7DQogICAgcm9vdC55MSA9IGR5IC8gbjsNCiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7DQogICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTsNCiAgICByZXR1cm4gcm9vdDsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShkeSwgbikgew0KICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgICBpZiAobm9kZS5jaGlsZHJlbikgew0KICAgICAgICB0cmVlbWFwRGljZShub2RlLCBub2RlLngwLCBkeSAqIChub2RlLmRlcHRoICsgMSkgLyBuLCBub2RlLngxLCBkeSAqIChub2RlLmRlcHRoICsgMikgLyBuKTsNCiAgICAgIH0NCiAgICAgIHZhciB4MCA9IG5vZGUueDAsDQogICAgICAgICAgeTAgPSBub2RlLnkwLA0KICAgICAgICAgIHgxID0gbm9kZS54MSAtIHBhZGRpbmcsDQogICAgICAgICAgeTEgPSBub2RlLnkxIC0gcGFkZGluZzsNCiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsNCiAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsNCiAgICAgIG5vZGUueDAgPSB4MDsNCiAgICAgIG5vZGUueTAgPSB5MDsNCiAgICAgIG5vZGUueDEgPSB4MTsNCiAgICAgIG5vZGUueTEgPSB5MTsNCiAgICB9Ow0KICB9DQoNCiAgcGFydGl0aW9uLnJvdW5kID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCBwYXJ0aXRpb24pIDogcm91bmQ7DQogIH07DQoNCiAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldOw0KICB9Ow0KDQogIHBhcnRpdGlvbi5wYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSAreCwgcGFydGl0aW9uKSA6IHBhZGRpbmc7DQogIH07DQoNCiAgcmV0dXJuIHBhcnRpdGlvbjsNCn07DQoNCnZhciBrZXlQcmVmaXggPSAiJCI7DQp2YXIgcHJlcm9vdCA9IHtkZXB0aDogLTF9Ow0KdmFyIGFtYmlndW91cyA9IHt9Ow0KDQpmdW5jdGlvbiBkZWZhdWx0SWQoZCkgew0KICByZXR1cm4gZC5pZDsNCn0NCg0KZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkKGQpIHsNCiAgcmV0dXJuIGQucGFyZW50SWQ7DQp9DQoNCnZhciBzdHJhdGlmeSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgaWQgPSBkZWZhdWx0SWQsDQogICAgICBwYXJlbnRJZCA9IGRlZmF1bHRQYXJlbnRJZDsNCg0KICBmdW5jdGlvbiBzdHJhdGlmeShkYXRhKSB7DQogICAgdmFyIGQsDQogICAgICAgIGksDQogICAgICAgIG4gPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgcm9vdCwNCiAgICAgICAgcGFyZW50LA0KICAgICAgICBub2RlLA0KICAgICAgICBub2RlcyA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgbm9kZUlkLA0KICAgICAgICBub2RlS2V5LA0KICAgICAgICBub2RlQnlLZXkgPSB7fTsNCg0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGQgPSBkYXRhW2ldLCBub2RlID0gbm9kZXNbaV0gPSBuZXcgTm9kZShkKTsNCiAgICAgIGlmICgobm9kZUlkID0gaWQoZCwgaSwgZGF0YSkpICE9IG51bGwgJiYgKG5vZGVJZCArPSAiIikpIHsNCiAgICAgICAgbm9kZUtleSA9IGtleVByZWZpeCArIChub2RlLmlkID0gbm9kZUlkKTsNCiAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2RlQnlLZXkgPyBhbWJpZ3VvdXMgOiBub2RlOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7DQogICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0gIiIpKSB7DQogICAgICAgIGlmIChyb290KSB0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7DQogICAgICAgIHJvb3QgPSBub2RlOw0KICAgICAgfSBlbHNlIHsNCiAgICAgICAgcGFyZW50ID0gbm9kZUJ5S2V5W2tleVByZWZpeCArIG5vZGVJZF07DQogICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOw0KICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMpIHRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiICsgbm9kZUlkKTsNCiAgICAgICAgaWYgKHBhcmVudC5jaGlsZHJlbikgcGFyZW50LmNoaWxkcmVuLnB1c2gobm9kZSk7DQogICAgICAgIGVsc2UgcGFyZW50LmNoaWxkcmVuID0gW25vZGVdOw0KICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsNCiAgICAgIH0NCiAgICB9DQoNCiAgICBpZiAoIXJvb3QpIHRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpOw0KICAgIHJvb3QucGFyZW50ID0gcHJlcm9vdDsNCiAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgeyBub2RlLmRlcHRoID0gbm9kZS5wYXJlbnQuZGVwdGggKyAxOyAtLW47IH0pLmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCk7DQogICAgcm9vdC5wYXJlbnQgPSBudWxsOw0KICAgIGlmIChuID4gMCkgdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpOw0KDQogICAgcmV0dXJuIHJvb3Q7DQogIH0NCg0KICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBpZDsNCiAgfTsNCg0KICBzdHJhdGlmeS5wYXJlbnRJZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYXJlbnRJZCA9IHJlcXVpcmVkKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDsNCiAgfTsNCg0KICByZXR1cm4gc3RyYXRpZnk7DQp9Ow0KDQpmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbiQxKGEsIGIpIHsNCiAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOw0KfQ0KDQovLyBmdW5jdGlvbiByYWRpYWxTZXBhcmF0aW9uKGEsIGIpIHsNCi8vICAgcmV0dXJuIChhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMikgLyBhLmRlcHRoOw0KLy8gfQ0KDQovLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGxlZnQgY29udG91ciBvZiBhIHN1YnRyZWUgKG9yDQovLyBzdWJmb3Jlc3QpLiBJdCByZXR1cm5zIHRoZSBzdWNjZXNzb3Igb2YgdiBvbiB0aGlzIGNvbnRvdXIuIFRoaXMgc3VjY2Vzc29yIGlzDQovLyBlaXRoZXIgZ2l2ZW4gYnkgdGhlIGxlZnRtb3N0IGNoaWxkIG9mIHYgb3IgYnkgdGhlIHRocmVhZCBvZiB2LiBUaGUgZnVuY3Rpb24NCi8vIHJldHVybnMgbnVsbCBpZiBhbmQgb25seSBpZiB2IGlzIG9uIHRoZSBoaWdoZXN0IGxldmVsIG9mIGl0cyBzdWJ0cmVlLg0KZnVuY3Rpb24gbmV4dExlZnQodikgew0KICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOw0KICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlblswXSA6IHYudDsNCn0NCg0KLy8gVGhpcyBmdW5jdGlvbiB3b3JrcyBhbmFsb2dvdXNseSB0byBuZXh0TGVmdC4NCmZ1bmN0aW9uIG5leHRSaWdodCh2KSB7DQogIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47DQogIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdIDogdi50Ow0KfQ0KDQovLyBTaGlmdHMgdGhlIGN1cnJlbnQgc3VidHJlZSByb290ZWQgYXQgdysuIFRoaXMgaXMgZG9uZSBieSBpbmNyZWFzaW5nDQovLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0Lg0KZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkgew0KICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpOw0KICB3cC5jIC09IGNoYW5nZTsNCiAgd3AucyArPSBzaGlmdDsNCiAgd20uYyArPSBjaGFuZ2U7DQogIHdwLnogKz0gc2hpZnQ7DQogIHdwLm0gKz0gc2hpZnQ7DQp9DQoNCi8vIEFsbCBvdGhlciBzaGlmdHMsIGFwcGxpZWQgdG8gdGhlIHNtYWxsZXIgc3VidHJlZXMgYmV0d2VlbiB3LSBhbmQgdyssIGFyZQ0KLy8gcGVyZm9ybWVkIGJ5IHRoaXMgZnVuY3Rpb24uIFRvIHByZXBhcmUgdGhlIHNoaWZ0cywgd2UgaGF2ZSB0byBhZGp1c3QNCi8vIGNoYW5nZSh3KyksIHNoaWZ0KHcrKSwgYW5kIGNoYW5nZSh3LSkuDQpmdW5jdGlvbiBleGVjdXRlU2hpZnRzKHYpIHsNCiAgdmFyIHNoaWZ0ID0gMCwNCiAgICAgIGNoYW5nZSA9IDAsDQogICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sDQogICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLA0KICAgICAgdzsNCiAgd2hpbGUgKC0taSA+PSAwKSB7DQogICAgdyA9IGNoaWxkcmVuW2ldOw0KICAgIHcueiArPSBzaGlmdDsNCiAgICB3Lm0gKz0gc2hpZnQ7DQogICAgc2hpZnQgKz0gdy5zICsgKGNoYW5nZSArPSB3LmMpOw0KICB9DQp9DQoNCi8vIElmIHZpLeKAmXMgYW5jZXN0b3IgaXMgYSBzaWJsaW5nIG9mIHYsIHJldHVybnMgdmkt4oCZcyBhbmNlc3Rvci4gT3RoZXJ3aXNlLA0KLy8gcmV0dXJucyB0aGUgc3BlY2lmaWVkIChkZWZhdWx0KSBhbmNlc3Rvci4NCmZ1bmN0aW9uIG5leHRBbmNlc3Rvcih2aW0sIHYsIGFuY2VzdG9yKSB7DQogIHJldHVybiB2aW0uYS5wYXJlbnQgPT09IHYucGFyZW50ID8gdmltLmEgOiBhbmNlc3RvcjsNCn0NCg0KZnVuY3Rpb24gVHJlZU5vZGUobm9kZSwgaSkgew0KICB0aGlzLl8gPSBub2RlOw0KICB0aGlzLnBhcmVudCA9IG51bGw7DQogIHRoaXMuY2hpbGRyZW4gPSBudWxsOw0KICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yDQogIHRoaXMuYSA9IHRoaXM7IC8vIGFuY2VzdG9yDQogIHRoaXMueiA9IDA7IC8vIHByZWxpbQ0KICB0aGlzLm0gPSAwOyAvLyBtb2QNCiAgdGhpcy5jID0gMDsgLy8gY2hhbmdlDQogIHRoaXMucyA9IDA7IC8vIHNoaWZ0DQogIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZA0KICB0aGlzLmkgPSBpOyAvLyBudW1iZXINCn0NCg0KVHJlZU5vZGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShOb2RlLnByb3RvdHlwZSk7DQoNCmZ1bmN0aW9uIHRyZWVSb290KHJvb3QpIHsNCiAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUocm9vdCwgMCksDQogICAgICBub2RlLA0KICAgICAgbm9kZXMgPSBbdHJlZV0sDQogICAgICBjaGlsZCwNCiAgICAgIGNoaWxkcmVuLA0KICAgICAgaSwNCiAgICAgIG47DQoNCiAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgew0KICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuXy5jaGlsZHJlbikgew0KICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuID0gY2hpbGRyZW4ubGVuZ3RoKTsNCiAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgew0KICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBUcmVlTm9kZShjaGlsZHJlbltpXSwgaSkpOw0KICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogICh0cmVlLnBhcmVudCA9IG5ldyBUcmVlTm9kZShudWxsLCAwKSkuY2hpbGRyZW4gPSBbdHJlZV07DQogIHJldHVybiB0cmVlOw0KfQ0KDQovLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0NCnZhciB0cmVlID0gZnVuY3Rpb24oKSB7DQogIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24kMSwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIG5vZGVTaXplID0gbnVsbDsNCg0KICBmdW5jdGlvbiB0cmVlKHJvb3QpIHsNCiAgICB2YXIgdCA9IHRyZWVSb290KHJvb3QpOw0KDQogICAgLy8gQ29tcHV0ZSB0aGUgbGF5b3V0IHVzaW5nIEJ1Y2hoZWltIGV0IGFsLuKAmXMgYWxnb3JpdGhtLg0KICAgIHQuZWFjaEFmdGVyKGZpcnN0V2FsayksIHQucGFyZW50Lm0gPSAtdC56Ow0KICAgIHQuZWFjaEJlZm9yZShzZWNvbmRXYWxrKTsNCg0KICAgIC8vIElmIGEgZml4ZWQgbm9kZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeS4NCiAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7DQoNCiAgICAvLyBJZiBhIGZpeGVkIHRyZWUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkgYmFzZWQgb24gdGhlIGV4dGVudC4NCiAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLg0KICAgIGVsc2Ugew0KICAgICAgdmFyIGxlZnQgPSByb290LA0KICAgICAgICAgIHJpZ2h0ID0gcm9vdCwNCiAgICAgICAgICBib3R0b20gPSByb290Ow0KICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsNCiAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7DQogICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7DQogICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlOw0KICAgICAgfSk7DQogICAgICB2YXIgcyA9IGxlZnQgPT09IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwNCiAgICAgICAgICB0eCA9IHMgLSBsZWZ0LngsDQogICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSwNCiAgICAgICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsNCiAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7DQogICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDsNCiAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5Ow0KICAgICAgfSk7DQogICAgfQ0KDQogICAgcmV0dXJuIHJvb3Q7DQogIH0NCg0KICAvLyBDb21wdXRlcyBhIHByZWxpbWluYXJ5IHgtY29vcmRpbmF0ZSBmb3Igdi4gQmVmb3JlIHRoYXQsIEZJUlNUIFdBTEsgaXMNCiAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb24NCiAgLy8gQVBQT1JUSU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNISUZUUywgdGhlDQogIC8vIG5vZGUgdiBpcyBwbGFjZWQgdG8gdGhlIG1pZHBvaW50IG9mIGl0cyBvdXRlcm1vc3QgY2hpbGRyZW4uDQogIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7DQogICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwNCiAgICAgICAgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbiwNCiAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDsNCiAgICBpZiAoY2hpbGRyZW4pIHsNCiAgICAgIGV4ZWN1dGVTaGlmdHModik7DQogICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsNCiAgICAgIGlmICh3KSB7DQogICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pOw0KICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHYueiA9IG1pZHBvaW50Ow0KICAgICAgfQ0KICAgIH0gZWxzZSBpZiAodykgew0KICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7DQogICAgfQ0KICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7DQogIH0NCg0KICAvLyBDb21wdXRlcyBhbGwgcmVhbCB4LWNvb3JkaW5hdGVzIGJ5IHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyByZWN1cnNpdmVseS4NCiAgZnVuY3Rpb24gc2Vjb25kV2Fsayh2KSB7DQogICAgdi5fLnggPSB2LnogKyB2LnBhcmVudC5tOw0KICAgIHYubSArPSB2LnBhcmVudC5tOw0KICB9DQoNCiAgLy8gVGhlIGNvcmUgb2YgdGhlIGFsZ29yaXRobS4gSGVyZSwgYSBuZXcgc3VidHJlZSBpcyBjb21iaW5lZCB3aXRoIHRoZQ0KICAvLyBwcmV2aW91cyBzdWJ0cmVlcy4gVGhyZWFkcyBhcmUgdXNlZCB0byB0cmF2ZXJzZSB0aGUgaW5zaWRlIGFuZCBvdXRzaWRlDQogIC8vIGNvbnRvdXJzIG9mIHRoZSBsZWZ0IGFuZCByaWdodCBzdWJ0cmVlIHVwIHRvIHRoZSBoaWdoZXN0IGNvbW1vbiBsZXZlbC4gVGhlDQogIC8vIHZlcnRpY2VzIHVzZWQgZm9yIHRoZSB0cmF2ZXJzYWxzIGFyZSB2aSssIHZpLSwgdm8tLCBhbmQgdm8rLCB3aGVyZSB0aGUNCiAgLy8gc3VwZXJzY3JpcHQgbyBtZWFucyBvdXRzaWRlIGFuZCBpIG1lYW5zIGluc2lkZSwgdGhlIHN1YnNjcmlwdCAtIG1lYW5zIGxlZnQNCiAgLy8gc3VidHJlZSBhbmQgKyBtZWFucyByaWdodCBzdWJ0cmVlLiBGb3Igc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIGFsb25nIHRoZQ0KICAvLyBjb250b3VyLCB3ZSB1c2UgcmVzcGVjdGl2ZSB2YXJpYWJsZXMgc2krLCBzaS0sIHNvLSwgYW5kIHNvKy4gV2hlbmV2ZXIgdHdvDQogIC8vIG5vZGVzIG9mIHRoZSBpbnNpZGUgY29udG91cnMgY29uZmxpY3QsIHdlIGNvbXB1dGUgdGhlIGxlZnQgb25lIG9mIHRoZQ0KICAvLyBncmVhdGVzdCB1bmNvbW1vbiBhbmNlc3RvcnMgdXNpbmcgdGhlIGZ1bmN0aW9uIEFOQ0VTVE9SIGFuZCBjYWxsIE1PVkUNCiAgLy8gU1VCVFJFRSB0byBzaGlmdCB0aGUgc3VidHJlZSBhbmQgcHJlcGFyZSB0aGUgc2hpZnRzIG9mIHNtYWxsZXIgc3VidHJlZXMuDQogIC8vIEZpbmFsbHksIHdlIGFkZCBhIG5ldyB0aHJlYWQgKGlmIG5lY2Vzc2FyeSkuDQogIGZ1bmN0aW9uIGFwcG9ydGlvbih2LCB3LCBhbmNlc3Rvcikgew0KICAgIGlmICh3KSB7DQogICAgICB2YXIgdmlwID0gdiwNCiAgICAgICAgICB2b3AgPSB2LA0KICAgICAgICAgIHZpbSA9IHcsDQogICAgICAgICAgdm9tID0gdmlwLnBhcmVudC5jaGlsZHJlblswXSwNCiAgICAgICAgICBzaXAgPSB2aXAubSwNCiAgICAgICAgICBzb3AgPSB2b3AubSwNCiAgICAgICAgICBzaW0gPSB2aW0ubSwNCiAgICAgICAgICBzb20gPSB2b20ubSwNCiAgICAgICAgICBzaGlmdDsNCiAgICAgIHdoaWxlICh2aW0gPSBuZXh0UmlnaHQodmltKSwgdmlwID0gbmV4dExlZnQodmlwKSwgdmltICYmIHZpcCkgew0KICAgICAgICB2b20gPSBuZXh0TGVmdCh2b20pOw0KICAgICAgICB2b3AgPSBuZXh0UmlnaHQodm9wKTsNCiAgICAgICAgdm9wLmEgPSB2Ow0KICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7DQogICAgICAgIGlmIChzaGlmdCA+IDApIHsNCiAgICAgICAgICBtb3ZlU3VidHJlZShuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvciksIHYsIHNoaWZ0KTsNCiAgICAgICAgICBzaXAgKz0gc2hpZnQ7DQogICAgICAgICAgc29wICs9IHNoaWZ0Ow0KICAgICAgICB9DQogICAgICAgIHNpbSArPSB2aW0ubTsNCiAgICAgICAgc2lwICs9IHZpcC5tOw0KICAgICAgICBzb20gKz0gdm9tLm07DQogICAgICAgIHNvcCArPSB2b3AubTsNCiAgICAgIH0NCiAgICAgIGlmICh2aW0gJiYgIW5leHRSaWdodCh2b3ApKSB7DQogICAgICAgIHZvcC50ID0gdmltOw0KICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7DQogICAgICB9DQogICAgICBpZiAodmlwICYmICFuZXh0TGVmdCh2b20pKSB7DQogICAgICAgIHZvbS50ID0gdmlwOw0KICAgICAgICB2b20ubSArPSBzaXAgLSBzb207DQogICAgICAgIGFuY2VzdG9yID0gdjsNCiAgICAgIH0NCiAgICB9DQogICAgcmV0dXJuIGFuY2VzdG9yOw0KICB9DQoNCiAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkgew0KICAgIG5vZGUueCAqPSBkeDsNCiAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7DQogIH0NCg0KICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjsNCiAgfTsNCg0KICB0cmVlLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pOw0KICB9Ow0KDQogIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7DQogIH07DQoNCiAgcmV0dXJuIHRyZWU7DQp9Ow0KDQp2YXIgdHJlZW1hcFNsaWNlID0gZnVuY3Rpb24ocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgew0KICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sDQogICAgICBub2RlLA0KICAgICAgaSA9IC0xLA0KICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlOw0KDQogIHdoaWxlICgrK2kgPCBuKSB7DQogICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLngwID0geDAsIG5vZGUueDEgPSB4MTsNCiAgICBub2RlLnkwID0geTAsIG5vZGUueTEgPSB5MCArPSBub2RlLnZhbHVlICogazsNCiAgfQ0KfTsNCg0KdmFyIHBoaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDI7DQoNCmZ1bmN0aW9uIHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgdmFyIHJvd3MgPSBbXSwNCiAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLA0KICAgICAgcm93LA0KICAgICAgbm9kZVZhbHVlLA0KICAgICAgaTAgPSAwLA0KICAgICAgaTEgPSAwLA0KICAgICAgbiA9IG5vZGVzLmxlbmd0aCwNCiAgICAgIGR4LCBkeSwNCiAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLA0KICAgICAgc3VtVmFsdWUsDQogICAgICBtaW5WYWx1ZSwNCiAgICAgIG1heFZhbHVlLA0KICAgICAgbmV3UmF0aW8sDQogICAgICBtaW5SYXRpbywNCiAgICAgIGFscGhhLA0KICAgICAgYmV0YTsNCg0KICB3aGlsZSAoaTAgPCBuKSB7DQogICAgZHggPSB4MSAtIHgwLCBkeSA9IHkxIC0geTA7DQoNCiAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLg0KICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTsNCiAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7DQogICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTsNCiAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOw0KICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpOw0KDQogICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuDQogICAgZm9yICg7IGkxIDwgbjsgKytpMSkgew0KICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlOw0KICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTsNCiAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7DQogICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOw0KICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7DQogICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9DQogICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvOw0KICAgIH0NCg0KICAgIC8vIFBvc2l0aW9uIGFuZCByZWNvcmQgdGhlIHJvdyBvcmllbnRhdGlvbi4NCiAgICByb3dzLnB1c2gocm93ID0ge3ZhbHVlOiBzdW1WYWx1ZSwgZGljZTogZHggPCBkeSwgY2hpbGRyZW46IG5vZGVzLnNsaWNlKGkwLCBpMSl9KTsNCiAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgdmFsdWUgPyB5MCArPSBkeSAqIHN1bVZhbHVlIC8gdmFsdWUgOiB5MSk7DQogICAgZWxzZSB0cmVlbWFwU2xpY2Uocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTsNCiAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTsNCiAgfQ0KDQogIHJldHVybiByb3dzOw0KfQ0KDQp2YXIgc3F1YXJpZnkgPSAoKGZ1bmN0aW9uIGN1c3RvbShyYXRpbykgew0KDQogIGZ1bmN0aW9uIHNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgICBzcXVhcmlmeVJhdGlvKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsNCiAgfQ0KDQogIHNxdWFyaWZ5LnJhdGlvID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBjdXN0b20oKHggPSAreCkgPiAxID8geCA6IDEpOw0KICB9Ow0KDQogIHJldHVybiBzcXVhcmlmeTsNCn0pKShwaGkpOw0KDQp2YXIgaW5kZXgkMSA9IGZ1bmN0aW9uKCkgew0KICB2YXIgdGlsZSA9IHNxdWFyaWZ5LA0KICAgICAgcm91bmQgPSBmYWxzZSwNCiAgICAgIGR4ID0gMSwNCiAgICAgIGR5ID0gMSwNCiAgICAgIHBhZGRpbmdTdGFjayA9IFswXSwNCiAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybywNCiAgICAgIHBhZGRpbmdUb3AgPSBjb25zdGFudFplcm8sDQogICAgICBwYWRkaW5nUmlnaHQgPSBjb25zdGFudFplcm8sDQogICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvLA0KICAgICAgcGFkZGluZ0xlZnQgPSBjb25zdGFudFplcm87DQoNCiAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7DQogICAgcm9vdC54MCA9DQogICAgcm9vdC55MCA9IDA7DQogICAgcm9vdC54MSA9IGR4Ow0KICAgIHJvb3QueTEgPSBkeTsNCiAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTsNCiAgICBwYWRkaW5nU3RhY2sgPSBbMF07DQogICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTsNCiAgICByZXR1cm4gcm9vdDsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7DQogICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sDQogICAgICAgIHgwID0gbm9kZS54MCArIHAsDQogICAgICAgIHkwID0gbm9kZS55MCArIHAsDQogICAgICAgIHgxID0gbm9kZS54MSAtIHAsDQogICAgICAgIHkxID0gbm9kZS55MSAtIHA7DQogICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOw0KICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsNCiAgICBub2RlLngwID0geDA7DQogICAgbm9kZS55MCA9IHkwOw0KICAgIG5vZGUueDEgPSB4MTsNCiAgICBub2RlLnkxID0geTE7DQogICAgaWYgKG5vZGUuY2hpbGRyZW4pIHsNCiAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjsNCiAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDsNCiAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwOw0KICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDsNCiAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwOw0KICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOw0KICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOw0KICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7DQogICAgfQ0KICB9DQoNCiAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDsNCiAgfTsNCg0KICB0cmVlbWFwLnNpemUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZW1hcCkgOiBbZHgsIGR5XTsNCiAgfTsNCg0KICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nSW5uZXIoeCkucGFkZGluZ091dGVyKHgpIDogdHJlZW1hcC5wYWRkaW5nSW5uZXIoKTsNCiAgfTsNCg0KICB0cmVlbWFwLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOw0KICB9Ow0KDQogIHRyZWVtYXAucGFkZGluZ091dGVyID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJlZW1hcC5wYWRkaW5nVG9wKHgpLnBhZGRpbmdSaWdodCh4KS5wYWRkaW5nQm90dG9tKHgpLnBhZGRpbmdMZWZ0KHgpIDogdHJlZW1hcC5wYWRkaW5nVG9wKCk7DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nVG9wID0gZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdUb3AgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsNCiAgfTsNCg0KICB0cmVlbWFwLnBhZGRpbmdSaWdodCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nUmlnaHQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCgreCksIHRyZWVtYXApIDogcGFkZGluZ1JpZ2h0Ow0KICB9Ow0KDQogIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdCb3R0b207DQogIH07DQoNCiAgdHJlZW1hcC5wYWRkaW5nTGVmdCA9IGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nTGVmdCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDsNCiAgfTsNCg0KICByZXR1cm4gdHJlZW1hcDsNCn07DQoNCnZhciBiaW5hcnkgPSBmdW5jdGlvbihwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwNCiAgICAgIGksIG4gPSBub2Rlcy5sZW5ndGgsDQogICAgICBzdW0sIHN1bXMgPSBuZXcgQXJyYXkobiArIDEpOw0KDQogIGZvciAoc3Vtc1swXSA9IHN1bSA9IGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgc3Vtc1tpICsgMV0gPSBzdW0gKz0gbm9kZXNbaV0udmFsdWU7DQogIH0NCg0KICBwYXJ0aXRpb24oMCwgbiwgcGFyZW50LnZhbHVlLCB4MCwgeTAsIHgxLCB5MSk7DQoNCiAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZhbHVlLCB4MCwgeTAsIHgxLCB5MSkgew0KICAgIGlmIChpID49IGogLSAxKSB7DQogICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOw0KICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7DQogICAgICBub2RlLngxID0geDEsIG5vZGUueTEgPSB5MTsNCiAgICAgIHJldHVybjsNCiAgICB9DQoNCiAgICB2YXIgdmFsdWVPZmZzZXQgPSBzdW1zW2ldLA0KICAgICAgICB2YWx1ZVRhcmdldCA9ICh2YWx1ZSAvIDIpICsgdmFsdWVPZmZzZXQsDQogICAgICAgIGsgPSBpICsgMSwNCiAgICAgICAgaGkgPSBqIC0gMTsNCg0KICAgIHdoaWxlIChrIDwgaGkpIHsNCiAgICAgIHZhciBtaWQgPSBrICsgaGkgPj4+IDE7DQogICAgICBpZiAoc3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxOw0KICAgICAgZWxzZSBoaSA9IG1pZDsNCiAgICB9DQoNCiAgICBpZiAoKHZhbHVlVGFyZ2V0IC0gc3Vtc1trIC0gMV0pIDwgKHN1bXNba10gLSB2YWx1ZVRhcmdldCkgJiYgaSArIDEgPCBrKSAtLWs7DQoNCiAgICB2YXIgdmFsdWVMZWZ0ID0gc3Vtc1trXSAtIHZhbHVlT2Zmc2V0LA0KICAgICAgICB2YWx1ZVJpZ2h0ID0gdmFsdWUgLSB2YWx1ZUxlZnQ7DQoNCiAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7DQogICAgICB2YXIgeGsgPSAoeDAgKiB2YWx1ZVJpZ2h0ICsgeDEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7DQogICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHhrLCB5MSk7DQogICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeGssIHkwLCB4MSwgeTEpOw0KICAgIH0gZWxzZSB7DQogICAgICB2YXIgeWsgPSAoeTAgKiB2YWx1ZVJpZ2h0ICsgeTEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7DQogICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7DQogICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpOw0KICAgIH0NCiAgfQ0KfTsNCg0KdmFyIHNsaWNlRGljZSA9IGZ1bmN0aW9uKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgKHBhcmVudC5kZXB0aCAmIDEgPyB0cmVlbWFwU2xpY2UgOiB0cmVlbWFwRGljZSkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSk7DQp9Ow0KDQp2YXIgcmVzcXVhcmlmeSA9ICgoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7DQoNCiAgZnVuY3Rpb24gcmVzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7DQogICAgaWYgKChyb3dzID0gcGFyZW50Ll9zcXVhcmlmeSkgJiYgKHJvd3MucmF0aW8gPT09IHJhdGlvKSkgew0KICAgICAgdmFyIHJvd3MsDQogICAgICAgICAgcm93LA0KICAgICAgICAgIG5vZGVzLA0KICAgICAgICAgIGksDQogICAgICAgICAgaiA9IC0xLA0KICAgICAgICAgIG4sDQogICAgICAgICAgbSA9IHJvd3MubGVuZ3RoLA0KICAgICAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlOw0KDQogICAgICB3aGlsZSAoKytqIDwgbSkgew0KICAgICAgICByb3cgPSByb3dzW2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsNCiAgICAgICAgZm9yIChpID0gcm93LnZhbHVlID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkgcm93LnZhbHVlICs9IG5vZGVzW2ldLnZhbHVlOw0KICAgICAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgeTAgKz0gKHkxIC0geTApICogcm93LnZhbHVlIC8gdmFsdWUpOw0KICAgICAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkxKTsNCiAgICAgICAgdmFsdWUgLT0gcm93LnZhbHVlOw0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICBwYXJlbnQuX3NxdWFyaWZ5ID0gcm93cyA9IHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOw0KICAgICAgcm93cy5yYXRpbyA9IHJhdGlvOw0KICAgIH0NCiAgfQ0KDQogIHJlc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7DQogICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7DQogIH07DQoNCiAgcmV0dXJuIHJlc3F1YXJpZnk7DQp9KSkocGhpKTsNCg0KZXhwb3J0cy5jbHVzdGVyID0gY2x1c3RlcjsNCmV4cG9ydHMuaGllcmFyY2h5ID0gaGllcmFyY2h5Ow0KZXhwb3J0cy5wYWNrID0gaW5kZXg7DQpleHBvcnRzLnBhY2tTaWJsaW5ncyA9IHNpYmxpbmdzOw0KZXhwb3J0cy5wYWNrRW5jbG9zZSA9IGVuY2xvc2U7DQpleHBvcnRzLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsNCmV4cG9ydHMuc3RyYXRpZnkgPSBzdHJhdGlmeTsNCmV4cG9ydHMudHJlZSA9IHRyZWU7DQpleHBvcnRzLnRyZWVtYXAgPSBpbmRleCQxOw0KZXhwb3J0cy50cmVlbWFwQmluYXJ5ID0gYmluYXJ5Ow0KZXhwb3J0cy50cmVlbWFwRGljZSA9IHRyZWVtYXBEaWNlOw0KZXhwb3J0cy50cmVlbWFwU2xpY2UgPSB0cmVlbWFwU2xpY2U7DQpleHBvcnRzLnRyZWVtYXBTbGljZURpY2UgPSBzbGljZURpY2U7DQpleHBvcnRzLnRyZWVtYXBTcXVhcmlmeSA9IHNxdWFyaWZ5Ow0KZXhwb3J0cy50cmVlbWFwUmVzcXVhcmlmeSA9IHJlc3F1YXJpZnk7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0se31dLDk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1pbnRlcnBvbGF0ZS8gVmVyc2lvbiAxLjEuNS4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ2QzLWNvbG9yJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLWNvbG9yJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzQ29sb3IpIHsgJ3VzZSBzdHJpY3QnOw0KDQpmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsNCiAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxOw0KICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjANCiAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjENCiAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjINCiAgICAgICsgdDMgKiB2MykgLyA2Ow0KfQ0KDQp2YXIgYmFzaXMkMSA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGggLSAxOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHZhciBpID0gdCA8PSAwID8gKHQgPSAwKSA6IHQgPj0gMSA/ICh0ID0gMSwgbiAtIDEpIDogTWF0aC5mbG9vcih0ICogbiksDQogICAgICAgIHYxID0gdmFsdWVzW2ldLA0KICAgICAgICB2MiA9IHZhbHVlc1tpICsgMV0sDQogICAgICAgIHYwID0gaSA+IDAgPyB2YWx1ZXNbaSAtIDFdIDogMiAqIHYxIC0gdjIsDQogICAgICAgIHYzID0gaSA8IG4gLSAxID8gdmFsdWVzW2kgKyAyXSA6IDIgKiB2MiAtIHYxOw0KICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTsNCiAgfTsNCn07DQoNCnZhciBiYXNpc0Nsb3NlZCA9IGZ1bmN0aW9uKHZhbHVlcykgew0KICB2YXIgbiA9IHZhbHVlcy5sZW5ndGg7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgdmFyIGkgPSBNYXRoLmZsb29yKCgodCAlPSAxKSA8IDAgPyArK3QgOiB0KSAqIG4pLA0KICAgICAgICB2MCA9IHZhbHVlc1soaSArIG4gLSAxKSAlIG5dLA0KICAgICAgICB2MSA9IHZhbHVlc1tpICUgbl0sDQogICAgICAgIHYyID0gdmFsdWVzWyhpICsgMSkgJSBuXSwNCiAgICAgICAgdjMgPSB2YWx1ZXNbKGkgKyAyKSAlIG5dOw0KICAgIHJldHVybiBiYXNpcygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTsNCiAgfTsNCn07DQoNCnZhciBjb25zdGFudCA9IGZ1bmN0aW9uKHgpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB4Ow0KICB9Ow0KfTsNCg0KZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gYSArIHQgKiBkOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBleHBvbmVudGlhbChhLCBiLCB5KSB7DQogIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBodWUoYSwgYikgew0KICB2YXIgZCA9IGIgLSBhOw0KICByZXR1cm4gZCA/IGxpbmVhcihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50KGlzTmFOKGEpID8gYiA6IGEpOw0KfQ0KDQpmdW5jdGlvbiBnYW1tYSh5KSB7DQogIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEgOiBmdW5jdGlvbihhLCBiKSB7DQogICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwoYSwgYiwgeSkgOiBjb25zdGFudChpc05hTihhKSA/IGIgOiBhKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7DQogIHZhciBkID0gYiAtIGE7DQogIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQoaXNOYU4oYSkgPyBiIDogYSk7DQp9DQoNCnZhciByZ2IkMSA9ICgoZnVuY3Rpb24gcmdiR2FtbWEoeSkgew0KICB2YXIgY29sb3IkJDEgPSBnYW1tYSh5KTsNCg0KICBmdW5jdGlvbiByZ2IkJDEoc3RhcnQsIGVuZCkgew0KICAgIHZhciByID0gY29sb3IkJDEoKHN0YXJ0ID0gZDNDb2xvci5yZ2Ioc3RhcnQpKS5yLCAoZW5kID0gZDNDb2xvci5yZ2IoZW5kKSkuciksDQogICAgICAgIGcgPSBjb2xvciQkMShzdGFydC5nLCBlbmQuZyksDQogICAgICAgIGIgPSBjb2xvciQkMShzdGFydC5iLCBlbmQuYiksDQogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgICAgc3RhcnQuciA9IHIodCk7DQogICAgICBzdGFydC5nID0gZyh0KTsNCiAgICAgIHN0YXJ0LmIgPSBiKHQpOw0KICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7DQogICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICB9Ow0KICB9DQoNCiAgcmdiJCQxLmdhbW1hID0gcmdiR2FtbWE7DQoNCiAgcmV0dXJuIHJnYiQkMTsNCn0pKSgxKTsNCg0KZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkgew0KICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7DQogICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLA0KICAgICAgICByID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBnID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBiID0gbmV3IEFycmF5KG4pLA0KICAgICAgICBpLCBjb2xvciQkMTsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBjb2xvciQkMSA9IGQzQ29sb3IucmdiKGNvbG9yc1tpXSk7DQogICAgICByW2ldID0gY29sb3IkJDEuciB8fCAwOw0KICAgICAgZ1tpXSA9IGNvbG9yJCQxLmcgfHwgMDsNCiAgICAgIGJbaV0gPSBjb2xvciQkMS5iIHx8IDA7DQogICAgfQ0KICAgIHIgPSBzcGxpbmUocik7DQogICAgZyA9IHNwbGluZShnKTsNCiAgICBiID0gc3BsaW5lKGIpOw0KICAgIGNvbG9yJCQxLm9wYWNpdHkgPSAxOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBjb2xvciQkMS5yID0gcih0KTsNCiAgICAgIGNvbG9yJCQxLmcgPSBnKHQpOw0KICAgICAgY29sb3IkJDEuYiA9IGIodCk7DQogICAgICByZXR1cm4gY29sb3IkJDEgKyAiIjsNCiAgICB9Ow0KICB9Ow0KfQ0KDQp2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7DQp2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpOw0KDQp2YXIgYXJyYXkgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsDQogICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCwNCiAgICAgIHggPSBuZXcgQXJyYXkobmIpLA0KICAgICAgYyA9IG5ldyBBcnJheShuYiksDQogICAgICBpOw0KDQogIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gdmFsdWUoYVtpXSwgYltpXSk7DQogIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9Ow0KDQp2YXIgZGF0ZSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGQgPSBuZXcgRGF0ZTsNCiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIGQuc2V0VGltZShhICsgYiAqIHQpLCBkOw0KICB9Ow0KfTsNCg0KdmFyIG51bWJlciA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIGEgKyBiICogdDsNCiAgfTsNCn07DQoNCnZhciBvYmplY3QgPSBmdW5jdGlvbihhLCBiKSB7DQogIHZhciBpID0ge30sDQogICAgICBjID0ge30sDQogICAgICBrOw0KDQogIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSAib2JqZWN0IikgYSA9IHt9Ow0KICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsNCg0KICBmb3IgKGsgaW4gYikgew0KICAgIGlmIChrIGluIGEpIHsNCiAgICAgIGlba10gPSB2YWx1ZShhW2tdLCBiW2tdKTsNCiAgICB9IGVsc2Ugew0KICAgICAgY1trXSA9IGJba107DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICBmb3IgKGsgaW4gaSkgY1trXSA9IGlba10odCk7DQogICAgcmV0dXJuIGM7DQogIH07DQp9Ow0KDQp2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nOw0KdmFyIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgImciKTsNCg0KZnVuY3Rpb24gemVybyhiKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gYjsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gb25lKGIpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICByZXR1cm4gYih0KSArICIiOw0KICB9Ow0KfQ0KDQp2YXIgc3RyaW5nID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgYmkgPSByZUEubGFzdEluZGV4ID0gcmVCLmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGINCiAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGENCiAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGINCiAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueQ0KICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzDQogICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycw0KICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KDQogIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4NCiAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsNCg0KICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLg0KICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpDQogICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHsNCiAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGINCiAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOw0KICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgICBlbHNlIHNbKytpXSA9IGJzOw0KICAgIH0NCiAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaA0KICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgICBlbHNlIHNbKytpXSA9IGJtOw0KICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzDQogICAgICBzWysraV0gPSBudWxsOw0KICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIoYW0sIGJtKX0pOw0KICAgIH0NCiAgICBiaSA9IHJlQi5sYXN0SW5kZXg7DQogIH0NCg0KICAvLyBBZGQgcmVtYWlucyBvZiBiLg0KICBpZiAoYmkgPCBiLmxlbmd0aCkgew0KICAgIGJzID0gYi5zbGljZShiaSk7DQogICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nDQogICAgZWxzZSBzWysraV0gPSBiczsNCiAgfQ0KDQogIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLg0KICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLg0KICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0NCiAgICAgID8gb25lKHFbMF0ueCkNCiAgICAgIDogemVybyhiKSkNCiAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgew0KICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7DQogICAgICAgIH0pOw0KfTsNCg0KdmFyIHZhbHVlID0gZnVuY3Rpb24oYSwgYikgew0KICB2YXIgdCA9IHR5cGVvZiBiLCBjOw0KICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50KGIpDQogICAgICA6ICh0ID09PSAibnVtYmVyIiA/IG51bWJlcg0KICAgICAgOiB0ID09PSAic3RyaW5nIiA/ICgoYyA9IGQzQ29sb3IuY29sb3IoYikpID8gKGIgPSBjLCByZ2IkMSkgOiBzdHJpbmcpDQogICAgICA6IGIgaW5zdGFuY2VvZiBkM0NvbG9yLmNvbG9yID8gcmdiJDENCiAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlDQogICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBhcnJheQ0KICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0DQogICAgICA6IG51bWJlcikoYSwgYik7DQp9Ow0KDQp2YXIgcm91bmQgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgew0KICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKyBiICogdCk7DQogIH07DQp9Ow0KDQp2YXIgZGVncmVlcyA9IDE4MCAvIE1hdGguUEk7DQoNCnZhciBpZGVudGl0eSA9IHsNCiAgdHJhbnNsYXRlWDogMCwNCiAgdHJhbnNsYXRlWTogMCwNCiAgcm90YXRlOiAwLA0KICBza2V3WDogMCwNCiAgc2NhbGVYOiAxLA0KICBzY2FsZVk6IDENCn07DQoNCnZhciBkZWNvbXBvc2UgPSBmdW5jdGlvbihhLCBiLCBjLCBkLCBlLCBmKSB7DQogIHZhciBzY2FsZVgsIHNjYWxlWSwgc2tld1g7DQogIGlmIChzY2FsZVggPSBNYXRoLnNxcnQoYSAqIGEgKyBiICogYikpIGEgLz0gc2NhbGVYLCBiIC89IHNjYWxlWDsNCiAgaWYgKHNrZXdYID0gYSAqIGMgKyBiICogZCkgYyAtPSBhICogc2tld1gsIGQgLT0gYiAqIHNrZXdYOw0KICBpZiAoc2NhbGVZID0gTWF0aC5zcXJ0KGMgKiBjICsgZCAqIGQpKSBjIC89IHNjYWxlWSwgZCAvPSBzY2FsZVksIHNrZXdYIC89IHNjYWxlWTsNCiAgaWYgKGEgKiBkIDwgYiAqIGMpIGEgPSAtYSwgYiA9IC1iLCBza2V3WCA9IC1za2V3WCwgc2NhbGVYID0gLXNjYWxlWDsNCiAgcmV0dXJuIHsNCiAgICB0cmFuc2xhdGVYOiBlLA0KICAgIHRyYW5zbGF0ZVk6IGYsDQogICAgcm90YXRlOiBNYXRoLmF0YW4yKGIsIGEpICogZGVncmVlcywNCiAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMsDQogICAgc2NhbGVYOiBzY2FsZVgsDQogICAgc2NhbGVZOiBzY2FsZVkNCiAgfTsNCn07DQoNCnZhciBjc3NOb2RlOw0KdmFyIGNzc1Jvb3Q7DQp2YXIgY3NzVmlldzsNCnZhciBzdmdOb2RlOw0KDQpmdW5jdGlvbiBwYXJzZUNzcyh2YWx1ZSkgew0KICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5Ow0KICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3Ow0KICBjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOw0KICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsNCiAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTsNCiAgdmFsdWUgPSB2YWx1ZS5zbGljZSg3LCAtMSkuc3BsaXQoIiwiKTsNCiAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VTdmcodmFsdWUpIHsNCiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTsNCiAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7DQogIHN2Z05vZGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7DQogIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5Ow0KICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDsNCiAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsNCn0NCg0KZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2UsIHB4Q29tbWEsIHB4UGFyZW4sIGRlZ1BhcmVuKSB7DQoNCiAgZnVuY3Rpb24gcG9wKHMpIHsNCiAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7DQogIH0NCg0KICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsNCiAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5Yikgew0KICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsNCiAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBudW1iZXIoeWEsIHliKX0pOw0KICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsNCiAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7DQogICAgaWYgKGEgIT09IGIpIHsNCiAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aA0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBudW1iZXIoYSwgYil9KTsNCiAgICB9IGVsc2UgaWYgKGIpIHsNCiAgICAgIHMucHVzaChwb3AocykgKyAicm90YXRlKCIgKyBiICsgZGVnUGFyZW4pOw0KICAgIH0NCiAgfQ0KDQogIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsNCiAgICBpZiAoYSAhPT0gYikgew0KICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlcihhLCBiKX0pOw0KICAgIH0gZWxzZSBpZiAoYikgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJza2V3WCgiICsgYiArIGRlZ1BhcmVuKTsNCiAgICB9DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgew0KICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7DQogICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOw0KICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlcih5YSwgeWIpfSk7DQogICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgew0KICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMNCiAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycw0KICAgIGEgPSBwYXJzZShhKSwgYiA9IHBhcnNlKGIpOw0KICAgIHRyYW5zbGF0ZShhLnRyYW5zbGF0ZVgsIGEudHJhbnNsYXRlWSwgYi50cmFuc2xhdGVYLCBiLnRyYW5zbGF0ZVksIHMsIHEpOw0KICAgIHJvdGF0ZShhLnJvdGF0ZSwgYi5yb3RhdGUsIHMsIHEpOw0KICAgIHNrZXdYKGEuc2tld1gsIGIuc2tld1gsIHMsIHEpOw0KICAgIHNjYWxlKGEuc2NhbGVYLCBhLnNjYWxlWSwgYi5zY2FsZVgsIGIuc2NhbGVZLCBzLCBxKTsNCiAgICBhID0gYiA9IG51bGw7IC8vIGdjDQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgIHZhciBpID0gLTEsIG4gPSBxLmxlbmd0aCwgbzsNCiAgICAgIHdoaWxlICgrK2kgPCBuKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7DQogICAgICByZXR1cm4gcy5qb2luKCIiKTsNCiAgICB9Ow0KICB9Ow0KfQ0KDQp2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcywgInB4LCAiLCAicHgpIiwgImRlZykiKTsNCnZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA9IGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlU3ZnLCAiLCAiLCAiKSIsICIpIik7DQoNCnZhciByaG8gPSBNYXRoLlNRUlQyOw0KdmFyIHJobzIgPSAyOw0KdmFyIHJobzQgPSA0Ow0KdmFyIGVwc2lsb24yID0gMWUtMTI7DQoNCmZ1bmN0aW9uIGNvc2goeCkgew0KICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsNCn0NCg0KZnVuY3Rpb24gc2luaCh4KSB7DQogIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyOw0KfQ0KDQpmdW5jdGlvbiB0YW5oKHgpIHsNCiAgcmV0dXJuICgoeCA9IE1hdGguZXhwKDIgKiB4KSkgLSAxKSAvICh4ICsgMSk7DQp9DQoNCi8vIHAwID0gW3V4MCwgdXkwLCB3MF0NCi8vIHAxID0gW3V4MSwgdXkxLCB3MV0NCnZhciB6b29tID0gZnVuY3Rpb24ocDAsIHAxKSB7DQogIHZhciB1eDAgPSBwMFswXSwgdXkwID0gcDBbMV0sIHcwID0gcDBbMl0sDQogICAgICB1eDEgPSBwMVswXSwgdXkxID0gcDFbMV0sIHcxID0gcDFbMl0sDQogICAgICBkeCA9IHV4MSAtIHV4MCwNCiAgICAgIGR5ID0gdXkxIC0gdXkwLA0KICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwNCiAgICAgIGksDQogICAgICBTOw0KDQogIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLg0KICBpZiAoZDIgPCBlcHNpbG9uMikgew0KICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgcmV0dXJuIFsNCiAgICAgICAgdXgwICsgdCAqIGR4LA0KICAgICAgICB1eTAgKyB0ICogZHksDQogICAgICAgIHcwICogTWF0aC5leHAocmhvICogdCAqIFMpDQogICAgICBdOw0KICAgIH07DQogIH0NCg0KICAvLyBHZW5lcmFsIGNhc2UuDQogIGVsc2Ugew0KICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksDQogICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLA0KICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwNCiAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLA0KICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7DQogICAgUyA9IChyMSAtIHIwKSAvIHJobzsNCiAgICBpID0gZnVuY3Rpb24odCkgew0KICAgICAgdmFyIHMgPSB0ICogUywNCiAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwNCiAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7DQogICAgICByZXR1cm4gWw0KICAgICAgICB1eDAgKyB1ICogZHgsDQogICAgICAgIHV5MCArIHUgKiBkeSwNCiAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMCkNCiAgICAgIF07DQogICAgfTsNCiAgfQ0KDQogIGkuZHVyYXRpb24gPSBTICogMTAwMDsNCg0KICByZXR1cm4gaTsNCn07DQoNCmZ1bmN0aW9uIGhzbCQxKGh1ZSQkMSkgew0KICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuaHNsKHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuaHNsKGVuZCkpLmgpLA0KICAgICAgICBzID0gbm9nYW1tYShzdGFydC5zLCBlbmQucyksDQogICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwNCiAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgICBzdGFydC5oID0gaCh0KTsNCiAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgc3RhcnQubCA9IGwodCk7DQogICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsNCiAgICAgIHJldHVybiBzdGFydCArICIiOw0KICAgIH07DQogIH0NCn0NCg0KdmFyIGhzbCQyID0gaHNsJDEoaHVlKTsNCnZhciBoc2xMb25nID0gaHNsJDEobm9nYW1tYSk7DQoNCmZ1bmN0aW9uIGxhYiQxKHN0YXJ0LCBlbmQpIHsNCiAgdmFyIGwgPSBub2dhbW1hKChzdGFydCA9IGQzQ29sb3IubGFiKHN0YXJ0KSkubCwgKGVuZCA9IGQzQ29sb3IubGFiKGVuZCkpLmwpLA0KICAgICAgYSA9IG5vZ2FtbWEoc3RhcnQuYSwgZW5kLmEpLA0KICAgICAgYiA9IG5vZ2FtbWEoc3RhcnQuYiwgZW5kLmIpLA0KICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgIHN0YXJ0LmEgPSBhKHQpOw0KICAgIHN0YXJ0LmIgPSBiKHQpOw0KICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgIHJldHVybiBzdGFydCArICIiOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBoY2wkMShodWUkJDEpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICB2YXIgaCA9IGh1ZSQkMSgoc3RhcnQgPSBkM0NvbG9yLmhjbChzdGFydCkpLmgsIChlbmQgPSBkM0NvbG9yLmhjbChlbmQpKS5oKSwNCiAgICAgICAgYyA9IG5vZ2FtbWEoc3RhcnQuYywgZW5kLmMpLA0KICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgew0KICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICBzdGFydC5jID0gYyh0KTsNCiAgICAgIHN0YXJ0LmwgPSBsKHQpOw0KICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7DQogICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICB9Ow0KICB9DQp9DQoNCnZhciBoY2wkMiA9IGhjbCQxKGh1ZSk7DQp2YXIgaGNsTG9uZyA9IGhjbCQxKG5vZ2FtbWEpOw0KDQpmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUkJDEpIHsNCiAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7DQogICAgeSA9ICt5Ow0KDQogICAgZnVuY3Rpb24gY3ViZWhlbGl4JCQxKHN0YXJ0LCBlbmQpIHsNCiAgICAgIHZhciBoID0gaHVlJCQxKChzdGFydCA9IGQzQ29sb3IuY3ViZWhlbGl4KHN0YXJ0KSkuaCwgKGVuZCA9IGQzQ29sb3IuY3ViZWhlbGl4KGVuZCkpLmgpLA0KICAgICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwNCiAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksDQogICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOw0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsNCiAgICAgICAgc3RhcnQuaCA9IGgodCk7DQogICAgICAgIHN0YXJ0LnMgPSBzKHQpOw0KICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7DQogICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOw0KICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsNCiAgICAgIH07DQogICAgfQ0KDQogICAgY3ViZWhlbGl4JCQxLmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7DQoNCiAgICByZXR1cm4gY3ViZWhlbGl4JCQxOw0KICB9KSgxKTsNCn0NCg0KdmFyIGN1YmVoZWxpeCQyID0gY3ViZWhlbGl4JDEoaHVlKTsNCnZhciBjdWJlaGVsaXhMb25nID0gY3ViZWhlbGl4JDEobm9nYW1tYSk7DQoNCnZhciBxdWFudGl6ZSA9IGZ1bmN0aW9uKGludGVycG9sYXRvciwgbikgew0KICB2YXIgc2FtcGxlcyA9IG5ldyBBcnJheShuKTsNCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHNhbXBsZXNbaV0gPSBpbnRlcnBvbGF0b3IoaSAvIChuIC0gMSkpOw0KICByZXR1cm4gc2FtcGxlczsNCn07DQoNCmV4cG9ydHMuaW50ZXJwb2xhdGUgPSB2YWx1ZTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVBcnJheSA9IGFycmF5Ow0KZXhwb3J0cy5pbnRlcnBvbGF0ZUJhc2lzID0gYmFzaXMkMTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZCA9IGJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZURhdGUgPSBkYXRlOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZU51bWJlciA9IG51bWJlcjsNCmV4cG9ydHMuaW50ZXJwb2xhdGVPYmplY3QgPSBvYmplY3Q7DQpleHBvcnRzLmludGVycG9sYXRlUm91bmQgPSByb3VuZDsNCmV4cG9ydHMuaW50ZXJwb2xhdGVTdHJpbmcgPSBzdHJpbmc7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M7DQpleHBvcnRzLmludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc7DQpleHBvcnRzLmludGVycG9sYXRlWm9vbSA9IHpvb207DQpleHBvcnRzLmludGVycG9sYXRlUmdiID0gcmdiJDE7DQpleHBvcnRzLmludGVycG9sYXRlUmdiQmFzaXMgPSByZ2JCYXNpczsNCmV4cG9ydHMuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZCA9IHJnYkJhc2lzQ2xvc2VkOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbCA9IGhzbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhzbExvbmcgPSBoc2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUxhYiA9IGxhYiQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbCA9IGhjbCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUhjbExvbmcgPSBoY2xMb25nOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeCA9IGN1YmVoZWxpeCQyOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmcgPSBjdWJlaGVsaXhMb25nOw0KZXhwb3J0cy5xdWFudGl6ZSA9IHF1YW50aXplOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtY29sb3IiOjR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXBhdGgvIFZlcnNpb24gMS4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHBpID0gTWF0aC5QSTsNCnZhciB0YXUgPSAyICogcGk7DQp2YXIgZXBzaWxvbiA9IDFlLTY7DQp2YXIgdGF1RXBzaWxvbiA9IHRhdSAtIGVwc2lsb247DQoNCmZ1bmN0aW9uIFBhdGgoKSB7DQogIHRoaXMuX3gwID0gdGhpcy5feTAgPSAvLyBzdGFydCBvZiBjdXJyZW50IHN1YnBhdGgNCiAgdGhpcy5feDEgPSB0aGlzLl95MSA9IG51bGw7IC8vIGVuZCBvZiBjdXJyZW50IHN1YnBhdGgNCiAgdGhpcy5fID0gIiI7DQp9DQoNCmZ1bmN0aW9uIHBhdGgoKSB7DQogIHJldHVybiBuZXcgUGF0aDsNCn0NCg0KUGF0aC5wcm90b3R5cGUgPSBwYXRoLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFBhdGgsDQogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgew0KICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpOw0KICB9LA0KICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl94MSAhPT0gbnVsbCkgew0KICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDsNCiAgICAgIHRoaXMuXyArPSAiWiI7DQogICAgfQ0KICB9LA0KICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOw0KICB9LA0KICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIlEiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsNCiAgfSwNCiAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsNCiAgICB0aGlzLl8gKz0gIkMiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICgreDIpICsgIiwiICsgKCt5MikgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7DQogIH0sDQogIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5Miwgcikgew0KICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7DQogICAgdmFyIHgwID0gdGhpcy5feDEsDQogICAgICAgIHkwID0gdGhpcy5feTEsDQogICAgICAgIHgyMSA9IHgyIC0geDEsDQogICAgICAgIHkyMSA9IHkyIC0geTEsDQogICAgICAgIHgwMSA9IHgwIC0geDEsDQogICAgICAgIHkwMSA9IHkwIC0geTEsDQogICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxOw0KDQogICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuDQogICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOw0KDQogICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuDQogICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7DQogICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOw0KICAgIH0NCg0KICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLg0KICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uKSkge30NCg0KICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/DQogICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPw0KICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4NCiAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uKSB8fCAhcikgew0KICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9IHgxKSArICIsIiArICh0aGlzLl95MSA9IHkxKTsNCiAgICB9DQoNCiAgICAvLyBPdGhlcndpc2UsIGRyYXcgYW4gYXJjIQ0KICAgIGVsc2Ugew0KICAgICAgdmFyIHgyMCA9IHgyIC0geDAsDQogICAgICAgICAgeTIwID0geTIgLSB5MCwNCiAgICAgICAgICBsMjFfMiA9IHgyMSAqIHgyMSArIHkyMSAqIHkyMSwNCiAgICAgICAgICBsMjBfMiA9IHgyMCAqIHgyMCArIHkyMCAqIHkyMCwNCiAgICAgICAgICBsMjEgPSBNYXRoLnNxcnQobDIxXzIpLA0KICAgICAgICAgIGwwMSA9IE1hdGguc3FydChsMDFfMiksDQogICAgICAgICAgbCA9IHIgKiBNYXRoLnRhbigocGkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLA0KICAgICAgICAgIHQwMSA9IGwgLyBsMDEsDQogICAgICAgICAgdDIxID0gbCAvIGwyMTsNCg0KICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLg0KICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbikgew0KICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHgxICsgdDAxICogeDAxKSArICIsIiArICh5MSArIHQwMSAqIHkwMSk7DQogICAgICB9DQoNCiAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIsIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTsNCiAgICB9DQogIH0sDQogIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsNCiAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyOw0KICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksDQogICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSwNCiAgICAgICAgeDAgPSB4ICsgZHgsDQogICAgICAgIHkwID0geSArIGR5LA0KICAgICAgICBjdyA9IDEgXiBjY3csDQogICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7DQoNCiAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4NCiAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiICsgcik7DQoNCiAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS4NCiAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsNCiAgICAgIHRoaXMuXyArPSAiTSIgKyB4MCArICIsIiArIHkwOw0KICAgIH0NCg0KICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuDQogICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uIHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbikgew0KICAgICAgdGhpcy5fICs9ICJMIiArIHgwICsgIiwiICsgeTA7DQogICAgfQ0KDQogICAgLy8gSXMgdGhpcyBhcmMgZW1wdHk/IFdl4oCZcmUgZG9uZS4NCiAgICBpZiAoIXIpIHJldHVybjsNCg0KICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi4NCiAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1ICsgdGF1Ow0KDQogICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLg0KICAgIGlmIChkYSA+IHRhdUVwc2lsb24pIHsNCiAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh4IC0gZHgpICsgIiwiICsgKHkgLSBkeSkgKyAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHgwKSArICIsIiArICh0aGlzLl95MSA9IHkwKTsNCiAgICB9DQoNCiAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQ0KICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbikgew0KICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhkYSA+PSBwaSkpICsgIiwiICsgY3cgKyAiLCIgKyAodGhpcy5feDEgPSB4ICsgciAqIE1hdGguY29zKGExKSkgKyAiLCIgKyAodGhpcy5feTEgPSB5ICsgciAqIE1hdGguc2luKGExKSk7DQogICAgfQ0KICB9LA0KICByZWN0OiBmdW5jdGlvbih4LCB5LCB3LCBoKSB7DQogICAgdGhpcy5fICs9ICJNIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSkgKyAiaCIgKyAoK3cpICsgInYiICsgKCtoKSArICJoIiArICgtdykgKyAiWiI7DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5fOw0KICB9DQp9Ow0KDQpleHBvcnRzLnBhdGggPSBwYXRoOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSwxMTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXNjYWxlLyBWZXJzaW9uIDEuMC42LiBDb3B5cmlnaHQgMjAxNyBNaWtlIEJvc3RvY2suDQooZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkgew0KCXR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cywgcmVxdWlyZSgnZDMtYXJyYXknKSwgcmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy1pbnRlcnBvbGF0ZScpLCByZXF1aXJlKCdkMy1mb3JtYXQnKSwgcmVxdWlyZSgnZDMtdGltZScpLCByZXF1aXJlKCdkMy10aW1lLWZvcm1hdCcpLCByZXF1aXJlKCdkMy1jb2xvcicpKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1hcnJheScsICdkMy1jb2xsZWN0aW9uJywgJ2QzLWludGVycG9sYXRlJywgJ2QzLWZvcm1hdCcsICdkMy10aW1lJywgJ2QzLXRpbWUtZm9ybWF0JywgJ2QzLWNvbG9yJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzQXJyYXksZDNDb2xsZWN0aW9uLGQzSW50ZXJwb2xhdGUsZDNGb3JtYXQsZDNUaW1lLGQzVGltZUZvcm1hdCxkM0NvbG9yKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOw0KDQp2YXIgbWFwJDEgPSBhcnJheS5tYXA7DQp2YXIgc2xpY2UgPSBhcnJheS5zbGljZTsNCg0KdmFyIGltcGxpY2l0ID0ge25hbWU6ICJpbXBsaWNpdCJ9Ow0KDQpmdW5jdGlvbiBvcmRpbmFsKHJhbmdlJCQxKSB7DQogIHZhciBpbmRleCA9IGQzQ29sbGVjdGlvbi5tYXAoKSwNCiAgICAgIGRvbWFpbiA9IFtdLA0KICAgICAgdW5rbm93biA9IGltcGxpY2l0Ow0KDQogIHJhbmdlJCQxID0gcmFuZ2UkJDEgPT0gbnVsbCA/IFtdIDogc2xpY2UuY2FsbChyYW5nZSQkMSk7DQoNCiAgZnVuY3Rpb24gc2NhbGUoZCkgew0KICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsNCiAgICBpZiAoIWkpIHsNCiAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247DQogICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOw0KICAgIH0NCiAgICByZXR1cm4gcmFuZ2UkJDFbKGkgLSAxKSAlIHJhbmdlJCQxLmxlbmd0aF07DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7DQogICAgZG9tYWluID0gW10sIGluZGV4ID0gZDNDb2xsZWN0aW9uLm1hcCgpOw0KICAgIHZhciBpID0gLTEsIG4gPSBfLmxlbmd0aCwgZCwga2V5Ow0KICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWluZGV4LmhhcyhrZXkgPSAoZCA9IF9baV0pICsgIiIpKSBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaChkKSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOw0KICB9Ow0KDQogIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gb3JkaW5hbCgpDQogICAgICAgIC5kb21haW4oZG9tYWluKQ0KICAgICAgICAucmFuZ2UocmFuZ2UkJDEpDQogICAgICAgIC51bmtub3duKHVua25vd24pOw0KICB9Ow0KDQogIHJldHVybiBzY2FsZTsNCn0NCg0KZnVuY3Rpb24gYmFuZCgpIHsNCiAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwNCiAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbiwNCiAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLA0KICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sDQogICAgICBzdGVwLA0KICAgICAgYmFuZHdpZHRoLA0KICAgICAgcm91bmQgPSBmYWxzZSwNCiAgICAgIHBhZGRpbmdJbm5lciA9IDAsDQogICAgICBwYWRkaW5nT3V0ZXIgPSAwLA0KICAgICAgYWxpZ24gPSAwLjU7DQoNCiAgZGVsZXRlIHNjYWxlLnVua25vd247DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCwNCiAgICAgICAgcmV2ZXJzZSA9IHJhbmdlJCQxWzFdIDwgcmFuZ2UkJDFbMF0sDQogICAgICAgIHN0YXJ0ID0gcmFuZ2UkJDFbcmV2ZXJzZSAtIDBdLA0KICAgICAgICBzdG9wID0gcmFuZ2UkJDFbMSAtIHJldmVyc2VdOw0KICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsNCiAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOw0KICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduOw0KICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7DQogICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7DQogICAgdmFyIHZhbHVlcyA9IGQzQXJyYXkucmFuZ2UobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOw0KICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJlc2NhbGUoKSkgOiByYW5nZSQkMS5zbGljZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIHJhbmdlJCQxID0gWytfWzBdLCArX1sxXV0sIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLmJhbmR3aWR0aCA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBiYW5kd2lkdGg7DQogIH07DQoNCiAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBzdGVwOw0KICB9Ow0KDQogIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7DQogIH07DQoNCiAgc2NhbGUucGFkZGluZyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBwYWRkaW5nT3V0ZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7DQogIH07DQoNCiAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsNCiAgfTsNCg0KICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyOw0KICB9Ow0KDQogIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFsaWduID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogYWxpZ247DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBiYW5kKCkNCiAgICAgICAgLmRvbWFpbihkb21haW4oKSkNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKQ0KICAgICAgICAucm91bmQocm91bmQpDQogICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKQ0KICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcikNCiAgICAgICAgLmFsaWduKGFsaWduKTsNCiAgfTsNCg0KICByZXR1cm4gcmVzY2FsZSgpOw0KfQ0KDQpmdW5jdGlvbiBwb2ludGlzaChzY2FsZSkgew0KICB2YXIgY29weSA9IHNjYWxlLmNvcHk7DQoNCiAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjsNCiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjsNCiAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7DQogIH07DQoNCiAgcmV0dXJuIHNjYWxlOw0KfQ0KDQpmdW5jdGlvbiBwb2ludCgpIHsNCiAgcmV0dXJuIHBvaW50aXNoKGJhbmQoKS5wYWRkaW5nSW5uZXIoMSkpOw0KfQ0KDQp2YXIgY29uc3RhbnQgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4geDsNCiAgfTsNCn07DQoNCnZhciBudW1iZXIgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiAreDsNCn07DQoNCnZhciB1bml0ID0gWzAsIDFdOw0KDQpmdW5jdGlvbiBkZWludGVycG9sYXRlTGluZWFyKGEsIGIpIHsNCiAgcmV0dXJuIChiIC09IChhID0gK2EpKQ0KICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIGEpIC8gYjsgfQ0KICAgICAgOiBjb25zdGFudChiKTsNCn0NCg0KZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZUNsYW1wKGRlaW50ZXJwb2xhdGUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsNCiAgICB2YXIgZCA9IGRlaW50ZXJwb2xhdGUoYSA9ICthLCBiID0gK2IpOw0KICAgIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiB4IDw9IGEgPyAwIDogeCA+PSBiID8gMSA6IGQoeCk7IH07DQogIH07DQp9DQoNCmZ1bmN0aW9uIHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSB7DQogIHJldHVybiBmdW5jdGlvbihhLCBiKSB7DQogICAgdmFyIHIgPSByZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsNCiAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gdCA8PSAwID8gYSA6IHQgPj0gMSA/IGIgOiByKHQpOyB9Ow0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlJCQxLCBkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSB7DQogIHZhciBkMCA9IGRvbWFpblswXSwgZDEgPSBkb21haW5bMV0sIHIwID0gcmFuZ2UkJDFbMF0sIHIxID0gcmFuZ2UkJDFbMV07DQogIGlmIChkMSA8IGQwKSBkMCA9IGRlaW50ZXJwb2xhdGUoZDEsIGQwKSwgcjAgPSByZWludGVycG9sYXRlKHIxLCByMCk7DQogIGVsc2UgZDAgPSBkZWludGVycG9sYXRlKGQwLCBkMSksIHIwID0gcmVpbnRlcnBvbGF0ZShyMCwgcjEpOw0KICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UkJDEsIGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsNCiAgdmFyIGogPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpIC0gMSwNCiAgICAgIGQgPSBuZXcgQXJyYXkoaiksDQogICAgICByID0gbmV3IEFycmF5KGopLA0KICAgICAgaSA9IC0xOw0KDQogIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLg0KICBpZiAoZG9tYWluW2pdIDwgZG9tYWluWzBdKSB7DQogICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOw0KICAgIHJhbmdlJCQxID0gcmFuZ2UkJDEuc2xpY2UoKS5yZXZlcnNlKCk7DQogIH0NCg0KICB3aGlsZSAoKytpIDwgaikgew0KICAgIGRbaV0gPSBkZWludGVycG9sYXRlKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7DQogICAgcltpXSA9IHJlaW50ZXJwb2xhdGUocmFuZ2UkJDFbaV0sIHJhbmdlJCQxW2kgKyAxXSk7DQogIH0NCg0KICByZXR1cm4gZnVuY3Rpb24oeCkgew0KICAgIHZhciBpID0gZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAxLCBqKSAtIDE7DQogICAgcmV0dXJuIHJbaV0oZFtpXSh4KSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHsNCiAgcmV0dXJuIHRhcmdldA0KICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpDQogICAgICAucmFuZ2Uoc291cmNlLnJhbmdlKCkpDQogICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpDQogICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpOw0KfQ0KDQovLyBkZWludGVycG9sYXRlKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uDQovLyByZWludGVycG9sYXRlKGEsIGIpKHQpIHRha2VzIGEgcGFyYW1ldGVyIHQgaW4gWzAsMV0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0uDQpmdW5jdGlvbiBjb250aW51b3VzKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsNCiAgdmFyIGRvbWFpbiA9IHVuaXQsDQogICAgICByYW5nZSQkMSA9IHVuaXQsDQogICAgICBpbnRlcnBvbGF0ZSQkMSA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGUsDQogICAgICBjbGFtcCA9IGZhbHNlLA0KICAgICAgcGllY2V3aXNlLA0KICAgICAgb3V0cHV0LA0KICAgICAgaW5wdXQ7DQoNCiAgZnVuY3Rpb24gcmVzY2FsZSgpIHsNCiAgICBwaWVjZXdpc2UgPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGgpID4gMiA/IHBvbHltYXAgOiBiaW1hcDsNCiAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiAob3V0cHV0IHx8IChvdXRwdXQgPSBwaWVjZXdpc2UoZG9tYWluLCByYW5nZSQkMSwgY2xhbXAgPyBkZWludGVycG9sYXRlQ2xhbXAoZGVpbnRlcnBvbGF0ZSkgOiBkZWludGVycG9sYXRlLCBpbnRlcnBvbGF0ZSQkMSkpKSgreCk7DQogIH0NCg0KICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7DQogICAgcmV0dXJuIChpbnB1dCB8fCAoaW5wdXQgPSBwaWVjZXdpc2UocmFuZ2UkJDEsIGRvbWFpbiwgZGVpbnRlcnBvbGF0ZUxpbmVhciwgY2xhbXAgPyByZWludGVycG9sYXRlQ2xhbXAocmVpbnRlcnBvbGF0ZSkgOiByZWludGVycG9sYXRlKSkpKCt5KTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDEuY2FsbChfLCBudW1iZXIpLCByZXNjYWxlKCkpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2UkJDEuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZVJvdW5kID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiByYW5nZSQkMSA9IHNsaWNlLmNhbGwoXyksIGludGVycG9sYXRlJCQxID0gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVJvdW5kLCByZXNjYWxlKCk7DQogIH07DQoNCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHJlc2NhbGUoKSkgOiBjbGFtcDsNCiAgfTsNCg0KICBzY2FsZS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSQkMSA9IF8sIHJlc2NhbGUoKSkgOiBpbnRlcnBvbGF0ZSQkMTsNCiAgfTsNCg0KICByZXR1cm4gcmVzY2FsZSgpOw0KfQ0KDQp2YXIgdGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGRvbWFpbiwgY291bnQsIHNwZWNpZmllcikgew0KICB2YXIgc3RhcnQgPSBkb21haW5bMF0sDQogICAgICBzdG9wID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSwNCiAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCksDQogICAgICBwcmVjaXNpb247DQogIHNwZWNpZmllciA9IGQzRm9ybWF0LmZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/ICIsZiIgOiBzcGVjaWZpZXIpOw0KICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7DQogICAgY2FzZSAicyI6IHsNCiAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpOw0KICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gZDNGb3JtYXQucHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247DQogICAgICByZXR1cm4gZDNGb3JtYXQuZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpOw0KICAgIH0NCiAgICBjYXNlICIiOg0KICAgIGNhc2UgImUiOg0KICAgIGNhc2UgImciOg0KICAgIGNhc2UgInAiOg0KICAgIGNhc2UgInIiOiB7DQogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25Sb3VuZChzdGVwLCBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSAiZSIpOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICAgIGNhc2UgImYiOg0KICAgIGNhc2UgIiUiOiB7DQogICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBkM0Zvcm1hdC5wcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICIlIikgKiAyOw0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQogIHJldHVybiBkM0Zvcm1hdC5mb3JtYXQoc3BlY2lmaWVyKTsNCn07DQoNCmZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkgew0KICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluOw0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpOw0KICAgIHJldHVybiBkM0FycmF5LnRpY2tzKGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7DQogICAgcmV0dXJuIHRpY2tGb3JtYXQoZG9tYWluKCksIGNvdW50LCBzcGVjaWZpZXIpOw0KICB9Ow0KDQogIHNjYWxlLm5pY2UgPSBmdW5jdGlvbihjb3VudCkgew0KICAgIGlmIChjb3VudCA9PSBudWxsKSBjb3VudCA9IDEwOw0KDQogICAgdmFyIGQgPSBkb21haW4oKSwNCiAgICAgICAgaTAgPSAwLA0KICAgICAgICBpMSA9IGQubGVuZ3RoIC0gMSwNCiAgICAgICAgc3RhcnQgPSBkW2kwXSwNCiAgICAgICAgc3RvcCA9IGRbaTFdLA0KICAgICAgICBzdGVwOw0KDQogICAgaWYgKHN0b3AgPCBzdGFydCkgew0KICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwOw0KICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7DQogICAgfQ0KDQogICAgc3RlcCA9IGQzQXJyYXkudGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOw0KDQogICAgaWYgKHN0ZXAgPiAwKSB7DQogICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgLyBzdGVwKSAqIHN0ZXA7DQogICAgICBzdGVwID0gZDNBcnJheS50aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7DQogICAgfSBlbHNlIGlmIChzdGVwIDwgMCkgew0KICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7DQogICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOw0KICAgICAgc3RlcCA9IGQzQXJyYXkudGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOw0KICAgIH0NCg0KICAgIGlmIChzdGVwID4gMCkgew0KICAgICAgZFtpMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOw0KICAgICAgZFtpMV0gPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsNCiAgICAgIGRvbWFpbihkKTsNCiAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7DQogICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDsNCiAgICAgIGRbaTFdID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOw0KICAgICAgZG9tYWluKGQpOw0KICAgIH0NCg0KICAgIHJldHVybiBzY2FsZTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIGxpbmVhcigpIHsNCiAgdmFyIHNjYWxlID0gY29udGludW91cyhkZWludGVycG9sYXRlTGluZWFyLCBkM0ludGVycG9sYXRlLmludGVycG9sYXRlTnVtYmVyKTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhcigpKTsNCiAgfTsNCg0KICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsNCn0NCg0KZnVuY3Rpb24gaWRlbnRpdHkoKSB7DQogIHZhciBkb21haW4gPSBbMCwgMV07DQoNCiAgZnVuY3Rpb24gc2NhbGUoeCkgew0KICAgIHJldHVybiAreDsNCiAgfQ0KDQogIHNjYWxlLmludmVydCA9IHNjYWxlOw0KDQogIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQxLmNhbGwoXywgbnVtYmVyKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBpZGVudGl0eSgpLmRvbWFpbihkb21haW4pOw0KICB9Ow0KDQogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOw0KfQ0KDQp2YXIgbmljZSA9IGZ1bmN0aW9uKGRvbWFpbiwgaW50ZXJ2YWwpIHsNCiAgZG9tYWluID0gZG9tYWluLnNsaWNlKCk7DQoNCiAgdmFyIGkwID0gMCwNCiAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsDQogICAgICB4MCA9IGRvbWFpbltpMF0sDQogICAgICB4MSA9IGRvbWFpbltpMV0sDQogICAgICB0Ow0KDQogIGlmICh4MSA8IHgwKSB7DQogICAgdCA9IGkwLCBpMCA9IGkxLCBpMSA9IHQ7DQogICAgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7DQogIH0NCg0KICBkb21haW5baTBdID0gaW50ZXJ2YWwuZmxvb3IoeDApOw0KICBkb21haW5baTFdID0gaW50ZXJ2YWwuY2VpbCh4MSk7DQogIHJldHVybiBkb21haW47DQp9Ow0KDQpmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsNCiAgcmV0dXJuIChiID0gTWF0aC5sb2coYiAvIGEpKQ0KICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4IC8gYSkgLyBiOyB9DQogICAgICA6IGNvbnN0YW50KGIpOw0KfQ0KDQpmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHsNCiAgcmV0dXJuIGEgPCAwDQogICAgICA/IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIC1NYXRoLnBvdygtYiwgdCkgKiBNYXRoLnBvdygtYSwgMSAtIHQpOyB9DQogICAgICA6IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucG93KGIsIHQpICogTWF0aC5wb3coYSwgMSAtIHQpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBwb3cxMCh4KSB7DQogIHJldHVybiBpc0Zpbml0ZSh4KSA/ICsoIjFlIiArIHgpIDogeCA8IDAgPyAwIDogeDsNCn0NCg0KZnVuY3Rpb24gcG93cChiYXNlKSB7DQogIHJldHVybiBiYXNlID09PSAxMCA/IHBvdzEwDQogICAgICA6IGJhc2UgPT09IE1hdGguRSA/IE1hdGguZXhwDQogICAgICA6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucG93KGJhc2UsIHgpOyB9Ow0KfQ0KDQpmdW5jdGlvbiBsb2dwKGJhc2UpIHsNCiAgcmV0dXJuIGJhc2UgPT09IE1hdGguRSA/IE1hdGgubG9nDQogICAgICA6IGJhc2UgPT09IDEwICYmIE1hdGgubG9nMTANCiAgICAgIHx8IGJhc2UgPT09IDIgJiYgTWF0aC5sb2cyDQogICAgICB8fCAoYmFzZSA9IE1hdGgubG9nKGJhc2UpLCBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4KSAvIGJhc2U7IH0pOw0KfQ0KDQpmdW5jdGlvbiByZWZsZWN0KGYpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsNCiAgICByZXR1cm4gLWYoLXgpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBsb2coKSB7DQogIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkuZG9tYWluKFsxLCAxMF0pLA0KICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLA0KICAgICAgYmFzZSA9IDEwLA0KICAgICAgbG9ncyA9IGxvZ3AoMTApLA0KICAgICAgcG93cyA9IHBvd3AoMTApOw0KDQogIGZ1bmN0aW9uIHJlc2NhbGUoKSB7DQogICAgbG9ncyA9IGxvZ3AoYmFzZSksIHBvd3MgPSBwb3dwKGJhc2UpOw0KICAgIGlmIChkb21haW4oKVswXSA8IDApIGxvZ3MgPSByZWZsZWN0KGxvZ3MpLCBwb3dzID0gcmVmbGVjdChwb3dzKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbihfKSwgcmVzY2FsZSgpKSA6IGRvbWFpbigpOw0KICB9Ow0KDQogIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsNCiAgICB2YXIgZCA9IGRvbWFpbigpLA0KICAgICAgICB1ID0gZFswXSwNCiAgICAgICAgdiA9IGRbZC5sZW5ndGggLSAxXSwNCiAgICAgICAgcjsNCg0KICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7DQoNCiAgICB2YXIgaSA9IGxvZ3ModSksDQogICAgICAgIGogPSBsb2dzKHYpLA0KICAgICAgICBwLA0KICAgICAgICBrLA0KICAgICAgICB0LA0KICAgICAgICBuID0gY291bnQgPT0gbnVsbCA/IDEwIDogK2NvdW50LA0KICAgICAgICB6ID0gW107DQoNCiAgICBpZiAoIShiYXNlICUgMSkgJiYgaiAtIGkgPCBuKSB7DQogICAgICBpID0gTWF0aC5yb3VuZChpKSAtIDEsIGogPSBNYXRoLnJvdW5kKGopICsgMTsNCiAgICAgIGlmICh1ID4gMCkgZm9yICg7IGkgPCBqOyArK2kpIHsNCiAgICAgICAgZm9yIChrID0gMSwgcCA9IHBvd3MoaSk7IGsgPCBiYXNlOyArK2spIHsNCiAgICAgICAgICB0ID0gcCAqIGs7DQogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsNCiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOw0KICAgICAgICAgIHoucHVzaCh0KTsNCiAgICAgICAgfQ0KICAgICAgfSBlbHNlIGZvciAoOyBpIDwgajsgKytpKSB7DQogICAgICAgIGZvciAoayA9IGJhc2UgLSAxLCBwID0gcG93cyhpKTsgayA+PSAxOyAtLWspIHsNCiAgICAgICAgICB0ID0gcCAqIGs7DQogICAgICAgICAgaWYgKHQgPCB1KSBjb250aW51ZTsNCiAgICAgICAgICBpZiAodCA+IHYpIGJyZWFrOw0KICAgICAgICAgIHoucHVzaCh0KTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICB6ID0gZDNBcnJheS50aWNrcyhpLCBqLCBNYXRoLm1pbihqIC0gaSwgbikpLm1hcChwb3dzKTsNCiAgICB9DQoNCiAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejsNCiAgfTsNCg0KICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgew0KICAgIGlmIChzcGVjaWZpZXIgPT0gbnVsbCkgc3BlY2lmaWVyID0gYmFzZSA9PT0gMTAgPyAiLjBlIiA6ICIsIjsNCiAgICBpZiAodHlwZW9mIHNwZWNpZmllciAhPT0gImZ1bmN0aW9uIikgc3BlY2lmaWVyID0gZDNGb3JtYXQuZm9ybWF0KHNwZWNpZmllcik7DQogICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjsNCiAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsNCiAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBjb3VudCAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTsgLy8gVE9ETyBmYXN0IGVzdGltYXRlPw0KICAgIHJldHVybiBmdW5jdGlvbihkKSB7DQogICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQobG9ncyhkKSkpOw0KICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIDAuNSkgaSAqPSBiYXNlOw0KICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6ICIiOw0KICAgIH07DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkb21haW4obmljZShkb21haW4oKSwgew0KICAgICAgZmxvb3I6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5mbG9vcihsb2dzKHgpKSk7IH0sDQogICAgICBjZWlsOiBmdW5jdGlvbih4KSB7IHJldHVybiBwb3dzKE1hdGguY2VpbChsb2dzKHgpKSk7IH0NCiAgICB9KSk7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBjb3B5KHNjYWxlLCBsb2coKS5iYXNlKGJhc2UpKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIHJhaXNlKHgsIGV4cG9uZW50KSB7DQogIHJldHVybiB4IDwgMCA/IC1NYXRoLnBvdygteCwgZXhwb25lbnQpIDogTWF0aC5wb3coeCwgZXhwb25lbnQpOw0KfQ0KDQpmdW5jdGlvbiBwb3coKSB7DQogIHZhciBleHBvbmVudCA9IDEsDQogICAgICBzY2FsZSA9IGNvbnRpbnVvdXMoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSksDQogICAgICBkb21haW4gPSBzY2FsZS5kb21haW47DQoNCiAgZnVuY3Rpb24gZGVpbnRlcnBvbGF0ZShhLCBiKSB7DQogICAgcmV0dXJuIChiID0gcmFpc2UoYiwgZXhwb25lbnQpIC0gKGEgPSByYWlzZShhLCBleHBvbmVudCkpKQ0KICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIChyYWlzZSh4LCBleHBvbmVudCkgLSBhKSAvIGI7IH0NCiAgICAgICAgOiBjb25zdGFudChiKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGUoYSwgYikgew0KICAgIGIgPSByYWlzZShiLCBleHBvbmVudCkgLSAoYSA9IHJhaXNlKGEsIGV4cG9uZW50KSk7DQogICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHJhaXNlKGEgKyBiICogdCwgMSAvIGV4cG9uZW50KTsgfTsNCiAgfQ0KDQogIHNjYWxlLmV4cG9uZW50ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4cG9uZW50ID0gK18sIGRvbWFpbihkb21haW4oKSkpIDogZXhwb25lbnQ7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBjb3B5KHNjYWxlLCBwb3coKS5leHBvbmVudChleHBvbmVudCkpOw0KICB9Ow0KDQogIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOw0KfQ0KDQpmdW5jdGlvbiBzcXJ0KCkgew0KICByZXR1cm4gcG93KCkuZXhwb25lbnQoMC41KTsNCn0NCg0KZnVuY3Rpb24gcXVhbnRpbGUkMSgpIHsNCiAgdmFyIGRvbWFpbiA9IFtdLA0KICAgICAgcmFuZ2UkJDEgPSBbXSwNCiAgICAgIHRocmVzaG9sZHMgPSBbXTsNCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlJCQxLmxlbmd0aCk7DQogICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7DQogICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gZDNBcnJheS5xdWFudGlsZShkb21haW4sIGkgLyBuKTsNCiAgICByZXR1cm4gc2NhbGU7DQogIH0NCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QodGhyZXNob2xkcywgeCldOw0KICB9DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogWw0KICAgICAgaSA+IDAgPyB0aHJlc2hvbGRzW2kgLSAxXSA6IGRvbWFpblswXSwNCiAgICAgIGkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbaV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdDQogICAgXTsNCiAgfTsNCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7DQogICAgZG9tYWluID0gW107DQogICAgZm9yICh2YXIgaSA9IDAsIG4gPSBfLmxlbmd0aCwgZDsgaSA8IG47ICsraSkgaWYgKGQgPSBfW2ldLCBkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpOw0KICAgIGRvbWFpbi5zb3J0KGQzQXJyYXkuYXNjZW5kaW5nKTsNCiAgICByZXR1cm4gcmVzY2FsZSgpOw0KICB9Ow0KDQogIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHF1YW50aWxlJDEoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbikNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCmZ1bmN0aW9uIHF1YW50aXplKCkgew0KICB2YXIgeDAgPSAwLA0KICAgICAgeDEgPSAxLA0KICAgICAgbiA9IDEsDQogICAgICBkb21haW4gPSBbMC41XSwNCiAgICAgIHJhbmdlJCQxID0gWzAsIDFdOw0KDQogIGZ1bmN0aW9uIHNjYWxlKHgpIHsNCiAgICBpZiAoeCA8PSB4KSByZXR1cm4gcmFuZ2UkJDFbZDNBcnJheS5iaXNlY3QoZG9tYWluLCB4LCAwLCBuKV07DQogIH0NCg0KICBmdW5jdGlvbiByZXNjYWxlKCkgew0KICAgIHZhciBpID0gLTE7DQogICAgZG9tYWluID0gbmV3IEFycmF5KG4pOw0KICAgIHdoaWxlICgrK2kgPCBuKSBkb21haW5baV0gPSAoKGkgKyAxKSAqIHgxIC0gKGkgLSBuKSAqIHgwKSAvIChuICsgMSk7DQogICAgcmV0dXJuIHNjYWxlOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF0sIHgxID0gK19bMV0sIHJlc2NhbGUoKSkgOiBbeDAsIHgxXTsNCiAgfTsNCg0KICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuID0gKHJhbmdlJCQxID0gc2xpY2UuY2FsbChfKSkubGVuZ3RoIC0gMSwgcmVzY2FsZSgpKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dDQogICAgICAgIDogaSA8IDEgPyBbeDAsIGRvbWFpblswXV0NCiAgICAgICAgOiBpID49IG4gPyBbZG9tYWluW24gLSAxXSwgeDFdDQogICAgICAgIDogW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBxdWFudGl6ZSgpDQogICAgICAgIC5kb21haW4oW3gwLCB4MV0pDQogICAgICAgIC5yYW5nZShyYW5nZSQkMSk7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCmZ1bmN0aW9uIHRocmVzaG9sZCgpIHsNCiAgdmFyIGRvbWFpbiA9IFswLjVdLA0KICAgICAgcmFuZ2UkJDEgPSBbMCwgMV0sDQogICAgICBuID0gMTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlJCQxW2QzQXJyYXkuYmlzZWN0KGRvbWFpbiwgeCwgMCwgbildOw0KICB9DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHNsaWNlLmNhbGwoXyksIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZSQkMS5sZW5ndGggLSAxKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UkJDEgPSBzbGljZS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UkJDEubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlJCQxLnNsaWNlKCk7DQogIH07DQoNCiAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgew0KICAgIHZhciBpID0gcmFuZ2UkJDEuaW5kZXhPZih5KTsNCiAgICByZXR1cm4gW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aHJlc2hvbGQoKQ0KICAgICAgICAuZG9tYWluKGRvbWFpbikNCiAgICAgICAgLnJhbmdlKHJhbmdlJCQxKTsNCiAgfTsNCg0KICByZXR1cm4gc2NhbGU7DQp9DQoNCnZhciBkdXJhdGlvblNlY29uZCA9IDEwMDA7DQp2YXIgZHVyYXRpb25NaW51dGUgPSBkdXJhdGlvblNlY29uZCAqIDYwOw0KdmFyIGR1cmF0aW9uSG91ciA9IGR1cmF0aW9uTWludXRlICogNjA7DQp2YXIgZHVyYXRpb25EYXkgPSBkdXJhdGlvbkhvdXIgKiAyNDsNCnZhciBkdXJhdGlvbldlZWsgPSBkdXJhdGlvbkRheSAqIDc7DQp2YXIgZHVyYXRpb25Nb250aCA9IGR1cmF0aW9uRGF5ICogMzA7DQp2YXIgZHVyYXRpb25ZZWFyID0gZHVyYXRpb25EYXkgKiAzNjU7DQoNCmZ1bmN0aW9uIGRhdGUodCkgew0KICByZXR1cm4gbmV3IERhdGUodCk7DQp9DQoNCmZ1bmN0aW9uIG51bWJlciQxKHQpIHsNCiAgcmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlID8gK3QgOiArbmV3IERhdGUoK3QpOw0KfQ0KDQpmdW5jdGlvbiBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCQkMSkgew0KICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGRlaW50ZXJwb2xhdGVMaW5lYXIsIGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVOdW1iZXIpLA0KICAgICAgaW52ZXJ0ID0gc2NhbGUuaW52ZXJ0LA0KICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluOw0KDQogIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCQkMSgiLiVMIiksDQogICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQkJDEoIjolUyIpLA0KICAgICAgZm9ybWF0TWludXRlID0gZm9ybWF0JCQxKCIlSTolTSIpLA0KICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCQkMSgiJUkgJXAiKSwNCiAgICAgIGZvcm1hdERheSA9IGZvcm1hdCQkMSgiJWEgJWQiKSwNCiAgICAgIGZvcm1hdFdlZWsgPSBmb3JtYXQkJDEoIiViICVkIiksDQogICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCQkMSgiJUIiKSwNCiAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQkJDEoIiVZIik7DQoNCiAgdmFyIHRpY2tJbnRlcnZhbHMgPSBbDQogICAgW3NlY29uZCwgIDEsICAgICAgZHVyYXRpb25TZWNvbmRdLA0KICAgIFtzZWNvbmQsICA1LCAgNSAqIGR1cmF0aW9uU2Vjb25kXSwNCiAgICBbc2Vjb25kLCAxNSwgMTUgKiBkdXJhdGlvblNlY29uZF0sDQogICAgW3NlY29uZCwgMzAsIDMwICogZHVyYXRpb25TZWNvbmRdLA0KICAgIFttaW51dGUsICAxLCAgICAgIGR1cmF0aW9uTWludXRlXSwNCiAgICBbbWludXRlLCAgNSwgIDUgKiBkdXJhdGlvbk1pbnV0ZV0sDQogICAgW21pbnV0ZSwgMTUsIDE1ICogZHVyYXRpb25NaW51dGVdLA0KICAgIFttaW51dGUsIDMwLCAzMCAqIGR1cmF0aW9uTWludXRlXSwNCiAgICBbICBob3VyLCAgMSwgICAgICBkdXJhdGlvbkhvdXIgIF0sDQogICAgWyAgaG91ciwgIDMsICAzICogZHVyYXRpb25Ib3VyICBdLA0KICAgIFsgIGhvdXIsICA2LCAgNiAqIGR1cmF0aW9uSG91ciAgXSwNCiAgICBbICBob3VyLCAxMiwgMTIgKiBkdXJhdGlvbkhvdXIgIF0sDQogICAgWyAgIGRheSwgIDEsICAgICAgZHVyYXRpb25EYXkgICBdLA0KICAgIFsgICBkYXksICAyLCAgMiAqIGR1cmF0aW9uRGF5ICAgXSwNCiAgICBbICB3ZWVrLCAgMSwgICAgICBkdXJhdGlvbldlZWsgIF0sDQogICAgWyBtb250aCwgIDEsICAgICAgZHVyYXRpb25Nb250aCBdLA0KICAgIFsgbW9udGgsICAzLCAgMyAqIGR1cmF0aW9uTW9udGggXSwNCiAgICBbICB5ZWFyLCAgMSwgICAgICBkdXJhdGlvblllYXIgIF0NCiAgXTsNCg0KICBmdW5jdGlvbiB0aWNrRm9ybWF0KGRhdGUpIHsNCiAgICByZXR1cm4gKHNlY29uZChkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaWxsaXNlY29uZA0KICAgICAgICA6IG1pbnV0ZShkYXRlKSA8IGRhdGUgPyBmb3JtYXRTZWNvbmQNCiAgICAgICAgOiBob3VyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1pbnV0ZQ0KICAgICAgICA6IGRheShkYXRlKSA8IGRhdGUgPyBmb3JtYXRIb3VyDQogICAgICAgIDogbW9udGgoZGF0ZSkgPCBkYXRlID8gKHdlZWsoZGF0ZSkgPCBkYXRlID8gZm9ybWF0RGF5IDogZm9ybWF0V2VlaykNCiAgICAgICAgOiB5ZWFyKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdE1vbnRoDQogICAgICAgIDogZm9ybWF0WWVhcikoZGF0ZSk7DQogIH0NCg0KICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7DQogICAgaWYgKGludGVydmFsID09IG51bGwpIGludGVydmFsID0gMTA7DQoNCiAgICAvLyBJZiBhIGRlc2lyZWQgdGljayBjb3VudCBpcyBzcGVjaWZpZWQsIHBpY2sgYSByZWFzb25hYmxlIHRpY2sgaW50ZXJ2YWwNCiAgICAvLyBiYXNlZCBvbiB0aGUgZXh0ZW50IG9mIHRoZSBkb21haW4gYW5kIGEgcm91Z2ggZXN0aW1hdGUgb2YgdGljayBzaXplLg0KICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGludGVydmFsIGlzIGFscmVhZHkgYSB0aW1lIGludGVydmFsIGFuZCB1c2UgaXQuDQogICAgaWYgKHR5cGVvZiBpbnRlcnZhbCA9PT0gIm51bWJlciIpIHsNCiAgICAgIHZhciB0YXJnZXQgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gaW50ZXJ2YWwsDQogICAgICAgICAgaSA9IGQzQXJyYXkuYmlzZWN0b3IoZnVuY3Rpb24oaSkgeyByZXR1cm4gaVsyXTsgfSkucmlnaHQodGlja0ludGVydmFscywgdGFyZ2V0KTsNCiAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkgew0KICAgICAgICBzdGVwID0gZDNBcnJheS50aWNrU3RlcChzdGFydCAvIGR1cmF0aW9uWWVhciwgc3RvcCAvIGR1cmF0aW9uWWVhciwgaW50ZXJ2YWwpOw0KICAgICAgICBpbnRlcnZhbCA9IHllYXI7DQogICAgICB9IGVsc2UgaWYgKGkpIHsNCiAgICAgICAgaSA9IHRpY2tJbnRlcnZhbHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJdIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsNCiAgICAgICAgc3RlcCA9IGlbMV07DQogICAgICAgIGludGVydmFsID0gaVswXTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIHN0ZXAgPSBkM0FycmF5LnRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCk7DQogICAgICAgIGludGVydmFsID0gbWlsbGlzZWNvbmQ7DQogICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuIHN0ZXAgPT0gbnVsbCA/IGludGVydmFsIDogaW50ZXJ2YWwuZXZlcnkoc3RlcCk7DQogIH0NCg0KICBzY2FsZS5pbnZlcnQgPSBmdW5jdGlvbih5KSB7DQogICAgcmV0dXJuIG5ldyBEYXRlKGludmVydCh5KSk7DQogIH07DQoNCiAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQxLmNhbGwoXywgbnVtYmVyJDEpKSA6IGRvbWFpbigpLm1hcChkYXRlKTsNCiAgfTsNCg0KICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7DQogICAgdmFyIGQgPSBkb21haW4oKSwNCiAgICAgICAgdDAgPSBkWzBdLA0KICAgICAgICB0MSA9IGRbZC5sZW5ndGggLSAxXSwNCiAgICAgICAgciA9IHQxIDwgdDAsDQogICAgICAgIHQ7DQogICAgaWYgKHIpIHQgPSB0MCwgdDAgPSB0MSwgdDEgPSB0Ow0KICAgIHQgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHQwLCB0MSwgc3RlcCk7DQogICAgdCA9IHQgPyB0LnJhbmdlKHQwLCB0MSArIDEpIDogW107IC8vIGluY2x1c2l2ZSBzdG9wDQogICAgcmV0dXJuIHIgPyB0LnJldmVyc2UoKSA6IHQ7DQogIH07DQoNCiAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsNCiAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0JCQxKHNwZWNpZmllcik7DQogIH07DQoNCiAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7DQogICAgdmFyIGQgPSBkb21haW4oKTsNCiAgICByZXR1cm4gKGludGVydmFsID0gdGlja0ludGVydmFsKGludGVydmFsLCBkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIHN0ZXApKQ0KICAgICAgICA/IGRvbWFpbihuaWNlKGQsIGludGVydmFsKSkNCiAgICAgICAgOiBzY2FsZTsNCiAgfTsNCg0KICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGNvcHkoc2NhbGUsIGNhbGVuZGFyKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0JCQxKSk7DQogIH07DQoNCiAgcmV0dXJuIHNjYWxlOw0KfQ0KDQp2YXIgdGltZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gY2FsZW5kYXIoZDNUaW1lLnRpbWVZZWFyLCBkM1RpbWUudGltZU1vbnRoLCBkM1RpbWUudGltZVdlZWssIGQzVGltZS50aW1lRGF5LCBkM1RpbWUudGltZUhvdXIsIGQzVGltZS50aW1lTWludXRlLCBkM1RpbWUudGltZVNlY29uZCwgZDNUaW1lLnRpbWVNaWxsaXNlY29uZCwgZDNUaW1lRm9ybWF0LnRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMjAwMCwgMCwgMSksIG5ldyBEYXRlKDIwMDAsIDAsIDIpXSk7DQp9Ow0KDQp2YXIgdXRjVGltZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gY2FsZW5kYXIoZDNUaW1lLnV0Y1llYXIsIGQzVGltZS51dGNNb250aCwgZDNUaW1lLnV0Y1dlZWssIGQzVGltZS51dGNEYXksIGQzVGltZS51dGNIb3VyLCBkM1RpbWUudXRjTWludXRlLCBkM1RpbWUudXRjU2Vjb25kLCBkM1RpbWUudXRjTWlsbGlzZWNvbmQsIGQzVGltZUZvcm1hdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMjAwMCwgMCwgMSksIERhdGUuVVRDKDIwMDAsIDAsIDIpXSk7DQp9Ow0KDQp2YXIgY29sb3JzID0gZnVuY3Rpb24ocykgew0KICByZXR1cm4gcy5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24oeCkgew0KICAgIHJldHVybiAiIyIgKyB4Ow0KICB9KTsNCn07DQoNCnZhciBjYXRlZ29yeTEwID0gY29sb3JzKCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKTsNCg0KdmFyIGNhdGVnb3J5MjBiID0gY29sb3JzKCIzOTNiNzk1MjU0YTM2YjZlY2Y5YzllZGU2Mzc5Mzk4Y2EyNTJiNWNmNmJjZWRiOWM4YzZkMzFiZDllMzllN2JhNTJlN2NiOTQ4NDNjMzlhZDQ5NGFkNjYxNmJlNzk2OWM3YjQxNzNhNTUxOTRjZTZkYmRkZTllZDYiKTsNCg0KdmFyIGNhdGVnb3J5MjBjID0gY29sb3JzKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKTsNCg0KdmFyIGNhdGVnb3J5MjAgPSBjb2xvcnMoIjFmNzdiNGFlYzdlOGZmN2YwZWZmYmI3ODJjYTAyYzk4ZGY4YWQ2MjcyOGZmOTg5Njk0NjdiZGM1YjBkNThjNTY0YmM0OWM5NGUzNzdjMmY3YjZkMjdmN2Y3ZmM3YzdjN2JjYmQyMmRiZGI4ZDE3YmVjZjllZGFlNSIpOw0KDQp2YXIgY3ViZWhlbGl4JDEgPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgzMDAsIDAuNSwgMC4wKSwgZDNDb2xvci5jdWJlaGVsaXgoLTI0MCwgMC41LCAxLjApKTsNCg0KdmFyIHdhcm0gPSBkM0ludGVycG9sYXRlLmludGVycG9sYXRlQ3ViZWhlbGl4TG9uZyhkM0NvbG9yLmN1YmVoZWxpeCgtMTAwLCAwLjc1LCAwLjM1KSwgZDNDb2xvci5jdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOw0KDQp2YXIgY29vbCA9IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nKGQzQ29sb3IuY3ViZWhlbGl4KDI2MCwgMC43NSwgMC4zNSksIGQzQ29sb3IuY3ViZWhlbGl4KDgwLCAxLjUwLCAwLjgpKTsNCg0KdmFyIHJhaW5ib3cgPSBkM0NvbG9yLmN1YmVoZWxpeCgpOw0KDQp2YXIgcmFpbmJvdyQxID0gZnVuY3Rpb24odCkgew0KICBpZiAodCA8IDAgfHwgdCA+IDEpIHQgLT0gTWF0aC5mbG9vcih0KTsNCiAgdmFyIHRzID0gTWF0aC5hYnModCAtIDAuNSk7DQogIHJhaW5ib3cuaCA9IDM2MCAqIHQgLSAxMDA7DQogIHJhaW5ib3cucyA9IDEuNSAtIDEuNSAqIHRzOw0KICByYWluYm93LmwgPSAwLjggLSAwLjkgKiB0czsNCiAgcmV0dXJuIHJhaW5ib3cgKyAiIjsNCn07DQoNCmZ1bmN0aW9uIHJhbXAocmFuZ2UkJDEpIHsNCiAgdmFyIG4gPSByYW5nZSQkMS5sZW5ndGg7DQogIHJldHVybiBmdW5jdGlvbih0KSB7DQogICAgcmV0dXJuIHJhbmdlJCQxW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTsNCiAgfTsNCn0NCg0KdmFyIHZpcmlkaXMgPSByYW1wKGNvbG9ycygiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpOw0KDQp2YXIgbWFnbWEgPSByYW1wKGNvbG9ycygiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpOw0KDQp2YXIgaW5mZXJubyA9IHJhbXAoY29sb3JzKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSk7DQoNCnZhciBwbGFzbWEgPSByYW1wKGNvbG9ycygiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpOw0KDQpmdW5jdGlvbiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikgew0KICB2YXIgeDAgPSAwLA0KICAgICAgeDEgPSAxLA0KICAgICAgY2xhbXAgPSBmYWxzZTsNCg0KICBmdW5jdGlvbiBzY2FsZSh4KSB7DQogICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTsNCiAgICByZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpIDogdCk7DQogIH0NCg0KICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSArX1swXSwgeDEgPSArX1sxXSwgc2NhbGUpIDogW3gwLCB4MV07DQogIH07DQoNCiAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHNjYWxlKSA6IGNsYW1wOw0KICB9Ow0KDQogIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7DQogIH07DQoNCiAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBzZXF1ZW50aWFsKGludGVycG9sYXRvcikuZG9tYWluKFt4MCwgeDFdKS5jbGFtcChjbGFtcCk7DQogIH07DQoNCiAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7DQp9DQoNCmV4cG9ydHMuc2NhbGVCYW5kID0gYmFuZDsNCmV4cG9ydHMuc2NhbGVQb2ludCA9IHBvaW50Ow0KZXhwb3J0cy5zY2FsZUlkZW50aXR5ID0gaWRlbnRpdHk7DQpleHBvcnRzLnNjYWxlTGluZWFyID0gbGluZWFyOw0KZXhwb3J0cy5zY2FsZUxvZyA9IGxvZzsNCmV4cG9ydHMuc2NhbGVPcmRpbmFsID0gb3JkaW5hbDsNCmV4cG9ydHMuc2NhbGVJbXBsaWNpdCA9IGltcGxpY2l0Ow0KZXhwb3J0cy5zY2FsZVBvdyA9IHBvdzsNCmV4cG9ydHMuc2NhbGVTcXJ0ID0gc3FydDsNCmV4cG9ydHMuc2NhbGVRdWFudGlsZSA9IHF1YW50aWxlJDE7DQpleHBvcnRzLnNjYWxlUXVhbnRpemUgPSBxdWFudGl6ZTsNCmV4cG9ydHMuc2NhbGVUaHJlc2hvbGQgPSB0aHJlc2hvbGQ7DQpleHBvcnRzLnNjYWxlVGltZSA9IHRpbWU7DQpleHBvcnRzLnNjYWxlVXRjID0gdXRjVGltZTsNCmV4cG9ydHMuc2NoZW1lQ2F0ZWdvcnkxMCA9IGNhdGVnb3J5MTA7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBiID0gY2F0ZWdvcnkyMGI7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjBjID0gY2F0ZWdvcnkyMGM7DQpleHBvcnRzLnNjaGVtZUNhdGVnb3J5MjAgPSBjYXRlZ29yeTIwOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQgPSBjdWJlaGVsaXgkMTsNCmV4cG9ydHMuaW50ZXJwb2xhdGVSYWluYm93ID0gcmFpbmJvdyQxOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZVdhcm0gPSB3YXJtOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZUNvb2wgPSBjb29sOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZVZpcmlkaXMgPSB2aXJpZGlzOw0KZXhwb3J0cy5pbnRlcnBvbGF0ZU1hZ21hID0gbWFnbWE7DQpleHBvcnRzLmludGVycG9sYXRlSW5mZXJubyA9IGluZmVybm87DQpleHBvcnRzLmludGVycG9sYXRlUGxhc21hID0gcGxhc21hOw0KZXhwb3J0cy5zY2FsZVNlcXVlbnRpYWwgPSBzZXF1ZW50aWFsOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtYXJyYXkiOjIsImQzLWNvbGxlY3Rpb24iOjMsImQzLWNvbG9yIjo0LCJkMy1mb3JtYXQiOjcsImQzLWludGVycG9sYXRlIjo5LCJkMy10aW1lIjoxNSwiZDMtdGltZS1mb3JtYXQiOjE0fV0sMTI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1zZWxlY3Rpb24vIFZlcnNpb24gMS4xLjAuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cyddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSkpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOw0KDQp2YXIgbmFtZXNwYWNlcyA9IHsNCiAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLA0KICB4aHRtbDogeGh0bWwsDQogIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsDQogIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsDQogIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iDQp9Ow0KDQp2YXIgbmFtZXNwYWNlID0gZnVuY3Rpb24obmFtZSkgew0KICB2YXIgcHJlZml4ID0gbmFtZSArPSAiIiwgaSA9IHByZWZpeC5pbmRleE9mKCI6Iik7DQogIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7DQogIHJldHVybiBuYW1lc3BhY2VzLmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsNCn07DQoNCmZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwNCiAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7DQogICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwNCiAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpDQogICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGNyZWF0b3JGaXhlZChmdWxsbmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgfTsNCn0NCg0KdmFyIGNyZWF0b3IgPSBmdW5jdGlvbihuYW1lKSB7DQogIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsNCiAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbA0KICAgICAgPyBjcmVhdG9yRml4ZWQNCiAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsNCn07DQoNCnZhciBuZXh0SWQgPSAwOw0KDQpmdW5jdGlvbiBsb2NhbCgpIHsNCiAgcmV0dXJuIG5ldyBMb2NhbDsNCn0NCg0KZnVuY3Rpb24gTG9jYWwoKSB7DQogIHRoaXMuXyA9ICJAIiArICgrK25leHRJZCkudG9TdHJpbmcoMzYpOw0KfQ0KDQpMb2NhbC5wcm90b3R5cGUgPSBsb2NhbC5wcm90b3R5cGUgPSB7DQogIGNvbnN0cnVjdG9yOiBMb2NhbCwNCiAgZ2V0OiBmdW5jdGlvbihub2RlKSB7DQogICAgdmFyIGlkID0gdGhpcy5fOw0KICAgIHdoaWxlICghKGlkIGluIG5vZGUpKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuOw0KICAgIHJldHVybiBub2RlW2lkXTsNCiAgfSwNCiAgc2V0OiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgew0KICAgIHJldHVybiBub2RlW3RoaXMuX10gPSB2YWx1ZTsNCiAgfSwNCiAgcmVtb3ZlOiBmdW5jdGlvbihub2RlKSB7DQogICAgcmV0dXJuIHRoaXMuXyBpbiBub2RlICYmIGRlbGV0ZSBub2RlW3RoaXMuX107DQogIH0sDQogIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5fOw0KICB9DQp9Ow0KDQp2YXIgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsNCiAgfTsNCn07DQoNCmlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7DQogIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICBpZiAoIWVsZW1lbnQubWF0Y2hlcykgew0KICAgIHZhciB2ZW5kb3JNYXRjaGVzID0gZWxlbWVudC53ZWJraXRNYXRjaGVzU2VsZWN0b3INCiAgICAgICAgfHwgZWxlbWVudC5tc01hdGNoZXNTZWxlY3Rvcg0KICAgICAgICB8fCBlbGVtZW50Lm1vek1hdGNoZXNTZWxlY3Rvcg0KICAgICAgICB8fCBlbGVtZW50Lm9NYXRjaGVzU2VsZWN0b3I7DQogICAgbWF0Y2hlciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgICAgIHJldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcywgc2VsZWN0b3IpOw0KICAgICAgfTsNCiAgICB9Ow0KICB9DQp9DQoNCnZhciBtYXRjaGVyJDEgPSBtYXRjaGVyOw0KDQp2YXIgZmlsdGVyRXZlbnRzID0ge307DQoNCmV4cG9ydHMuZXZlbnQgPSBudWxsOw0KDQppZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgew0KICB2YXIgZWxlbWVudCQxID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Ow0KICBpZiAoISgib25tb3VzZWVudGVyIiBpbiBlbGVtZW50JDEpKSB7DQogICAgZmlsdGVyRXZlbnRzID0ge21vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQifTsNCiAgfQ0KfQ0KDQpmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCkgew0KICBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTsNCiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7DQogICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0Ow0KICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHsNCiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpOw0KICAgIH0NCiAgfTsNCn0NCg0KZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgew0KICAgIHZhciBldmVudDAgPSBleHBvcnRzLmV2ZW50OyAvLyBFdmVudHMgY2FuIGJlIHJlZW50cmFudCAoZS5nLiwgZm9jdXMpLg0KICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7DQogICAgdHJ5IHsNCiAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsNCiAgICB9IGZpbmFsbHkgew0KICAgICAgZXhwb3J0cy5ldmVudCA9IGV2ZW50MDsNCiAgICB9DQogIH07DQp9DQoNCmZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcykgew0KICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgew0KICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsNCiAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOw0KICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07DQogIH0pOw0KfQ0KDQpmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIG9uID0gdGhpcy5fX29uOw0KICAgIGlmICghb24pIHJldHVybjsNCiAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7DQogICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsNCiAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsNCiAgICAgIH0gZWxzZSB7DQogICAgICAgIG9uWysraV0gPSBvOw0KICAgICAgfQ0KICAgIH0NCiAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpOw0KICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7DQogIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzLmhhc093blByb3BlcnR5KHR5cGVuYW1lLnR5cGUpID8gZmlsdGVyQ29udGV4dExpc3RlbmVyIDogY29udGV4dExpc3RlbmVyOw0KICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsNCiAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOw0KICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgew0KICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOw0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpOw0KICAgICAgICBvLnZhbHVlID0gdmFsdWU7DQogICAgICAgIHJldHVybjsNCiAgICAgIH0NCiAgICB9DQogICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsNCiAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTsNCiAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107DQogICAgZWxzZSBvbi5wdXNoKG8pOw0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX29uID0gZnVuY3Rpb24odHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7DQogIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQogICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsNCiAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7DQogICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsNCiAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsNCiAgICAgICAgICByZXR1cm4gby52YWx1ZTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm47DQogIH0NCg0KICBvbiA9IHZhbHVlID8gb25BZGQgOiBvblJlbW92ZTsNCiAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlOw0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgY2FwdHVyZSkpOw0KICByZXR1cm4gdGhpczsNCn07DQoNCmZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHsNCiAgdmFyIGV2ZW50MCA9IGV4cG9ydHMuZXZlbnQ7DQogIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV4cG9ydHMuZXZlbnQ7DQogIGV4cG9ydHMuZXZlbnQgPSBldmVudDE7DQogIHRyeSB7DQogICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3MpOw0KICB9IGZpbmFsbHkgew0KICAgIGV4cG9ydHMuZXZlbnQgPSBldmVudDA7DQogIH0NCn0NCg0KdmFyIHNvdXJjZUV2ZW50ID0gZnVuY3Rpb24oKSB7DQogIHZhciBjdXJyZW50ID0gZXhwb3J0cy5ldmVudCwgc291cmNlOw0KICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsNCiAgcmV0dXJuIGN1cnJlbnQ7DQp9Ow0KDQp2YXIgcG9pbnQgPSBmdW5jdGlvbihub2RlLCBldmVudCkgew0KICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTsNCg0KICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7DQogICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7DQogICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOw0KICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsNCiAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOw0KICB9DQoNCiAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOw0KICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsNCn07DQoNCnZhciBtb3VzZSA9IGZ1bmN0aW9uKG5vZGUpIHsNCiAgdmFyIGV2ZW50ID0gc291cmNlRXZlbnQoKTsNCiAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSBldmVudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdOw0KICByZXR1cm4gcG9pbnQobm9kZSwgZXZlbnQpOw0KfTsNCg0KZnVuY3Rpb24gbm9uZSgpIHt9DQoNCnZhciBzZWxlY3RvciA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7DQogIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSA6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOw0KICB9Ow0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zZWxlY3QgPSBmdW5jdGlvbihzZWxlY3QpIHsNCiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsNCiAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187DQogICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KZnVuY3Rpb24gZW1wdHkoKSB7DQogIHJldHVybiBbXTsNCn0NCg0KdmFyIHNlbGVjdG9yQWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSA6IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOw0KICB9Ow0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zZWxlY3RBbGwgPSBmdW5jdGlvbihzZWxlY3QpIHsNCiAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsNCiAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7DQogIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlciQxKG1hdGNoKTsNCg0KICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsNCiAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KdmFyIHNwYXJzZSA9IGZ1bmN0aW9uKHVwZGF0ZSkgew0KICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9lbnRlciA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gbmV3IFNlbGVjdGlvbih0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOw0KfTsNCg0KZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHsNCiAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7DQogIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsNCiAgdGhpcy5fbmV4dCA9IG51bGw7DQogIHRoaXMuX3BhcmVudCA9IHBhcmVudDsNCiAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOw0KfQ0KDQpFbnRlck5vZGUucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlLA0KICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LA0KICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwNCiAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSwNCiAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfQ0KfTsNCg0KdmFyIGNvbnN0YW50ID0gZnVuY3Rpb24oeCkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHg7DQogIH07DQp9Ow0KDQp2YXIga2V5UHJlZml4ID0gIiQiOyAvLyBQcm90ZWN0IGFnYWluc3Qga2V5cyBsaWtlIOKAnF9fcHJvdG9fX+KAnS4NCg0KZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsNCiAgdmFyIGkgPSAwLA0KICAgICAgbm9kZSwNCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLA0KICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOw0KDQogIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuDQogIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLg0KICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuDQogIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07DQogICAgICB1cGRhdGVbaV0gPSBub2RlOw0KICAgIH0gZWxzZSB7DQogICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsNCiAgICB9DQogIH0NCg0KICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0Lg0KICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsNCiAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICBleGl0W2ldID0gbm9kZTsNCiAgICB9DQogIH0NCn0NCg0KZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsNCiAgdmFyIGksDQogICAgICBub2RlLA0KICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwNCiAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLA0KICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLA0KICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwNCiAgICAgIGtleVZhbHVlOw0KDQogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLg0KICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuDQogIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7DQogICAgaWYgKG5vZGUgPSBncm91cFtpXSkgew0KICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7DQogICAgICBpZiAoa2V5VmFsdWUgaW4gbm9kZUJ5S2V5VmFsdWUpIHsNCiAgICAgICAgZXhpdFtpXSA9IG5vZGU7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4NCiAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS4NCiAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLg0KICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7DQogICAga2V5VmFsdWUgPSBrZXlQcmVmaXggKyBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpOw0KICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdKSB7DQogICAgICB1cGRhdGVbaV0gPSBub2RlOw0KICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07DQogICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBudWxsOw0KICAgIH0gZWxzZSB7DQogICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUocGFyZW50LCBkYXRhW2ldKTsNCiAgICB9DQogIH0NCg0KICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4NCiAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsNCiAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7DQogICAgICBleGl0W2ldID0gbm9kZTsNCiAgICB9DQogIH0NCn0NCg0KdmFyIHNlbGVjdGlvbl9kYXRhID0gZnVuY3Rpb24odmFsdWUsIGtleSkgew0KICBpZiAoIXZhbHVlKSB7DQogICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGogPSAtMTsNCiAgICB0aGlzLmVhY2goZnVuY3Rpb24oZCkgeyBkYXRhWysral0gPSBkOyB9KTsNCiAgICByZXR1cm4gZGF0YTsNCiAgfQ0KDQogIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSA6IGJpbmRJbmRleCwNCiAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLA0KICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzOw0KDQogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQodmFsdWUpOw0KDQogIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLA0KICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSwNCiAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsDQogICAgICAgIGRhdGEgPSB2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cyksDQogICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwNCiAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLA0KICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwNCiAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7DQoNCiAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7DQoNCiAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQNCiAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLA0KICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLg0KICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7DQogICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkgew0KICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxOw0KICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7DQogICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24odXBkYXRlLCBwYXJlbnRzKTsNCiAgdXBkYXRlLl9lbnRlciA9IGVudGVyOw0KICB1cGRhdGUuX2V4aXQgPSBleGl0Ow0KICByZXR1cm4gdXBkYXRlOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9leGl0ID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UpLCB0aGlzLl9wYXJlbnRzKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fbWVyZ2UgPSBmdW5jdGlvbihzZWxlY3Rpb24pIHsNCg0KICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgew0KICAgICAgICBtZXJnZVtpXSA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgZm9yICg7IGogPCBtMDsgKytqKSB7DQogICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsNCiAgfQ0KDQogIHJldHVybiBuZXcgU2VsZWN0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX29yZGVyID0gZnVuY3Rpb24oKSB7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgaWYgKG5leHQgJiYgbmV4dCAhPT0gbm9kZS5uZXh0U2libGluZykgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsNCiAgICAgICAgbmV4dCA9IG5vZGU7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX3NvcnQgPSBmdW5jdGlvbihjb21wYXJlKSB7DQogIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZzsNCg0KICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7DQogICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOw0KICB9DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsNCiAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTsNCiAgICAgIH0NCiAgICB9DQogICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpOw0KICB9DQoNCiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTsNCn07DQoNCmZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7DQogIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsNCn0NCg0KdmFyIHNlbGVjdGlvbl9jYWxsID0gZnVuY3Rpb24oKSB7DQogIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsNCiAgYXJndW1lbnRzWzBdID0gdGhpczsNCiAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsNCiAgcmV0dXJuIHRoaXM7DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX25vZGVzID0gZnVuY3Rpb24oKSB7DQogIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTsNCiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7DQogIHJldHVybiBub2RlczsNCn07DQoNCnZhciBzZWxlY3Rpb25fbm9kZSA9IGZ1bmN0aW9uKCkgew0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOw0KICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBudWxsOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9zaXplID0gZnVuY3Rpb24oKSB7DQogIHZhciBzaXplID0gMDsNCiAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pOw0KICByZXR1cm4gc2l6ZTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZW1wdHkgPSBmdW5jdGlvbigpIHsNCiAgcmV0dXJuICF0aGlzLm5vZGUoKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZWFjaCA9IGZ1bmN0aW9uKGNhbGxiYWNrKSB7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiB0aGlzOw0KfTsNCg0KZnVuY3Rpb24gYXR0clJlbW92ZShuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0clJlbW92ZU5TKGZ1bGxuYW1lKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyhmdWxsbmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9hdHRyID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpOw0KDQogIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgew0KICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7DQogICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsDQogICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpDQogICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbA0KICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pDQogICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpOw0KfTsNCg0KdmFyIGRlZmF1bHRWaWV3ID0gZnVuY3Rpb24obm9kZSkgew0KICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlDQogICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93DQogICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnQNCn07DQoNCmZ1bmN0aW9uIHN0eWxlUmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOw0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3N0eWxlID0gZnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7DQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQ0KICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwNCiAgICAgICAgICAgID8gc3R5bGVSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbg0KICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50KShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKQ0KICAgICAgOiBzdHlsZVZhbHVlKHRoaXMubm9kZSgpLCBuYW1lKTsNCn07DQoNCmZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkgew0KICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpDQogICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7DQp9DQoNCmZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGRlbGV0ZSB0aGlzW25hbWVdOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50KG5hbWUsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzW25hbWVdID0gdmFsdWU7DQogIH07DQp9DQoNCmZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsNCiAgICBlbHNlIHRoaXNbbmFtZV0gPSB2Ow0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3Byb3BlcnR5ID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxDQogICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbA0KICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb24NCiAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQpKG5hbWUsIHZhbHVlKSkNCiAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07DQp9Ow0KDQpmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgew0KICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsNCn0NCg0KZnVuY3Rpb24gY2xhc3NMaXN0KG5vZGUpIHsNCiAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3Qobm9kZSk7DQp9DQoNCmZ1bmN0aW9uIENsYXNzTGlzdChub2RlKSB7DQogIHRoaXMuX25vZGUgPSBub2RlOw0KICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOw0KfQ0KDQpDbGFzc0xpc3QucHJvdG90eXBlID0gew0KICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7DQogICAgaWYgKGkgPCAwKSB7DQogICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOw0KICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsNCiAgICB9DQogIH0sDQogIHJlbW92ZTogZnVuY3Rpb24obmFtZSkgew0KICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsNCiAgICBpZiAoaSA+PSAwKSB7DQogICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7DQogICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOw0KICAgIH0NCiAgfSwNCiAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsNCiAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiBjbGFzc2VkQWRkKG5vZGUsIG5hbWVzKSB7DQogIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7DQogIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7DQp9DQoNCmZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUobm9kZSwgbmFtZXMpIHsNCiAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTsNCn0NCg0KZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjbGFzc2VkRmFsc2UobmFtZXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIGNsYXNzZWRSZW1vdmUodGhpcywgbmFtZXMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24obmFtZXMsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQgOiBjbGFzc2VkUmVtb3ZlKSh0aGlzLCBuYW1lcyk7DQogIH07DQp9DQoNCnZhciBzZWxlY3Rpb25fY2xhc3NlZCA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsNCg0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsNCiAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsNCiAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOw0KICAgIHJldHVybiB0cnVlOw0KICB9DQoNCiAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICA/IGNsYXNzZWRGdW5jdGlvbiA6IHZhbHVlDQogICAgICA/IGNsYXNzZWRUcnVlDQogICAgICA6IGNsYXNzZWRGYWxzZSkobmFtZXMsIHZhbHVlKSk7DQp9Ow0KDQpmdW5jdGlvbiB0ZXh0UmVtb3ZlKCkgew0KICB0aGlzLnRleHRDb250ZW50ID0gIiI7DQp9DQoNCmZ1bmN0aW9uIHRleHRDb25zdGFudCh2YWx1ZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2Ow0KICB9Ow0KfQ0KDQp2YXIgc2VsZWN0aW9uX3RleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aA0KICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbA0KICAgICAgICAgID8gdGV4dFJlbW92ZSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IHRleHRGdW5jdGlvbg0KICAgICAgICAgIDogdGV4dENvbnN0YW50KSh2YWx1ZSkpDQogICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50Ow0KfTsNCg0KZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsNCiAgdGhpcy5pbm5lckhUTUwgPSAiIjsNCn0NCg0KZnVuY3Rpb24gaHRtbENvbnN0YW50KHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBodG1sRnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9odG1sID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwNCiAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iDQogICAgICAgICAgPyBodG1sRnVuY3Rpb24NCiAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKQ0KICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7DQp9Ow0KDQpmdW5jdGlvbiByYWlzZSgpIHsNCiAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9yYWlzZSA9IGZ1bmN0aW9uKCkgew0KICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsNCn07DQoNCmZ1bmN0aW9uIGxvd2VyKCkgew0KICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOw0KfQ0KDQp2YXIgc2VsZWN0aW9uX2xvd2VyID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOw0KfTsNCg0KdmFyIHNlbGVjdGlvbl9hcHBlbmQgPSBmdW5jdGlvbihuYW1lKSB7DQogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpOw0KICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOw0KICB9KTsNCn07DQoNCmZ1bmN0aW9uIGNvbnN0YW50TnVsbCgpIHsNCiAgcmV0dXJuIG51bGw7DQp9DQoNCnZhciBzZWxlY3Rpb25faW5zZXJ0ID0gZnVuY3Rpb24obmFtZSwgYmVmb3JlKSB7DQogIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yKG5hbWUpLA0KICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IoYmVmb3JlKTsNCiAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gcmVtb3ZlKCkgew0KICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOw0KICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7DQp9DQoNCnZhciBzZWxlY3Rpb25fcmVtb3ZlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlKTsNCn07DQoNCnZhciBzZWxlY3Rpb25fZGF0dW0gPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aA0KICAgICAgPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKQ0KICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsNCn07DQoNCmZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQobm9kZSwgdHlwZSwgcGFyYW1zKSB7DQogIHZhciB3aW5kb3cgPSBkZWZhdWx0Vmlldyhub2RlKSwNCiAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50Ow0KDQogIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsNCiAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOw0KICB9IGVsc2Ugew0KICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOw0KICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOw0KICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7DQogIH0NCg0KICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpOw0KfQ0KDQpmdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50KHR5cGUsIHBhcmFtcykgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQodGhpcywgdHlwZSwgcGFyYW1zKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsNCiAgfTsNCn0NCg0KdmFyIHNlbGVjdGlvbl9kaXNwYXRjaCA9IGZ1bmN0aW9uKHR5cGUsIHBhcmFtcykgew0KICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSAiZnVuY3Rpb24iDQogICAgICA/IGRpc3BhdGNoRnVuY3Rpb24NCiAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7DQp9Ow0KDQp2YXIgcm9vdCA9IFtudWxsXTsNCg0KZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykgew0KICB0aGlzLl9ncm91cHMgPSBncm91cHM7DQogIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOw0KfQ0KDQpmdW5jdGlvbiBzZWxlY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QpOw0KfQ0KDQpTZWxlY3Rpb24ucHJvdG90eXBlID0gc2VsZWN0aW9uLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFNlbGVjdGlvbiwNCiAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0LA0KICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwsDQogIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlciwNCiAgZGF0YTogc2VsZWN0aW9uX2RhdGEsDQogIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIsDQogIGV4aXQ6IHNlbGVjdGlvbl9leGl0LA0KICBtZXJnZTogc2VsZWN0aW9uX21lcmdlLA0KICBvcmRlcjogc2VsZWN0aW9uX29yZGVyLA0KICBzb3J0OiBzZWxlY3Rpb25fc29ydCwNCiAgY2FsbDogc2VsZWN0aW9uX2NhbGwsDQogIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMsDQogIG5vZGU6IHNlbGVjdGlvbl9ub2RlLA0KICBzaXplOiBzZWxlY3Rpb25fc2l6ZSwNCiAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSwNCiAgZWFjaDogc2VsZWN0aW9uX2VhY2gsDQogIGF0dHI6IHNlbGVjdGlvbl9hdHRyLA0KICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlLA0KICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5LA0KICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCwNCiAgdGV4dDogc2VsZWN0aW9uX3RleHQsDQogIGh0bWw6IHNlbGVjdGlvbl9odG1sLA0KICByYWlzZTogc2VsZWN0aW9uX3JhaXNlLA0KICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyLA0KICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQsDQogIGluc2VydDogc2VsZWN0aW9uX2luc2VydCwNCiAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlLA0KICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtLA0KICBvbjogc2VsZWN0aW9uX29uLA0KICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoDQp9Ow0KDQp2YXIgc2VsZWN0ID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCiAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQ0KICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7DQp9Ow0KDQp2YXIgc2VsZWN0QWxsID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsNCiAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyINCiAgICAgID8gbmV3IFNlbGVjdGlvbihbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkNCiAgICAgIDogbmV3IFNlbGVjdGlvbihbc2VsZWN0b3IgPT0gbnVsbCA/IFtdIDogc2VsZWN0b3JdLCByb290KTsNCn07DQoNCnZhciB0b3VjaCA9IGZ1bmN0aW9uKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7DQoNCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgew0KICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7DQogICAgICByZXR1cm4gcG9pbnQobm9kZSwgdG91Y2gpOw0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBudWxsOw0KfTsNCg0KdmFyIHRvdWNoZXMgPSBmdW5jdGlvbihub2RlLCB0b3VjaGVzKSB7DQogIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLnRvdWNoZXM7DQoNCiAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCBwb2ludHMgPSBuZXcgQXJyYXkobik7IGkgPCBuOyArK2kpIHsNCiAgICBwb2ludHNbaV0gPSBwb2ludChub2RlLCB0b3VjaGVzW2ldKTsNCiAgfQ0KDQogIHJldHVybiBwb2ludHM7DQp9Ow0KDQpleHBvcnRzLmNyZWF0b3IgPSBjcmVhdG9yOw0KZXhwb3J0cy5sb2NhbCA9IGxvY2FsOw0KZXhwb3J0cy5tYXRjaGVyID0gbWF0Y2hlciQxOw0KZXhwb3J0cy5tb3VzZSA9IG1vdXNlOw0KZXhwb3J0cy5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7DQpleHBvcnRzLm5hbWVzcGFjZXMgPSBuYW1lc3BhY2VzOw0KZXhwb3J0cy5zZWxlY3QgPSBzZWxlY3Q7DQpleHBvcnRzLnNlbGVjdEFsbCA9IHNlbGVjdEFsbDsNCmV4cG9ydHMuc2VsZWN0aW9uID0gc2VsZWN0aW9uOw0KZXhwb3J0cy5zZWxlY3RvciA9IHNlbGVjdG9yOw0KZXhwb3J0cy5zZWxlY3RvckFsbCA9IHNlbGVjdG9yQWxsOw0KZXhwb3J0cy5zdHlsZSA9IHN0eWxlVmFsdWU7DQpleHBvcnRzLnRvdWNoID0gdG91Y2g7DQpleHBvcnRzLnRvdWNoZXMgPSB0b3VjaGVzOw0KZXhwb3J0cy53aW5kb3cgPSBkZWZhdWx0VmlldzsNCmV4cG9ydHMuY3VzdG9tRXZlbnQgPSBjdXN0b21FdmVudDsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMTM6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy1zaGFwZS8gVmVyc2lvbiAxLjIuMC4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMsIHJlcXVpcmUoJ2QzLXBhdGgnKSkgOg0KCXR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2V4cG9ydHMnLCAnZDMtcGF0aCddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzKSk7DQp9KHRoaXMsIChmdW5jdGlvbiAoZXhwb3J0cyxkM1BhdGgpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgY29uc3RhbnQgPSBmdW5jdGlvbih4KSB7DQogIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHsNCiAgICByZXR1cm4geDsNCiAgfTsNCn07DQoNCnZhciBhYnMgPSBNYXRoLmFiczsNCnZhciBhdGFuMiA9IE1hdGguYXRhbjI7DQp2YXIgY29zID0gTWF0aC5jb3M7DQp2YXIgbWF4ID0gTWF0aC5tYXg7DQp2YXIgbWluID0gTWF0aC5taW47DQp2YXIgc2luID0gTWF0aC5zaW47DQp2YXIgc3FydCA9IE1hdGguc3FydDsNCg0KdmFyIGVwc2lsb24gPSAxZS0xMjsNCnZhciBwaSA9IE1hdGguUEk7DQp2YXIgaGFsZlBpID0gcGkgLyAyOw0KdmFyIHRhdSA9IDIgKiBwaTsNCg0KZnVuY3Rpb24gYWNvcyh4KSB7DQogIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSA6IE1hdGguYWNvcyh4KTsNCn0NCg0KZnVuY3Rpb24gYXNpbih4KSB7DQogIHJldHVybiB4ID49IDEgPyBoYWxmUGkgOiB4IDw9IC0xID8gLWhhbGZQaSA6IE1hdGguYXNpbih4KTsNCn0NCg0KZnVuY3Rpb24gYXJjSW5uZXJSYWRpdXMoZCkgew0KICByZXR1cm4gZC5pbm5lclJhZGl1czsNCn0NCg0KZnVuY3Rpb24gYXJjT3V0ZXJSYWRpdXMoZCkgew0KICByZXR1cm4gZC5vdXRlclJhZGl1czsNCn0NCg0KZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7DQogIHJldHVybiBkLnN0YXJ0QW5nbGU7DQp9DQoNCmZ1bmN0aW9uIGFyY0VuZEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQuZW5kQW5nbGU7DQp9DQoNCmZ1bmN0aW9uIGFyY1BhZEFuZ2xlKGQpIHsNCiAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhDQp9DQoNCmZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHsNCiAgdmFyIHgxMCA9IHgxIC0geDAsIHkxMCA9IHkxIC0geTAsDQogICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLA0KICAgICAgdCA9ICh4MzIgKiAoeTAgLSB5MikgLSB5MzIgKiAoeDAgLSB4MikpIC8gKHkzMiAqIHgxMCAtIHgzMiAqIHkxMCk7DQogIHJldHVybiBbeDAgKyB0ICogeDEwLCB5MCArIHQgKiB5MTBdOw0KfQ0KDQovLyBDb21wdXRlIHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGxpbmUgb2YgbGVuZ3RoIHJjLg0KLy8gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5odG1sDQpmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyh4MCwgeTAsIHgxLCB5MSwgcjEsIHJjLCBjdykgew0KICB2YXIgeDAxID0geDAgLSB4MSwNCiAgICAgIHkwMSA9IHkwIC0geTEsDQogICAgICBsbyA9IChjdyA/IHJjIDogLXJjKSAvIHNxcnQoeDAxICogeDAxICsgeTAxICogeTAxKSwNCiAgICAgIG94ID0gbG8gKiB5MDEsDQogICAgICBveSA9IC1sbyAqIHgwMSwNCiAgICAgIHgxMSA9IHgwICsgb3gsDQogICAgICB5MTEgPSB5MCArIG95LA0KICAgICAgeDEwID0geDEgKyBveCwNCiAgICAgIHkxMCA9IHkxICsgb3ksDQogICAgICB4MDAgPSAoeDExICsgeDEwKSAvIDIsDQogICAgICB5MDAgPSAoeTExICsgeTEwKSAvIDIsDQogICAgICBkeCA9IHgxMCAtIHgxMSwNCiAgICAgIGR5ID0geTEwIC0geTExLA0KICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeSwNCiAgICAgIHIgPSByMSAtIHJjLA0KICAgICAgRCA9IHgxMSAqIHkxMCAtIHgxMCAqIHkxMSwNCiAgICAgIGQgPSAoZHkgPCAwID8gLTEgOiAxKSAqIHNxcnQobWF4KDAsIHIgKiByICogZDIgLSBEICogRCkpLA0KICAgICAgY3gwID0gKEQgKiBkeSAtIGR4ICogZCkgLyBkMiwNCiAgICAgIGN5MCA9ICgtRCAqIGR4IC0gZHkgKiBkKSAvIGQyLA0KICAgICAgY3gxID0gKEQgKiBkeSArIGR4ICogZCkgLyBkMiwNCiAgICAgIGN5MSA9ICgtRCAqIGR4ICsgZHkgKiBkKSAvIGQyLA0KICAgICAgZHgwID0gY3gwIC0geDAwLA0KICAgICAgZHkwID0gY3kwIC0geTAwLA0KICAgICAgZHgxID0gY3gxIC0geDAwLA0KICAgICAgZHkxID0gY3kxIC0geTAwOw0KDQogIC8vIFBpY2sgdGhlIGNsb3NlciBvZiB0aGUgdHdvIGludGVyc2VjdGlvbiBwb2ludHMuDQogIC8vIFRPRE8gSXMgdGhlcmUgYSBmYXN0ZXIgd2F5IHRvIGRldGVybWluZSB3aGljaCBpbnRlcnNlY3Rpb24gdG8gdXNlPw0KICBpZiAoZHgwICogZHgwICsgZHkwICogZHkwID4gZHgxICogZHgxICsgZHkxICogZHkxKSBjeDAgPSBjeDEsIGN5MCA9IGN5MTsNCg0KICByZXR1cm4gew0KICAgIGN4OiBjeDAsDQogICAgY3k6IGN5MCwNCiAgICB4MDE6IC1veCwNCiAgICB5MDE6IC1veSwNCiAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSwNCiAgICB5MTE6IGN5MCAqIChyMSAvIHIgLSAxKQ0KICB9Ow0KfQ0KDQp2YXIgYXJjID0gZnVuY3Rpb24oKSB7DQogIHZhciBpbm5lclJhZGl1cyA9IGFyY0lubmVyUmFkaXVzLA0KICAgICAgb3V0ZXJSYWRpdXMgPSBhcmNPdXRlclJhZGl1cywNCiAgICAgIGNvcm5lclJhZGl1cyA9IGNvbnN0YW50KDApLA0KICAgICAgcGFkUmFkaXVzID0gbnVsbCwNCiAgICAgIHN0YXJ0QW5nbGUgPSBhcmNTdGFydEFuZ2xlLA0KICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSwNCiAgICAgIHBhZEFuZ2xlID0gYXJjUGFkQW5nbGUsDQogICAgICBjb250ZXh0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBhcmMoKSB7DQogICAgdmFyIGJ1ZmZlciwNCiAgICAgICAgciwNCiAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGksDQogICAgICAgIGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGhhbGZQaSwNCiAgICAgICAgZGEgPSBhYnMoYTEgLSBhMCksDQogICAgICAgIGN3ID0gYTEgPiBhMDsNCg0KICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IGQzUGF0aC5wYXRoKCk7DQoNCiAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLg0KICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsNCg0KICAgIC8vIElzIGl0IGEgcG9pbnQ/DQogICAgaWYgKCEocjEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7DQoNCiAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPw0KICAgIGVsc2UgaWYgKGRhID4gdGF1IC0gZXBzaWxvbikgew0KICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MoYTApLCByMSAqIHNpbihhMCkpOw0KICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGEwLCBhMSwgIWN3KTsNCiAgICAgIGlmIChyMCA+IGVwc2lsb24pIHsNCiAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MoYTEpLCByMCAqIHNpbihhMSkpOw0KICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEsIGEwLCBjdyk7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj8NCiAgICBlbHNlIHsNCiAgICAgIHZhciBhMDEgPSBhMCwNCiAgICAgICAgICBhMTEgPSBhMSwNCiAgICAgICAgICBhMDAgPSBhMCwNCiAgICAgICAgICBhMTAgPSBhMSwNCiAgICAgICAgICBkYTAgPSBkYSwNCiAgICAgICAgICBkYTEgPSBkYSwNCiAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLA0KICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbikgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQocjAgKiByMCArIHIxICogcjEpKSwNCiAgICAgICAgICByYyA9IG1pbihhYnMocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLA0KICAgICAgICAgIHJjMCA9IHJjLA0KICAgICAgICAgIHJjMSA9IHJjLA0KICAgICAgICAgIHQwLA0KICAgICAgICAgIHQxOw0KDQogICAgICAvLyBBcHBseSBwYWRkaW5nPyBOb3RlIHRoYXQgc2luY2UgcjEg4omlIHIwLCBkYTEg4omlIGRhMC4NCiAgICAgIGlmIChycCA+IGVwc2lsb24pIHsNCiAgICAgICAgdmFyIHAwID0gYXNpbihycCAvIHIwICogc2luKGFwKSksDQogICAgICAgICAgICBwMSA9IGFzaW4ocnAgLyByMSAqIHNpbihhcCkpOw0KICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbikgcDAgKj0gKGN3ID8gMSA6IC0xKSwgYTAwICs9IHAwLCBhMTAgLT0gcDA7DQogICAgICAgIGVsc2UgZGEwID0gMCwgYTAwID0gYTEwID0gKGEwICsgYTEpIC8gMjsNCiAgICAgICAgaWYgKChkYTEgLT0gcDEgKiAyKSA+IGVwc2lsb24pIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxOw0KICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7DQogICAgICB9DQoNCiAgICAgIHZhciB4MDEgPSByMSAqIGNvcyhhMDEpLA0KICAgICAgICAgIHkwMSA9IHIxICogc2luKGEwMSksDQogICAgICAgICAgeDEwID0gcjAgKiBjb3MoYTEwKSwNCiAgICAgICAgICB5MTAgPSByMCAqIHNpbihhMTApOw0KDQogICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBpZiAocmMgPiBlcHNpbG9uKSB7DQogICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyhhMTEpLA0KICAgICAgICAgICAgeTExID0gcjEgKiBzaW4oYTExKSwNCiAgICAgICAgICAgIHgwMCA9IHIwICogY29zKGEwMCksDQogICAgICAgICAgICB5MDAgPSByMCAqIHNpbihhMDApOw0KDQogICAgICAgIC8vIFJlc3RyaWN0IHRoZSBjb3JuZXIgcmFkaXVzIGFjY29yZGluZyB0byB0aGUgc2VjdG9yIGFuZ2xlLg0KICAgICAgICBpZiAoZGEgPCBwaSkgew0KICAgICAgICAgIHZhciBvYyA9IGRhMCA+IGVwc2lsb24gPyBpbnRlcnNlY3QoeDAxLCB5MDEsIHgwMCwgeTAwLCB4MTEsIHkxMSwgeDEwLCB5MTApIDogW3gxMCwgeTEwXSwNCiAgICAgICAgICAgICAgYXggPSB4MDEgLSBvY1swXSwNCiAgICAgICAgICAgICAgYXkgPSB5MDEgLSBvY1sxXSwNCiAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSwNCiAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwNCiAgICAgICAgICAgICAga2MgPSAxIC8gc2luKGFjb3MoKGF4ICogYnggKyBheSAqIGJ5KSAvIChzcXJ0KGF4ICogYXggKyBheSAqIGF5KSAqIHNxcnQoYnggKiBieCArIGJ5ICogYnkpKSkgLyAyKSwNCiAgICAgICAgICAgICAgbGMgPSBzcXJ0KG9jWzBdICogb2NbMF0gKyBvY1sxXSAqIG9jWzFdKTsNCiAgICAgICAgICByYzAgPSBtaW4ocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsNCiAgICAgICAgICByYzEgPSBtaW4ocmMsIChyMSAtIGxjKSAvIChrYyArIDEpKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICAvLyBJcyB0aGUgc2VjdG9yIGNvbGxhcHNlZCB0byBhIGxpbmU/DQogICAgICBpZiAoIShkYTEgPiBlcHNpbG9uKSkgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpOw0KDQogICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIG91dGVyIHJpbmcgaGF2ZSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBlbHNlIGlmIChyYzEgPiBlcHNpbG9uKSB7DQogICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDAwLCB5MDAsIHgwMSwgeTAxLCByMSwgcmMxLCBjdyk7DQogICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMoeDExLCB5MTEsIHgxMCwgeTEwLCByMSwgcmMxLCBjdyk7DQoNCiAgICAgICAgY29udGV4dC5tb3ZlVG8odDAuY3ggKyB0MC54MDEsIHQwLmN5ICsgdDAueTAxKTsNCg0KICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8NCiAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIodDAueTAxLCB0MC54MDEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7DQoNCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuDQogICAgICAgIGVsc2Ugew0KICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQwLnkxMSwgdDAueDExKSwgIWN3KTsNCiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYXRhbjIodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIodDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgIWN3KTsNCiAgICAgICAgICBjb250ZXh0LmFyYyh0MS5jeCwgdDEuY3ksIHJjMSwgYXRhbjIodDEueTExLCB0MS54MTEpLCBhdGFuMih0MS55MDEsIHQxLngwMSksICFjdyk7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgLy8gT3IgaXMgdGhlIG91dGVyIHJpbmcganVzdCBhIGNpcmN1bGFyIGFyYz8NCiAgICAgIGVsc2UgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpLCBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAxLCBhMTEsICFjdyk7DQoNCiAgICAgIC8vIElzIHRoZXJlIG5vIGlubmVyIHJpbmcsIGFuZCBpdOKAmXMgYSBjaXJjdWxhciBzZWN0b3I/DQogICAgICAvLyBPciBwZXJoYXBzIGl04oCZcyBhbiBhbm51bGFyIHNlY3RvciBjb2xsYXBzZWQgZHVlIHRvIHBhZGRpbmc/DQogICAgICBpZiAoIShyMCA+IGVwc2lsb24pIHx8ICEoZGEwID4gZXBzaWxvbikpIGNvbnRleHQubGluZVRvKHgxMCwgeTEwKTsNCg0KICAgICAgLy8gRG9lcyB0aGUgc2VjdG9y4oCZcyBpbm5lciByaW5nIChvciBwb2ludCkgaGF2ZSByb3VuZGVkIGNvcm5lcnM/DQogICAgICBlbHNlIGlmIChyYzAgPiBlcHNpbG9uKSB7DQogICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDEwLCB5MTAsIHgxMSwgeTExLCByMCwgLXJjMCwgY3cpOw0KICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgwMSwgeTAxLCB4MDAsIHkwMCwgcjAsIC1yYzAsIGN3KTsNCg0KICAgICAgICBjb250ZXh0LmxpbmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpOw0KDQogICAgICAgIC8vIEhhdmUgdGhlIGNvcm5lcnMgbWVyZ2VkPw0KICAgICAgICBpZiAocmMwIDwgcmMpIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMih0MC55MDEsIHQwLngwMSksIGF0YW4yKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsNCg0KICAgICAgICAvLyBPdGhlcndpc2UsIGRyYXcgdGhlIHR3byBjb3JuZXJzIGFuZCB0aGUgcmluZy4NCiAgICAgICAgZWxzZSB7DQogICAgICAgICAgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIodDAueTExLCB0MC54MTEpLCAhY3cpOw0KICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhdGFuMih0MC5jeSArIHQwLnkxMSwgdDAuY3ggKyB0MC54MTEpLCBhdGFuMih0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7DQogICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzAsIGF0YW4yKHQxLnkxMSwgdDEueDExKSwgYXRhbjIodDEueTAxLCB0MS54MDEpLCAhY3cpOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8vIE9yIGlzIHRoZSBpbm5lciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/DQogICAgICBlbHNlIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMTAsIGEwMCwgY3cpOw0KICAgIH0NCg0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7DQoNCiAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7DQogIH0NCg0KICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHsNCiAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsDQogICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSAvIDI7DQogICAgcmV0dXJuIFtjb3MoYSkgKiByLCBzaW4oYSkgKiByXTsNCiAgfTsNCg0KICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBpbm5lclJhZGl1czsNCiAgfTsNCg0KICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3V0ZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBvdXRlclJhZGl1czsNCiAgfTsNCg0KICBhcmMuY29ybmVyUmFkaXVzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvcm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1czsNCiAgfTsNCg0KICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGFyYykgOiBwYWRSYWRpdXM7DQogIH07DQoNCiAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJjKSA6IHN0YXJ0QW5nbGU7DQogIH07DQoNCiAgYXJjLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogZW5kQW5nbGU7DQogIH07DQoNCiAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmMpIDogcGFkQW5nbGU7DQogIH07DQoNCiAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGFyYykgOiBjb250ZXh0Ow0KICB9Ow0KDQogIHJldHVybiBhcmM7DQp9Ow0KDQpmdW5jdGlvbiBMaW5lYXIoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCn0NCg0KTGluZWFyLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkDQogICAgICBkZWZhdWx0OiB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsgYnJlYWs7DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgY3VydmVMaW5lYXIgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgTGluZWFyKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24geChwKSB7DQogIHJldHVybiBwWzBdOw0KfQ0KDQpmdW5jdGlvbiB5KHApIHsNCiAgcmV0dXJuIHBbMV07DQp9DQoNCnZhciBsaW5lID0gZnVuY3Rpb24oKSB7DQogIHZhciB4JCQxID0geCwNCiAgICAgIHkkJDEgPSB5LA0KICAgICAgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLA0KICAgICAgY29udGV4dCA9IG51bGwsDQogICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLA0KICAgICAgb3V0cHV0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBsaW5lKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBkLA0KICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLA0KICAgICAgICBidWZmZXI7DQoNCiAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBkM1BhdGgucGF0aCgpKTsNCg0KICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7DQogICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7DQogICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7DQogICAgICB9DQogICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreCQkMShkLCBpLCBkYXRhKSwgK3kkJDEoZCwgaSwgZGF0YSkpOw0KICAgIH0NCg0KICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOw0KICB9DQoNCiAgbGluZS54ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgkJDEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmUpIDogeCQkMTsNCiAgfTsNCg0KICBsaW5lLnkgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSQkMSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgbGluZSkgOiB5JCQxOw0KICB9Ow0KDQogIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoISFfKSwgbGluZSkgOiBkZWZpbmVkOw0KICB9Ow0KDQogIGxpbmUuY3VydmUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgbGluZSkgOiBjdXJ2ZTsNCiAgfTsNCg0KICBsaW5lLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gbGluZTsNCn07DQoNCnZhciBhcmVhID0gZnVuY3Rpb24oKSB7DQogIHZhciB4MCA9IHgsDQogICAgICB4MSA9IG51bGwsDQogICAgICB5MCA9IGNvbnN0YW50KDApLA0KICAgICAgeTEgPSB5LA0KICAgICAgZGVmaW5lZCA9IGNvbnN0YW50KHRydWUpLA0KICAgICAgY29udGV4dCA9IG51bGwsDQogICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyLA0KICAgICAgb3V0cHV0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBhcmVhKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgaiwNCiAgICAgICAgaywNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBkLA0KICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLA0KICAgICAgICBidWZmZXIsDQogICAgICAgIHgweiA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgeTB6ID0gbmV3IEFycmF5KG4pOw0KDQogICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gZDNQYXRoLnBhdGgoKSk7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkgew0KICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkgew0KICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsNCiAgICAgICAgICBqID0gaTsNCiAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7DQogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7DQogICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOw0KICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykgew0KICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTsNCiAgICAgICAgICB9DQogICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTsNCiAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpOw0KICAgICAgICB9DQogICAgICB9DQogICAgICBpZiAoZGVmaW5lZDApIHsNCiAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7DQogICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOw0KICB9DQoNCiAgZnVuY3Rpb24gYXJlYWxpbmUoKSB7DQogICAgcmV0dXJuIGxpbmUoKS5kZWZpbmVkKGRlZmluZWQpLmN1cnZlKGN1cnZlKS5jb250ZXh0KGNvbnRleHQpOw0KICB9DQoNCiAgYXJlYS54ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCB4MSA9IG51bGwsIGFyZWEpIDogeDA7DQogIH07DQoNCiAgYXJlYS54MCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MDsNCiAgfTsNCg0KICBhcmVhLngxID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgYXJlYSkgOiB4MTsNCiAgfTsNCg0KICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIHkxID0gbnVsbCwgYXJlYSkgOiB5MDsNCiAgfTsNCg0KICBhcmVhLnkwID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkwOw0KICB9Ow0KDQogIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBhcmVhKSA6IHkxOw0KICB9Ow0KDQogIGFyZWEubGluZVgwID0NCiAgYXJlYS5saW5lWTAgPSBmdW5jdGlvbigpIHsNCiAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKTsNCiAgfTsNCg0KICBhcmVhLmxpbmVZMSA9IGZ1bmN0aW9uKCkgew0KICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpOw0KICB9Ow0KDQogIGFyZWEubGluZVgxID0gZnVuY3Rpb24oKSB7DQogICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MSkueSh5MCk7DQogIH07DQoNCiAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCghIV8pLCBhcmVhKSA6IGRlZmluZWQ7DQogIH07DQoNCiAgYXJlYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBhcmVhKSA6IGN1cnZlOw0KICB9Ow0KDQogIGFyZWEuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgYXJlYSkgOiBjb250ZXh0Ow0KICB9Ow0KDQogIHJldHVybiBhcmVhOw0KfTsNCg0KdmFyIGRlc2NlbmRpbmcgPSBmdW5jdGlvbihhLCBiKSB7DQogIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsNCn07DQoNCnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKGQpIHsNCiAgcmV0dXJuIGQ7DQp9Ow0KDQp2YXIgcGllID0gZnVuY3Rpb24oKSB7DQogIHZhciB2YWx1ZSA9IGlkZW50aXR5LA0KICAgICAgc29ydFZhbHVlcyA9IGRlc2NlbmRpbmcsDQogICAgICBzb3J0ID0gbnVsbCwNCiAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCgwKSwNCiAgICAgIGVuZEFuZ2xlID0gY29uc3RhbnQodGF1KSwNCiAgICAgIHBhZEFuZ2xlID0gY29uc3RhbnQoMCk7DQoNCiAgZnVuY3Rpb24gcGllKGRhdGEpIHsNCiAgICB2YXIgaSwNCiAgICAgICAgbiA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBqLA0KICAgICAgICBrLA0KICAgICAgICBzdW0gPSAwLA0KICAgICAgICBpbmRleCA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgYXJjcyA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgYTAgPSArc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLA0KICAgICAgICBkYSA9IE1hdGgubWluKHRhdSwgTWF0aC5tYXgoLXRhdSwgZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGEwKSksDQogICAgICAgIGExLA0KICAgICAgICBwID0gTWF0aC5taW4oTWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksDQogICAgICAgIHBhID0gcCAqIChkYSA8IDAgPyAtMSA6IDEpLA0KICAgICAgICB2Ow0KDQogICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKCh2ID0gYXJjc1tpbmRleFtpXSA9IGldID0gK3ZhbHVlKGRhdGFbaV0sIGksIGRhdGEpKSA+IDApIHsNCiAgICAgICAgc3VtICs9IHY7DQogICAgICB9DQogICAgfQ0KDQogICAgLy8gT3B0aW9uYWxseSBzb3J0IHRoZSBhcmNzIGJ5IHByZXZpb3VzbHktY29tcHV0ZWQgdmFsdWVzIG9yIGJ5IGRhdGEuDQogICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0VmFsdWVzKGFyY3NbaV0sIGFyY3Nbal0pOyB9KTsNCiAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7DQoNCiAgICAvLyBDb21wdXRlIHRoZSBhcmNzISBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsIGRhdGEncyBvcmRlci4NCiAgICBmb3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ksIGEwID0gYTEpIHsNCiAgICAgIGogPSBpbmRleFtpXSwgdiA9IGFyY3Nbal0sIGExID0gYTAgKyAodiA+IDAgPyB2ICogayA6IDApICsgcGEsIGFyY3Nbal0gPSB7DQogICAgICAgIGRhdGE6IGRhdGFbal0sDQogICAgICAgIGluZGV4OiBpLA0KICAgICAgICB2YWx1ZTogdiwNCiAgICAgICAgc3RhcnRBbmdsZTogYTAsDQogICAgICAgIGVuZEFuZ2xlOiBhMSwNCiAgICAgICAgcGFkQW5nbGU6IHANCiAgICAgIH07DQogICAgfQ0KDQogICAgcmV0dXJuIGFyY3M7DQogIH0NCg0KICBwaWUudmFsdWUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIHBpZSkgOiB2YWx1ZTsNCiAgfTsNCg0KICBwaWUuc29ydFZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0VmFsdWVzID0gXywgc29ydCA9IG51bGwsIHBpZSkgOiBzb3J0VmFsdWVzOw0KICB9Ow0KDQogIHBpZS5zb3J0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQgPSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7DQogIH07DQoNCiAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgcGllKSA6IHN0YXJ0QW5nbGU7DQogIH07DQoNCiAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogZW5kQW5nbGU7DQogIH07DQoNCiAgcGllLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBwaWUpIDogcGFkQW5nbGU7DQogIH07DQoNCiAgcmV0dXJuIHBpZTsNCn07DQoNCnZhciBjdXJ2ZVJhZGlhbExpbmVhciA9IGN1cnZlUmFkaWFsKGN1cnZlTGluZWFyKTsNCg0KZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7DQogIHRoaXMuX2N1cnZlID0gY3VydmU7DQp9DQoNClJhZGlhbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fY3VydmUuYXJlYVN0YXJ0KCk7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2N1cnZlLmFyZWFFbmQoKTsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKTsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fY3VydmUubGluZUVuZCgpOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oYSwgcikgew0KICAgIHRoaXMuX2N1cnZlLnBvaW50KHIgKiBNYXRoLnNpbihhKSwgciAqIC1NYXRoLmNvcyhhKSk7DQogIH0NCn07DQoNCmZ1bmN0aW9uIGN1cnZlUmFkaWFsKGN1cnZlKSB7DQoNCiAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsNCiAgICByZXR1cm4gbmV3IFJhZGlhbChjdXJ2ZShjb250ZXh0KSk7DQogIH0NCg0KICByYWRpYWwuX2N1cnZlID0gY3VydmU7DQoNCiAgcmV0dXJuIHJhZGlhbDsNCn0NCg0KZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7DQogIHZhciBjID0gbC5jdXJ2ZTsNCg0KICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54Ow0KICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTsNCg0KICBsLmN1cnZlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gYyhjdXJ2ZVJhZGlhbChfKSkgOiBjKCkuX2N1cnZlOw0KICB9Ow0KDQogIHJldHVybiBsOw0KfQ0KDQp2YXIgbGluZVJhZGlhbCQxID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBsaW5lUmFkaWFsKGxpbmUoKS5jdXJ2ZShjdXJ2ZVJhZGlhbExpbmVhcikpOw0KfTsNCg0KdmFyIGFyZWFSYWRpYWwgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGEgPSBhcmVhKCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIpLA0KICAgICAgYyA9IGEuY3VydmUsDQogICAgICB4MCA9IGEubGluZVgwLA0KICAgICAgeDEgPSBhLmxpbmVYMSwNCiAgICAgIHkwID0gYS5saW5lWTAsDQogICAgICB5MSA9IGEubGluZVkxOw0KDQogIGEuYW5nbGUgPSBhLngsIGRlbGV0ZSBhLng7DQogIGEuc3RhcnRBbmdsZSA9IGEueDAsIGRlbGV0ZSBhLngwOw0KICBhLmVuZEFuZ2xlID0gYS54MSwgZGVsZXRlIGEueDE7DQogIGEucmFkaXVzID0gYS55LCBkZWxldGUgYS55Ow0KICBhLmlubmVyUmFkaXVzID0gYS55MCwgZGVsZXRlIGEueTA7DQogIGEub3V0ZXJSYWRpdXMgPSBhLnkxLCBkZWxldGUgYS55MTsNCiAgYS5saW5lU3RhcnRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwOw0KICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh4MSgpKTsgfSwgZGVsZXRlIGEubGluZVgxOw0KICBhLmxpbmVJbm5lclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MCgpKTsgfSwgZGVsZXRlIGEubGluZVkwOw0KICBhLmxpbmVPdXRlclJhZGl1cyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCh5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOw0KDQogIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7DQogIH07DQoNCiAgcmV0dXJuIGE7DQp9Ow0KDQp2YXIgcG9pbnRSYWRpYWwgPSBmdW5jdGlvbih4LCB5KSB7DQogIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTsNCn07DQoNCnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsNCg0KZnVuY3Rpb24gbGlua1NvdXJjZShkKSB7DQogIHJldHVybiBkLnNvdXJjZTsNCn0NCg0KZnVuY3Rpb24gbGlua1RhcmdldChkKSB7DQogIHJldHVybiBkLnRhcmdldDsNCn0NCg0KZnVuY3Rpb24gbGluayhjdXJ2ZSkgew0KICB2YXIgc291cmNlID0gbGlua1NvdXJjZSwNCiAgICAgIHRhcmdldCA9IGxpbmtUYXJnZXQsDQogICAgICB4JCQxID0geCwNCiAgICAgIHkkJDEgPSB5LA0KICAgICAgY29udGV4dCA9IG51bGw7DQoNCiAgZnVuY3Rpb24gbGluaygpIHsNCiAgICB2YXIgYnVmZmVyLCBhcmd2ID0gc2xpY2UuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpOw0KICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IGQzUGF0aC5wYXRoKCk7DQogICAgY3VydmUoY29udGV4dCwgK3gkJDEuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5JCQxLmFwcGx5KHRoaXMsIGFyZ3YpLCAreCQkMS5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kkJDEuYXBwbHkodGhpcywgYXJndikpOw0KICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsNCiAgfQ0KDQogIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIGxpbmspIDogc291cmNlOw0KICB9Ow0KDQogIGxpbmsudGFyZ2V0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRhcmdldCA9IF8sIGxpbmspIDogdGFyZ2V0Ow0KICB9Ow0KDQogIGxpbmsueCA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4JCQxID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoK18pLCBsaW5rKSA6IHgkJDE7DQogIH07DQoNCiAgbGluay55ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkkJDEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCgrXyksIGxpbmspIDogeSQkMTsNCiAgfTsNCg0KICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gbGluazsNCn0NCg0KZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7DQogIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7DQogIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7DQp9DQoNCmZ1bmN0aW9uIGN1cnZlVmVydGljYWwoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHsNCiAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsNCiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwLCB5MCA9ICh5MCArIHkxKSAvIDIsIHgxLCB5MCwgeDEsIHkxKTsNCn0NCg0KZnVuY3Rpb24gY3VydmVSYWRpYWwkMShjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkgew0KICB2YXIgcDAgPSBwb2ludFJhZGlhbCh4MCwgeTApLA0KICAgICAgcDEgPSBwb2ludFJhZGlhbCh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyKSwNCiAgICAgIHAyID0gcG9pbnRSYWRpYWwoeDEsIHkwKSwNCiAgICAgIHAzID0gcG9pbnRSYWRpYWwoeDEsIHkxKTsNCiAgY29udGV4dC5tb3ZlVG8ocDBbMF0sIHAwWzFdKTsNCiAgY29udGV4dC5iZXppZXJDdXJ2ZVRvKHAxWzBdLCBwMVsxXSwgcDJbMF0sIHAyWzFdLCBwM1swXSwgcDNbMV0pOw0KfQ0KDQpmdW5jdGlvbiBsaW5rSG9yaXpvbnRhbCgpIHsNCiAgcmV0dXJuIGxpbmsoY3VydmVIb3Jpem9udGFsKTsNCn0NCg0KZnVuY3Rpb24gbGlua1ZlcnRpY2FsKCkgew0KICByZXR1cm4gbGluayhjdXJ2ZVZlcnRpY2FsKTsNCn0NCg0KZnVuY3Rpb24gbGlua1JhZGlhbCgpIHsNCiAgdmFyIGwgPSBsaW5rKGN1cnZlUmFkaWFsJDEpOw0KICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54Ow0KICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTsNCiAgcmV0dXJuIGw7DQp9DQoNCnZhciBjaXJjbGUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gcGkpOw0KICAgIGNvbnRleHQubW92ZVRvKHIsIDApOw0KICAgIGNvbnRleHQuYXJjKDAsIDAsIHIsIDAsIHRhdSk7DQogIH0NCn07DQoNCnZhciBjcm9zcyA9IHsNCiAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgew0KICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyA1KSAvIDI7DQogICAgY29udGV4dC5tb3ZlVG8oLTMgKiByLCAtcik7DQogICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsNCiAgICBjb250ZXh0LmxpbmVUbygtciwgLTMgKiByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCAtMyAqIHIpOw0KICAgIGNvbnRleHQubGluZVRvKHIsIC1yKTsNCiAgICBjb250ZXh0LmxpbmVUbygzICogciwgLXIpOw0KICAgIGNvbnRleHQubGluZVRvKDMgKiByLCByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsNCiAgICBjb250ZXh0LmxpbmVUbyhyLCAzICogcik7DQogICAgY29udGV4dC5saW5lVG8oLXIsIDMgKiByKTsNCiAgICBjb250ZXh0LmxpbmVUbygtciwgcik7DQogICAgY29udGV4dC5saW5lVG8oLTMgKiByLCByKTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpOw0KdmFyIHRhbjMwXzIgPSB0YW4zMCAqIDI7DQoNCnZhciBkaWFtb25kID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHkgPSBNYXRoLnNxcnQoc2l6ZSAvIHRhbjMwXzIpLA0KICAgICAgICB4ID0geSAqIHRhbjMwOw0KICAgIGNvbnRleHQubW92ZVRvKDAsIC15KTsNCiAgICBjb250ZXh0LmxpbmVUbyh4LCAwKTsNCiAgICBjb250ZXh0LmxpbmVUbygwLCB5KTsNCiAgICBjb250ZXh0LmxpbmVUbygteCwgMCk7DQogICAgY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgfQ0KfTsNCg0KdmFyIGthID0gMC44OTA4MTMwOTE1MjkyODUyMjgxMDsNCnZhciBrciA9IE1hdGguc2luKHBpIC8gMTApIC8gTWF0aC5zaW4oNyAqIHBpIC8gMTApOw0KdmFyIGt4ID0gTWF0aC5zaW4odGF1IC8gMTApICoga3I7DQp2YXIga3kgPSAtTWF0aC5jb3ModGF1IC8gMTApICoga3I7DQoNCnZhciBzdGFyID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAqIGthKSwNCiAgICAgICAgeCA9IGt4ICogciwNCiAgICAgICAgeSA9IGt5ICogcjsNCiAgICBjb250ZXh0Lm1vdmVUbygwLCAtcik7DQogICAgY29udGV4dC5saW5lVG8oeCwgeSk7DQogICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyArK2kpIHsNCiAgICAgIHZhciBhID0gdGF1ICogaSAvIDUsDQogICAgICAgICAgYyA9IE1hdGguY29zKGEpLA0KICAgICAgICAgIHMgPSBNYXRoLnNpbihhKTsNCiAgICAgIGNvbnRleHQubGluZVRvKHMgKiByLCAtYyAqIHIpOw0KICAgICAgY29udGV4dC5saW5lVG8oYyAqIHggLSBzICogeSwgcyAqIHggKyBjICogeSk7DQogICAgfQ0KICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7DQogIH0NCn07DQoNCnZhciBzcXVhcmUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSwNCiAgICAgICAgeCA9IC13IC8gMjsNCiAgICBjb250ZXh0LnJlY3QoeCwgeCwgdywgdyk7DQogIH0NCn07DQoNCnZhciBzcXJ0MyA9IE1hdGguc3FydCgzKTsNCg0KdmFyIHRyaWFuZ2xlID0gew0KICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7DQogICAgdmFyIHkgPSAtTWF0aC5zcXJ0KHNpemUgLyAoc3FydDMgKiAzKSk7DQogICAgY29udGV4dC5tb3ZlVG8oMCwgeSAqIDIpOw0KICAgIGNvbnRleHQubGluZVRvKC1zcXJ0MyAqIHksIC15KTsNCiAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyAqIHksIC15KTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgYyA9IC0wLjU7DQp2YXIgcyA9IE1hdGguc3FydCgzKSAvIDI7DQp2YXIgayA9IDEgLyBNYXRoLnNxcnQoMTIpOw0KdmFyIGEgPSAoayAvIDIgKyAxKSAqIDM7DQoNCnZhciB3eWUgPSB7DQogIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsNCiAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSksDQogICAgICAgIHgwID0gciAvIDIsDQogICAgICAgIHkwID0gciAqIGssDQogICAgICAgIHgxID0geDAsDQogICAgICAgIHkxID0gciAqIGsgKyByLA0KICAgICAgICB4MiA9IC14MSwNCiAgICAgICAgeTIgPSB5MTsNCiAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOw0KICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7DQogICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTsNCiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMgKiB5MCk7DQogICAgY29udGV4dC5saW5lVG8oYyAqIHgxIC0gcyAqIHkxLCBzICogeDEgKyBjICogeTEpOw0KICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiAtIHMgKiB5MiwgcyAqIHgyICsgYyAqIHkyKTsNCiAgICBjb250ZXh0LmxpbmVUbyhjICogeDAgKyBzICogeTAsIGMgKiB5MCAtIHMgKiB4MCk7DQogICAgY29udGV4dC5saW5lVG8oYyAqIHgxICsgcyAqIHkxLCBjICogeTEgLSBzICogeDEpOw0KICAgIGNvbnRleHQubGluZVRvKGMgKiB4MiArIHMgKiB5MiwgYyAqIHkyIC0gcyAqIHgyKTsNCiAgICBjb250ZXh0LmNsb3NlUGF0aCgpOw0KICB9DQp9Ow0KDQp2YXIgc3ltYm9scyA9IFsNCiAgY2lyY2xlLA0KICBjcm9zcywNCiAgZGlhbW9uZCwNCiAgc3F1YXJlLA0KICBzdGFyLA0KICB0cmlhbmdsZSwNCiAgd3llDQpdOw0KDQp2YXIgc3ltYm9sID0gZnVuY3Rpb24oKSB7DQogIHZhciB0eXBlID0gY29uc3RhbnQoY2lyY2xlKSwNCiAgICAgIHNpemUgPSBjb25zdGFudCg2NCksDQogICAgICBjb250ZXh0ID0gbnVsbDsNCg0KICBmdW5jdGlvbiBzeW1ib2woKSB7DQogICAgdmFyIGJ1ZmZlcjsNCiAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBkM1BhdGgucGF0aCgpOw0KICAgIHR5cGUuYXBwbHkodGhpcywgYXJndW1lbnRzKS5kcmF3KGNvbnRleHQsICtzaXplLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOw0KICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsNCiAgfQ0KDQogIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChfKSwgc3ltYm9sKSA6IHR5cGU7DQogIH07DQoNCiAgc3ltYm9sLnNpemUgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2l6ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgc3ltYm9sKSA6IHNpemU7DQogIH07DQoNCiAgc3ltYm9sLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfLCBzeW1ib2wpIDogY29udGV4dDsNCiAgfTsNCg0KICByZXR1cm4gc3ltYm9sOw0KfTsNCg0KdmFyIG5vb3AgPSBmdW5jdGlvbigpIHt9Ow0KDQpmdW5jdGlvbiBwb2ludCh0aGF0LCB4LCB5KSB7DQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygNCiAgICAoMiAqIHRoYXQuX3gwICsgdGhhdC5feDEpIC8gMywNCiAgICAoMiAqIHRoYXQuX3kwICsgdGhhdC5feTEpIC8gMywNCiAgICAodGhhdC5feDAgKyAyICogdGhhdC5feDEpIC8gMywNCiAgICAodGhhdC5feTAgKyAyICogdGhhdC5feTEpIC8gMywNCiAgICAodGhhdC5feDAgKyA0ICogdGhhdC5feDEgKyB4KSAvIDYsDQogICAgKHRoYXQuX3kwICsgNCAqIHRoYXQuX3kxICsgeSkgLyA2DQogICk7DQp9DQoNCmZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCkJhc2lzLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOOw0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAzOiBwb2ludCh0aGlzLCB0aGlzLl94MSwgdGhpcy5feTEpOyAvLyBwcm9jZWVkDQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgIH0NCiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7DQogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fY29udGV4dC5saW5lVG8oKDUgKiB0aGlzLl94MCArIHRoaXMuX3gxKSAvIDYsICg1ICogdGhpcy5feTAgKyB0aGlzLl95MSkgLyA2KTsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgYmFzaXMgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgQmFzaXMoY29udGV4dCk7DQp9Ow0KDQpmdW5jdGlvbiBCYXNpc0Nsb3NlZChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpCYXNpc0Nsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gTmFOOw0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAxOiB7DQogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7DQogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgY2FzZSAyOiB7DQogICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MiArIDIgKiB0aGlzLl94MykgLyAzLCAodGhpcy5feTIgKyAyICogdGhpcy5feTMpIC8gMyk7DQogICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MyArIDIgKiB0aGlzLl94MikgLyAzLCAodGhpcy5feTMgKyAyICogdGhpcy5feTIpIC8gMyk7DQogICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgICAgY2FzZSAzOiB7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDIgPSB4LCB0aGlzLl95MiA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsNCiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geTsgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDYpOyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50KHRoaXMsIHgsIHkpOyBicmVhazsNCiAgICB9DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4Ow0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsNCiAgfQ0KfTsNCg0KdmFyIGJhc2lzQ2xvc2VkID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24gQmFzaXNPcGVuKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCkJhc2lzT3Blbi5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHZhciB4MCA9ICh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgeTAgPSAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDY7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MCwgeTApIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgYmFzaXNPcGVuID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTsNCn07DQoNCmZ1bmN0aW9uIEJ1bmRsZShjb250ZXh0LCBiZXRhKSB7DQogIHRoaXMuX2Jhc2lzID0gbmV3IEJhc2lzKGNvbnRleHQpOw0KICB0aGlzLl9iZXRhID0gYmV0YTsNCn0NCg0KQnVuZGxlLnByb3RvdHlwZSA9IHsNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94ID0gW107DQogICAgdGhpcy5feSA9IFtdOw0KICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICB2YXIgeCA9IHRoaXMuX3gsDQogICAgICAgIHkgPSB0aGlzLl95LA0KICAgICAgICBqID0geC5sZW5ndGggLSAxOw0KDQogICAgaWYgKGogPiAwKSB7DQogICAgICB2YXIgeDAgPSB4WzBdLA0KICAgICAgICAgIHkwID0geVswXSwNCiAgICAgICAgICBkeCA9IHhbal0gLSB4MCwNCiAgICAgICAgICBkeSA9IHlbal0gLSB5MCwNCiAgICAgICAgICBpID0gLTEsDQogICAgICAgICAgdDsNCg0KICAgICAgd2hpbGUgKCsraSA8PSBqKSB7DQogICAgICAgIHQgPSBpIC8gajsNCiAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoDQogICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSwNCiAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpDQogICAgICAgICk7DQogICAgICB9DQogICAgfQ0KDQogICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsOw0KICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB0aGlzLl94LnB1c2goK3gpOw0KICAgIHRoaXMuX3kucHVzaCgreSk7DQogIH0NCn07DQoNCnZhciBidW5kbGUgPSAoKGZ1bmN0aW9uIGN1c3RvbShiZXRhKSB7DQoNCiAgZnVuY3Rpb24gYnVuZGxlKGNvbnRleHQpIHsNCiAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNpcyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7DQogIH0NCg0KICBidW5kbGUuYmV0YSA9IGZ1bmN0aW9uKGJldGEpIHsNCiAgICByZXR1cm4gY3VzdG9tKCtiZXRhKTsNCiAgfTsNCg0KICByZXR1cm4gYnVuZGxlOw0KfSkpKDAuODUpOw0KDQpmdW5jdGlvbiBwb2ludCQxKHRoYXQsIHgsIHkpIHsNCiAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKA0KICAgIHRoYXQuX3gxICsgdGhhdC5fayAqICh0aGF0Ll94MiAtIHRoYXQuX3gwKSwNCiAgICB0aGF0Ll95MSArIHRoYXQuX2sgKiAodGhhdC5feTIgLSB0aGF0Ll95MCksDQogICAgdGhhdC5feDIgKyB0aGF0Ll9rICogKHRoYXQuX3gxIC0geCksDQogICAgdGhhdC5feTIgKyB0aGF0Ll9rICogKHRoYXQuX3kxIC0geSksDQogICAgdGhhdC5feDIsDQogICAgdGhhdC5feTINCiAgKTsNCn0NCg0KZnVuY3Rpb24gQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbikgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Ow0KfQ0KDQpDYXJkaW5hbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOw0KICAgICAgY2FzZSAzOiBwb2ludCQxKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgIH0NCiAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDEodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2FyZGluYWwgPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbik7DQogIH0NCg0KICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgew0KICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOw0KICB9Ow0KDQogIHJldHVybiBjYXJkaW5hbDsNCn0pKSgwKTsNCg0KZnVuY3Rpb24gQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbikgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fayA9ICgxIC0gdGVuc2lvbikgLyA2Ow0KfQ0KDQpDYXJkaW5hbENsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMTogew0KICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICAgIGNhc2UgMjogew0KICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICAgIGNhc2UgMzogew0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NSwgdGhpcy5feTUpOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g1ID0geCwgdGhpcy5feTUgPSB5OyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDEodGhpcywgeCwgeSk7IGJyZWFrOw0KICAgIH0NCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2FyZGluYWxDbG9zZWQgPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQoY29udGV4dCwgdGVuc2lvbik7DQogIH0NCg0KICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgew0KICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOw0KICB9Ow0KDQogIHJldHVybiBjYXJkaW5hbDsNCn0pKSgwKTsNCg0KZnVuY3Rpb24gQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQogIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsNCn0NCg0KQ2FyZGluYWxPcGVuLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQkMSh0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsNCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7DQogIH0NCn07DQoNCnZhciBjYXJkaW5hbE9wZW4gPSAoKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7DQoNCiAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgew0KICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pOw0KICB9DQoNCiAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsNCiAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsNCiAgfTsNCg0KICByZXR1cm4gY2FyZGluYWw7DQp9KSkoMCk7DQoNCmZ1bmN0aW9uIHBvaW50JDIodGhhdCwgeCwgeSkgew0KICB2YXIgeDEgPSB0aGF0Ll94MSwNCiAgICAgIHkxID0gdGhhdC5feTEsDQogICAgICB4MiA9IHRoYXQuX3gyLA0KICAgICAgeTIgPSB0aGF0Ll95MjsNCg0KICBpZiAodGhhdC5fbDAxX2EgPiBlcHNpbG9uKSB7DQogICAgdmFyIGEgPSAyICogdGhhdC5fbDAxXzJhICsgMyAqIHRoYXQuX2wwMV9hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsDQogICAgICAgIG4gPSAzICogdGhhdC5fbDAxX2EgKiAodGhhdC5fbDAxX2EgKyB0aGF0Ll9sMTJfYSk7DQogICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuOw0KICAgIHkxID0gKHkxICogYSAtIHRoYXQuX3kwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feTIgKiB0aGF0Ll9sMDFfMmEpIC8gbjsNCiAgfQ0KDQogIGlmICh0aGF0Ll9sMjNfYSA+IGVwc2lsb24pIHsNCiAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwNCiAgICAgICAgbSA9IDMgKiB0aGF0Ll9sMjNfYSAqICh0aGF0Ll9sMjNfYSArIHRoYXQuX2wxMl9hKTsNCiAgICB4MiA9ICh4MiAqIGIgKyB0aGF0Ll94MSAqIHRoYXQuX2wyM18yYSAtIHggKiB0aGF0Ll9sMTJfMmEpIC8gbTsNCiAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTsNCiAgfQ0KDQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsNCn0NCg0KZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fYWxwaGEgPSBhbHBoYTsNCn0NCg0KQ2F0bXVsbFJvbS5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0NCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQ0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsNCiAgICAgIGNhc2UgMzogdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsNCiAgICB9DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCg0KICAgIGlmICh0aGlzLl9wb2ludCkgew0KICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwNCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7DQogICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7DQogICAgfQ0KDQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsNCiAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsNCiAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkDQogICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsNCiAgICB9DQoNCiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hLCB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hOw0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSwgdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhOw0KICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsNCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7DQogIH0NCn07DQoNCnZhciBjYXRtdWxsUm9tID0gKChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsNCg0KICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHsNCiAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWwoY29udGV4dCwgMCk7DQogIH0NCg0KICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsNCiAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7DQogIH07DQoNCiAgcmV0dXJuIGNhdG11bGxSb207DQp9KSkoMC41KTsNCg0KZnVuY3Rpb24gQ2F0bXVsbFJvbUNsb3NlZChjb250ZXh0LCBhbHBoYSkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCiAgdGhpcy5fYWxwaGEgPSBhbHBoYTsNCn0NCg0KQ2F0bXVsbFJvbUNsb3NlZC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogbm9vcCwNCiAgYXJlYUVuZDogbm9vcCwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPQ0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsNCiAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQ0KICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDE6IHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTsNCiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICBjYXNlIDI6IHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsNCiAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgICBjYXNlIDM6IHsNCiAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOw0KICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7DQogICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTsNCiAgICAgICAgYnJlYWs7DQogICAgICB9DQogICAgfQ0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KDQogICAgaWYgKHRoaXMuX3BvaW50KSB7DQogICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LA0KICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsNCiAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsNCiAgICB9DQoNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDMgPSB4LCB0aGlzLl95MyA9IHk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5KTsgYnJlYWs7DQogICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOw0KICAgICAgZGVmYXVsdDogcG9pbnQkMih0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsNCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2F0bXVsbFJvbUNsb3NlZCA9ICgoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7DQoNCiAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7DQogICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIDApOw0KICB9DQoNCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7DQogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOw0KICB9Ow0KDQogIHJldHVybiBjYXRtdWxsUm9tOw0KfSkpKDAuNSk7DQoNCmZ1bmN0aW9uIENhdG11bGxSb21PcGVuKGNvbnRleHQsIGFscGhhKSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KICB0aGlzLl9hbHBoYSA9IGFscGhhOw0KfQ0KDQpDYXRtdWxsUm9tT3Blbi5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0NCiAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47DQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0NCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQ0KICAgIHRoaXMuX3BvaW50ID0gMDsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgfSwNCiAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsNCiAgICB4ID0gK3gsIHkgPSAreTsNCg0KICAgIGlmICh0aGlzLl9wb2ludCkgew0KICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwNCiAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7DQogICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7DQogICAgfQ0KDQogICAgc3dpdGNoICh0aGlzLl9wb2ludCkgew0KICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7DQogICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogcG9pbnQkMih0aGlzLCB4LCB5KTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsNCiAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsNCiAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5Ow0KICB9DQp9Ow0KDQp2YXIgY2F0bXVsbFJvbU9wZW4gPSAoKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgew0KDQogIGZ1bmN0aW9uIGNhdG11bGxSb20oY29udGV4dCkgew0KICAgIHJldHVybiBhbHBoYSA/IG5ldyBDYXRtdWxsUm9tT3Blbihjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIDApOw0KICB9DQoNCiAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7DQogICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOw0KICB9Ow0KDQogIHJldHVybiBjYXRtdWxsUm9tOw0KfSkpKDAuNSk7DQoNCmZ1bmN0aW9uIExpbmVhckNsb3NlZChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpMaW5lYXJDbG9zZWQucHJvdG90eXBlID0gew0KICBhcmVhU3RhcnQ6IG5vb3AsDQogIGFyZWFFbmQ6IG5vb3AsDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsNCiAgICBlbHNlIHRoaXMuX3BvaW50ID0gMSwgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7DQogIH0NCn07DQoNCnZhciBsaW5lYXJDbG9zZWQgPSBmdW5jdGlvbihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgTGluZWFyQ2xvc2VkKGNvbnRleHQpOw0KfTsNCg0KZnVuY3Rpb24gc2lnbih4KSB7DQogIHJldHVybiB4IDwgMCA/IC0xIDogMTsNCn0NCg0KLy8gQ2FsY3VsYXRlIHRoZSBzbG9wZXMgb2YgdGhlIHRhbmdlbnRzIChIZXJtaXRlLXR5cGUgaW50ZXJwb2xhdGlvbikgYmFzZWQgb24NCi8vIHRoZSBmb2xsb3dpbmcgcGFwZXI6IFN0ZWZmZW4sIE0uIDE5OTAuIEEgU2ltcGxlIE1ldGhvZCBmb3IgTW9ub3RvbmljDQovLyBJbnRlcnBvbGF0aW9uIGluIE9uZSBEaW1lbnNpb24uIEFzdHJvbm9teSBhbmQgQXN0cm9waHlzaWNzLCBWb2wuIDIzOSwgTk8uDQovLyBOT1YoSUkpLCBQLiA0NDMsIDE5OTAuDQpmdW5jdGlvbiBzbG9wZTModGhhdCwgeDIsIHkyKSB7DQogIHZhciBoMCA9IHRoYXQuX3gxIC0gdGhhdC5feDAsDQogICAgICBoMSA9IHgyIC0gdGhhdC5feDEsDQogICAgICBzMCA9ICh0aGF0Ll95MSAtIHRoYXQuX3kwKSAvIChoMCB8fCBoMSA8IDAgJiYgLTApLA0KICAgICAgczEgPSAoeTIgLSB0aGF0Ll95MSkgLyAoaDEgfHwgaDAgPCAwICYmIC0wKSwNCiAgICAgIHAgPSAoczAgKiBoMSArIHMxICogaDApIC8gKGgwICsgaDEpOw0KICByZXR1cm4gKHNpZ24oczApICsgc2lnbihzMSkpICogTWF0aC5taW4oTWF0aC5hYnMoczApLCBNYXRoLmFicyhzMSksIDAuNSAqIE1hdGguYWJzKHApKSB8fCAwOw0KfQ0KDQovLyBDYWxjdWxhdGUgYSBvbmUtc2lkZWQgc2xvcGUuDQpmdW5jdGlvbiBzbG9wZTIodGhhdCwgdCkgew0KICB2YXIgaCA9IHRoYXQuX3gxIC0gdGhhdC5feDA7DQogIHJldHVybiBoID8gKDMgKiAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyBoIC0gdCkgLyAyIDogdDsNCn0NCg0KLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lI1JlcHJlc2VudGF0aW9ucw0KLy8gInlvdSBjYW4gZXhwcmVzcyBjdWJpYyBIZXJtaXRlIGludGVycG9sYXRpb24gaW4gdGVybXMgb2YgY3ViaWMgQsOpemllciBjdXJ2ZXMNCi8vIHdpdGggcmVzcGVjdCB0byB0aGUgZm91ciB2YWx1ZXMgcDAsIHAwICsgbTAgLyAzLCBwMSAtIG0xIC8gMywgcDEiLg0KZnVuY3Rpb24gcG9pbnQkMyh0aGF0LCB0MCwgdDEpIHsNCiAgdmFyIHgwID0gdGhhdC5feDAsDQogICAgICB5MCA9IHRoYXQuX3kwLA0KICAgICAgeDEgPSB0aGF0Ll94MSwNCiAgICAgIHkxID0gdGhhdC5feTEsDQogICAgICBkeCA9ICh4MSAtIHgwKSAvIDM7DQogIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0MSwgeDEsIHkxKTsNCn0NCg0KZnVuY3Rpb24gTW9ub3RvbmVYKGNvbnRleHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQp9DQoNCk1vbm90b25lWC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feDAgPSB0aGlzLl94MSA9DQogICAgdGhpcy5feTAgPSB0aGlzLl95MSA9DQogICAgdGhpcy5fdDAgPSBOYU47DQogICAgdGhpcy5fcG9pbnQgPSAwOw0KICB9LA0KICBsaW5lRW5kOiBmdW5jdGlvbigpIHsNCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOw0KICAgICAgY2FzZSAzOiBwb2ludCQzKHRoaXMsIHRoaXMuX3QwLCBzbG9wZTIodGhpcywgdGhpcy5fdDApKTsgYnJlYWs7DQogICAgfQ0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsNCiAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgdmFyIHQxID0gTmFOOw0KDQogICAgeCA9ICt4LCB5ID0gK3k7DQogICAgaWYgKHggPT09IHRoaXMuX3gxICYmIHkgPT09IHRoaXMuX3kxKSByZXR1cm47IC8vIElnbm9yZSBjb2luY2lkZW50IHBvaW50cy4NCiAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7DQogICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOw0KICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOw0KICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDModGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsNCiAgICAgIGRlZmF1bHQ6IHBvaW50JDModGhpcywgdGhpcy5fdDAsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKTsgYnJlYWs7DQogICAgfQ0KDQogICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4Ow0KICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsNCiAgICB0aGlzLl90MCA9IHQxOw0KICB9DQp9Ow0KDQpmdW5jdGlvbiBNb25vdG9uZVkoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gbmV3IFJlZmxlY3RDb250ZXh0KGNvbnRleHQpOw0KfQ0KDQooTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkgew0KICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7DQp9Ow0KDQpmdW5jdGlvbiBSZWZsZWN0Q29udGV4dChjb250ZXh0KSB7DQogIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0Ow0KfQ0KDQpSZWZsZWN0Q29udGV4dC5wcm90b3R5cGUgPSB7DQogIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh5LCB4KTsgfSwNCiAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsgfSwNCiAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubGluZVRvKHksIHgpOyB9LA0KICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgeyB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oeTEsIHgxLCB5MiwgeDIsIHksIHgpOyB9DQp9Ow0KDQpmdW5jdGlvbiBtb25vdG9uZVgoY29udGV4dCkgew0KICByZXR1cm4gbmV3IE1vbm90b25lWChjb250ZXh0KTsNCn0NCg0KZnVuY3Rpb24gbW9ub3RvbmVZKGNvbnRleHQpIHsNCiAgcmV0dXJuIG5ldyBNb25vdG9uZVkoY29udGV4dCk7DQp9DQoNCmZ1bmN0aW9uIE5hdHVyYWwoY29udGV4dCkgew0KICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsNCn0NCg0KTmF0dXJhbC5wcm90b3R5cGUgPSB7DQogIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IDA7DQogIH0sDQogIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIHRoaXMuX2xpbmUgPSBOYU47DQogIH0sDQogIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5feCA9IFtdOw0KICAgIHRoaXMuX3kgPSBbXTsNCiAgfSwNCiAgbGluZUVuZDogZnVuY3Rpb24oKSB7DQogICAgdmFyIHggPSB0aGlzLl94LA0KICAgICAgICB5ID0gdGhpcy5feSwNCiAgICAgICAgbiA9IHgubGVuZ3RoOw0KDQogICAgaWYgKG4pIHsNCiAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pOw0KICAgICAgaWYgKG4gPT09IDIpIHsNCiAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzKHgpLA0KICAgICAgICAgICAgcHkgPSBjb250cm9sUG9pbnRzKHkpOw0KICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMTsgaTEgPCBuOyArK2kwLCArK2kxKSB7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHB4WzBdW2kwXSwgcHlbMF1baTBdLCBweFsxXVtpMF0sIHB5WzFdW2kwXSwgeFtpMV0sIHlbaTFdKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCg0KICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsNCiAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7DQogIH0sDQogIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7DQogICAgdGhpcy5feC5wdXNoKCt4KTsNCiAgICB0aGlzLl95LnB1c2goK3kpOw0KICB9DQp9Ow0KDQovLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLg0KZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7DQogIHZhciBpLA0KICAgICAgbiA9IHgubGVuZ3RoIC0gMSwNCiAgICAgIG0sDQogICAgICBhID0gbmV3IEFycmF5KG4pLA0KICAgICAgYiA9IG5ldyBBcnJheShuKSwNCiAgICAgIHIgPSBuZXcgQXJyYXkobik7DQogIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTsNCiAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdOw0KICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dOw0KICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdOw0KICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07DQogIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTsNCiAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7DQogIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07DQogIHJldHVybiBbYSwgYl07DQp9DQoNCnZhciBuYXR1cmFsID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IE5hdHVyYWwoY29udGV4dCk7DQp9Ow0KDQpmdW5jdGlvbiBTdGVwKGNvbnRleHQsIHQpIHsNCiAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7DQogIHRoaXMuX3QgPSB0Ow0KfQ0KDQpTdGVwLnByb3RvdHlwZSA9IHsNCiAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl9saW5lID0gMDsNCiAgfSwNCiAgYXJlYUVuZDogZnVuY3Rpb24oKSB7DQogICAgdGhpcy5fbGluZSA9IE5hTjsNCiAgfSwNCiAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsNCiAgICB0aGlzLl94ID0gdGhpcy5feSA9IE5hTjsNCiAgICB0aGlzLl9wb2ludCA9IDA7DQogIH0sDQogIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgew0KICAgIGlmICgwIDwgdGhpcy5fdCAmJiB0aGlzLl90IDwgMSAmJiB0aGlzLl9wb2ludCA9PT0gMikgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgdGhpcy5feSk7DQogICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOw0KICAgIGlmICh0aGlzLl9saW5lID49IDApIHRoaXMuX3QgPSAxIC0gdGhpcy5fdCwgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOw0KICB9LA0KICBwb2ludDogZnVuY3Rpb24oeCwgeSkgew0KICAgIHggPSAreCwgeSA9ICt5Ow0KICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsNCiAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7DQogICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZA0KICAgICAgZGVmYXVsdDogew0KICAgICAgICBpZiAodGhpcy5fdCA8PSAwKSB7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCwgeSk7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgdmFyIHgxID0gdGhpcy5feCAqICgxIC0gdGhpcy5fdCkgKyB4ICogdGhpcy5fdDsNCiAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MSwgdGhpcy5feSk7DQogICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeDEsIHkpOw0KICAgICAgICB9DQogICAgICAgIGJyZWFrOw0KICAgICAgfQ0KICAgIH0NCiAgICB0aGlzLl94ID0geCwgdGhpcy5feSA9IHk7DQogIH0NCn07DQoNCnZhciBzdGVwID0gZnVuY3Rpb24oY29udGV4dCkgew0KICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMC41KTsNCn07DQoNCmZ1bmN0aW9uIHN0ZXBCZWZvcmUoY29udGV4dCkgew0KICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMCk7DQp9DQoNCmZ1bmN0aW9uIHN0ZXBBZnRlcihjb250ZXh0KSB7DQogIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAxKTsNCn0NCg0KdmFyIG5vbmUgPSBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7DQogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAxKSkgcmV0dXJuOw0KICBmb3IgKHZhciBpID0gMSwgaiwgczAsIHMxID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9IHMxLmxlbmd0aDsgaSA8IG47ICsraSkgew0KICAgIHMwID0gczEsIHMxID0gc2VyaWVzW29yZGVyW2ldXTsNCiAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgICBzMVtqXVsxXSArPSBzMVtqXVswXSA9IGlzTmFOKHMwW2pdWzFdKSA/IHMwW2pdWzBdIDogczBbal1bMV07DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgbm9uZSQxID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHZhciBuID0gc2VyaWVzLmxlbmd0aCwgbyA9IG5ldyBBcnJheShuKTsNCiAgd2hpbGUgKC0tbiA+PSAwKSBvW25dID0gbjsNCiAgcmV0dXJuIG87DQp9Ow0KDQpmdW5jdGlvbiBzdGFja1ZhbHVlKGQsIGtleSkgew0KICByZXR1cm4gZFtrZXldOw0KfQ0KDQp2YXIgc3RhY2sgPSBmdW5jdGlvbigpIHsNCiAgdmFyIGtleXMgPSBjb25zdGFudChbXSksDQogICAgICBvcmRlciA9IG5vbmUkMSwNCiAgICAgIG9mZnNldCA9IG5vbmUsDQogICAgICB2YWx1ZSA9IHN0YWNrVmFsdWU7DQoNCiAgZnVuY3Rpb24gc3RhY2soZGF0YSkgew0KICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwNCiAgICAgICAgaSwNCiAgICAgICAgbSA9IGRhdGEubGVuZ3RoLA0KICAgICAgICBuID0ga3oubGVuZ3RoLA0KICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwNCiAgICAgICAgb3o7DQoNCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBmb3IgKHZhciBraSA9IGt6W2ldLCBzaSA9IHN6W2ldID0gbmV3IEFycmF5KG0pLCBqID0gMCwgc2lqOyBqIDwgbTsgKytqKSB7DQogICAgICAgIHNpW2pdID0gc2lqID0gWzAsICt2YWx1ZShkYXRhW2pdLCBraSwgaiwgZGF0YSldOw0KICAgICAgICBzaWouZGF0YSA9IGRhdGFbal07DQogICAgICB9DQogICAgICBzaS5rZXkgPSBraTsNCiAgICB9DQoNCiAgICBmb3IgKGkgPSAwLCBveiA9IG9yZGVyKHN6KTsgaSA8IG47ICsraSkgew0KICAgICAgc3pbb3pbaV1dLmluZGV4ID0gaTsNCiAgICB9DQoNCiAgICBvZmZzZXQoc3osIG96KTsNCiAgICByZXR1cm4gc3o7DQogIH0NCg0KICBzdGFjay5rZXlzID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGtleXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDoga2V5czsNCiAgfTsNCg0KICBzdGFjay52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsNCiAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KCtfKSwgc3RhY2spIDogdmFsdWU7DQogIH07DQoNCiAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7DQogICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JkZXIgPSBfID09IG51bGwgPyBub25lJDEgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudChzbGljZS5jYWxsKF8pKSwgc3RhY2spIDogb3JkZXI7DQogIH07DQoNCiAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgew0KICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG5vbmUgOiBfLCBzdGFjaykgOiBvZmZzZXQ7DQogIH07DQoNCiAgcmV0dXJuIHN0YWNrOw0KfTsNCg0KdmFyIGV4cGFuZCA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIGksIG4sIGogPSAwLCBtID0gc2VyaWVzWzBdLmxlbmd0aCwgeTsgaiA8IG07ICsraikgew0KICAgIGZvciAoeSA9IGkgPSAwOyBpIDwgbjsgKytpKSB5ICs9IHNlcmllc1tpXVtqXVsxXSB8fCAwOw0KICAgIGlmICh5KSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzZXJpZXNbaV1bal1bMV0gLz0geTsNCiAgfQ0KICBub25lKHNlcmllcywgb3JkZXIpOw0KfTsNCg0KdmFyIGRpdmVyZ2luZyA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47DQogIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+PSAwKSB7DQogICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5Ow0KICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsNCiAgICAgICAgZFsxXSA9IHluLCBkWzBdID0geW4gKz0gZHk7DQogICAgICB9IGVsc2Ugew0KICAgICAgICBkWzBdID0geXA7DQogICAgICB9DQogICAgfQ0KICB9DQp9Ow0KDQp2YXIgc2lsaG91ZXR0ZSA9IGZ1bmN0aW9uKHNlcmllcywgb3JkZXIpIHsNCiAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBpID0gMCwgeSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7DQogICAgczBbal1bMV0gKz0gczBbal1bMF0gPSAteSAvIDI7DQogIH0NCiAgbm9uZShzZXJpZXMsIG9yZGVyKTsNCn07DQoNCnZhciB3aWdnbGUgPSBmdW5jdGlvbihzZXJpZXMsIG9yZGVyKSB7DQogIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSB8fCAhKChtID0gKHMwID0gc2VyaWVzW29yZGVyWzBdXSkubGVuZ3RoKSA+IDApKSByZXR1cm47DQogIGZvciAodmFyIHkgPSAwLCBqID0gMSwgczAsIG0sIG47IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBpID0gMCwgczEgPSAwLCBzMiA9IDA7IGkgPCBuOyArK2kpIHsNCiAgICAgIHZhciBzaSA9IHNlcmllc1tvcmRlcltpXV0sDQogICAgICAgICAgc2lqMCA9IHNpW2pdWzFdIHx8IDAsDQogICAgICAgICAgc2lqMSA9IHNpW2ogLSAxXVsxXSB8fCAwLA0KICAgICAgICAgIHMzID0gKHNpajAgLSBzaWoxKSAvIDI7DQogICAgICBmb3IgKHZhciBrID0gMDsgayA8IGk7ICsraykgew0KICAgICAgICB2YXIgc2sgPSBzZXJpZXNbb3JkZXJba11dLA0KICAgICAgICAgICAgc2tqMCA9IHNrW2pdWzFdIHx8IDAsDQogICAgICAgICAgICBza2oxID0gc2tbaiAtIDFdWzFdIHx8IDA7DQogICAgICAgIHMzICs9IHNrajAgLSBza2oxOw0KICAgICAgfQ0KICAgICAgczEgKz0gc2lqMCwgczIgKz0gczMgKiBzaWowOw0KICAgIH0NCiAgICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsNCiAgICBpZiAoczEpIHkgLT0gczIgLyBzMTsNCiAgfQ0KICBzMFtqIC0gMV1bMV0gKz0gczBbaiAtIDFdWzBdID0geTsNCiAgbm9uZShzZXJpZXMsIG9yZGVyKTsNCn07DQoNCnZhciBhc2NlbmRpbmcgPSBmdW5jdGlvbihzZXJpZXMpIHsNCiAgdmFyIHN1bXMgPSBzZXJpZXMubWFwKHN1bSk7DQogIHJldHVybiBub25lJDEoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHN1bXNbYV0gLSBzdW1zW2JdOyB9KTsNCn07DQoNCmZ1bmN0aW9uIHN1bShzZXJpZXMpIHsNCiAgdmFyIHMgPSAwLCBpID0gLTEsIG4gPSBzZXJpZXMubGVuZ3RoLCB2Ow0KICB3aGlsZSAoKytpIDwgbikgaWYgKHYgPSArc2VyaWVzW2ldWzFdKSBzICs9IHY7DQogIHJldHVybiBzOw0KfQ0KDQp2YXIgZGVzY2VuZGluZyQxID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHJldHVybiBhc2NlbmRpbmcoc2VyaWVzKS5yZXZlcnNlKCk7DQp9Ow0KDQp2YXIgaW5zaWRlT3V0ID0gZnVuY3Rpb24oc2VyaWVzKSB7DQogIHZhciBuID0gc2VyaWVzLmxlbmd0aCwNCiAgICAgIGksDQogICAgICBqLA0KICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtKSwNCiAgICAgIG9yZGVyID0gbm9uZSQxKHNlcmllcykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzdW1zW2JdIC0gc3Vtc1thXTsgfSksDQogICAgICB0b3AgPSAwLA0KICAgICAgYm90dG9tID0gMCwNCiAgICAgIHRvcHMgPSBbXSwNCiAgICAgIGJvdHRvbXMgPSBbXTsNCg0KICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgaiA9IG9yZGVyW2ldOw0KICAgIGlmICh0b3AgPCBib3R0b20pIHsNCiAgICAgIHRvcCArPSBzdW1zW2pdOw0KICAgICAgdG9wcy5wdXNoKGopOw0KICAgIH0gZWxzZSB7DQogICAgICBib3R0b20gKz0gc3Vtc1tqXTsNCiAgICAgIGJvdHRvbXMucHVzaChqKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gYm90dG9tcy5yZXZlcnNlKCkuY29uY2F0KHRvcHMpOw0KfTsNCg0KdmFyIHJldmVyc2UgPSBmdW5jdGlvbihzZXJpZXMpIHsNCiAgcmV0dXJuIG5vbmUkMShzZXJpZXMpLnJldmVyc2UoKTsNCn07DQoNCmV4cG9ydHMuYXJjID0gYXJjOw0KZXhwb3J0cy5hcmVhID0gYXJlYTsNCmV4cG9ydHMubGluZSA9IGxpbmU7DQpleHBvcnRzLnBpZSA9IHBpZTsNCmV4cG9ydHMuYXJlYVJhZGlhbCA9IGFyZWFSYWRpYWw7DQpleHBvcnRzLnJhZGlhbEFyZWEgPSBhcmVhUmFkaWFsOw0KZXhwb3J0cy5saW5lUmFkaWFsID0gbGluZVJhZGlhbCQxOw0KZXhwb3J0cy5yYWRpYWxMaW5lID0gbGluZVJhZGlhbCQxOw0KZXhwb3J0cy5wb2ludFJhZGlhbCA9IHBvaW50UmFkaWFsOw0KZXhwb3J0cy5saW5rSG9yaXpvbnRhbCA9IGxpbmtIb3Jpem9udGFsOw0KZXhwb3J0cy5saW5rVmVydGljYWwgPSBsaW5rVmVydGljYWw7DQpleHBvcnRzLmxpbmtSYWRpYWwgPSBsaW5rUmFkaWFsOw0KZXhwb3J0cy5zeW1ib2wgPSBzeW1ib2w7DQpleHBvcnRzLnN5bWJvbHMgPSBzeW1ib2xzOw0KZXhwb3J0cy5zeW1ib2xDaXJjbGUgPSBjaXJjbGU7DQpleHBvcnRzLnN5bWJvbENyb3NzID0gY3Jvc3M7DQpleHBvcnRzLnN5bWJvbERpYW1vbmQgPSBkaWFtb25kOw0KZXhwb3J0cy5zeW1ib2xTcXVhcmUgPSBzcXVhcmU7DQpleHBvcnRzLnN5bWJvbFN0YXIgPSBzdGFyOw0KZXhwb3J0cy5zeW1ib2xUcmlhbmdsZSA9IHRyaWFuZ2xlOw0KZXhwb3J0cy5zeW1ib2xXeWUgPSB3eWU7DQpleHBvcnRzLmN1cnZlQmFzaXNDbG9zZWQgPSBiYXNpc0Nsb3NlZDsNCmV4cG9ydHMuY3VydmVCYXNpc09wZW4gPSBiYXNpc09wZW47DQpleHBvcnRzLmN1cnZlQmFzaXMgPSBiYXNpczsNCmV4cG9ydHMuY3VydmVCdW5kbGUgPSBidW5kbGU7DQpleHBvcnRzLmN1cnZlQ2FyZGluYWxDbG9zZWQgPSBjYXJkaW5hbENsb3NlZDsNCmV4cG9ydHMuY3VydmVDYXJkaW5hbE9wZW4gPSBjYXJkaW5hbE9wZW47DQpleHBvcnRzLmN1cnZlQ2FyZGluYWwgPSBjYXJkaW5hbDsNCmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tQ2xvc2VkID0gY2F0bXVsbFJvbUNsb3NlZDsNCmV4cG9ydHMuY3VydmVDYXRtdWxsUm9tT3BlbiA9IGNhdG11bGxSb21PcGVuOw0KZXhwb3J0cy5jdXJ2ZUNhdG11bGxSb20gPSBjYXRtdWxsUm9tOw0KZXhwb3J0cy5jdXJ2ZUxpbmVhckNsb3NlZCA9IGxpbmVhckNsb3NlZDsNCmV4cG9ydHMuY3VydmVMaW5lYXIgPSBjdXJ2ZUxpbmVhcjsNCmV4cG9ydHMuY3VydmVNb25vdG9uZVggPSBtb25vdG9uZVg7DQpleHBvcnRzLmN1cnZlTW9ub3RvbmVZID0gbW9ub3RvbmVZOw0KZXhwb3J0cy5jdXJ2ZU5hdHVyYWwgPSBuYXR1cmFsOw0KZXhwb3J0cy5jdXJ2ZVN0ZXAgPSBzdGVwOw0KZXhwb3J0cy5jdXJ2ZVN0ZXBBZnRlciA9IHN0ZXBBZnRlcjsNCmV4cG9ydHMuY3VydmVTdGVwQmVmb3JlID0gc3RlcEJlZm9yZTsNCmV4cG9ydHMuc3RhY2sgPSBzdGFjazsNCmV4cG9ydHMuc3RhY2tPZmZzZXRFeHBhbmQgPSBleHBhbmQ7DQpleHBvcnRzLnN0YWNrT2Zmc2V0RGl2ZXJnaW5nID0gZGl2ZXJnaW5nOw0KZXhwb3J0cy5zdGFja09mZnNldE5vbmUgPSBub25lOw0KZXhwb3J0cy5zdGFja09mZnNldFNpbGhvdWV0dGUgPSBzaWxob3VldHRlOw0KZXhwb3J0cy5zdGFja09mZnNldFdpZ2dsZSA9IHdpZ2dsZTsNCmV4cG9ydHMuc3RhY2tPcmRlckFzY2VuZGluZyA9IGFzY2VuZGluZzsNCmV4cG9ydHMuc3RhY2tPcmRlckRlc2NlbmRpbmcgPSBkZXNjZW5kaW5nJDE7DQpleHBvcnRzLnN0YWNrT3JkZXJJbnNpZGVPdXQgPSBpbnNpZGVPdXQ7DQpleHBvcnRzLnN0YWNrT3JkZXJOb25lID0gbm9uZSQxOw0KZXhwb3J0cy5zdGFja09yZGVyUmV2ZXJzZSA9IHJldmVyc2U7DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0seyJkMy1wYXRoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS1mb3JtYXQvIFZlcnNpb24gMi4wLjUuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy10aW1lJykpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJ2QzLXRpbWUnXSwgZmFjdG9yeSkgOg0KCShmYWN0b3J5KChnbG9iYWwuZDMgPSBnbG9iYWwuZDMgfHwge30pLGdsb2JhbC5kMykpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMsZDNUaW1lKSB7ICd1c2Ugc3RyaWN0JzsNCg0KZnVuY3Rpb24gbG9jYWxEYXRlKGQpIHsNCiAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkgew0KICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOw0KICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTsNCiAgICByZXR1cm4gZGF0ZTsNCiAgfQ0KICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsNCn0NCg0KZnVuY3Rpb24gdXRjRGF0ZShkKSB7DQogIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsNCiAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7DQogICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpOw0KICAgIHJldHVybiBkYXRlOw0KICB9DQogIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsNCn0NCg0KZnVuY3Rpb24gbmV3WWVhcih5KSB7DQogIHJldHVybiB7eTogeSwgbTogMCwgZDogMSwgSDogMCwgTTogMCwgUzogMCwgTDogMH07DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHsNCiAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwNCiAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsDQogICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLA0KICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywNCiAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLA0KICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLA0KICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsDQogICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7DQoNCiAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLA0KICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSwNCiAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksDQogICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksDQogICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwNCiAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksDQogICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksDQogICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSwNCiAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksDQogICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7DQoNCiAgdmFyIGZvcm1hdHMgPSB7DQogICAgImEiOiBmb3JtYXRTaG9ydFdlZWtkYXksDQogICAgIkEiOiBmb3JtYXRXZWVrZGF5LA0KICAgICJiIjogZm9ybWF0U2hvcnRNb250aCwNCiAgICAiQiI6IGZvcm1hdE1vbnRoLA0KICAgICJjIjogbnVsbCwNCiAgICAiZCI6IGZvcm1hdERheU9mTW9udGgsDQogICAgImUiOiBmb3JtYXREYXlPZk1vbnRoLA0KICAgICJIIjogZm9ybWF0SG91cjI0LA0KICAgICJJIjogZm9ybWF0SG91cjEyLA0KICAgICJqIjogZm9ybWF0RGF5T2ZZZWFyLA0KICAgICJMIjogZm9ybWF0TWlsbGlzZWNvbmRzLA0KICAgICJtIjogZm9ybWF0TW9udGhOdW1iZXIsDQogICAgIk0iOiBmb3JtYXRNaW51dGVzLA0KICAgICJwIjogZm9ybWF0UGVyaW9kLA0KICAgICJTIjogZm9ybWF0U2Vjb25kcywNCiAgICAiVSI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXksDQogICAgInciOiBmb3JtYXRXZWVrZGF5TnVtYmVyLA0KICAgICJXIjogZm9ybWF0V2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IG51bGwsDQogICAgIlgiOiBudWxsLA0KICAgICJ5IjogZm9ybWF0WWVhciwNCiAgICAiWSI6IGZvcm1hdEZ1bGxZZWFyLA0KICAgICJaIjogZm9ybWF0Wm9uZSwNCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgdmFyIHV0Y0Zvcm1hdHMgPSB7DQogICAgImEiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksDQogICAgIkEiOiBmb3JtYXRVVENXZWVrZGF5LA0KICAgICJiIjogZm9ybWF0VVRDU2hvcnRNb250aCwNCiAgICAiQiI6IGZvcm1hdFVUQ01vbnRoLA0KICAgICJjIjogbnVsbCwNCiAgICAiZCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsDQogICAgImUiOiBmb3JtYXRVVENEYXlPZk1vbnRoLA0KICAgICJIIjogZm9ybWF0VVRDSG91cjI0LA0KICAgICJJIjogZm9ybWF0VVRDSG91cjEyLA0KICAgICJqIjogZm9ybWF0VVRDRGF5T2ZZZWFyLA0KICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLA0KICAgICJtIjogZm9ybWF0VVRDTW9udGhOdW1iZXIsDQogICAgIk0iOiBmb3JtYXRVVENNaW51dGVzLA0KICAgICJwIjogZm9ybWF0VVRDUGVyaW9kLA0KICAgICJTIjogZm9ybWF0VVRDU2Vjb25kcywNCiAgICAiVSI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXksDQogICAgInciOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyLA0KICAgICJXIjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IG51bGwsDQogICAgIlgiOiBudWxsLA0KICAgICJ5IjogZm9ybWF0VVRDWWVhciwNCiAgICAiWSI6IGZvcm1hdFVUQ0Z1bGxZZWFyLA0KICAgICJaIjogZm9ybWF0VVRDWm9uZSwNCiAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgdmFyIHBhcnNlcyA9IHsNCiAgICAiYSI6IHBhcnNlU2hvcnRXZWVrZGF5LA0KICAgICJBIjogcGFyc2VXZWVrZGF5LA0KICAgICJiIjogcGFyc2VTaG9ydE1vbnRoLA0KICAgICJCIjogcGFyc2VNb250aCwNCiAgICAiYyI6IHBhcnNlTG9jYWxlRGF0ZVRpbWUsDQogICAgImQiOiBwYXJzZURheU9mTW9udGgsDQogICAgImUiOiBwYXJzZURheU9mTW9udGgsDQogICAgIkgiOiBwYXJzZUhvdXIyNCwNCiAgICAiSSI6IHBhcnNlSG91cjI0LA0KICAgICJqIjogcGFyc2VEYXlPZlllYXIsDQogICAgIkwiOiBwYXJzZU1pbGxpc2Vjb25kcywNCiAgICAibSI6IHBhcnNlTW9udGhOdW1iZXIsDQogICAgIk0iOiBwYXJzZU1pbnV0ZXMsDQogICAgInAiOiBwYXJzZVBlcmlvZCwNCiAgICAiUyI6IHBhcnNlU2Vjb25kcywNCiAgICAiVSI6IHBhcnNlV2Vla051bWJlclN1bmRheSwNCiAgICAidyI6IHBhcnNlV2Vla2RheU51bWJlciwNCiAgICAiVyI6IHBhcnNlV2Vla051bWJlck1vbmRheSwNCiAgICAieCI6IHBhcnNlTG9jYWxlRGF0ZSwNCiAgICAiWCI6IHBhcnNlTG9jYWxlVGltZSwNCiAgICAieSI6IHBhcnNlWWVhciwNCiAgICAiWSI6IHBhcnNlRnVsbFllYXIsDQogICAgIloiOiBwYXJzZVpvbmUsDQogICAgIiUiOiBwYXJzZUxpdGVyYWxQZXJjZW50DQogIH07DQoNCiAgLy8gVGhlc2UgcmVjdXJzaXZlIGRpcmVjdGl2ZSBkZWZpbml0aW9ucyBtdXN0IGJlIGRlZmVycmVkLg0KICBmb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIGZvcm1hdHMpOw0KICBmb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIGZvcm1hdHMpOw0KICBmb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCBmb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCB1dGNGb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCB1dGNGb3JtYXRzKTsNCiAgdXRjRm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgdXRjRm9ybWF0cyk7DQoNCiAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykgew0KICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7DQogICAgICB2YXIgc3RyaW5nID0gW10sDQogICAgICAgICAgaSA9IC0xLA0KICAgICAgICAgIGogPSAwLA0KICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLA0KICAgICAgICAgIGMsDQogICAgICAgICAgcGFkLA0KICAgICAgICAgIGZvcm1hdDsNCg0KICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpOw0KDQogICAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgICBpZiAoc3BlY2lmaWVyLmNoYXJDb2RlQXQoaSkgPT09IDM3KSB7DQogICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsNCiAgICAgICAgICBpZiAoKHBhZCA9IHBhZHNbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7DQogICAgICAgICAgZWxzZSBwYWQgPSBjID09PSAiZSIgPyAiICIgOiAiMCI7DQogICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTsNCiAgICAgICAgICBzdHJpbmcucHVzaChjKTsNCiAgICAgICAgICBqID0gaSArIDE7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsNCiAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7DQogICAgfTsNCiAgfQ0KDQogIGZ1bmN0aW9uIG5ld1BhcnNlKHNwZWNpZmllciwgbmV3RGF0ZSkgew0KICAgIHJldHVybiBmdW5jdGlvbihzdHJpbmcpIHsNCiAgICAgIHZhciBkID0gbmV3WWVhcigxOTAwKSwNCiAgICAgICAgICBpID0gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcgKz0gIiIsIDApOw0KICAgICAgaWYgKGkgIT0gc3RyaW5nLmxlbmd0aCkgcmV0dXJuIG51bGw7DQoNCiAgICAgIC8vIFRoZSBhbS1wbSBmbGFnIGlzIDAgZm9yIEFNLCBhbmQgMSBmb3IgUE0uDQogICAgICBpZiAoInAiIGluIGQpIGQuSCA9IGQuSCAlIDEyICsgZC5wICogMTI7DQoNCiAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci4NCiAgICAgIGlmICgiVyIgaW4gZCB8fCAiVSIgaW4gZCkgew0KICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJXIiBpbiBkID8gMSA6IDA7DQogICAgICAgIHZhciBkYXkgPSAiWiIgaW4gZCA/IHV0Y0RhdGUobmV3WWVhcihkLnkpKS5nZXRVVENEYXkoKSA6IG5ld0RhdGUobmV3WWVhcihkLnkpKS5nZXREYXkoKTsNCiAgICAgICAgZC5tID0gMDsNCiAgICAgICAgZC5kID0gIlciIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSArIDYpICUgNzsNCiAgICAgIH0NCg0KICAgICAgLy8gSWYgYSB0aW1lIHpvbmUgaXMgc3BlY2lmaWVkLCBhbGwgZmllbGRzIGFyZSBpbnRlcnByZXRlZCBhcyBVVEMgYW5kIHRoZW4NCiAgICAgIC8vIG9mZnNldCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0aW1lIHpvbmUuDQogICAgICBpZiAoIloiIGluIGQpIHsNCiAgICAgICAgZC5IICs9IGQuWiAvIDEwMCB8IDA7DQogICAgICAgIGQuTSArPSBkLlogJSAxMDA7DQogICAgICAgIHJldHVybiB1dGNEYXRlKGQpOw0KICAgICAgfQ0KDQogICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuDQogICAgICByZXR1cm4gbmV3RGF0ZShkKTsNCiAgICB9Ow0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcsIGopIHsNCiAgICB2YXIgaSA9IDAsDQogICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLA0KICAgICAgICBtID0gc3RyaW5nLmxlbmd0aCwNCiAgICAgICAgYywNCiAgICAgICAgcGFyc2U7DQoNCiAgICB3aGlsZSAoaSA8IG4pIHsNCiAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTsNCiAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckNvZGVBdChpKyspOw0KICAgICAgaWYgKGMgPT09IDM3KSB7DQogICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7DQogICAgICAgIHBhcnNlID0gcGFyc2VzW2MgaW4gcGFkcyA/IHNwZWNpZmllci5jaGFyQXQoaSsrKSA6IGNdOw0KICAgICAgICBpZiAoIXBhcnNlIHx8ICgoaiA9IHBhcnNlKGQsIHN0cmluZywgaikpIDwgMCkpIHJldHVybiAtMTsNCiAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7DQogICAgICAgIHJldHVybiAtMTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICByZXR1cm4gajsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlUGVyaW9kKGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOw0KICAgIHJldHVybiBuID8gKGQucCA9IHBlcmlvZExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZVNob3J0V2Vla2RheShkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHNob3J0V2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsNCiAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gd2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsNCiAgICByZXR1cm4gbiA/IChkLncgPSB3ZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlU2hvcnRNb250aChkLCBzdHJpbmcsIGkpIHsNCiAgICB2YXIgbiA9IHNob3J0TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC5tID0gc2hvcnRNb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQogIH0NCg0KICBmdW5jdGlvbiBwYXJzZU1vbnRoKGQsIHN0cmluZywgaSkgew0KICAgIHZhciBuID0gbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsNCiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGVUaW1lLCBzdHJpbmcsIGkpOw0KICB9DQoNCiAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlKGQsIHN0cmluZywgaSkgew0KICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZSwgc3RyaW5nLCBpKTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHBhcnNlTG9jYWxlVGltZShkLCBzdHJpbmcsIGkpIHsNCiAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX3RpbWUsIHN0cmluZywgaSk7DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldERheSgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXREYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRTaG9ydE1vbnRoKGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRNb250aCgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFBlcmlvZChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgew0KICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXRVVENEYXkoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydE1vbnRoKGQpIHsNCiAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0VVRDTW9udGgoKV07DQogIH0NCg0KICBmdW5jdGlvbiBmb3JtYXRVVENNb250aChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsNCiAgfQ0KDQogIGZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKSB7DQogICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRVVENIb3VycygpID49IDEyKV07DQogIH0NCg0KICByZXR1cm4gew0KICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIGZvcm1hdHMpOw0KICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9Ow0KICAgICAgcmV0dXJuIGY7DQogICAgfSwNCiAgICBwYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7DQogICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSAiIiwgbG9jYWxEYXRlKTsNCiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsNCiAgICAgIHJldHVybiBwOw0KICAgIH0sDQogICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHsNCiAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSAiIiwgdXRjRm9ybWF0cyk7DQogICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07DQogICAgICByZXR1cm4gZjsNCiAgICB9LA0KICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsNCiAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyLCB1dGNEYXRlKTsNCiAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsNCiAgICAgIHJldHVybiBwOw0KICAgIH0NCiAgfTsNCn0NCg0KdmFyIHBhZHMgPSB7Ii0iOiAiIiwgIl8iOiAiICIsICIwIjogIjAifTsNCnZhciBudW1iZXJSZSA9IC9eXHMqXGQrLzsNCnZhciBwZXJjZW50UmUgPSAvXiUvOw0KdmFyIHJlcXVvdGVSZSA9IC9bXFxcXlwkXCpcK1w/XHxcW1xdXChcKVwuXHtcfV0vZzsNCg0KZnVuY3Rpb24gcGFkKHZhbHVlLCBmaWxsLCB3aWR0aCkgew0KICB2YXIgc2lnbiA9IHZhbHVlIDwgMCA/ICItIiA6ICIiLA0KICAgICAgc3RyaW5nID0gKHNpZ24gPyAtdmFsdWUgOiB2YWx1ZSkgKyAiIiwNCiAgICAgIGxlbmd0aCA9IHN0cmluZy5sZW5ndGg7DQogIHJldHVybiBzaWduICsgKGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbihmaWxsKSArIHN0cmluZyA6IHN0cmluZyk7DQp9DQoNCmZ1bmN0aW9uIHJlcXVvdGUocykgew0KICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSwgIlxcJCYiKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHsNCiAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwiKSArICIpIiwgImkiKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TG9va3VwKG5hbWVzKSB7DQogIHZhciBtYXAgPSB7fSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOw0KICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTsNCiAgcmV0dXJuIG1hcDsNCn0NCg0KZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7DQogIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogIHJldHVybiBuID8gKGQuVSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlV2Vla051bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpKSk7DQogIHJldHVybiBuID8gKGQuVyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTsNCiAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VZZWFyKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQueSA9ICtuWzBdICsgKCtuWzBdID4gNjggPyAxOTAwIDogMjAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2Vab25lKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IC9eKFopfChbKy1dXGRcZCkoPzpcOj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTsNCiAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCAiMDAiKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VNb250aE51bWJlcihkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZURheU9mTW9udGgoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VEYXlPZlllYXIoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsNCiAgcmV0dXJuIG4gPyAoZC5tID0gMCwgZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VIb3VyMjQoZCwgc3RyaW5nLCBpKSB7DQogIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsNCiAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsNCn0NCg0KZnVuY3Rpb24gcGFyc2VNaW51dGVzKGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7DQogIHJldHVybiBuID8gKGQuTSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7DQp9DQoNCmZ1bmN0aW9uIHBhcnNlU2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOw0KICByZXR1cm4gbiA/IChkLlMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsNCiAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpOw0KICByZXR1cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBwYXJzZUxpdGVyYWxQZXJjZW50KGQsIHN0cmluZywgaSkgew0KICB2YXIgbiA9IHBlcmNlbnRSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOw0KICByZXR1cm4gbiA/IGkgKyBuWzBdLmxlbmd0aCA6IC0xOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXREYXlPZk1vbnRoKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldERhdGUoKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRIb3VycygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0SG91cjEyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdERheU9mWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoMSArIGQzVGltZS50aW1lRGF5LmNvdW50KGQzVGltZS50aW1lWWVhcihkKSwgZCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0TWlsbGlzZWNvbmRzKCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRNb250aE51bWJlcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRNb250aCgpICsgMSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdE1pbnV0ZXMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0TWludXRlcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRTZWNvbmRzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudGltZVN1bmRheS5jb3VudChkM1RpbWUudGltZVllYXIoZCksIGQpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlcihkKSB7DQogIHJldHVybiBkLmdldERheSgpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudGltZU1vbmRheS5jb3VudChkM1RpbWUudGltZVllYXIoZCksIGQpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0WWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0Wm9uZShkKSB7DQogIHZhciB6ID0gZC5nZXRUaW1lem9uZU9mZnNldCgpOw0KICByZXR1cm4gKHogPiAwID8gIi0iIDogKHogKj0gLTEsICIrIikpDQogICAgICArIHBhZCh6IC8gNjAgfCAwLCAiMCIsIDIpDQogICAgICArIHBhZCh6ICUgNjAsICIwIiwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mTW9udGgoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDRGF0ZSgpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0hvdXJzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENIb3VyMTIoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZZZWFyKGQsIHApIHsNCiAgcmV0dXJuIHBhZCgxICsgZDNUaW1lLnV0Y0RheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENNb250aCgpICsgMSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ01pbnV0ZXMoZCwgcCkgew0KICByZXR1cm4gcGFkKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDU2Vjb25kcyhkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsNCiAgcmV0dXJuIHBhZChkM1RpbWUudXRjU3VuZGF5LmNvdW50KGQzVGltZS51dGNZZWFyKGQpLCBkKSwgcCwgMik7DQp9DQoNCmZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXIoZCkgew0KICByZXR1cm4gZC5nZXRVVENEYXkoKTsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlck1vbmRheShkLCBwKSB7DQogIHJldHVybiBwYWQoZDNUaW1lLnV0Y01vbmRheS5jb3VudChkM1RpbWUudXRjWWVhcihkKSwgZCksIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENZZWFyKGQsIHApIHsNCiAgcmV0dXJuIHBhZChkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENGdWxsWWVhcihkLCBwKSB7DQogIHJldHVybiBwYWQoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOw0KfQ0KDQpmdW5jdGlvbiBmb3JtYXRVVENab25lKCkgew0KICByZXR1cm4gIiswMDAwIjsNCn0NCg0KZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQoKSB7DQogIHJldHVybiAiJSI7DQp9DQoNCnZhciBsb2NhbGUkMTsNCg0KDQoNCg0KDQpkZWZhdWx0TG9jYWxlKHsNCiAgZGF0ZVRpbWU6ICIleCwgJVgiLA0KICBkYXRlOiAiJS1tLyUtZC8lWSIsDQogIHRpbWU6ICIlLUk6JU06JVMgJXAiLA0KICBwZXJpb2RzOiBbIkFNIiwgIlBNIl0sDQogIGRheXM6IFsiU3VuZGF5IiwgIk1vbmRheSIsICJUdWVzZGF5IiwgIldlZG5lc2RheSIsICJUaHVyc2RheSIsICJGcmlkYXkiLCAiU2F0dXJkYXkiXSwNCiAgc2hvcnREYXlzOiBbIlN1biIsICJNb24iLCAiVHVlIiwgIldlZCIsICJUaHUiLCAiRnJpIiwgIlNhdCJdLA0KICBtb250aHM6IFsiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlciIsICJEZWNlbWJlciJdLA0KICBzaG9ydE1vbnRoczogWyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJdDQp9KTsNCg0KZnVuY3Rpb24gZGVmYXVsdExvY2FsZShkZWZpbml0aW9uKSB7DQogIGxvY2FsZSQxID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pOw0KICBleHBvcnRzLnRpbWVGb3JtYXQgPSBsb2NhbGUkMS5mb3JtYXQ7DQogIGV4cG9ydHMudGltZVBhcnNlID0gbG9jYWxlJDEucGFyc2U7DQogIGV4cG9ydHMudXRjRm9ybWF0ID0gbG9jYWxlJDEudXRjRm9ybWF0Ow0KICBleHBvcnRzLnV0Y1BhcnNlID0gbG9jYWxlJDEudXRjUGFyc2U7DQogIHJldHVybiBsb2NhbGUkMTsNCn0NCg0KdmFyIGlzb1NwZWNpZmllciA9ICIlWS0lbS0lZFQlSDolTTolUy4lTFoiOw0KDQpmdW5jdGlvbiBmb3JtYXRJc29OYXRpdmUoZGF0ZSkgew0KICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOw0KfQ0KDQp2YXIgZm9ybWF0SXNvID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcNCiAgICA/IGZvcm1hdElzb05hdGl2ZQ0KICAgIDogZXhwb3J0cy51dGNGb3JtYXQoaXNvU3BlY2lmaWVyKTsNCg0KZnVuY3Rpb24gcGFyc2VJc29OYXRpdmUoc3RyaW5nKSB7DQogIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTsNCiAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7DQp9DQoNCnZhciBwYXJzZUlzbyA9ICtuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIikNCiAgICA/IHBhcnNlSXNvTmF0aXZlDQogICAgOiBleHBvcnRzLnV0Y1BhcnNlKGlzb1NwZWNpZmllcik7DQoNCmV4cG9ydHMudGltZUZvcm1hdERlZmF1bHRMb2NhbGUgPSBkZWZhdWx0TG9jYWxlOw0KZXhwb3J0cy50aW1lRm9ybWF0TG9jYWxlID0gZm9ybWF0TG9jYWxlOw0KZXhwb3J0cy5pc29Gb3JtYXQgPSBmb3JtYXRJc287DQpleHBvcnRzLmlzb1BhcnNlID0gcGFyc2VJc287DQoNCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7DQoNCn0pKSk7DQoNCn0seyJkMy10aW1lIjoxNX1dLDE1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXsNCi8vIGh0dHBzOi8vZDNqcy5vcmcvZDMtdGltZS8gVmVyc2lvbiAxLjAuNi4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgdDAgPSBuZXcgRGF0ZTsNCnZhciB0MSA9IG5ldyBEYXRlOw0KDQpmdW5jdGlvbiBuZXdJbnRlcnZhbChmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgew0KDQogIGZ1bmN0aW9uIGludGVydmFsKGRhdGUpIHsNCiAgICByZXR1cm4gZmxvb3JpKGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSkpLCBkYXRlOw0KICB9DQoNCiAgaW50ZXJ2YWwuZmxvb3IgPSBpbnRlcnZhbDsNCg0KICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgew0KICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsNCiAgfTsNCg0KICBpbnRlcnZhbC5yb3VuZCA9IGZ1bmN0aW9uKGRhdGUpIHsNCiAgICB2YXIgZDAgPSBpbnRlcnZhbChkYXRlKSwNCiAgICAgICAgZDEgPSBpbnRlcnZhbC5jZWlsKGRhdGUpOw0KICAgIHJldHVybiBkYXRlIC0gZDAgPCBkMSAtIGRhdGUgPyBkMCA6IGQxOw0KICB9Ow0KDQogIGludGVydmFsLm9mZnNldCA9IGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7DQogIH07DQoNCiAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgew0KICAgIHZhciByYW5nZSA9IFtdOw0KICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7DQogICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApOw0KICAgIGlmICghKHN0YXJ0IDwgc3RvcCkgfHwgIShzdGVwID4gMCkpIHJldHVybiByYW5nZTsgLy8gYWxzbyBoYW5kbGVzIEludmFsaWQgRGF0ZQ0KICAgIGRvIHJhbmdlLnB1c2gobmV3IERhdGUoK3N0YXJ0KSk7IHdoaWxlIChvZmZzZXRpKHN0YXJ0LCBzdGVwKSwgZmxvb3JpKHN0YXJ0KSwgc3RhcnQgPCBzdG9wKQ0KICAgIHJldHVybiByYW5nZTsNCiAgfTsNCg0KICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7DQogICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOw0KICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlICgtLXN0ZXAgPj0gMCkgd2hpbGUgKG9mZnNldGkoZGF0ZSwgMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5DQogICAgfSk7DQogIH07DQoNCiAgaWYgKGNvdW50KSB7DQogICAgaW50ZXJ2YWwuY291bnQgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgICB0MC5zZXRUaW1lKCtzdGFydCksIHQxLnNldFRpbWUoK2VuZCk7DQogICAgICBmbG9vcmkodDApLCBmbG9vcmkodDEpOw0KICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAsIHQxKSk7DQogICAgfTsNCg0KICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgew0KICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7DQogICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbA0KICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbA0KICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkDQogICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9DQogICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsNCiAgICB9Ow0KICB9DQoNCiAgcmV0dXJuIGludGVydmFsOw0KfQ0KDQp2YXIgbWlsbGlzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbigpIHsNCiAgLy8gbm9vcA0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIGVuZCAtIHN0YXJ0Ow0KfSk7DQoNCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4NCm1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykgew0KICBrID0gTWF0aC5mbG9vcihrKTsNCiAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7DQogIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kOw0KICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspOw0KICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspOw0KICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrOw0KICB9KTsNCn07DQoNCnZhciBtaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZC5yYW5nZTsNCg0KdmFyIGR1cmF0aW9uU2Vjb25kID0gMWUzOw0KdmFyIGR1cmF0aW9uTWludXRlID0gNmU0Ow0KdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7DQp2YXIgZHVyYXRpb25EYXkgPSA4NjRlNTsNCnZhciBkdXJhdGlvbldlZWsgPSA2MDQ4ZTU7DQoNCnZhciBzZWNvbmQgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvblNlY29uZCkgKiBkdXJhdGlvblNlY29uZCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvblNlY29uZCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQ7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTsNCn0pOw0KDQp2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTsNCg0KdmFyIG1pbnV0ZSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoZGF0ZSAvIGR1cmF0aW9uTWludXRlKSAqIGR1cmF0aW9uTWludXRlKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOw0KfSk7DQoNCnZhciBtaW51dGVzID0gbWludXRlLnJhbmdlOw0KDQp2YXIgaG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgdmFyIG9mZnNldCA9IGRhdGUuZ2V0VGltZXpvbmVPZmZzZXQoKSAqIGR1cmF0aW9uTWludXRlICUgZHVyYXRpb25Ib3VyOw0KICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ICs9IGR1cmF0aW9uSG91cjsNCiAgZGF0ZS5zZXRUaW1lKE1hdGguZmxvb3IoKCtkYXRlIC0gb2Zmc2V0KSAvIGR1cmF0aW9uSG91cikgKiBkdXJhdGlvbkhvdXIgKyBvZmZzZXQpOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsNCn0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldEhvdXJzKCk7DQp9KTsNCg0KdmFyIGhvdXJzID0gaG91ci5yYW5nZTsNCg0KdmFyIGRheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uRGF5Ow0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOw0KfSk7DQoNCnZhciBkYXlzID0gZGF5LnJhbmdlOw0KDQpmdW5jdGlvbiB3ZWVrZGF5KGkpIHsNCiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpOw0KICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7DQogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7DQogIH0pOw0KfQ0KDQp2YXIgc3VuZGF5ID0gd2Vla2RheSgwKTsNCnZhciBtb25kYXkgPSB3ZWVrZGF5KDEpOw0KdmFyIHR1ZXNkYXkgPSB3ZWVrZGF5KDIpOw0KdmFyIHdlZG5lc2RheSA9IHdlZWtkYXkoMyk7DQp2YXIgdGh1cnNkYXkgPSB3ZWVrZGF5KDQpOw0KdmFyIGZyaWRheSA9IHdlZWtkYXkoNSk7DQp2YXIgc2F0dXJkYXkgPSB3ZWVrZGF5KDYpOw0KDQp2YXIgc3VuZGF5cyA9IHN1bmRheS5yYW5nZTsNCnZhciBtb25kYXlzID0gbW9uZGF5LnJhbmdlOw0KdmFyIHR1ZXNkYXlzID0gdHVlc2RheS5yYW5nZTsNCnZhciB3ZWRuZXNkYXlzID0gd2VkbmVzZGF5LnJhbmdlOw0KdmFyIHRodXJzZGF5cyA9IHRodXJzZGF5LnJhbmdlOw0KdmFyIGZyaWRheXMgPSBmcmlkYXkucmFuZ2U7DQp2YXIgc2F0dXJkYXlzID0gc2F0dXJkYXkucmFuZ2U7DQoNCnZhciBtb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgZGF0ZS5zZXREYXRlKDEpOw0KICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjsNCn0sIGZ1bmN0aW9uKGRhdGUpIHsNCiAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsNCn0pOw0KDQp2YXIgbW9udGhzID0gbW9udGgucmFuZ2U7DQoNCnZhciB5ZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldE1vbnRoKDAsIDEpOw0KICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOw0KfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOw0KfSk7DQoNCi8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4NCnllYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7DQogIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRGdWxsWWVhcigpIC8gaykgKiBrKTsNCiAgICBkYXRlLnNldE1vbnRoKDAsIDEpOw0KICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiBrKTsNCiAgfSk7DQp9Ow0KDQp2YXIgeWVhcnMgPSB5ZWFyLnJhbmdlOw0KDQp2YXIgdXRjTWludXRlID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ1NlY29uZHMoMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbk1pbnV0ZSk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGU7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTsNCn0pOw0KDQp2YXIgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTsNCg0KdmFyIHV0Y0hvdXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDTWludXRlcygwLCAwLCAwKTsNCn0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uSG91cik7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOw0KfSk7DQoNCnZhciB1dGNIb3VycyA9IHV0Y0hvdXIucmFuZ2U7DQoNCnZhciB1dGNEYXkgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXApOw0KfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgew0KICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uRGF5Ow0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENEYXRlKCkgLSAxOw0KfSk7DQoNCnZhciB1dGNEYXlzID0gdXRjRGF5LnJhbmdlOw0KDQpmdW5jdGlvbiB1dGNXZWVrZGF5KGkpIHsNCiAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsNCiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOw0KICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQogIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsNCiAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7DQogIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsNCiAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlazsNCiAgfSk7DQp9DQoNCnZhciB1dGNTdW5kYXkgPSB1dGNXZWVrZGF5KDApOw0KdmFyIHV0Y01vbmRheSA9IHV0Y1dlZWtkYXkoMSk7DQp2YXIgdXRjVHVlc2RheSA9IHV0Y1dlZWtkYXkoMik7DQp2YXIgdXRjV2VkbmVzZGF5ID0gdXRjV2Vla2RheSgzKTsNCnZhciB1dGNUaHVyc2RheSA9IHV0Y1dlZWtkYXkoNCk7DQp2YXIgdXRjRnJpZGF5ID0gdXRjV2Vla2RheSg1KTsNCnZhciB1dGNTYXR1cmRheSA9IHV0Y1dlZWtkYXkoNik7DQoNCnZhciB1dGNTdW5kYXlzID0gdXRjU3VuZGF5LnJhbmdlOw0KdmFyIHV0Y01vbmRheXMgPSB1dGNNb25kYXkucmFuZ2U7DQp2YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlOw0KdmFyIHV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXkucmFuZ2U7DQp2YXIgdXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7DQp2YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTsNCnZhciB1dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheS5yYW5nZTsNCg0KdmFyIHV0Y01vbnRoID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICBkYXRlLnNldFVUQ0RhdGUoMSk7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiBlbmQuZ2V0VVRDTW9udGgoKSAtIHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAoZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpKSAqIDEyOw0KfSwgZnVuY3Rpb24oZGF0ZSkgew0KICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOw0KfSk7DQoNCnZhciB1dGNNb250aHMgPSB1dGNNb250aC5yYW5nZTsNCg0KdmFyIHV0Y1llYXIgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7DQogIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7DQogIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7DQp9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7DQogIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7DQp9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7DQogIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCk7DQp9LCBmdW5jdGlvbihkYXRlKSB7DQogIHJldHVybiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7DQp9KTsNCg0KLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLg0KdXRjWWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsNCiAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgew0KICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLyBrKSAqIGspOw0KICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7DQogICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsNCiAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgew0KICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOw0KICB9KTsNCn07DQoNCnZhciB1dGNZZWFycyA9IHV0Y1llYXIucmFuZ2U7DQoNCmV4cG9ydHMudGltZUludGVydmFsID0gbmV3SW50ZXJ2YWw7DQpleHBvcnRzLnRpbWVNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOw0KZXhwb3J0cy50aW1lTWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzOw0KZXhwb3J0cy51dGNNaWxsaXNlY29uZCA9IG1pbGxpc2Vjb25kOw0KZXhwb3J0cy51dGNNaWxsaXNlY29uZHMgPSBtaWxsaXNlY29uZHM7DQpleHBvcnRzLnRpbWVTZWNvbmQgPSBzZWNvbmQ7DQpleHBvcnRzLnRpbWVTZWNvbmRzID0gc2Vjb25kczsNCmV4cG9ydHMudXRjU2Vjb25kID0gc2Vjb25kOw0KZXhwb3J0cy51dGNTZWNvbmRzID0gc2Vjb25kczsNCmV4cG9ydHMudGltZU1pbnV0ZSA9IG1pbnV0ZTsNCmV4cG9ydHMudGltZU1pbnV0ZXMgPSBtaW51dGVzOw0KZXhwb3J0cy50aW1lSG91ciA9IGhvdXI7DQpleHBvcnRzLnRpbWVIb3VycyA9IGhvdXJzOw0KZXhwb3J0cy50aW1lRGF5ID0gZGF5Ow0KZXhwb3J0cy50aW1lRGF5cyA9IGRheXM7DQpleHBvcnRzLnRpbWVXZWVrID0gc3VuZGF5Ow0KZXhwb3J0cy50aW1lV2Vla3MgPSBzdW5kYXlzOw0KZXhwb3J0cy50aW1lU3VuZGF5ID0gc3VuZGF5Ow0KZXhwb3J0cy50aW1lU3VuZGF5cyA9IHN1bmRheXM7DQpleHBvcnRzLnRpbWVNb25kYXkgPSBtb25kYXk7DQpleHBvcnRzLnRpbWVNb25kYXlzID0gbW9uZGF5czsNCmV4cG9ydHMudGltZVR1ZXNkYXkgPSB0dWVzZGF5Ow0KZXhwb3J0cy50aW1lVHVlc2RheXMgPSB0dWVzZGF5czsNCmV4cG9ydHMudGltZVdlZG5lc2RheSA9IHdlZG5lc2RheTsNCmV4cG9ydHMudGltZVdlZG5lc2RheXMgPSB3ZWRuZXNkYXlzOw0KZXhwb3J0cy50aW1lVGh1cnNkYXkgPSB0aHVyc2RheTsNCmV4cG9ydHMudGltZVRodXJzZGF5cyA9IHRodXJzZGF5czsNCmV4cG9ydHMudGltZUZyaWRheSA9IGZyaWRheTsNCmV4cG9ydHMudGltZUZyaWRheXMgPSBmcmlkYXlzOw0KZXhwb3J0cy50aW1lU2F0dXJkYXkgPSBzYXR1cmRheTsNCmV4cG9ydHMudGltZVNhdHVyZGF5cyA9IHNhdHVyZGF5czsNCmV4cG9ydHMudGltZU1vbnRoID0gbW9udGg7DQpleHBvcnRzLnRpbWVNb250aHMgPSBtb250aHM7DQpleHBvcnRzLnRpbWVZZWFyID0geWVhcjsNCmV4cG9ydHMudGltZVllYXJzID0geWVhcnM7DQpleHBvcnRzLnV0Y01pbnV0ZSA9IHV0Y01pbnV0ZTsNCmV4cG9ydHMudXRjTWludXRlcyA9IHV0Y01pbnV0ZXM7DQpleHBvcnRzLnV0Y0hvdXIgPSB1dGNIb3VyOw0KZXhwb3J0cy51dGNIb3VycyA9IHV0Y0hvdXJzOw0KZXhwb3J0cy51dGNEYXkgPSB1dGNEYXk7DQpleHBvcnRzLnV0Y0RheXMgPSB1dGNEYXlzOw0KZXhwb3J0cy51dGNXZWVrID0gdXRjU3VuZGF5Ow0KZXhwb3J0cy51dGNXZWVrcyA9IHV0Y1N1bmRheXM7DQpleHBvcnRzLnV0Y1N1bmRheSA9IHV0Y1N1bmRheTsNCmV4cG9ydHMudXRjU3VuZGF5cyA9IHV0Y1N1bmRheXM7DQpleHBvcnRzLnV0Y01vbmRheSA9IHV0Y01vbmRheTsNCmV4cG9ydHMudXRjTW9uZGF5cyA9IHV0Y01vbmRheXM7DQpleHBvcnRzLnV0Y1R1ZXNkYXkgPSB1dGNUdWVzZGF5Ow0KZXhwb3J0cy51dGNUdWVzZGF5cyA9IHV0Y1R1ZXNkYXlzOw0KZXhwb3J0cy51dGNXZWRuZXNkYXkgPSB1dGNXZWRuZXNkYXk7DQpleHBvcnRzLnV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXlzOw0KZXhwb3J0cy51dGNUaHVyc2RheSA9IHV0Y1RodXJzZGF5Ow0KZXhwb3J0cy51dGNUaHVyc2RheXMgPSB1dGNUaHVyc2RheXM7DQpleHBvcnRzLnV0Y0ZyaWRheSA9IHV0Y0ZyaWRheTsNCmV4cG9ydHMudXRjRnJpZGF5cyA9IHV0Y0ZyaWRheXM7DQpleHBvcnRzLnV0Y1NhdHVyZGF5ID0gdXRjU2F0dXJkYXk7DQpleHBvcnRzLnV0Y1NhdHVyZGF5cyA9IHV0Y1NhdHVyZGF5czsNCmV4cG9ydHMudXRjTW9udGggPSB1dGNNb250aDsNCmV4cG9ydHMudXRjTW9udGhzID0gdXRjTW9udGhzOw0KZXhwb3J0cy51dGNZZWFyID0gdXRjWWVhcjsNCmV4cG9ydHMudXRjWWVhcnMgPSB1dGNZZWFyczsNCg0KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTsNCg0KfSkpKTsNCg0KfSx7fV0sMTY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpew0KLy8gaHR0cHM6Ly9kM2pzLm9yZy9kMy10aW1lci8gVmVyc2lvbiAxLjAuNi4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLg0KKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsNCgl0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KGV4cG9ydHMpIDoNCgl0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDoNCgkoZmFjdG9yeSgoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9KSkpOw0KfSh0aGlzLCAoZnVuY3Rpb24gKGV4cG9ydHMpIHsgJ3VzZSBzdHJpY3QnOw0KDQp2YXIgZnJhbWUgPSAwOw0KdmFyIHRpbWVvdXQgPSAwOw0KdmFyIGludGVydmFsID0gMDsNCnZhciBwb2tlRGVsYXkgPSAxMDAwOw0KdmFyIHRhc2tIZWFkOw0KdmFyIHRhc2tUYWlsOw0KdmFyIGNsb2NrTGFzdCA9IDA7DQp2YXIgY2xvY2tOb3cgPSAwOw0KdmFyIGNsb2NrU2tldyA9IDA7DQp2YXIgY2xvY2sgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZTsNCnZhciBzZXRGcmFtZSA9IHR5cGVvZiB3aW5kb3cgPT09ICJvYmplY3QiICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KSA6IGZ1bmN0aW9uKGYpIHsgc2V0VGltZW91dChmLCAxNyk7IH07DQoNCmZ1bmN0aW9uIG5vdygpIHsNCiAgcmV0dXJuIGNsb2NrTm93IHx8IChzZXRGcmFtZShjbGVhck5vdyksIGNsb2NrTm93ID0gY2xvY2subm93KCkgKyBjbG9ja1NrZXcpOw0KfQ0KDQpmdW5jdGlvbiBjbGVhck5vdygpIHsNCiAgY2xvY2tOb3cgPSAwOw0KfQ0KDQpmdW5jdGlvbiBUaW1lcigpIHsNCiAgdGhpcy5fY2FsbCA9DQogIHRoaXMuX3RpbWUgPQ0KICB0aGlzLl9uZXh0ID0gbnVsbDsNCn0NCg0KVGltZXIucHJvdG90eXBlID0gdGltZXIucHJvdG90eXBlID0gew0KICBjb25zdHJ1Y3RvcjogVGltZXIsDQogIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7DQogICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7DQogICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7DQogICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpczsNCiAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzOw0KICAgICAgdGFza1RhaWwgPSB0aGlzOw0KICAgIH0NCiAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7DQogICAgdGhpcy5fdGltZSA9IHRpbWU7DQogICAgc2xlZXAoKTsNCiAgfSwNCiAgc3RvcDogZnVuY3Rpb24oKSB7DQogICAgaWYgKHRoaXMuX2NhbGwpIHsNCiAgICAgIHRoaXMuX2NhbGwgPSBudWxsOw0KICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5Ow0KICAgICAgc2xlZXAoKTsNCiAgICB9DQogIH0NCn07DQoNCmZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICB2YXIgdCA9IG5ldyBUaW1lcjsNCiAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7DQogIHJldHVybiB0Ow0KfQ0KDQpmdW5jdGlvbiB0aW1lckZsdXNoKCkgew0KICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4NCiAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuDQogIHZhciB0ID0gdGFza0hlYWQsIGU7DQogIHdoaWxlICh0KSB7DQogICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7DQogICAgdCA9IHQuX25leHQ7DQogIH0NCiAgLS1mcmFtZTsNCn0NCg0KZnVuY3Rpb24gd2FrZSgpIHsNCiAgY2xvY2tOb3cgPSAoY2xvY2tMYXN0ID0gY2xvY2subm93KCkpICsgY2xvY2tTa2V3Ow0KICBmcmFtZSA9IHRpbWVvdXQgPSAwOw0KICB0cnkgew0KICAgIHRpbWVyRmx1c2goKTsNCiAgfSBmaW5hbGx5IHsNCiAgICBmcmFtZSA9IDA7DQogICAgbmFwKCk7DQogICAgY2xvY2tOb3cgPSAwOw0KICB9DQp9DQoNCmZ1bmN0aW9uIHBva2UoKSB7DQogIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7DQogIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7DQp9DQoNCmZ1bmN0aW9uIG5hcCgpIHsNCiAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5Ow0KICB3aGlsZSAodDEpIHsNCiAgICBpZiAodDEuX2NhbGwpIHsNCiAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTsNCiAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7DQogICAgfSBlbHNlIHsNCiAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDsNCiAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsNCiAgICB9DQogIH0NCiAgdGFza1RhaWwgPSB0MDsNCiAgc2xlZXAodGltZSk7DQp9DQoNCmZ1bmN0aW9uIHNsZWVwKHRpbWUpIHsNCiAgaWYgKGZyYW1lKSByZXR1cm47IC8vIFNvb25lc3QgYWxhcm0gYWxyZWFkeSBzZXQsIG9yIHdpbGwgYmUuDQogIGlmICh0aW1lb3V0KSB0aW1lb3V0ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQpOw0KICB2YXIgZGVsYXkgPSB0aW1lIC0gY2xvY2tOb3c7DQogIGlmIChkZWxheSA+IDI0KSB7DQogICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgZGVsYXkpOw0KICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTsNCiAgfSBlbHNlIHsNCiAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9ja05vdywgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpOw0KICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7DQogIH0NCn0NCg0KdmFyIHRpbWVvdXQkMSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgew0KICB2YXIgdCA9IG5ldyBUaW1lcjsNCiAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTsNCiAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsNCiAgICB0LnN0b3AoKTsNCiAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOw0KICB9LCBkZWxheSwgdGltZSk7DQogIHJldHVybiB0Ow0KfTsNCg0KdmFyIGludGVydmFsJDEgPSBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsNCiAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7DQogIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7DQogIGRlbGF5ID0gK2RlbGF5LCB0aW1lID0gdGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZTsNCiAgdC5yZXN0YXJ0KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgew0KICAgIGVsYXBzZWQgKz0gdG90YWw7DQogICAgdC5yZXN0YXJ0KHRpY2ssIHRvdGFsICs9IGRlbGF5LCB0aW1lKTsNCiAgICBjYWxsYmFjayhlbGFwc2VkKTsNCiAgfSwgZGVsYXksIHRpbWUpOw0KICByZXR1cm4gdDsNCn07DQoNCmV4cG9ydHMubm93ID0gbm93Ow0KZXhwb3J0cy50aW1lciA9IHRpbWVyOw0KZXhwb3J0cy50aW1lckZsdXNoID0gdGltZXJGbHVzaDsNCmV4cG9ydHMudGltZW91dCA9IHRpbWVvdXQkMTsNCmV4cG9ydHMuaW50ZXJ2YWwgPSBpbnRlcnZhbCQxOw0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHt9XSwxNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7DQovLyBodHRwczovL2QzanMub3JnL2QzLXRyYW5zaXRpb24vIFZlcnNpb24gMS4xLjAuIENvcHlyaWdodCAyMDE3IE1pa2UgQm9zdG9jay4NCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7DQoJdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCdkMy1zZWxlY3Rpb24nKSwgcmVxdWlyZSgnZDMtZGlzcGF0Y2gnKSwgcmVxdWlyZSgnZDMtdGltZXInKSwgcmVxdWlyZSgnZDMtaW50ZXJwb2xhdGUnKSwgcmVxdWlyZSgnZDMtY29sb3InKSwgcmVxdWlyZSgnZDMtZWFzZScpKSA6DQoJdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnZXhwb3J0cycsICdkMy1zZWxlY3Rpb24nLCAnZDMtZGlzcGF0Y2gnLCAnZDMtdGltZXInLCAnZDMtaW50ZXJwb2xhdGUnLCAnZDMtY29sb3InLCAnZDMtZWFzZSddLCBmYWN0b3J5KSA6DQoJKGZhY3RvcnkoKGdsb2JhbC5kMyA9IGdsb2JhbC5kMyB8fCB7fSksZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMsZ2xvYmFsLmQzLGdsb2JhbC5kMyxnbG9iYWwuZDMpKTsNCn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLGQzU2VsZWN0aW9uLGQzRGlzcGF0Y2gsZDNUaW1lcixkM0ludGVycG9sYXRlLGQzQ29sb3IsZDNFYXNlKSB7ICd1c2Ugc3RyaWN0JzsNCg0KdmFyIGVtcHR5T24gPSBkM0Rpc3BhdGNoLmRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiaW50ZXJydXB0Iik7DQp2YXIgZW1wdHlUd2VlbiA9IFtdOw0KDQp2YXIgQ1JFQVRFRCA9IDA7DQp2YXIgU0NIRURVTEVEID0gMTsNCnZhciBTVEFSVElORyA9IDI7DQp2YXIgU1RBUlRFRCA9IDM7DQp2YXIgUlVOTklORyA9IDQ7DQp2YXIgRU5ESU5HID0gNTsNCnZhciBFTkRFRCA9IDY7DQoNCnZhciBzY2hlZHVsZSA9IGZ1bmN0aW9uKG5vZGUsIG5hbWUsIGlkLCBpbmRleCwgZ3JvdXAsIHRpbWluZykgew0KICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb247DQogIGlmICghc2NoZWR1bGVzKSBub2RlLl9fdHJhbnNpdGlvbiA9IHt9Ow0KICBlbHNlIGlmIChpZCBpbiBzY2hlZHVsZXMpIHJldHVybjsNCiAgY3JlYXRlKG5vZGUsIGlkLCB7DQogICAgbmFtZTogbmFtZSwNCiAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4NCiAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4NCiAgICBvbjogZW1wdHlPbiwNCiAgICB0d2VlbjogZW1wdHlUd2VlbiwNCiAgICB0aW1lOiB0aW1pbmcudGltZSwNCiAgICBkZWxheTogdGltaW5nLmRlbGF5LA0KICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sDQogICAgZWFzZTogdGltaW5nLmVhc2UsDQogICAgdGltZXI6IG51bGwsDQogICAgc3RhdGU6IENSRUFURUQNCiAgfSk7DQp9Ow0KDQpmdW5jdGlvbiBpbml0KG5vZGUsIGlkKSB7DQogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOw0KICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pIHx8IHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCkgdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpOw0KICByZXR1cm4gc2NoZWR1bGU7DQp9DQoNCmZ1bmN0aW9uIHNldChub2RlLCBpZCkgew0KICB2YXIgc2NoZWR1bGUgPSBub2RlLl9fdHJhbnNpdGlvbjsNCiAgaWYgKCFzY2hlZHVsZSB8fCAhKHNjaGVkdWxlID0gc2NoZWR1bGVbaWRdKSB8fCBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7DQogIHJldHVybiBzY2hlZHVsZTsNCn0NCg0KZnVuY3Rpb24gZ2V0KG5vZGUsIGlkKSB7DQogIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOw0KICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7DQogIHJldHVybiBzY2hlZHVsZTsNCn0NCg0KZnVuY3Rpb24gY3JlYXRlKG5vZGUsIGlkLCBzZWxmKSB7DQogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwNCiAgICAgIHR3ZWVuOw0KDQogIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLg0KICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayENCiAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7DQogIHNlbGYudGltZXIgPSBkM1RpbWVyLnRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOw0KDQogIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsNCiAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEOw0KICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsNCg0KICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5Lg0KICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsNCiAgfQ0KDQogIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsNCiAgICB2YXIgaSwgaiwgbiwgbzsNCg0KICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC4NCiAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpOw0KDQogICAgZm9yIChpIGluIHNjaGVkdWxlcykgew0KICAgICAgbyA9IHNjaGVkdWxlc1tpXTsNCiAgICAgIGlmIChvLm5hbWUgIT09IHNlbGYubmFtZSkgY29udGludWU7DQoNCiAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsDQogICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGENCiAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhDQogICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIGQzVGltZXIudGltZW91dChzdGFydCk7DQoNCiAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS4NCiAgICAgIC8vIERpc3BhdGNoIHRoZSBpbnRlcnJ1cHQgZXZlbnQuDQogICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORykgew0KICAgICAgICBvLnN0YXRlID0gRU5ERUQ7DQogICAgICAgIG8udGltZXIuc3RvcCgpOw0KICAgICAgICBvLm9uLmNhbGwoImludGVycnVwdCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOw0KICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICAgICAgfQ0KDQogICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuIE5vIGludGVycnVwdCBldmVudCBpcyBkaXNwYXRjaGVkDQogICAgICAvLyBiZWNhdXNlIHRoZSBjYW5jZWxsZWQgdHJhbnNpdGlvbnMgbmV2ZXIgc3RhcnRlZC4gTm90ZSB0aGF0IHRoaXMgYWxzbw0KICAgICAgLy8gcmVtb3ZlcyB0aGlzIHRyYW5zaXRpb24gZnJvbSB0aGUgcGVuZGluZyBsaXN0IQ0KICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgew0KICAgICAgICBvLnN0YXRlID0gRU5ERUQ7DQogICAgICAgIG8udGltZXIuc3RvcCgpOw0KICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuDQogICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayENCiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhDQogICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLg0KICAgIGQzVGltZXIudGltZW91dChmdW5jdGlvbigpIHsNCiAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEKSB7DQogICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HOw0KICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQodGljaywgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsNCiAgICAgICAgdGljayhlbGFwc2VkKTsNCiAgICAgIH0NCiAgICB9KTsNCg0KICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4NCiAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLg0KICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORzsNCiAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7DQogICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkDQogICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7DQoNCiAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4NCiAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOw0KICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsNCiAgICAgICAgdHdlZW5bKytqXSA9IG87DQogICAgICB9DQogICAgfQ0KICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOw0KICB9DQoNCiAgZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7DQogICAgdmFyIHQgPSBlbGFwc2VkIDwgc2VsZi5kdXJhdGlvbiA/IHNlbGYuZWFzZS5jYWxsKG51bGwsIGVsYXBzZWQgLyBzZWxmLmR1cmF0aW9uKSA6IChzZWxmLnRpbWVyLnJlc3RhcnQoc3RvcCksIHNlbGYuc3RhdGUgPSBFTkRJTkcsIDEpLA0KICAgICAgICBpID0gLTEsDQogICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7DQoNCiAgICB3aGlsZSAoKytpIDwgbikgew0KICAgICAgdHdlZW5baV0uY2FsbChudWxsLCB0KTsNCiAgICB9DQoNCiAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50Lg0KICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHsNCiAgICAgIHNlbGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7DQogICAgICBzdG9wKCk7DQogICAgfQ0KICB9DQoNCiAgZnVuY3Rpb24gc3RvcCgpIHsNCiAgICBzZWxmLnN0YXRlID0gRU5ERUQ7DQogICAgc2VsZi50aW1lci5zdG9wKCk7DQogICAgZGVsZXRlIHNjaGVkdWxlc1tpZF07DQogICAgZm9yICh2YXIgaSBpbiBzY2hlZHVsZXMpIHJldHVybjsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycw0KICAgIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsNCiAgfQ0KfQ0KDQp2YXIgaW50ZXJydXB0ID0gZnVuY3Rpb24obm9kZSwgbmFtZSkgew0KICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sDQogICAgICBzY2hlZHVsZSwNCiAgICAgIGFjdGl2ZSwNCiAgICAgIGVtcHR5ID0gdHJ1ZSwNCiAgICAgIGk7DQoNCiAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjsNCg0KICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsNCg0KICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7DQogICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfQ0KICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7DQogICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDsNCiAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7DQogICAgaWYgKGFjdGl2ZSkgc2NoZWR1bGUub24uY2FsbCgiaW50ZXJydXB0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTsNCiAgICBkZWxldGUgc2NoZWR1bGVzW2ldOw0KICB9DQoNCiAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247DQp9Ow0KDQp2YXIgc2VsZWN0aW9uX2ludGVycnVwdCA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsNCiAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7DQogIH0pOw0KfTsNCg0KZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHsNCiAgdmFyIHR3ZWVuMCwgdHdlZW4xOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKSwNCiAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsNCg0KICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwNCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSENCiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuDQogICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHsNCiAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOw0KICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7DQogICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkgew0KICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOw0KICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7DQogICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQoNCiAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHsNCiAgdmFyIHR3ZWVuMCwgdHdlZW4xOw0KICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgc2NoZWR1bGUgPSBzZXQodGhpcywgaWQpLA0KICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOw0KDQogICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLA0KICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQ0KICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4NCiAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgew0KICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOw0KICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsNCiAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7DQogICAgICAgICAgdHdlZW4xW2ldID0gdDsNCiAgICAgICAgICBicmVhazsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOw0KICAgIH0NCg0KICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOw0KICB9Ow0KfQ0KDQp2YXIgdHJhbnNpdGlvbl90d2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBpZCA9IHRoaXMuX2lkOw0KDQogIG5hbWUgKz0gIiI7DQoNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7DQogICAgdmFyIHR3ZWVuID0gZ2V0KHRoaXMubm9kZSgpLCBpZCkudHdlZW47DQogICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2Vlbi5sZW5ndGgsIHQ7IGkgPCBuOyArK2kpIHsNCiAgICAgIGlmICgodCA9IHR3ZWVuW2ldKS5uYW1lID09PSBuYW1lKSB7DQogICAgICAgIHJldHVybiB0LnZhbHVlOw0KICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gbnVsbDsNCiAgfQ0KDQogIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOw0KfTsNCg0KZnVuY3Rpb24gdHdlZW5WYWx1ZSh0cmFuc2l0aW9uLCBuYW1lLCB2YWx1ZSkgew0KICB2YXIgaWQgPSB0cmFuc2l0aW9uLl9pZDsNCg0KICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7DQogICAgdmFyIHNjaGVkdWxlID0gc2V0KHRoaXMsIGlkKTsNCiAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7DQogIH0pOw0KDQogIHJldHVybiBmdW5jdGlvbihub2RlKSB7DQogICAgcmV0dXJuIGdldChub2RlLCBpZCkudmFsdWVbbmFtZV07DQogIH07DQp9DQoNCnZhciBpbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKGEsIGIpIHsNCiAgdmFyIGM7DQogIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZU51bWJlcg0KICAgICAgOiBiIGluc3RhbmNlb2YgZDNDb2xvci5jb2xvciA/IGQzSW50ZXJwb2xhdGUuaW50ZXJwb2xhdGVSZ2INCiAgICAgIDogKGMgPSBkM0NvbG9yLmNvbG9yKGIpKSA/IChiID0gYywgZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVJnYikNCiAgICAgIDogZDNJbnRlcnBvbGF0ZS5pbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7DQp9Ow0KDQpmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBhdHRyUmVtb3ZlTlMoZnVsbG5hbWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0ckNvbnN0YW50KG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZTEpIHsNCiAgdmFyIHZhbHVlMDAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7DQogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbA0KICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCA/IGludGVycG9sYXRlMA0KICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUxKSB7DQogIHZhciB2YWx1ZTAwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsNCiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsDQogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gYXR0ckZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsNCiAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOw0KICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7DQogIH07DQp9DQoNCmZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUpIHsNCiAgdmFyIHZhbHVlMDAsDQogICAgICB2YWx1ZTEwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCwgdmFsdWUxID0gdmFsdWUodGhpcyk7DQogICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7DQogICAgdmFsdWUwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwDQogICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUkJDEodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2F0dHIgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgew0KICB2YXIgZnVsbG5hbWUgPSBkM1NlbGVjdGlvbi5uYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gInRyYW5zZm9ybSIgPyBkM0ludGVycG9sYXRlLmludGVycG9sYXRlVHJhbnNmb3JtU3ZnIDogaW50ZXJwb2xhdGU7DQogIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJhdHRyLiIgKyBuYW1lLCB2YWx1ZSkpDQogICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKShmdWxsbmFtZSkNCiAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMgOiBhdHRyQ29uc3RhbnQpKGZ1bGxuYW1lLCBpLCB2YWx1ZSArICIiKSk7DQp9Ow0KDQpmdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaSh0KSk7DQogICAgfTsNCiAgfQ0KICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsNCiAgcmV0dXJuIHR3ZWVuOw0KfQ0KDQpmdW5jdGlvbiBhdHRyVHdlZW4obmFtZSwgdmFsdWUpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCBpKHQpKTsNCiAgICB9Ow0KICB9DQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOw0KICByZXR1cm4gdHdlZW47DQp9DQoNCnZhciB0cmFuc2l0aW9uX2F0dHJUd2VlbiA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlKSB7DQogIHZhciBrZXkgPSAiYXR0ci4iICsgbmFtZTsNCiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsNCiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7DQogIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsNCiAgdmFyIGZ1bGxuYW1lID0gZDNTZWxlY3Rpb24ubmFtZXNwYWNlKG5hbWUpOw0KICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTsNCn07DQoNCmZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24oaWQsIHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgew0KICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgew0KICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2RlbGF5ID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IGRlbGF5RnVuY3Rpb24NCiAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQpKGlkLCB2YWx1ZSkpDQogICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5Ow0KfTsNCg0KZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbihpZCwgdmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHNldCh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsNCiAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsNCiAgICBzZXQodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX2R1cmF0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgNCiAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiINCiAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24NCiAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpDQogICAgICA6IGdldCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uOw0KfTsNCg0KZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkgew0KICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICBzZXQodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTsNCiAgfTsNCn0NCg0KdmFyIHRyYW5zaXRpb25fZWFzZSA9IGZ1bmN0aW9uKHZhbHVlKSB7DQogIHZhciBpZCA9IHRoaXMuX2lkOw0KDQogIHJldHVybiBhcmd1bWVudHMubGVuZ3RoDQogICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkNCiAgICAgIDogZ2V0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX2ZpbHRlciA9IGZ1bmN0aW9uKG1hdGNoKSB7DQogIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gZDNTZWxlY3Rpb24ubWF0Y2hlcihtYXRjaCk7DQoNCiAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgew0KICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgew0KICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7DQogICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOw0KfTsNCg0KdmFyIHRyYW5zaXRpb25fbWVyZ2UgPSBmdW5jdGlvbih0cmFuc2l0aW9uKSB7DQogIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjsNCg0KICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsNCiAgICAgICAgbWVyZ2VbaV0gPSBub2RlOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIGZvciAoOyBqIDwgbTA7ICsraikgew0KICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24obWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7DQp9Ow0KDQpmdW5jdGlvbiBzdGFydChuYW1lKSB7DQogIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgew0KICAgIHZhciBpID0gdC5pbmRleE9mKCIuIik7DQogICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7DQogICAgcmV0dXJuICF0IHx8IHQgPT09ICJzdGFydCI7DQogIH0pOw0KfQ0KDQpmdW5jdGlvbiBvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikgew0KICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0KG5hbWUpID8gaW5pdCA6IHNldDsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksDQogICAgICAgIG9uID0gc2NoZWR1bGUub247DQoNCiAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwNCiAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSENCiAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuDQogICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpOw0KDQogICAgc2NoZWR1bGUub24gPSBvbjE7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX29uID0gZnVuY3Rpb24obmFtZSwgbGlzdGVuZXIpIHsNCiAgdmFyIGlkID0gdGhpcy5faWQ7DQoNCiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyDQogICAgICA/IGdldCh0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpDQogICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uKGlkLCBuYW1lLCBsaXN0ZW5lcikpOw0KfTsNCg0KZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7DQogICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuOw0KICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsNCiAgfTsNCn0NCg0KdmFyIHRyYW5zaXRpb25fcmVtb3ZlID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24odGhpcy5faWQpKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3NlbGVjdCA9IGZ1bmN0aW9uKHNlbGVjdCkgew0KICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsDQogICAgICBpZCA9IHRoaXMuX2lkOw0KDQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBkM1NlbGVjdGlvbi5zZWxlY3RvcihzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsNCiAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7DQogICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOw0KICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7DQogICAgICAgIHNjaGVkdWxlKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldChub2RlLCBpZCkpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3NlbGVjdEFsbCA9IGZ1bmN0aW9uKHNlbGVjdCkgew0KICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsDQogICAgICBpZCA9IHRoaXMuX2lkOw0KDQogIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBkM1NlbGVjdGlvbi5zZWxlY3RvckFsbChzZWxlY3QpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldChub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7DQogICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsNCiAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7DQogICAgICAgIHBhcmVudHMucHVzaChub2RlKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24oc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7DQp9Ow0KDQp2YXIgU2VsZWN0aW9uID0gZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsNCg0KdmFyIHRyYW5zaXRpb25fc2VsZWN0aW9uID0gZnVuY3Rpb24oKSB7DQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7DQp9Ow0KDQpmdW5jdGlvbiBzdHlsZVJlbW92ZShuYW1lLCBpbnRlcnBvbGF0ZSQkMSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gZDNTZWxlY3Rpb24uc3R5bGUodGhpcywgbmFtZSksDQogICAgICAgIHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBkM1NlbGVjdGlvbi5zdHlsZSh0aGlzLCBuYW1lKSk7DQogICAgcmV0dXJuIHZhbHVlMCA9PT0gdmFsdWUxID8gbnVsbA0KICAgICAgICA6IHZhbHVlMCA9PT0gdmFsdWUwMCAmJiB2YWx1ZTEgPT09IHZhbHVlMTAgPyBpbnRlcnBvbGF0ZTANCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEwID0gdmFsdWUxKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gc3R5bGVSZW1vdmVFbmQobmFtZSkgew0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gc3R5bGVDb25zdGFudChuYW1lLCBpbnRlcnBvbGF0ZSQkMSwgdmFsdWUxKSB7DQogIHZhciB2YWx1ZTAwLA0KICAgICAgaW50ZXJwb2xhdGUwOw0KICByZXR1cm4gZnVuY3Rpb24oKSB7DQogICAgdmFyIHZhbHVlMCA9IGQzU2VsZWN0aW9uLnN0eWxlKHRoaXMsIG5hbWUpOw0KICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwNCiAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTANCiAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSQkMSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOw0KICB9Ow0KfQ0KDQpmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uKG5hbWUsIGludGVycG9sYXRlJCQxLCB2YWx1ZSkgew0KICB2YXIgdmFsdWUwMCwNCiAgICAgIHZhbHVlMTAsDQogICAgICBpbnRlcnBvbGF0ZTA7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUwID0gZDNTZWxlY3Rpb24uc3R5bGUodGhpcywgbmFtZSksDQogICAgICAgIHZhbHVlMSA9IHZhbHVlKHRoaXMpOw0KICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgdmFsdWUxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIGQzU2VsZWN0aW9uLnN0eWxlKHRoaXMsIG5hbWUpKTsNCiAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsDQogICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMA0KICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlJCQxKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOw0KICB9Ow0KfQ0KDQp2YXIgdHJhbnNpdGlvbl9zdHlsZSA9IGZ1bmN0aW9uKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgew0KICB2YXIgaSA9IChuYW1lICs9ICIiKSA9PT0gInRyYW5zZm9ybSIgPyBkM0ludGVycG9sYXRlLmludGVycG9sYXRlVHJhbnNmb3JtQ3NzIDogaW50ZXJwb2xhdGU7DQogIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcw0KICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlUmVtb3ZlKG5hbWUsIGkpKQ0KICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZUVuZChuYW1lKSkNCiAgICAgIDogdGhpcy5zdHlsZVR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgICAgID8gc3R5bGVGdW5jdGlvbihuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUpKQ0KICAgICAgICAgIDogc3R5bGVDb25zdGFudChuYW1lLCBpLCB2YWx1ZSArICIiKSwgcHJpb3JpdHkpOw0KfTsNCg0KZnVuY3Rpb24gc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsNCiAgZnVuY3Rpb24gdHdlZW4oKSB7DQogICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsNCiAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7DQogICAgICBub2RlLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkodCksIHByaW9yaXR5KTsNCiAgICB9Ow0KICB9DQogIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOw0KICByZXR1cm4gdHdlZW47DQp9DQoNCnZhciB0cmFuc2l0aW9uX3N0eWxlVHdlZW4gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsNCiAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOw0KICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOw0KICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsNCiAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOw0KICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSk7DQp9Ow0KDQpmdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHsNCiAgcmV0dXJuIGZ1bmN0aW9uKCkgew0KICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsNCiAgfTsNCn0NCg0KZnVuY3Rpb24gdGV4dEZ1bmN0aW9uKHZhbHVlKSB7DQogIHJldHVybiBmdW5jdGlvbigpIHsNCiAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7DQogICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7DQogIH07DQp9DQoNCnZhciB0cmFuc2l0aW9uX3RleHQgPSBmdW5jdGlvbih2YWx1ZSkgew0KICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIg0KICAgICAgPyB0ZXh0RnVuY3Rpb24odHdlZW5WYWx1ZSh0aGlzLCAidGV4dCIsIHZhbHVlKSkNCiAgICAgIDogdGV4dENvbnN0YW50KHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsNCn07DQoNCnZhciB0cmFuc2l0aW9uX3RyYW5zaXRpb24gPSBmdW5jdGlvbigpIHsNCiAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLA0KICAgICAgaWQwID0gdGhpcy5faWQsDQogICAgICBpZDEgPSBuZXdJZCgpOw0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHZhciBpbmhlcml0ID0gZ2V0KG5vZGUsIGlkMCk7DQogICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHsNCiAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwNCiAgICAgICAgICBkZWxheTogMCwNCiAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbiwNCiAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UNCiAgICAgICAgfSk7DQogICAgICB9DQogICAgfQ0KICB9DQoNCiAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsNCn07DQoNCnZhciBpZCA9IDA7DQoNCmZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkgew0KICB0aGlzLl9ncm91cHMgPSBncm91cHM7DQogIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOw0KICB0aGlzLl9uYW1lID0gbmFtZTsNCiAgdGhpcy5faWQgPSBpZDsNCn0NCg0KZnVuY3Rpb24gdHJhbnNpdGlvbihuYW1lKSB7DQogIHJldHVybiBkM1NlbGVjdGlvbi5zZWxlY3Rpb24oKS50cmFuc2l0aW9uKG5hbWUpOw0KfQ0KDQpmdW5jdGlvbiBuZXdJZCgpIHsNCiAgcmV0dXJuICsraWQ7DQp9DQoNCnZhciBzZWxlY3Rpb25fcHJvdG90eXBlID0gZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZTsNCg0KVHJhbnNpdGlvbi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uLnByb3RvdHlwZSA9IHsNCiAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sDQogIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsDQogIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsDQogIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsDQogIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLA0KICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLA0KICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sDQogIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCwNCiAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsDQogIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwNCiAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLA0KICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwNCiAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLA0KICBvbjogdHJhbnNpdGlvbl9vbiwNCiAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLA0KICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLA0KICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSwNCiAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLA0KICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsDQogIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsDQogIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLA0KICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSwNCiAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sDQogIGVhc2U6IHRyYW5zaXRpb25fZWFzZQ0KfTsNCg0KdmFyIGRlZmF1bHRUaW1pbmcgPSB7DQogIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuDQogIGRlbGF5OiAwLA0KICBkdXJhdGlvbjogMjUwLA0KICBlYXNlOiBkM0Vhc2UuZWFzZUN1YmljSW5PdXQNCn07DQoNCmZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsNCiAgdmFyIHRpbWluZzsNCiAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHsNCiAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgew0KICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IGQzVGltZXIubm93KCksIGRlZmF1bHRUaW1pbmc7DQogICAgfQ0KICB9DQogIHJldHVybiB0aW1pbmc7DQp9DQoNCnZhciBzZWxlY3Rpb25fdHJhbnNpdGlvbiA9IGZ1bmN0aW9uKG5hbWUpIHsNCiAgdmFyIGlkLA0KICAgICAgdGltaW5nOw0KDQogIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbikgew0KICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOw0KICB9IGVsc2Ugew0KICAgIGlkID0gbmV3SWQoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmcpLnRpbWUgPSBkM1RpbWVyLm5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsNCiAgfQ0KDQogIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7DQogICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7DQogICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7DQogICAgICAgIHNjaGVkdWxlKG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQobm9kZSwgaWQpKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7DQp9Ow0KDQpkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQ7DQpkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbjsNCg0KdmFyIHJvb3QgPSBbbnVsbF07DQoNCnZhciBhY3RpdmUgPSBmdW5jdGlvbihub2RlLCBuYW1lKSB7DQogIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwNCiAgICAgIHNjaGVkdWxlLA0KICAgICAgaTsNCg0KICBpZiAoc2NoZWR1bGVzKSB7DQogICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7DQogICAgZm9yIChpIGluIHNjaGVkdWxlcykgew0KICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkgew0KICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QsIG5hbWUsICtpKTsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gbnVsbDsNCn07DQoNCmV4cG9ydHMudHJhbnNpdGlvbiA9IHRyYW5zaXRpb247DQpleHBvcnRzLmFjdGl2ZSA9IGFjdGl2ZTsNCmV4cG9ydHMuaW50ZXJydXB0ID0gaW50ZXJydXB0Ow0KDQpPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pOw0KDQp9KSkpOw0KDQp9LHsiZDMtY29sb3IiOjQsImQzLWRpc3BhdGNoIjo1LCJkMy1lYXNlIjo2LCJkMy1pbnRlcnBvbGF0ZSI6OSwiZDMtc2VsZWN0aW9uIjoxMiwiZDMtdGltZXIiOjE2fV19LHt9LFsxXSk7DQo="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-c9c7495687611e24fd85" class="sunburst html-widget" style="width:960px;height:500px; position:relative;">
<div>
<div class="sunburst-main">
<div class="sunburst-sequence"></div>
<div class="sunburst-chart">
<div class="sunburst-explanation" style="visibility:hidden;"></div>
</div>
</div>
<div class="sunburst-sidebar">
<input type="checkbox" class="sunburst-togglelegend">Legend</input>
<div class="sunburst-legend" style="visibility:hidden;"></div>
</div>
</div>
</div>
</div>
<script type="application/json" data-for="htmlwidget-c9c7495687611e24fd85">{"x":{"data":{"name":"leaflet.extras","children":[{"name":"CONDUCT.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1412},{"name":"DESCRIPTION","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:09:47","size":1171},{"name":"docs","children":[{"name":"authors.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3466},{"name":"index.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":9245},{"name":"jquery.sticky-kit.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2807},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":35815},{"name":"link.svg","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":822},{"name":"news","children":[{"name":"index.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":13191}]},{"name":"pkgdown.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1990},{"name":"pkgdown.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":148},{"name":"reference","children":[{"name":"addAwesomeMarkersDependencies.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3992},{"name":"addBootstrapDependency.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3814},{"name":"addGeodesicPolylines.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":10185},{"name":"draw-options.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":11932},{"name":"draw.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6982},{"name":"fullscreen.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4663},{"name":"gps.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5379},{"name":"heatmap.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":11859},{"name":"index.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":11369},{"name":"leaflet.extras.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3415},{"name":"leafletExtrasDependencies.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3853},{"name":"leaflethash.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4305},{"name":"measure-path.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5363},{"name":"omnivore.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":26383},{"name":"pulseMarkers.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":8897},{"name":"search-options.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":10742},{"name":"search.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4892},{"name":"sleep.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5068},{"name":"style-editor.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4856},{"name":"TileCaching.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4891},{"name":"utils.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5192},{"name":"weatherMarkers.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":9032},{"name":"webglheatmap.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":11160},{"name":"wms-legend.html","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4218}]}]},{"name":"inst","children":[{"name":"examples","children":[{"name":"CSV.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":853},{"name":"data","children":[{"name":"csv","children":[{"name":"us_airports.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5929},{"name":"world_airports.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":74957}]},{"name":"gpx","children":[{"name":"md-airports.gpx.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5414},{"name":"md-towns.gpx.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":10837},{"name":"St_Louis_Zoo_sample.gpx.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1299}]},{"name":"kml","children":[{"name":"cb_2015_us_state_20m.kml.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":148025},{"name":"crimes.kml.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":268476}]},{"name":"London-Crimes","children":[{"name":"2016-01","children":[{"name":"2016-01-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":22298}]},{"name":"2016-02","children":[{"name":"2016-02-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":24268}]},{"name":"2016-03","children":[{"name":"2016-03-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":25277}]},{"name":"2016-04","children":[{"name":"2016-04-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":25092}]},{"name":"2016-05","children":[{"name":"2016-05-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":24061}]},{"name":"2016-06","children":[{"name":"2016-06-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":24817}]},{"name":"2016-07","children":[{"name":"2016-07-city-of-london-street.csv.zip","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":25450}]}]}]},{"name":"draw.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3212},{"name":"geodesic.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3204},{"name":"geojsonv2.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":11522},{"name":"GPX.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1180},{"name":"heatmaps.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2478},{"name":"KML.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1900},{"name":"measurePath.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2975},{"name":"pulseIcon.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1698},{"name":"search.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2147},{"name":"shiny","children":[{"name":"draw-events","children":[{"name":"app.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1302}]},{"name":"search","children":[{"name":"app.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":346}]}]},{"name":"sleep.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":392},{"name":"TileLayer-Caching.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1109},{"name":"TopoJSON.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2791},{"name":"virginia.rds","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":22727557},{"name":"weatherIcons.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2134},{"name":"webglHeatmaps.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2743},{"name":"wmsLegend.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":871}]},{"name":"htmlwidgets","children":[{"name":"lib","children":[{"name":"draw","children":[{"name":"draw-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7579},{"name":"images","children":[{"name":"layers-2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1259},{"name":"layers.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":696},{"name":"marker-icon-2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2586},{"name":"marker-icon.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1466},{"name":"marker-shadow.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":618},{"name":"spritesheet-2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2078},{"name":"spritesheet.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1056},{"name":"spritesheet.svg","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1834}]},{"name":"leaflet.draw-src.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7630},{"name":"leaflet.draw-src.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":119007},{"name":"leaflet.draw-src.map","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":148818},{"name":"leaflet.draw.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5087},{"name":"Leaflet.draw.drag-src.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":26263},{"name":"Leaflet.draw.drag.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":13644},{"name":"leaflet.draw.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":62042},{"name":"MIT-LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1087},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2127}]},{"name":"fullscreen","children":[{"name":"fullscreen.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":299},{"name":"fullscreen@2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":420},{"name":"leaflet.fullscreen.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1034},{"name":"Leaflet.fullscreen.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5225},{"name":"Leaflet.fullscreen.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3677},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":730},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":638}]},{"name":"geodesic","children":[{"name":"geodesic-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2267},{"name":"Leaflet.Geodesic.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":18015},{"name":"Leaflet.Geodesic.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7157},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":35793},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":550}]},{"name":"geojson-choropleth","children":[{"name":"choropleth-src.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":10977},{"name":"choropleth.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":43779},{"name":"choropleth.js.map","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":137020},{"name":"LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1102},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":933}]},{"name":"gps","children":[{"name":"gps-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1616},{"name":"images","children":[{"name":"gps-icon.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2081}]},{"name":"leaflet-gps.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1182},{"name":"leaflet-gps.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5633},{"name":"leaflet-gps.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1300},{"name":"leaflet-gps.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3332},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":967}]},{"name":"hash","children":[{"name":"leaflet-hash.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3624},{"name":"LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1073},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":496}]},{"name":"heat","children":[{"name":"heat-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":5980},{"name":"leaflet-heat.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4951},{"name":"leaflet-heat2.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4918},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1343},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1250}]},{"name":"icon-pulse","children":[{"name":"L.Icon.Pulse.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":797},{"name":"L.Icon.Pulse.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2192},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1124},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":874},{"name":"plugin-pulseIcon-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1603}]},{"name":"mapshaper","children":[{"name":"mapshaper.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":637515}]},{"name":"measure-path","children":[{"name":"leaflet-measure-path.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":559},{"name":"leaflet-measure-path.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":14175},{"name":"LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2416},{"name":"measure-path-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1169},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":621}]},{"name":"omnivore","children":[{"name":"csv2geojson.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":14021},{"name":"omnivore-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":17727},{"name":"polyline.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4971},{"name":"toGeoJSON.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":22649},{"name":"topojson.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":16697},{"name":"wellknown.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7078}]},{"name":"search","children":[{"name":"images","children":[{"name":"back.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":117578},{"name":"leaflet-search.jpg","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":148555},{"name":"loader.gif","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1849},{"name":"search-icon-mobile.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3959},{"name":"search-icon.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3838}]},{"name":"leaflet-search-binding.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3630},{"name":"leaflet-search.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2627},{"name":"leaflet-search.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":15725},{"name":"leaflet-search.mobile.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1726},{"name":"leaflet-search.mobile.src.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2001},{"name":"leaflet-search.src.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3107},{"name":"leaflet-search.src.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":30248}]},{"name":"sleep","children":[{"name":"Leaflet.Sleep.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6714},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1089},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":609}]},{"name":"style-editor","children":[{"name":"img","children":[{"name":"icon.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4546}]},{"name":"Leaflet.StyleEditor.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3828},{"name":"Leaflet.StyleEditor.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":16064},{"name":"LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1067},{"name":"package.json","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":726},{"name":"styleEditor-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":613}]},{"name":"TileLayer.PouchDBCached","children":[{"name":"COPYING","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1096},{"name":"L.TileLayer.PouchDBCached.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6697},{"name":"pouchdb-6.0.7.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":922643}]},{"name":"turf","children":[{"name":"turf.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":532896}]},{"name":"utils","children":[{"name":"leaflet_extras-utils.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":269}]},{"name":"weather-markers","children":[{"name":"font","children":[{"name":"weathericons-regular-webfont.eot","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":99774},{"name":"weathericons-regular-webfont.svg","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":185225},{"name":"weathericons-regular-webfont.ttf","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":99564},{"name":"weathericons-regular-webfont.woff","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":56468}]},{"name":"images","children":[{"name":"markers-matte.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":14323},{"name":"markers-matte@2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":31113},{"name":"markers-plain.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7946},{"name":"markers-shadow.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":535},{"name":"markers-shadow@2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1469},{"name":"markers-soft.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":41226},{"name":"markers-soft@2x.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":66408}]},{"name":"leaflet.weather-markers.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2379},{"name":"leaflet.weather-markers.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3771},{"name":"leaflet.weather-markers.min.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1735},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1060},{"name":"plugin-weatherMarkers-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1822},{"name":"weather-icons-wind.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":150459},{"name":"weather-icons-wind.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":126750},{"name":"weather-icons.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":32494},{"name":"weather-icons.min.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":26654}]},{"name":"webgl-heatmap","children":[{"name":"deep-sea-gradient.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3403},{"name":"LICENSE.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1095},{"name":"skyline-gradient.png","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3452},{"name":"webgl-heatmap-bindings.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7163},{"name":"webgl-heatmap-leaflet.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4754},{"name":"webgl-heatmap.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":41022}]},{"name":"wms-legend","children":[{"name":"leaflet.wmslegend.css","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":362},{"name":"leaflet.wmslegend.js","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2241},{"name":"LICENSE.txt","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1098}]}]}]}]},{"name":"leaflet.extras.Rproj","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":426},{"name":"LICENSE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":35815},{"name":"man","children":[{"name":"addAwesomeMarkersDependencies.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":463},{"name":"addBootstrapDependency.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":346},{"name":"addGeodesicPolylines.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2968},{"name":"draw-options.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4313},{"name":"draw.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2171},{"name":"fullscreen.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":623},{"name":"gps.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1212},{"name":"heatmap.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3964},{"name":"leaflet.extras.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":263},{"name":"leafletExtrasDependencies.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":464},{"name":"leaflethash.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":445},{"name":"measure-path.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1253},{"name":"omnivore.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":8485},{"name":"pulseMarkers.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3661},{"name":"search-options.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3747},{"name":"search.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":801},{"name":"sleep.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":917},{"name":"style-editor.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":863},{"name":"TileCaching.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":796},{"name":"utils.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1030},{"name":"weatherMarkers.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3768},{"name":"webglheatmap.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3689},{"name":"wms-legend.Rd","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":487}]},{"name":"NAMESPACE","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1897},{"name":"NEWS.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3218},{"name":"R","children":[{"name":"draw.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3835},{"name":"drawOptions.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6000},{"name":"fullscreen.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1120},{"name":"geodesic.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":4429},{"name":"gps.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2259},{"name":"hash.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":781},{"name":"heatmap.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7506},{"name":"jsFunctions.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3934},{"name":"leaflet.extras-package.r","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":125},{"name":"leafletDependencies.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1414},{"name":"mapUtils.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":632},{"name":"measure-path.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":2764},{"name":"omnivore.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":16315},{"name":"pulseIcon.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6820},{"name":"search.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":6721},{"name":"sleep.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1523},{"name":"styleEditor.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1521},{"name":"TileLayer.PouchDBCached.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1144},{"name":"weatherMarkers.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":8063},{"name":"webGLHeatmap.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":7307},{"name":"wms-legend.R","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":1525}]},{"name":"README.md","atime":"2017-06-20 06:08:26","ctime":"2017-06-20 06:08:26","exe":"no","isdir":false,"mode":{},"mtime":"2017-06-20 06:08:26","size":3876}]},"options":{"legendOrder":null,"colors":null,"valueField":"size","percent":true,"count":true,"explanation":null,"breadcrumb":[],"legend":[],"sortFunction":null}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-c9c7495687611e24fd85">{"viewer":{"width":450,"height":350,"padding":15,"fill":true},"browser":{"width":960,"height":500,"padding":40,"fill":true}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment