-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathctreebread.html
19 lines (18 loc) · 345 KB
/
ctreebread.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuMTAuMi4gQ29weXJpZ2h0IDIwMTcgTWlrZSBCb3N0b2NrLgooZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0pKHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHNzKHQobiksZSl9fWZ1bmN0aW9uIGUodCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiByKHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49VHM/MTA6bz49a3M/NTpvPj1Ocz8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PVRzPzEwOm8+PWtzPzU6bz49TnM/MjoxKX1mdW5jdGlvbiBpKHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj1Ucz9pKj0xMDpvPj1rcz9pKj01Om8+PU5zJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdC5sZW5ndGh9ZnVuY3Rpb24gdSh0KXtyZXR1cm4idHJhbnNsYXRlKCIrKHQrLjUpKyIsMCkifWZ1bmN0aW9uIGEodCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4rdChuKX19ZnVuY3Rpb24gcyh0KXt2YXIgbj1NYXRoLm1heCgwLHQuYmFuZHdpZHRoKCktMSkvMjtyZXR1cm4gdC5yb3VuZCgpJiYobj1NYXRoLnJvdW5kKG4pKSxmdW5jdGlvbihlKXtyZXR1cm4rdChlKStufX1mdW5jdGlvbiBmKCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIGwodCxuKXtmdW5jdGlvbiBlKGUpe3ZhciB1PW51bGw9PWk/bi50aWNrcz9uLnRpY2tzLmFwcGx5KG4scik6bi5kb21haW4oKTppLGE9bnVsbD09bz9uLnRpY2tGb3JtYXQ/bi50aWNrRm9ybWF0LmFwcGx5KG4scik6THM6byx5PU1hdGgubWF4KGwsMCkrcCxnPW4ucmFuZ2UoKSxtPStnWzBdKy41LHg9K2dbZy5sZW5ndGgtMV0rLjUsYj0obi5iYW5kd2lkdGg/czpjKShuLmNvcHkoKSksdz1lLnNlbGVjdGlvbj9lLnNlbGVjdGlvbigpOmUsTT13LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSxUPXcuc2VsZWN0QWxsKCIudGljayIpLmRhdGEodSxuKS5vcmRlcigpLGs9VC5leGl0KCksTj1ULmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksUz1ULnNlbGVjdCgibGluZSIpLEU9VC5zZWxlY3QoInRleHQiKTtNPU0ubWVyZ2UoTS5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCIjMDAwIikpLFQ9VC5tZXJnZShOKSxTPVMubWVyZ2UoTi5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCIjMDAwIikuYXR0cih2KyIyIixkKmwpKSxFPUUubWVyZ2UoTi5hcHBlbmQoInRleHQiKS5hdHRyKCJmaWxsIiwiIzAwMCIpLmF0dHIodixkKnkpLmF0dHIoImR5Iix0PT09cXM/IjBlbSI6dD09PURzPyIwLjcxZW0iOiIwLjMyZW0iKSksZSE9PXcmJihNPU0udHJhbnNpdGlvbihlKSxUPVQudHJhbnNpdGlvbihlKSxTPVMudHJhbnNpdGlvbihlKSxFPUUudHJhbnNpdGlvbihlKSxrPWsudHJhbnNpdGlvbihlKS5hdHRyKCJvcGFjaXR5IixGcykuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1iKHQpKT9fKHQpOnRoaXMuZ2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iKX0pLE4uYXR0cigib3BhY2l0eSIsRnMpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gXyhuJiZpc0Zpbml0ZShuPW4odCkpP246Yih0KSl9KSksay5yZW1vdmUoKSxNLmF0dHIoImQiLHQ9PT1Pc3x8dD09VXM/Ik0iK2QqaCsiLCIrbSsiSDAuNVYiK3grIkgiK2QqaDoiTSIrbSsiLCIrZCpoKyJWMC41SCIreCsiViIrZCpoKSxULmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIF8oYih0KSl9KSxTLmF0dHIodisiMiIsZCpsKSxFLmF0dHIodixkKnkpLnRleHQoYSksdy5maWx0ZXIoZikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsdD09PVVzPyJzdGFydCI6dD09PU9zPyJlbmQiOiJtaWRkbGUiKSx3LmVhY2goZnVuY3Rpb24oKXt0aGlzLl9fYXhpcz1ifSl9dmFyIHI9W10saT1udWxsLG89bnVsbCxsPTYsaD02LHA9MyxkPXQ9PT1xc3x8dD09PU9zPy0xOjEsdj10PT09T3N8fHQ9PT1Vcz8ieCI6InkiLF89dD09PXFzfHx0PT09RHM/dTphO3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZSk6bn0sZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiByPVJzLmNhbGwoYXJndW1lbnRzKSxlfSxlLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9bXTpScy5jYWxsKHQpLGUpOnIuc2xpY2UoKX0sZS50aWNrVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDpScy5jYWxsKHQpLGUpOmkmJmkuc2xpY2UoKX0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsZSk6b30sZS50aWNrU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1oPSt0LGUpOmx9LGUudGlja1NpemVJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxlKTpsfSxlLnRpY2tTaXplT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsZSk6aH0sZS50aWNrUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdCxlKTpwfSxlfWZ1bmN0aW9uIGgoKXtmb3IodmFyIHQsbj0wLGU9YXJndW1lbnRzLmxlbmd0aCxyPXt9O248ZTsrK24pe2lmKCEodD1hcmd1bWVudHNbbl0rIiIpfHx0IGluIHIpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7clt0XT1bXX1yZXR1cm4gbmV3IHAocil9ZnVuY3Rpb24gcCh0KXt0aGlzLl89dH1mdW5jdGlvbiBkKHQsbil7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KXt2YXIgZT0iIixyPXQuaW5kZXhPZigiLiIpO2lmKHI+PTAmJihlPXQuc2xpY2UocisxKSx0PXQuc2xpY2UoMCxyKSksdCYmIW4uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOmV9fSl9ZnVuY3Rpb24gdih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIF8odCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUlzLHQ9dC5zbGljZSgwLHIpLmNvbmNhdCh0LnNsaWNlKHIrMSkpO2JyZWFrfXJldHVybiBudWxsIT1lJiZ0LnB1c2goe25hbWU6bix2YWx1ZTplfSksdH1mdW5jdGlvbiB5KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09WXMmJm4uZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVlzP24uY3JlYXRlRWxlbWVudCh0KTpuLmNyZWF0ZUVsZW1lbnROUyhlLHQpfX1mdW5jdGlvbiBnKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIG0oKXtyZXR1cm4gbmV3IHh9ZnVuY3Rpb24geCgpe3RoaXMuXz0iQCIrKCsrWHMpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBiKHQsbixlKXtyZXR1cm4gdD13KHQsbixlKSxmdW5jdGlvbihuKXt2YXIgZT1uLnJlbGF0ZWRUYXJnZXQ7ZSYmKGU9PT10aGlzfHw4JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxuKX19ZnVuY3Rpb24gdyhuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciBvPXQuZXZlbnQ7dC5ldmVudD1pO3RyeXtuLmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUscil9ZmluYWxseXt0LmV2ZW50PW99fX1mdW5jdGlvbiBNKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX1mdW5jdGlvbiBUKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrKHQsbixlKXt2YXIgcj1Hcy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2I6dztyZXR1cm4gZnVuY3Rpb24oaSxvLHUpe3ZhciBhLGM9dGhpcy5fX29uLHM9cihuLG8sdSk7aWYoYylmb3IodmFyIGY9MCxsPWMubGVuZ3RoO2Y8bDsrK2YpaWYoKGE9Y1tmXSkudHlwZT09PXQudHlwZSYmYS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXIsYS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXI9cyxhLmNhcHR1cmU9ZSksdm9pZChhLnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUscyxlKSxhPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOnMsY2FwdHVyZTplfSxjP2MucHVzaChhKTp0aGlzLl9fb249W2FdfX1mdW5jdGlvbiBOKG4sZSxyLGkpe3ZhciBvPXQuZXZlbnQ7bi5zb3VyY2VFdmVudD10LmV2ZW50LHQuZXZlbnQ9bjt0cnl7cmV0dXJuIGUuYXBwbHkocixpKX1maW5hbGx5e3QuZXZlbnQ9b319ZnVuY3Rpb24gUygpe31mdW5jdGlvbiBFKCl7cmV0dXJuW119ZnVuY3Rpb24gQSh0LG4pe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189bn1mdW5jdGlvbiBDKHQsbixlLHIsaSxvKXtmb3IodmFyIHUsYT0wLGM9bi5sZW5ndGgscz1vLmxlbmd0aDthPHM7KythKSh1PW5bYV0pPyh1Ll9fZGF0YV9fPW9bYV0sclthXT11KTplW2FdPW5ldyBBKHQsb1thXSk7Zm9yKDthPGM7KythKSh1PW5bYV0pJiYoaVthXT11KX1mdW5jdGlvbiB6KHQsbixlLHIsaSxvLHUpe3ZhciBhLGMscyxmPXt9LGw9bi5sZW5ndGgsaD1vLmxlbmd0aCxwPW5ldyBBcnJheShsKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJihwW2FdPXM9b2YrdS5jYWxsKGMsYy5fX2RhdGFfXyxhLG4pLHMgaW4gZj9pW2FdPWM6ZltzXT1jKTtmb3IoYT0wO2E8aDsrK2EpKGM9ZltzPW9mK3UuY2FsbCh0LG9bYV0sYSxvKV0pPyhyW2FdPWMsYy5fX2RhdGFfXz1vW2FdLGZbc109bnVsbCk6ZVthXT1uZXcgQSh0LG9bYV0pO2ZvcihhPTA7YTxsOysrYSkoYz1uW2FdKSYmZltwW2FdXT09PWMmJihpW2FdPWMpfWZ1bmN0aW9uIFAodCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gUih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gTCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHEodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBVKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIEQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIE8odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gRih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBJKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19ZnVuY3Rpb24gWSh0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX1mdW5jdGlvbiBCKHQsbil7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuKXx8dWYodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUobil9ZnVuY3Rpb24gaih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gSCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19ZnVuY3Rpb24gWCh0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1lfX1mdW5jdGlvbiAkKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBWKHQpe3JldHVybiB0LmNsYXNzTGlzdHx8bmV3IFcodCl9ZnVuY3Rpb24gVyh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9JCh0LmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpfWZ1bmN0aW9uIFoodCxuKXtmb3IodmFyIGU9Vih0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIEcodCxuKXtmb3IodmFyIGU9Vih0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUucmVtb3ZlKG5bcl0pfWZ1bmN0aW9uIEoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7Wih0aGlzLHQpfX1mdW5jdGlvbiBRKHQpe3JldHVybiBmdW5jdGlvbigpe0codGhpcyx0KX19ZnVuY3Rpb24gSyh0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9aOkcpKHRoaXMsdCl9fWZ1bmN0aW9uIHR0KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBudCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIGV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX1mdW5jdGlvbiBydCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIG90KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PW4/IiI6bn19ZnVuY3Rpb24gdXQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gYXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBjdCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHN0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gZnQodCxuLGUpe3ZhciByPXVmKHQpLGk9ci5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2YgaT9pPW5ldyBpKG4sZSk6KGk9ci5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxlPyhpLmluaXRFdmVudChuLGUuYnViYmxlcyxlLmNhbmNlbGFibGUpLGkuZGV0YWlsPWUuZGV0YWlsKTppLmluaXRFdmVudChuLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KGkpfWZ1bmN0aW9uIGx0KHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ0KHRoaXMsdCxuKX19ZnVuY3Rpb24gaHQodCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZnQodGhpcyx0LG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX19ZnVuY3Rpb24gcHQodCxuKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW59ZnVuY3Rpb24gZHQoKXtyZXR1cm4gbmV3IHB0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sYWYpfWZ1bmN0aW9uIHZ0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBfdCh0LG4pe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9Y2YodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtuJiYoci5vbigiY2xpY2suZHJhZyIsZmYsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJjbGljay5kcmFnIixudWxsKX0sMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9ZnVuY3Rpb24geXQodCxuLGUscixpLG8sdSxhLGMscyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnN1YmplY3Q9ZSx0aGlzLmlkZW50aWZpZXI9cix0aGlzLmFjdGl2ZT1pLHRoaXMueD1vLHRoaXMueT11LHRoaXMuZHg9YSx0aGlzLmR5PWMsdGhpcy5fPXN9ZnVuY3Rpb24gZ3QoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlfWZ1bmN0aW9uIHh0KG4pe3JldHVybiBudWxsPT1uP3t4OnQuZXZlbnQueCx5OnQuZXZlbnQueX06bn1mdW5jdGlvbiBidCgpe3JldHVybiJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiB3dCh0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBNdCgpe31mdW5jdGlvbiBUdCh0KXt2YXIgbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKG49eWYuZXhlYyh0KSk/KG49cGFyc2VJbnQoblsxXSwxNiksbmV3IEF0KG4+PjgmMTV8bj4+NCYyNDAsbj4+NCYxNXwyNDAmbiwoMTUmbik8PDR8MTUmbiwxKSk6KG49Z2YuZXhlYyh0KSk/a3QocGFyc2VJbnQoblsxXSwxNikpOihuPW1mLmV4ZWModCkpP25ldyBBdChuWzFdLG5bMl0sblszXSwxKToobj14Zi5leGVjKHQpKT9uZXcgQXQoMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49YmYuZXhlYyh0KSk/TnQoblsxXSxuWzJdLG5bM10sbls0XSk6KG49d2YuZXhlYyh0KSk/TnQoMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49TWYuZXhlYyh0KSk/Q3QoblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1UZi5leGVjKHQpKT9DdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOmtmLmhhc093blByb3BlcnR5KHQpP2t0KGtmW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgQXQoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBrdCh0KXtyZXR1cm4gbmV3IEF0KHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBOdCh0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IEF0KHQsbixlLHIpfWZ1bmN0aW9uIFN0KHQpe3JldHVybiB0IGluc3RhbmNlb2YgTXR8fCh0PVR0KHQpKSx0Pyh0PXQucmdiKCksbmV3IEF0KHQucix0LmcsdC5iLHQub3BhY2l0eSkpOm5ldyBBdH1mdW5jdGlvbiBFdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/U3QodCk6bmV3IEF0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBBdCh0LG4sZSxyKXt0aGlzLnI9K3QsdGhpcy5nPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gQ3QodCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBSdCh0LG4sZSxyKX1mdW5jdGlvbiB6dCh0KXtpZih0IGluc3RhbmNlb2YgUnQpcmV0dXJuIG5ldyBSdCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBNdHx8KHQ9VHQodCkpLCF0KXJldHVybiBuZXcgUnQ7aWYodCBpbnN0YW5jZW9mIFJ0KXJldHVybiB0O3ZhciBuPSh0PXQucmdiKCkpLnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT1NYXRoLm1pbihuLGUsciksbz1NYXRoLm1heChuLGUsciksdT1OYU4sYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PW49PT1vPyhlLXIpL2ErNiooZTxyKTplPT09bz8oci1uKS9hKzI6KG4tZSkvYSs0LGEvPWM8LjU/bytpOjItby1pLHUqPTYwKTphPWM+MCYmYzwxPzA6dSxuZXcgUnQodSxhLGMsdC5vcGFjaXR5KX1mdW5jdGlvbiBQdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/enQodCk6bmV3IFJ0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBSdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gTHQodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWZ1bmN0aW9uIHF0KHQpe2lmKHQgaW5zdGFuY2VvZiBEdClyZXR1cm4gbmV3IER0KHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIEh0KXt2YXIgbj10LmgqTmY7cmV0dXJuIG5ldyBEdCh0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBBdHx8KHQ9U3QodCkpO3ZhciBlPVl0KHQucikscj1ZdCh0LmcpLGk9WXQodC5iKSxvPU90KCguNDEyNDU2NCplKy4zNTc1NzYxKnIrLjE4MDQzNzUqaSkvRWYpLHU9T3QoKC4yMTI2NzI5KmUrLjcxNTE1MjIqcisuMDcyMTc1KmkpL0FmKTtyZXR1cm4gbmV3IER0KDExNip1LTE2LDUwMCooby11KSwyMDAqKHUtT3QoKC4wMTkzMzM5KmUrLjExOTE5MipyKy45NTAzMDQxKmkpL0NmKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBVdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/cXQodCk6bmV3IER0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBEdCh0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT3QodCl7cmV0dXJuIHQ+TGY/TWF0aC5wb3codCwxLzMpOnQvUmYremZ9ZnVuY3Rpb24gRnQodCl7cmV0dXJuIHQ+UGY/dCp0KnQ6UmYqKHQtemYpfWZ1bmN0aW9uIEl0KHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gWXQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gQnQodCl7aWYodCBpbnN0YW5jZW9mIEh0KXJldHVybiBuZXcgSHQodC5oLHQuYyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgRHR8fCh0PXF0KHQpKTt2YXIgbj1NYXRoLmF0YW4yKHQuYix0LmEpKlNmO3JldHVybiBuZXcgSHQobjwwP24rMzYwOm4sTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24ganQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0J0KHQpOm5ldyBIdCh0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gSHQodCxuLGUscil7dGhpcy5oPSt0LHRoaXMuYz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFh0KHQpe2lmKHQgaW5zdGFuY2VvZiBWdClyZXR1cm4gbmV3IFZ0KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIEF0fHwodD1TdCh0KSk7dmFyIG49dC5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9KEJmKnIrSWYqbi1ZZiplKS8oQmYrSWYtWWYpLG89ci1pLHU9KEZmKihlLWkpLURmKm8pL09mLGE9TWF0aC5zcXJ0KHUqdStvKm8pLyhGZippKigxLWkpKSxjPWE/TWF0aC5hdGFuMih1LG8pKlNmLTEyMDpOYU47cmV0dXJuIG5ldyBWdChjPDA/YyszNjA6YyxhLGksdC5vcGFjaXR5KX1mdW5jdGlvbiAkdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/WHQodCk6bmV3IFZ0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBWdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gV3QodCxuLGUscixpKXt2YXIgbz10KnQsdT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tdSkqbisoNC02Km8rMyp1KSplKygxKzMqdCszKm8tMyp1KSpyK3UqaSkvNn1mdW5jdGlvbiBadCh0LG4pe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdCtlKm59fWZ1bmN0aW9uIEd0KHQsbixlKXtyZXR1cm4gdD1NYXRoLnBvdyh0LGUpLG49TWF0aC5wb3cobixlKS10LGU9MS9lLGZ1bmN0aW9uKHIpe3JldHVybiBNYXRoLnBvdyh0K3IqbixlKX19ZnVuY3Rpb24gSnQodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/WnQodCxlPjE4MHx8ZTwtMTgwP2UtMzYwKk1hdGgucm91bmQoZS8zNjApOmUpOkpmKGlzTmFOKHQpP246dCl9ZnVuY3Rpb24gUXQodCl7cmV0dXJuIDE9PSh0PSt0KT9LdDpmdW5jdGlvbihuLGUpe3JldHVybiBlLW4/R3QobixlLHQpOkpmKGlzTmFOKG4pP2U6bil9fWZ1bmN0aW9uIEt0KHQsbil7dmFyIGU9bi10O3JldHVybiBlP1p0KHQsZSk6SmYoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB0bih0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGUscixpPW4ubGVuZ3RoLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpO2ZvcihlPTA7ZTxpOysrZSlyPUV0KG5bZV0pLG9bZV09ci5yfHwwLHVbZV09ci5nfHwwLGFbZV09ci5ifHwwO3JldHVybiBvPXQobyksdT10KHUpLGE9dChhKSxyLm9wYWNpdHk9MSxmdW5jdGlvbih0KXtyZXR1cm4gci5yPW8odCksci5nPXUodCksci5iPWEodCkscisiIn19fWZ1bmN0aW9uIG5uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBlbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9fWZ1bmN0aW9uIHJuKHQsbixlLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifWZ1bmN0aW9uIG8odCxyLGksbyx1LGEpe2lmKHQhPT1pfHxyIT09byl7dmFyIGM9dS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLG4sbnVsbCxlKTthLnB1c2goe2k6Yy00LHg6cmwodCxpKX0se2k6Yy0yLHg6cmwocixvKX0pfWVsc2UoaXx8bykmJnUucHVzaCgidHJhbnNsYXRlKCIraStuK28rZSl9ZnVuY3Rpb24gdSh0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDpybCh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfWZ1bmN0aW9uIGEodCxuLGUsbyl7dCE9PW4/by5wdXNoKHtpOmUucHVzaChpKGUpKyJza2V3WCgiLG51bGwsciktMix4OnJsKHQsbil9KTpuJiZlLnB1c2goaShlKSsic2tld1goIituK3IpfWZ1bmN0aW9uIGModCxuLGUscixvLHUpe2lmKHQhPT1lfHxuIT09cil7dmFyIGE9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO3UucHVzaCh7aTphLTQseDpybCh0LGUpfSx7aTphLTIseDpybChuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX1yZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1bXSxpPVtdO3JldHVybiBuPXQobiksZT10KGUpLG8obi50cmFuc2xhdGVYLG4udHJhbnNsYXRlWSxlLnRyYW5zbGF0ZVgsZS50cmFuc2xhdGVZLHIsaSksdShuLnJvdGF0ZSxlLnJvdGF0ZSxyLGkpLGEobi5za2V3WCxlLnNrZXdYLHIsaSksYyhuLnNjYWxlWCxuLnNjYWxlWSxlLnNjYWxlWCxlLnNjYWxlWSxyLGkpLG49ZT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLG89aS5sZW5ndGg7KytlPG87KXJbKG49aVtlXSkuaV09bi54KHQpO3JldHVybiByLmpvaW4oIiIpfX19ZnVuY3Rpb24gb24odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gdW4odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9ZnVuY3Rpb24gYW4odCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfWZ1bmN0aW9uIGNuKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQoKG49UHQobikpLmgsKGU9UHQoZSkpLmgpLGk9S3Qobi5zLGUucyksbz1LdChuLmwsZS5sKSx1PUt0KG4ub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPXIodCksbi5zPWkodCksbi5sPW8odCksbi5vcGFjaXR5PXUodCksbisiIn19fWZ1bmN0aW9uIHNuKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQoKG49anQobikpLmgsKGU9anQoZSkpLmgpLGk9S3Qobi5jLGUuYyksbz1LdChuLmwsZS5sKSx1PUt0KG4ub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbi5oPXIodCksbi5jPWkodCksbi5sPW8odCksbi5vcGFjaXR5PXUodCksbisiIn19fWZ1bmN0aW9uIGZuKHQpe3JldHVybiBmdW5jdGlvbiBuKGUpe2Z1bmN0aW9uIHIobixyKXt2YXIgaT10KChuPSR0KG4pKS5oLChyPSR0KHIpKS5oKSxvPUt0KG4ucyxyLnMpLHU9S3Qobi5sLHIubCksYT1LdChuLm9wYWNpdHksci5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1pKHQpLG4ucz1vKHQpLG4ubD11KE1hdGgucG93KHQsZSkpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fXJldHVybiBlPStlLHIuZ2FtbWE9bixyfSgxKX1mdW5jdGlvbiBsbigpe3JldHVybiBFbHx8KHpsKGhuKSxFbD1DbC5ub3coKStBbCl9ZnVuY3Rpb24gaG4oKXtFbD0wfWZ1bmN0aW9uIHBuKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBkbih0LG4sZSl7dmFyIHI9bmV3IHBuO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gdm4oKXtsbigpLCsrTWw7Zm9yKHZhciB0LG49VmY7bjspKHQ9RWwtbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLU1sfWZ1bmN0aW9uIF9uKCl7RWw9KFNsPUNsLm5vdygpKStBbCxNbD1UbD0wO3RyeXt2bigpfWZpbmFsbHl7TWw9MCxnbigpLEVsPTB9fWZ1bmN0aW9uIHluKCl7dmFyIHQ9Q2wubm93KCksbj10LVNsO24+TmwmJihBbC09bixTbD10KX1mdW5jdGlvbiBnbigpe2Zvcih2YXIgdCxuLGU9VmYscj0xLzA7ZTspZS5fY2FsbD8ocj5lLl90aW1lJiYocj1lLl90aW1lKSx0PWUsZT1lLl9uZXh0KToobj1lLl9uZXh0LGUuX25leHQ9bnVsbCxlPXQ/dC5fbmV4dD1uOlZmPW4pO1dmPXQsbW4ocil9ZnVuY3Rpb24gbW4odCl7TWx8fChUbCYmKFRsPWNsZWFyVGltZW91dChUbCkpLHQtRWw+MjQ/KHQ8MS8wJiYoVGw9c2V0VGltZW91dChfbix0LUNsLm5vdygpLUFsKSksa2wmJihrbD1jbGVhckludGVydmFsKGtsKSkpOihrbHx8KFNsPUNsLm5vdygpLGtsPXNldEludGVydmFsKHluLE5sKSksTWw9MSx6bChfbikpKX1mdW5jdGlvbiB4bih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSl8fGUuc3RhdGU+cWwpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZSIpO3JldHVybiBlfWZ1bmN0aW9uIGJuKHQsbil7dmFyIGU9dC5fX3RyYW5zaXRpb247aWYoIWV8fCEoZT1lW25dKXx8ZS5zdGF0ZT5EbCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlIik7cmV0dXJuIGV9ZnVuY3Rpb24gd24odCxuKXt2YXIgZT10Ll9fdHJhbnNpdGlvbjtpZighZXx8IShlPWVbbl0pKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGUiKTtyZXR1cm4gZX1mdW5jdGlvbiBNbih0LG4sZSl7ZnVuY3Rpb24gcihjKXt2YXIgcyxmLGwsaDtpZihlLnN0YXRlIT09VWwpcmV0dXJuIG8oKTtmb3IocyBpbiBhKWlmKChoPWFbc10pLm5hbWU9PT1lLm5hbWUpe2lmKGguc3RhdGU9PT1PbClyZXR1cm4gUGwocik7aC5zdGF0ZT09PUZsPyhoLnN0YXRlPVlsLGgudGltZXIuc3RvcCgpLGgub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18saC5pbmRleCxoLmdyb3VwKSxkZWxldGUgYVtzXSk6K3M8biYmKGguc3RhdGU9WWwsaC50aW1lci5zdG9wKCksZGVsZXRlIGFbc10pfWlmKFBsKGZ1bmN0aW9uKCl7ZS5zdGF0ZT09PU9sJiYoZS5zdGF0ZT1GbCxlLnRpbWVyLnJlc3RhcnQoaSxlLmRlbGF5LGUudGltZSksaShjKSl9KSxlLnN0YXRlPURsLGUub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGUuc3RhdGU9PT1EbCl7Zm9yKGUuc3RhdGU9T2wsdT1uZXcgQXJyYXkobD1lLnR3ZWVuLmxlbmd0aCkscz0wLGY9LTE7czxsOysrcykoaD1lLnR3ZWVuW3NdLnZhbHVlLmNhbGwodCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCkpJiYodVsrK2ZdPWgpO3UubGVuZ3RoPWYrMX19ZnVuY3Rpb24gaShuKXtmb3IodmFyIHI9bjxlLmR1cmF0aW9uP2UuZWFzZS5jYWxsKG51bGwsbi9lLmR1cmF0aW9uKTooZS50aW1lci5yZXN0YXJ0KG8pLGUuc3RhdGU9SWwsMSksaT0tMSxhPXUubGVuZ3RoOysraTxhOyl1W2ldLmNhbGwobnVsbCxyKTtlLnN0YXRlPT09SWwmJihlLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLGUuaW5kZXgsZS5ncm91cCksbygpKX1mdW5jdGlvbiBvKCl7ZS5zdGF0ZT1ZbCxlLnRpbWVyLnN0b3AoKSxkZWxldGUgYVtuXTtmb3IodmFyIHIgaW4gYSlyZXR1cm47ZGVsZXRlIHQuX190cmFuc2l0aW9ufXZhciB1LGE9dC5fX3RyYW5zaXRpb247YVtuXT1lLGUudGltZXI9ZG4oZnVuY3Rpb24odCl7ZS5zdGF0ZT1VbCxlLnRpbWVyLnJlc3RhcnQocixlLmRlbGF5LGUudGltZSksZS5kZWxheTw9dCYmcih0LWUuZGVsYXkpfSwwLGUudGltZSl9ZnVuY3Rpb24gVG4odCxuKXt2YXIgZSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWJuKHRoaXMsdCksbz1pLnR3ZWVuO2lmKG8hPT1lKWZvcih2YXIgdT0wLGE9KHI9ZT1vKS5sZW5ndGg7dTxhOysrdSlpZihyW3VdLm5hbWU9PT1uKXsocj1yLnNsaWNlKCkpLnNwbGljZSh1LDEpO2JyZWFrfWkudHdlZW49cn19ZnVuY3Rpb24ga24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWJuKHRoaXMsdCksdT1vLnR3ZWVuO2lmKHUhPT1yKXtpPShyPXUpLnNsaWNlKCk7Zm9yKHZhciBhPXtuYW1lOm4sdmFsdWU6ZX0sYz0wLHM9aS5sZW5ndGg7YzxzOysrYylpZihpW2NdLm5hbWU9PT1uKXtpW2NdPWE7YnJlYWt9Yz09PXMmJmkucHVzaChhKX1vLnR3ZWVuPWl9fWZ1bmN0aW9uIE5uKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9Ym4odGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiB3bih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBTbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gRW4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBBbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fWZ1bmN0aW9uIENuKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fWZ1bmN0aW9uIHpuKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHUsYT1lKHRoaXMpO3tpZihudWxsIT1hKXJldHVybih1PXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fX1mdW5jdGlvbiBQbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTt7aWYobnVsbCE9YSlyZXR1cm4odT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fX1mdW5jdGlvbiBSbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZT10aGlzLHI9bi5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe2Uuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfWZ1bmN0aW9uIExuKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX1mdW5jdGlvbiBxbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3huKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBVbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7eG4odGhpcyx0KS5kZWxheT1ufX1mdW5jdGlvbiBEbih0LG4pe3JldHVybiBmdW5jdGlvbigpe2JuKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBPbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7Ym4odGhpcyx0KS5kdXJhdGlvbj1ufX1mdW5jdGlvbiBGbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtibih0aGlzLHQpLmVhc2U9bn19ZnVuY3Rpb24gSW4odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX1mdW5jdGlvbiBZbih0LG4sZSl7dmFyIHIsaSxvPUluKG4pP3huOmJuO3JldHVybiBmdW5jdGlvbigpe3ZhciB1PW8odGhpcyx0KSxhPXUub247YSE9PXImJihpPShyPWEpLmNvcHkoKSkub24obixlKSx1Lm9uPWl9fWZ1bmN0aW9uIEJuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtmb3IodmFyIGUgaW4gdGhpcy5fX3RyYW5zaXRpb24paWYoK2UhPT10KXJldHVybjtuJiZuLnJlbW92ZUNoaWxkKHRoaXMpfX1mdW5jdGlvbiBqbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1CKHRoaXMsdCksdT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxCKHRoaXMsdCkpO3JldHVybiBvPT09dT9udWxsOm89PT1lJiZ1PT09cj9pOmk9bihlPW8scj11KX19ZnVuY3Rpb24gSG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19ZnVuY3Rpb24gWG4odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Qih0aGlzLHQpO3JldHVybiBvPT09ZT9udWxsOm89PT1yP2k6aT1uKHI9byxlKX19ZnVuY3Rpb24gJG4odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1CKHRoaXMsdCksYT1lKHRoaXMpO3JldHVybiBudWxsPT1hJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxhPUIodGhpcyx0KSksdT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSl9fWZ1bmN0aW9uIFZuKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn1mdW5jdGlvbiBXbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFpuKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fWZ1bmN0aW9uIEduKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiBKbih0KXtyZXR1cm4gZHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFFuKCl7cmV0dXJuKyskbH1mdW5jdGlvbiBLbih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdDotLXQqKDItdCkrMSkvMn1mdW5jdGlvbiB0ZSh0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn1mdW5jdGlvbiBuZSh0KXtyZXR1cm4oMS1NYXRoLmNvcyhKbCp0KSkvMn1mdW5jdGlvbiBlZSh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIHJlKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfWZ1bmN0aW9uIGllKHQpe3JldHVybih0PSt0KTxLbD9jaCp0KnQ6dDxuaD9jaCoodC09dGgpKnQrZWg6dDxpaD9jaCoodC09cmgpKnQrb2g6Y2gqKHQtPXVoKSp0K2FofWZ1bmN0aW9uIG9lKHQsbil7Zm9yKHZhciBlOyEoZT10Ll9fdHJhbnNpdGlvbil8fCEoZT1lW25dKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIF9oLnRpbWU9bG4oKSxfaDtyZXR1cm4gZX1mdW5jdGlvbiB1ZSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gYWUodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24gY2UoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gc2UoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gZmUodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiBsZSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIGhlKG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9dC5wcm9wZXJ0eSgiX19icnVzaCIsYSkuc2VsZWN0QWxsKCIub3ZlcmxheSIpLmRhdGEoW2FlKCJvdmVybGF5IildKTtlLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLCJvdmVybGF5IikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5hdHRyKCJjdXJzb3IiLEVoLm92ZXJsYXkpLm1lcmdlKGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1mZSh0aGlzKS5leHRlbnQ7Y2YodGhpcykuYXR0cigieCIsdFswXVswXSkuYXR0cigieSIsdFswXVsxXSkuYXR0cigid2lkdGgiLHRbMV1bMF0tdFswXVswXSkuYXR0cigiaGVpZ2h0Iix0WzFdWzFdLXRbMF1bMV0pfSksdC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5kYXRhKFthZSgic2VsZWN0aW9uIildKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwic2VsZWN0aW9uIikuYXR0cigiY3Vyc29yIixFaC5zZWxlY3Rpb24pLmF0dHIoImZpbGwiLCIjNzc3IikuYXR0cigiZmlsbC1vcGFjaXR5IiwuMykuYXR0cigic3Ryb2tlIiwiI2ZmZiIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgaT10LnNlbGVjdEFsbCgiLmhhbmRsZSIpLmRhdGEobi5oYW5kbGVzLGZ1bmN0aW9uKHQpe3JldHVybiB0LnR5cGV9KTtpLmV4aXQoKS5yZW1vdmUoKSxpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKHQpe3JldHVybiJoYW5kbGUgaGFuZGxlLS0iK3QudHlwZX0pLmF0dHIoImN1cnNvciIsZnVuY3Rpb24odCl7cmV0dXJuIEVoW3QudHlwZV19KSx0LmVhY2gocikuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCB0b3VjaHN0YXJ0LmJydXNoIix1KX1mdW5jdGlvbiByKCl7dmFyIHQ9Y2YodGhpcyksbj1mZSh0aGlzKS5zZWxlY3Rpb247bj8odC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5zdHlsZSgiZGlzcGxheSIsbnVsbCkuYXR0cigieCIsblswXVswXSkuYXR0cigieSIsblswXVsxXSkuYXR0cigid2lkdGgiLG5bMV1bMF0tblswXVswXSkuYXR0cigiaGVpZ2h0IixuWzFdWzFdLW5bMF1bMV0pLHQuc2VsZWN0QWxsKCIuaGFuZGxlIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGZ1bmN0aW9uKHQpe3JldHVybiJlIj09PXQudHlwZVt0LnR5cGUubGVuZ3RoLTFdP25bMV1bMF0tcC8yOm5bMF1bMF0tcC8yfSkuYXR0cigieSIsZnVuY3Rpb24odCl7cmV0dXJuInMiPT09dC50eXBlWzBdP25bMV1bMV0tcC8yOm5bMF1bMV0tcC8yfSkuYXR0cigid2lkdGgiLGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP25bMV1bMF0tblswXVswXStwOnB9KS5hdHRyKCJoZWlnaHQiLGZ1bmN0aW9uKHQpe3JldHVybiJlIj09PXQudHlwZXx8InciPT09dC50eXBlP25bMV1bMV0tblswXVsxXStwOnB9KSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIGkodCxuKXtyZXR1cm4gdC5fX2JydXNoLmVtaXR0ZXJ8fG5ldyBvKHQsbil9ZnVuY3Rpb24gbyh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTB9ZnVuY3Rpb24gdSgpe2Z1bmN0aW9uIGUoKXt2YXIgdD1Lcyh3KTshTHx8eHx8Ynx8KE1hdGguYWJzKHRbMF0tVVswXSk+TWF0aC5hYnModFsxXS1VWzFdKT9iPSEwOng9ITApLFU9dCxtPSEwLHhoKCksbygpfWZ1bmN0aW9uIG8oKXt2YXIgdDtzd2l0Y2goeT1VWzBdLXFbMF0sZz1VWzFdLXFbMV0sVCl7Y2FzZSB3aDpjYXNlIGJoOmsmJih5PU1hdGgubWF4KEMtYSxNYXRoLm1pbihQLXAseSkpLHM9YSt5LGQ9cCt5KSxOJiYoZz1NYXRoLm1heCh6LWwsTWF0aC5taW4oUi12LGcpKSxoPWwrZyxfPXYrZyk7YnJlYWs7Y2FzZSBNaDprPDA/KHk9TWF0aC5tYXgoQy1hLE1hdGgubWluKFAtYSx5KSkscz1hK3ksZD1wKTprPjAmJih5PU1hdGgubWF4KEMtcCxNYXRoLm1pbihQLXAseSkpLHM9YSxkPXAreSksTjwwPyhnPU1hdGgubWF4KHotbCxNYXRoLm1pbihSLWwsZykpLGg9bCtnLF89dik6Tj4wJiYoZz1NYXRoLm1heCh6LXYsTWF0aC5taW4oUi12LGcpKSxoPWwsXz12K2cpO2JyZWFrO2Nhc2UgVGg6ayYmKHM9TWF0aC5tYXgoQyxNYXRoLm1pbihQLGEteSprKSksZD1NYXRoLm1heChDLE1hdGgubWluKFAscCt5KmspKSksTiYmKGg9TWF0aC5tYXgoeixNYXRoLm1pbihSLGwtZypOKSksXz1NYXRoLm1heCh6LE1hdGgubWluKFIsditnKk4pKSl9ZDxzJiYoayo9LTEsdD1hLGE9cCxwPXQsdD1zLHM9ZCxkPXQsTSBpbiBBaCYmRi5hdHRyKCJjdXJzb3IiLEVoW009QWhbTV1dKSksXzxoJiYoTio9LTEsdD1sLGw9dix2PXQsdD1oLGg9XyxfPXQsTSBpbiBDaCYmRi5hdHRyKCJjdXJzb3IiLEVoW009Q2hbTV1dKSksUy5zZWxlY3Rpb24mJihBPVMuc2VsZWN0aW9uKSx4JiYocz1BWzBdWzBdLGQ9QVsxXVswXSksYiYmKGg9QVswXVsxXSxfPUFbMV1bMV0pLEFbMF1bMF09PT1zJiZBWzBdWzFdPT09aCYmQVsxXVswXT09PWQmJkFbMV1bMV09PT1ffHwoUy5zZWxlY3Rpb249W1tzLGhdLFtkLF9dXSxyLmNhbGwodyksRC5icnVzaCgpKX1mdW5jdGlvbiB1KCl7aWYodWUoKSx0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuO2MmJmNsZWFyVGltZW91dChjKSxjPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtjPW51bGx9LDUwMCksTy5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixudWxsKX1lbHNlIF90KHQuZXZlbnQudmlldyxtKSxJLm9uKCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIixudWxsKTtPLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIiksRi5hdHRyKCJjdXJzb3IiLEVoLm92ZXJsYXkpLFMuc2VsZWN0aW9uJiYoQT1TLnNlbGVjdGlvbiksbGUoQSkmJihTLnNlbGVjdGlvbj1udWxsLHIuY2FsbCh3KSksRC5lbmQoKX1pZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHhoKCl9ZWxzZSBpZihjKXJldHVybjtpZihmLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGEscyxsLGgscCxkLHYsXyx5LGcsbSx4LGIsdz10aGlzLE09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSxUPSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9NPSJvdmVybGF5IjpNKT9iaDp0LmV2ZW50LmFsdEtleT9UaDpNaCxrPW49PT1OaD9udWxsOnpoW01dLE49bj09PWtoP251bGw6UGhbTV0sUz1mZSh3KSxFPVMuZXh0ZW50LEE9Uy5zZWxlY3Rpb24sQz1FWzBdWzBdLHo9RVswXVsxXSxQPUVbMV1bMF0sUj1FWzFdWzFdLEw9ayYmTiYmdC5ldmVudC5zaGlmdEtleSxxPUtzKHcpLFU9cSxEPWkodyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09TT9TLnNlbGVjdGlvbj1BPVtbYT1uPT09Tmg/QzpxWzBdLGw9bj09PWtoP3o6cVsxXV0sW3A9bj09PU5oP1A6YSx2PW49PT1raD9SOmxdXTooYT1BWzBdWzBdLGw9QVswXVsxXSxwPUFbMV1bMF0sdj1BWzFdWzFdKSxzPWEsaD1sLGQ9cCxfPXY7dmFyIE89Y2YodykuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksRj1PLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLEVoW01dKTtpZih0LmV2ZW50LnRvdWNoZXMpTy5vbigidG91Y2htb3ZlLmJydXNoIixlLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLHUsITApO2Vsc2V7dmFyIEk9Y2YodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2Okw9ayYmTjticmVhaztjYXNlIDE4OlQ9PT1NaCYmKGsmJihwPWQteSprLGE9cyt5KmspLE4mJih2PV8tZypOLGw9aCtnKk4pLFQ9VGgsbygpKTticmVhaztjYXNlIDMyOlQhPT1NaCYmVCE9PVRofHwoazwwP3A9ZC15Oms+MCYmKGE9cy15KSxOPDA/dj1fLWc6Tj4wJiYobD1oLWcpLFQ9d2gsRi5hdHRyKCJjdXJzb3IiLEVoLnNlbGVjdGlvbiksbygpKTticmVhaztkZWZhdWx0OnJldHVybn14aCgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6TCYmKHg9Yj1MPSExLG8oKSk7YnJlYWs7Y2FzZSAxODpUPT09VGgmJihrPDA/cD1kOms+MCYmKGE9cyksTjwwP3Y9XzpOPjAmJihsPWgpLFQ9TWgsbygpKTticmVhaztjYXNlIDMyOlQ9PT13aCYmKHQuZXZlbnQuYWx0S2V5PyhrJiYocD1kLXkqayxhPXMreSprKSxOJiYodj1fLWcqTixsPWgrZypOKSxUPVRoKTooazwwP3A9ZDprPjAmJihhPXMpLE48MD92PV86Tj4wJiYobD1oKSxUPU1oKSxGLmF0dHIoImN1cnNvciIsRWhbTV0pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59eGgoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLGUsITApLm9uKCJtb3VzZXVwLmJydXNoIix1LCEwKTtsZih0LmV2ZW50LnZpZXcpfXVlKCksamwodyksci5jYWxsKHcpLEQuc3RhcnQoKX19ZnVuY3Rpb24gYSgpe3ZhciB0PXRoaXMuX19icnVzaHx8e3NlbGVjdGlvbjpudWxsfTtyZXR1cm4gdC5leHRlbnQ9cy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdC5kaW09bix0fXZhciBjLHM9c2UsZj1jZSxsPWgoZSwic3RhcnQiLCJicnVzaCIsImVuZCIpLHA9NjtyZXR1cm4gZS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7aSh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7aSh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt1LnNlbGVjdGlvbj0xPT09dCYmbGUocyk/bnVsbDpmKHQpLHIuY2FsbChvKSxhLmJydXNoKCl9dmFyIG89dGhpcyx1PW8uX19icnVzaCxhPWkobyxhcmd1bWVudHMpLGM9dS5zZWxlY3Rpb24scz1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsdS5leHRlbnQpLGY9Y2woYyxzKTtyZXR1cm4gYyYmcz90OnQoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD10aGlzLG89YXJndW1lbnRzLHU9dC5fX2JydXNoLGE9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHQsbyk6ZSx1LmV4dGVudCksYz1pKHQsbykuYmVmb3Jlc3RhcnQoKTtqbCh0KSx1LnNlbGVjdGlvbj1udWxsPT1hfHxsZShhKT9udWxsOmEsci5jYWxsKHQpLGMuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LG8ucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7TihuZXcgbWgoZSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksbC5hcHBseSxsLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LGUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z2goW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLGUpOnN9LGUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Z2goISF0KSxlKTpmfSxlLmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3QsZSk6cH0sZS5vbj1mdW5jdGlvbigpe3ZhciB0PWwub24uYXBwbHkobCxhcmd1bWVudHMpO3JldHVybiB0PT09bD9lOnR9LGV9ZnVuY3Rpb24gcGUodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHQobi5zb3VyY2UudmFsdWUrbi50YXJnZXQudmFsdWUsZS5zb3VyY2UudmFsdWUrZS50YXJnZXQudmFsdWUpfX1mdW5jdGlvbiBkZSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIHZlKCl7cmV0dXJuIG5ldyBkZX1mdW5jdGlvbiBfZSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24geWUodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGdlKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBtZSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIHhlKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGJlKCl7fWZ1bmN0aW9uIHdlKHQsbil7dmFyIGU9bmV3IGJlO2lmKHQgaW5zdGFuY2VvZiBiZSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciB1IGluIHQpZS5zZXQodSx0W3VdKTtyZXR1cm4gZX1mdW5jdGlvbiBNZSgpe3JldHVybnt9fWZ1bmN0aW9uIFRlKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24ga2UoKXtyZXR1cm4gd2UoKX1mdW5jdGlvbiBOZSh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBTZSgpe31mdW5jdGlvbiBFZSh0LG4pe3ZhciBlPW5ldyBTZTtpZih0IGluc3RhbmNlb2YgU2UpdC5lYWNoKGZ1bmN0aW9uKHQpe2UuYWRkKHQpfSk7ZWxzZSBpZih0KXt2YXIgcj0tMSxpPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK3I8aTspZS5hZGQodFtyXSk7ZWxzZSBmb3IoOysrcjxpOyllLmFkZChuKHRbcl0scix0KSl9cmV0dXJuIGV9ZnVuY3Rpb24gQWUodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBDZSh0LG4pe3ZhciBlPUFlKHQpO3JldHVybiBmdW5jdGlvbihyLGkpe3JldHVybiBuKGUociksaSx0KX19ZnVuY3Rpb24gemUodCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxlPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciByIGluIHQpciBpbiBufHxlLnB1c2gobltyXT1yKX0pLGV9ZnVuY3Rpb24gUGUodCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sdSxhLGMscyxmLGwsaCxwPXQuX3Jvb3QsZD17ZGF0YTpyfSx2PXQuX3gwLF89dC5feTAseT10Ll94MSxnPXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWQsdDtmb3IoO3AubGVuZ3RoOylpZigocz1uPj0obz0odit5KS8yKSk/dj1vOnk9bywoZj1lPj0odT0oXytnKS8yKSk/Xz11Omc9dSxpPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gaVtsXT1kLHQ7aWYoYT0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLG49PT1hJiZlPT09YylyZXR1cm4gZC5uZXh0PXAsaT9pW2xdPWQ6dC5fcm9vdD1kLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChzPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChmPWU+PSh1PShfK2cpLzIpKT9fPXU6Zz11fXdoaWxlKChsPWY8PDF8cyk9PShoPShjPj11KTw8MXxhPj1vKSk7cmV0dXJuIGlbaF09cCxpW2xdPWQsdH1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBMZSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBxZSh0LG4sZSl7dmFyIHI9bmV3IFVlKG51bGw9PW4/UmU6bixudWxsPT1lP0xlOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIFVlKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24gRGUodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufWZ1bmN0aW9uIE9lKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBGZSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gSWUodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gWWUodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gQmUodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBqZSh0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIEhlKHQpe3JldHVybiBuZXcgWGUodCl9ZnVuY3Rpb24gWGUodCl7aWYoIShuPXhwLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG4sZT1uWzFdfHwiICIscj1uWzJdfHwiPiIsaT1uWzNdfHwiLSIsbz1uWzRdfHwiIix1PSEhbls1XSxhPW5bNl0mJituWzZdLGM9ISFuWzddLHM9bls4XSYmK25bOF0uc2xpY2UoMSksZj1uWzldfHwiIjsibiI9PT1mPyhjPSEwLGY9ImciKTptcFtmXXx8KGY9IiIpLCh1fHwiMCI9PT1lJiYiPSI9PT1yKSYmKHU9ITAsZT0iMCIscj0iPSIpLHRoaXMuZmlsbD1lLHRoaXMuYWxpZ249cix0aGlzLnNpZ249aSx0aGlzLnN5bWJvbD1vLHRoaXMuemVybz11LHRoaXMud2lkdGg9YSx0aGlzLmNvbW1hPWMsdGhpcy5wcmVjaXNpb249cyx0aGlzLnR5cGU9Zn1mdW5jdGlvbiAkZShuKXtyZXR1cm4gYnA9VHAobiksdC5mb3JtYXQ9YnAuZm9ybWF0LHQuZm9ybWF0UHJlZml4PWJwLmZvcm1hdFByZWZpeCxicH1mdW5jdGlvbiBWZSgpe3RoaXMucmVzZXQoKX1mdW5jdGlvbiBXZSh0LG4sZSl7dmFyIHI9dC5zPW4rZSxpPXItbixvPXItaTt0LnQ9bi1vKyhlLWkpfWZ1bmN0aW9uIFplKHQpe3JldHVybiB0PjE/MDp0PC0xP2NkOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBHZSh0KXtyZXR1cm4gdD4xP3NkOnQ8LTE/LXNkOk1hdGguYXNpbih0KX1mdW5jdGlvbiBKZSh0KXtyZXR1cm4odD13ZCh0LzIpKSp0fWZ1bmN0aW9uIFFlKCl7fWZ1bmN0aW9uIEtlKHQsbil7dCYmU2QuaGFzT3duUHJvcGVydHkodC50eXBlKSYmU2RbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIHRyKHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIG5yKHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspdHIodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIGVyKCl7emQucG9pbnQ9aXJ9ZnVuY3Rpb24gcnIoKXtvcihBcCxDcCl9ZnVuY3Rpb24gaXIodCxuKXt6ZC5wb2ludD1vcixBcD10LENwPW4senA9dCo9cGQsUHA9eWQobj0obio9cGQpLzIrZmQpLFJwPXdkKG4pfWZ1bmN0aW9uIG9yKHQsbil7bj0obio9cGQpLzIrZmQ7dmFyIGU9KHQqPXBkKS16cCxyPWU+PTA/MTotMSxpPXIqZSxvPXlkKG4pLHU9d2QobiksYT1ScCp1LGM9UHAqbythKnlkKGkpLHM9YSpyKndkKGkpO0FkLmFkZChfZChzLGMpKSx6cD10LFBwPW8sUnA9dX1mdW5jdGlvbiB1cih0KXtyZXR1cm5bX2QodFsxXSx0WzBdKSxHZSh0WzJdKV19ZnVuY3Rpb24gYXIodCl7dmFyIG49dFswXSxlPXRbMV0scj15ZChlKTtyZXR1cm5bcip5ZChuKSxyKndkKG4pLHdkKGUpXX1mdW5jdGlvbiBjcih0LG4pe3JldHVybiB0WzBdKm5bMF0rdFsxXSpuWzFdK3RbMl0qblsyXX1mdW5jdGlvbiBzcih0LG4pe3JldHVyblt0WzFdKm5bMl0tdFsyXSpuWzFdLHRbMl0qblswXS10WzBdKm5bMl0sdFswXSpuWzFdLXRbMV0qblswXV19ZnVuY3Rpb24gZnIodCxuKXt0WzBdKz1uWzBdLHRbMV0rPW5bMV0sdFsyXSs9blsyXX1mdW5jdGlvbiBscih0LG4pe3JldHVyblt0WzBdKm4sdFsxXSpuLHRbMl0qbl19ZnVuY3Rpb24gaHIodCl7dmFyIG49VGQodFswXSp0WzBdK3RbMV0qdFsxXSt0WzJdKnRbMl0pO3RbMF0vPW4sdFsxXS89bix0WzJdLz1ufWZ1bmN0aW9uIHByKHQsbil7QnAucHVzaChqcD1bTHA9dCxVcD10XSksbjxxcCYmKHFwPW4pLG4+RHAmJihEcD1uKX1mdW5jdGlvbiBkcih0LG4pe3ZhciBlPWFyKFt0KnBkLG4qcGRdKTtpZihZcCl7dmFyIHI9c3IoWXAsZSksaT1zcihbclsxXSwtclswXSwwXSxyKTtocihpKSxpPXVyKGkpO3ZhciBvLHU9dC1PcCxhPXU+MD8xOi0xLGM9aVswXSpoZCphLHM9ZGQodSk+MTgwO3NeKGEqT3A8YyYmYzxhKnQpPyhvPWlbMV0qaGQpPkRwJiYoRHA9byk6KGM9KGMrMzYwKSUzNjAtMTgwLHNeKGEqT3A8YyYmYzxhKnQpPyhvPS1pWzFdKmhkKTxxcCYmKHFwPW8pOihuPHFwJiYocXA9biksbj5EcCYmKERwPW4pKSkscz90PE9wP3hyKExwLHQpPnhyKExwLFVwKSYmKFVwPXQpOnhyKHQsVXApPnhyKExwLFVwKSYmKExwPXQpOlVwPj1McD8odDxMcCYmKExwPXQpLHQ+VXAmJihVcD10KSk6dD5PcD94cihMcCx0KT54cihMcCxVcCkmJihVcD10KTp4cih0LFVwKT54cihMcCxVcCkmJihMcD10KX1lbHNlIEJwLnB1c2goanA9W0xwPXQsVXA9dF0pO248cXAmJihxcD1uKSxuPkRwJiYoRHA9biksWXA9ZSxPcD10fWZ1bmN0aW9uIHZyKCl7UmQucG9pbnQ9ZHJ9ZnVuY3Rpb24gX3IoKXtqcFswXT1McCxqcFsxXT1VcCxSZC5wb2ludD1wcixZcD1udWxsfWZ1bmN0aW9uIHlyKHQsbil7aWYoWXApe3ZhciBlPXQtT3A7UGQuYWRkKGRkKGUpPjE4MD9lKyhlPjA/MzYwOi0zNjApOmUpfWVsc2UgRnA9dCxJcD1uO3pkLnBvaW50KHQsbiksZHIodCxuKX1mdW5jdGlvbiBncigpe3pkLmxpbmVTdGFydCgpfWZ1bmN0aW9uIG1yKCl7eXIoRnAsSXApLHpkLmxpbmVFbmQoKSxkZChQZCk+YWQmJihMcD0tKFVwPTE4MCkpLGpwWzBdPUxwLGpwWzFdPVVwLFlwPW51bGx9ZnVuY3Rpb24geHIodCxuKXtyZXR1cm4obi09dCk8MD9uKzM2MDpufWZ1bmN0aW9uIGJyKHQsbil7cmV0dXJuIHRbMF0tblswXX1mdW5jdGlvbiB3cih0LG4pe3JldHVybiB0WzBdPD10WzFdP3RbMF08PW4mJm48PXRbMV06bjx0WzBdfHx0WzFdPG59ZnVuY3Rpb24gTXIodCxuKXt0Kj1wZDt2YXIgZT15ZChuKj1wZCk7VHIoZSp5ZCh0KSxlKndkKHQpLHdkKG4pKX1mdW5jdGlvbiBUcih0LG4sZSl7JHArPSh0LSRwKS8rK0hwLFZwKz0obi1WcCkvSHAsV3ArPShlLVdwKS9IcH1mdW5jdGlvbiBrcigpe0xkLnBvaW50PU5yfWZ1bmN0aW9uIE5yKHQsbil7dCo9cGQ7dmFyIGU9eWQobio9cGQpO3JkPWUqeWQodCksaWQ9ZSp3ZCh0KSxvZD13ZChuKSxMZC5wb2ludD1TcixUcihyZCxpZCxvZCl9ZnVuY3Rpb24gU3IodCxuKXt0Kj1wZDt2YXIgZT15ZChuKj1wZCkscj1lKnlkKHQpLGk9ZSp3ZCh0KSxvPXdkKG4pLHU9X2QoVGQoKHU9aWQqby1vZCppKSp1Kyh1PW9kKnItcmQqbykqdSsodT1yZCppLWlkKnIpKnUpLHJkKnIraWQqaStvZCpvKTtYcCs9dSxacCs9dSoocmQrKHJkPXIpKSxHcCs9dSooaWQrKGlkPWkpKSxKcCs9dSoob2QrKG9kPW8pKSxUcihyZCxpZCxvZCl9ZnVuY3Rpb24gRXIoKXtMZC5wb2ludD1Ncn1mdW5jdGlvbiBBcigpe0xkLnBvaW50PXpyfWZ1bmN0aW9uIENyKCl7UHIobmQsZWQpLExkLnBvaW50PU1yfWZ1bmN0aW9uIHpyKHQsbil7bmQ9dCxlZD1uLHQqPXBkLG4qPXBkLExkLnBvaW50PVByO3ZhciBlPXlkKG4pO3JkPWUqeWQodCksaWQ9ZSp3ZCh0KSxvZD13ZChuKSxUcihyZCxpZCxvZCl9ZnVuY3Rpb24gUHIodCxuKXt0Kj1wZDt2YXIgZT15ZChuKj1wZCkscj1lKnlkKHQpLGk9ZSp3ZCh0KSxvPXdkKG4pLHU9aWQqby1vZCppLGE9b2Qqci1yZCpvLGM9cmQqaS1pZCpyLHM9VGQodSp1K2EqYStjKmMpLGY9R2UocyksbD1zJiYtZi9zO1FwKz1sKnUsS3ArPWwqYSx0ZCs9bCpjLFhwKz1mLFpwKz1mKihyZCsocmQ9cikpLEdwKz1mKihpZCsoaWQ9aSkpLEpwKz1mKihvZCsob2Q9bykpLFRyKHJkLGlkLG9kKX1mdW5jdGlvbiBScih0LG4pe3JldHVyblt0PmNkP3QtbGQ6dDwtY2Q/dCtsZDp0LG5dfWZ1bmN0aW9uIExyKHQsbixlKXtyZXR1cm4odCU9bGQpP258fGU/VWQoVXIodCksRHIobixlKSk6VXIodCk6bnx8ZT9EcihuLGUpOlJyfWZ1bmN0aW9uIHFyKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPmNkP24tbGQ6bjwtY2Q/bitsZDpuLGVdfX1mdW5jdGlvbiBVcih0KXt2YXIgbj1xcih0KTtyZXR1cm4gbi5pbnZlcnQ9cXIoLXQpLG59ZnVuY3Rpb24gRHIodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9eWQobiksYT15ZCh0KSplLGM9d2QodCkqZSxzPXdkKG4pLGY9cypyK2EqaTtyZXR1cm5bX2QoYypvLWYqdSxhKnItcyppKSxHZShmKm8rYyp1KV19dmFyIHI9eWQodCksaT13ZCh0KSxvPXlkKG4pLHU9d2Qobik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9eWQobiksYT15ZCh0KSplLGM9d2QodCkqZSxzPXdkKG4pLGY9cypvLWMqdTtyZXR1cm5bX2QoYypvK3MqdSxhKnIrZippKSxHZShmKnItYSppKV19LGV9ZnVuY3Rpb24gT3IodCxuLGUscixpLG8pe2lmKGUpe3ZhciB1PXlkKG4pLGE9d2QobiksYz1yKmU7bnVsbD09aT8oaT1uK3IqbGQsbz1uLWMvMik6KGk9RnIodSxpKSxvPUZyKHUsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqbGQpKTtmb3IodmFyIHMsZj1pO3I+MD9mPm86ZjxvO2YtPWMpcz11cihbdSwtYSp5ZChmKSwtYSp3ZChmKV0pLHQucG9pbnQoc1swXSxzWzFdKX19ZnVuY3Rpb24gRnIodCxuKXsobj1hcihuKSlbMF0tPXQsaHIobik7dmFyIGU9WmUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStsZC1hZCklbGR9ZnVuY3Rpb24gSXIodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBZcih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1mdW5jdGlvbiBCcih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKWRve3MucG9pbnQoMD09PWZ8fDM9PT1mP3Q6ZSxmPjE/cjpuKX13aGlsZSgoZj0oZithKzQpJTQpIT09bCk7ZWxzZSBzLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gdShyLGkpe3JldHVybiBkZChyWzBdLXQpPGFkP2k+MD8wOjM6ZGQoclswXS1lKTxhZD9pPjA/MjoxOmRkKHJbMV0tbik8YWQ/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxuKXtyZXR1cm4gYyh0Lngsbi54KX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9dSh0LDEpLHI9dShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbih1KXtmdW5jdGlvbiBjKHQsbil7aSh0LG4pJiZ3LnBvaW50KHQsbil9ZnVuY3Rpb24gcygpe2Zvcih2YXIgbj0wLGU9MCxpPWgubGVuZ3RoO2U8aTsrK2UpZm9yKHZhciBvLHUsYT1oW2VdLGM9MSxzPWEubGVuZ3RoLGY9YVswXSxsPWZbMF0scD1mWzFdO2M8czsrK2Mpbz1sLHU9cCxsPShmPWFbY10pWzBdLHA9ZlsxXSx1PD1yP3A+ciYmKGwtbykqKHItdSk+KHAtdSkqKHQtbykmJisrbjpwPD1yJiYobC1vKSooci11KTwocC11KSoodC1vKSYmLS1uO3JldHVybiBufWZ1bmN0aW9uIGYobyx1KXt2YXIgYT1pKG8sdSk7aWYoaCYmcC5wdXNoKFtvLHVdKSx4KWQ9byx2PXUsXz1hLHg9ITEsYSYmKHcubGluZVN0YXJ0KCksdy5wb2ludChvLHUpKTtlbHNlIGlmKGEmJm0pdy5wb2ludChvLHUpO2Vsc2V7dmFyIGM9W3k9TWF0aC5tYXgodHYsTWF0aC5taW4oS2QseSkpLGc9TWF0aC5tYXgodHYsTWF0aC5taW4oS2QsZykpXSxzPVtvPU1hdGgubWF4KHR2LE1hdGgubWluKEtkLG8pKSx1PU1hdGgubWF4KHR2LE1hdGgubWluKEtkLHUpKV07R2QoYyxzLHQsbixlLHIpPyhtfHwody5saW5lU3RhcnQoKSx3LnBvaW50KGNbMF0sY1sxXSkpLHcucG9pbnQoc1swXSxzWzFdKSxhfHx3LmxpbmVFbmQoKSxiPSExKTphJiYody5saW5lU3RhcnQoKSx3LnBvaW50KG8sdSksYj0hMSl9eT1vLGc9dSxtPWF9dmFyIGwsaCxwLGQsdixfLHksZyxtLHgsYix3PXUsTT1aZCgpLFQ9e3BvaW50OmMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7VC5wb2ludD1mLGgmJmgucHVzaChwPVtdKSx4PSEwLG09ITEseT1nPU5hTn0sbGluZUVuZDpmdW5jdGlvbigpe2wmJihmKGQsdiksXyYmbSYmTS5yZWpvaW4oKSxsLnB1c2goTS5yZXN1bHQoKSkpLFQucG9pbnQ9YyxtJiZ3LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dz1NLGw9W10saD1bXSxiPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9cygpLG49YiYmdCxlPShsPUNzKGwpKS5sZW5ndGg7KG58fGUpJiYodS5wb2x5Z29uU3RhcnQoKSxuJiYodS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHUpLHUubGluZUVuZCgpKSxlJiZRZChsLGEsdCxvLHUpLHUucG9seWdvbkVuZCgpKSx3PXUsbD1oPXA9bnVsbH19O3JldHVybiBUfX1mdW5jdGlvbiBqcigpe2l2LnBvaW50PWl2LmxpbmVFbmQ9UWV9ZnVuY3Rpb24gSHIodCxuKXtEZD10Kj1wZCxPZD13ZChuKj1wZCksRmQ9eWQobiksaXYucG9pbnQ9WHJ9ZnVuY3Rpb24gWHIodCxuKXt0Kj1wZDt2YXIgZT13ZChuKj1wZCkscj15ZChuKSxpPWRkKHQtRGQpLG89eWQoaSksdT1yKndkKGkpLGE9RmQqZS1PZCpyKm8sYz1PZCplK0ZkKnIqbztydi5hZGQoX2QoVGQodSp1K2EqYSksYykpLERkPXQsT2Q9ZSxGZD1yfWZ1bmN0aW9uICRyKHQsbil7cmV0dXJuISghdHx8IWZ2Lmhhc093blByb3BlcnR5KHQudHlwZSkpJiZmdlt0LnR5cGVdKHQsbil9ZnVuY3Rpb24gVnIodCxuKXtyZXR1cm4gMD09PWN2KHQsbil9ZnVuY3Rpb24gV3IodCxuKXt2YXIgZT1jdih0WzBdLHRbMV0pO3JldHVybiBjdih0WzBdLG4pK2N2KG4sdFsxXSk8PWUrYWR9ZnVuY3Rpb24gWnIodCxuKXtyZXR1cm4hIWV2KHQubWFwKEdyKSxKcihuKSl9ZnVuY3Rpb24gR3IodCl7cmV0dXJuKHQ9dC5tYXAoSnIpKS5wb3AoKSx0fWZ1bmN0aW9uIEpyKHQpe3JldHVyblt0WzBdKnBkLHRbMV0qcGRdfWZ1bmN0aW9uIFFyKHQsbixlKXt2YXIgcj1Ncyh0LG4tYWQsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gS3IodCxuLGUpe3ZhciByPU1zKHQsbi1hZCxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bbix0XX0pfX1mdW5jdGlvbiB0aSgpe2Z1bmN0aW9uIHQoKXtyZXR1cm57dHlwZToiTXVsdGlMaW5lU3RyaW5nIixjb29yZGluYXRlczpuKCl9fWZ1bmN0aW9uIG4oKXtyZXR1cm4gTXMoZ2Qoby9fKSpfLGksXykubWFwKGgpLmNvbmNhdChNcyhnZChzL3kpKnksYyx5KS5tYXAocCkpLmNvbmNhdChNcyhnZChyL2QpKmQsZSxkKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGRkKHQlXyk+YWR9KS5tYXAoZikpLmNvbmNhdChNcyhnZChhL3YpKnYsdSx2KS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGRkKHQleSk+YWR9KS5tYXAobCkpfXZhciBlLHIsaSxvLHUsYSxjLHMsZixsLGgscCxkPTEwLHY9ZCxfPTkwLHk9MzYwLGc9Mi41O3JldHVybiB0LmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSl9LHQub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbaChvKS5jb25jYXQocChjKS5zbGljZSgxKSxoKGkpLnJldmVyc2UoKS5zbGljZSgxKSxwKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5leHRlbnRNYWpvcihuKS5leHRlbnRNaW5vcihuKTp0LmV4dGVudE1pbm9yKCl9LHQuZXh0ZW50TWFqb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMF0saT0rblsxXVswXSxzPStuWzBdWzFdLGM9K25bMV1bMV0sbz5pJiYobj1vLG89aSxpPW4pLHM+YyYmKG49cyxzPWMsYz1uKSx0LnByZWNpc2lvbihnKSk6W1tvLHNdLFtpLGNdXX0sdC5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rblswXVswXSxlPStuWzFdWzBdLGE9K25bMF1bMV0sdT0rblsxXVsxXSxyPmUmJihuPXIscj1lLGU9biksYT51JiYobj1hLGE9dSx1PW4pLHQucHJlY2lzaW9uKGcpKTpbW3IsYV0sW2UsdV1dfSx0LnN0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5zdGVwTWFqb3Iobikuc3RlcE1pbm9yKG4pOnQuc3RlcE1pbm9yKCl9LHQuc3RlcE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPStuWzBdLHk9K25bMV0sdCk6W18seV19LHQuc3RlcE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPStuWzBdLHY9K25bMV0sdCk6W2Qsdl19LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPStuLGY9UXIoYSx1LDkwKSxsPUtyKHIsZSxnKSxoPVFyKHMsYyw5MCkscD1LcihvLGksZyksdCk6Z30sdC5leHRlbnRNYWpvcihbWy0xODAsLTkwK2FkXSxbMTgwLDkwLWFkXV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAtYWRdLFsxODAsODArYWRdXSl9ZnVuY3Rpb24gbmkoKXtkdi5wb2ludD1laX1mdW5jdGlvbiBlaSh0LG4pe2R2LnBvaW50PXJpLElkPUJkPXQsWWQ9amQ9bn1mdW5jdGlvbiByaSh0LG4pe3B2LmFkZChqZCp0LUJkKm4pLEJkPXQsamQ9bn1mdW5jdGlvbiBpaSgpe3JpKElkLFlkKX1mdW5jdGlvbiBvaSh0LG4pe3h2Kz10LGJ2Kz1uLCsrd3Z9ZnVuY3Rpb24gdWkoKXtBdi5wb2ludD1haX1mdW5jdGlvbiBhaSh0LG4pe0F2LnBvaW50PWNpLG9pKCRkPXQsVmQ9bil9ZnVuY3Rpb24gY2kodCxuKXt2YXIgZT10LSRkLHI9bi1WZCxpPVRkKGUqZStyKnIpO012Kz1pKigkZCt0KS8yLFR2Kz1pKihWZCtuKS8yLGt2Kz1pLG9pKCRkPXQsVmQ9bil9ZnVuY3Rpb24gc2koKXtBdi5wb2ludD1vaX1mdW5jdGlvbiBmaSgpe0F2LnBvaW50PWhpfWZ1bmN0aW9uIGxpKCl7cGkoSGQsWGQpfWZ1bmN0aW9uIGhpKHQsbil7QXYucG9pbnQ9cGksb2koSGQ9JGQ9dCxYZD1WZD1uKX1mdW5jdGlvbiBwaSh0LG4pe3ZhciBlPXQtJGQscj1uLVZkLGk9VGQoZSplK3Iqcik7TXYrPWkqKCRkK3QpLzIsVHYrPWkqKFZkK24pLzIsa3YrPWksTnYrPShpPVZkKnQtJGQqbikqKCRkK3QpLFN2Kz1pKihWZCtuKSxFdis9MyppLG9pKCRkPXQsVmQ9bil9ZnVuY3Rpb24gZGkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHZpKHQsbil7VXYucG9pbnQ9X2ksenY9UnY9dCxQdj1Mdj1ufWZ1bmN0aW9uIF9pKHQsbil7UnYtPXQsTHYtPW4scXYuYWRkKFRkKFJ2KlJ2K0x2Kkx2KSksUnY9dCxMdj1ufWZ1bmN0aW9uIHlpKCl7dGhpcy5fc3RyaW5nPVtdfWZ1bmN0aW9uIGdpKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uIG1pKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIHhpKHQsbil7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLXNkLWFkOnNkLXRbMV0pLSgobj1uLngpWzBdPDA/blsxXS1zZC1hZDpzZC1uWzFdKX1mdW5jdGlvbiBiaSh0LG4sZSxyKXt2YXIgaSxvLHU9d2QodC1lKTtyZXR1cm4gZGQodSk+YWQ/dmQoKHdkKG4pKihvPXlkKHIpKSp3ZChlKS13ZChyKSooaT15ZChuKSkqd2QodCkpLyhpKm8qdSkpOihuK3IpLzJ9ZnVuY3Rpb24gd2kodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPW5ldyBNaTtmb3IodmFyIHIgaW4gdCllW3JdPXRbcl07cmV0dXJuIGUuc3RyZWFtPW4sZX19ZnVuY3Rpb24gTWkoKXt9ZnVuY3Rpb24gVGkodCxuLGUpe3ZhciByPW5bMV1bMF0tblswXVswXSxpPW5bMV1bMV0tblswXVsxXSxvPXQuY2xpcEV4dGVudCYmdC5jbGlwRXh0ZW50KCk7dC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9byYmdC5jbGlwRXh0ZW50KG51bGwpLEVkKGUsdC5zdHJlYW0obXYpKTt2YXIgdT1tdi5yZXN1bHQoKSxhPU1hdGgubWluKHIvKHVbMV1bMF0tdVswXVswXSksaS8odVsxXVsxXS11WzBdWzFdKSksYz0rblswXVswXSsoci1hKih1WzFdWzBdK3VbMF1bMF0pKS8yLHM9K25bMF1bMV0rKGktYSoodVsxXVsxXSt1WzBdWzFdKSkvMjtyZXR1cm4gbnVsbCE9byYmdC5jbGlwRXh0ZW50KG8pLHQuc2NhbGUoMTUwKmEpLnRyYW5zbGF0ZShbYyxzXSl9ZnVuY3Rpb24ga2kodCxuLGUpe3JldHVybiBUaSh0LFtbMCwwXSxuXSxlKX1mdW5jdGlvbiBOaSh0KXtyZXR1cm4gd2koe3BvaW50OmZ1bmN0aW9uKG4sZSl7bj10KG4sZSksdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX1mdW5jdGlvbiBTaSh0LG4pe2Z1bmN0aW9uIGUocixpLG8sdSxhLGMscyxmLGwsaCxwLGQsdixfKXt2YXIgeT1zLXIsZz1mLWksbT15KnkrZypnO2lmKG0+NCpuJiZ2LS0pe3ZhciB4PXUraCxiPWErcCx3PWMrZCxNPVRkKHgqeCtiKmIrdyp3KSxUPUdlKHcvPU0pLGs9ZGQoZGQodyktMSk8YWR8fGRkKG8tbCk8YWQ/KG8rbCkvMjpfZChiLHgpLE49dChrLFQpLFM9TlswXSxFPU5bMV0sQT1TLXIsQz1FLWksej1nKkEteSpDOyh6KnovbT5ufHxkZCgoeSpBK2cqQykvbS0uNSk+LjN8fHUqaCthKnArYypkPFl2KSYmKGUocixpLG8sdSxhLGMsUyxFLGsseC89TSxiLz1NLHcsdixfKSxfLnBvaW50KFMsRSksZShTLEUsayx4LGIsdyxzLGYsbCxoLHAsZCx2LF8pKX19cmV0dXJuIGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIoZSxyKXtlPXQoZSxyKSxuLnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gaSgpe3k9TmFOLHcucG9pbnQ9byxuLmxpbmVTdGFydCgpfWZ1bmN0aW9uIG8ocixpKXt2YXIgbz1hcihbcixpXSksdT10KHIsaSk7ZSh5LGcsXyxtLHgsYix5PXVbMF0sZz11WzFdLF89cixtPW9bMF0seD1vWzFdLGI9b1syXSxJdixuKSxuLnBvaW50KHksZyl9ZnVuY3Rpb24gdSgpe3cucG9pbnQ9cixuLmxpbmVFbmQoKX1mdW5jdGlvbiBhKCl7aSgpLHcucG9pbnQ9Yyx3LmxpbmVFbmQ9c31mdW5jdGlvbiBjKHQsbil7byhmPXQsbiksbD15LGg9ZyxwPW0sZD14LHY9Yix3LnBvaW50PW99ZnVuY3Rpb24gcygpe2UoeSxnLF8sbSx4LGIsbCxoLGYscCxkLHYsSXYsbiksdy5saW5lRW5kPXUsdSgpfXZhciBmLGwsaCxwLGQsdixfLHksZyxtLHgsYix3PXtwb2ludDpyLGxpbmVTdGFydDppLGxpbmVFbmQ6dSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpLHcubGluZVN0YXJ0PWF9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25FbmQoKSx3LmxpbmVTdGFydD1pfX07cmV0dXJuIHd9fWZ1bmN0aW9uIEVpKHQpe3JldHVybiBBaShmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBBaSh0KXtmdW5jdGlvbiBuKHQpe3JldHVybiB0PWYodFswXSpwZCx0WzFdKnBkKSxbdFswXSpfK2EsYy10WzFdKl9dfWZ1bmN0aW9uIGUodCl7cmV0dXJuKHQ9Zi5pbnZlcnQoKHRbMF0tYSkvXywoYy10WzFdKS9fKSkmJlt0WzBdKmhkLHRbMV0qaGRdfWZ1bmN0aW9uIHIodCxuKXtyZXR1cm4gdD11KHQsbiksW3RbMF0qXythLGMtdFsxXSpfXX1mdW5jdGlvbiBpKCl7Zj1VZChzPUxyKGIsdyxNKSx1KTt2YXIgdD11KG0seCk7cmV0dXJuIGE9eS10WzBdKl8sYz1nK3RbMV0qXyxvKCl9ZnVuY3Rpb24gbygpe3JldHVybiBkPXY9bnVsbCxufXZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF89MTUwLHk9NDgwLGc9MjUwLG09MCx4PTAsYj0wLHc9MCxNPTAsVD1udWxsLGs9T3YsTj1udWxsLFM9bHYsRT0uNSxBPUJ2KHIsRSk7cmV0dXJuIG4uc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBkJiZ2PT09dD9kOmQ9anYoayhzLEEoUyh2PXQpKSkpfSxuLmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz0rdD9GdihUPXQqcGQsNipwZCk6KFQ9bnVsbCxPdiksbygpKTpUKmhkfSxuLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9bnVsbD09dD8oTj1sPWg9cD1udWxsLGx2KTpCcihOPSt0WzBdWzBdLGw9K3RbMF1bMV0saD0rdFsxXVswXSxwPSt0WzFdWzFdKSxvKCkpOm51bGw9PU4/bnVsbDpbW04sbF0sW2gscF1dfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPSt0LGkoKSk6X30sbi50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3RbMF0sZz0rdFsxXSxpKCkpOlt5LGddfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10WzBdJTM2MCpwZCx4PXRbMV0lMzYwKnBkLGkoKSk6W20qaGQseCpoZF19LG4ucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXRbMF0lMzYwKnBkLHc9dFsxXSUzNjAqcGQsTT10Lmxlbmd0aD4yP3RbMl0lMzYwKnBkOjAsaSgpKTpbYipoZCx3KmhkLE0qaGRdfSxuLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT1CdihyLEU9dCp0KSxvKCkpOlRkKEUpfSxuLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiBUaShuLHQsZSl9LG4uZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiBraShuLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbi5pbnZlcnQ9dS5pbnZlcnQmJmUsaSgpfX1mdW5jdGlvbiBDaSh0KXt2YXIgbj0wLGU9Y2QvMyxyPUFpKHQpLGk9cihuLGUpO3JldHVybiBpLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9yKG49dFswXSpwZCxlPXRbMV0qcGQpOltuKmhkLGUqaGRdfSxpfWZ1bmN0aW9uIHppKHQpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm5bdCplLHdkKG4pL2VdfXZhciBlPXlkKHQpO3JldHVybiBuLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0L2UsR2UobiplKV19LG59ZnVuY3Rpb24gUGkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9VGQoby0yKmkqd2QobikpL2k7cmV0dXJuW2Uqd2QodCo9aSksdS1lKnlkKHQpXX12YXIgcj13ZCh0KSxpPShyK3dkKG4pKS8yO2lmKGRkKGkpPGFkKXJldHVybiB6aSh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PVRkKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltfZCh0LGRkKGUpKS9pKk1kKGUpLEdlKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gUmkodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJue3BvaW50OmZ1bmN0aW9uKGUscil7Zm9yKHZhciBpPS0xOysraTxuOyl0W2ldLnBvaW50KGUscil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgZT0tMTsrK2U8bjspdFtlXS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnBvbHlnb25FbmQoKX19fWZ1bmN0aW9uIExpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXlkKG4pLGk9eWQoZSksbz10KHIqaSk7cmV0dXJuW28qaSp3ZChuKSxvKndkKGUpXX19ZnVuY3Rpb24gcWkodCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9VGQobipuK2UqZSksaT10KHIpLG89d2QoaSksdT15ZChpKTtyZXR1cm5bX2QobipvLHIqdSksR2UociYmZSpvL3IpXX19ZnVuY3Rpb24gVWkodCxuKXtyZXR1cm5bdCx4ZChrZCgoc2QrbikvMikpXX1mdW5jdGlvbiBEaSh0KXtmdW5jdGlvbiBuKCl7dmFyIG49Y2QqYSgpLHU9byhXZChvLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gcyhudWxsPT1mP1tbdVswXS1uLHVbMV0tbl0sW3VbMF0rbix1WzFdK25dXTp0PT09VWk/W1tNYXRoLm1heCh1WzBdLW4sZiksZV0sW01hdGgubWluKHVbMF0rbixyKSxpXV06W1tmLE1hdGgubWF4KHVbMV0tbixlKV0sW3IsTWF0aC5taW4odVsxXStuLGkpXV0pfXZhciBlLHIsaSxvPUVpKHQpLHU9by5jZW50ZXIsYT1vLnNjYWxlLGM9by50cmFuc2xhdGUscz1vLmNsaXBFeHRlbnQsZj1udWxsO3JldHVybiBvLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLG4oKSk6YSgpfSxvLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYyh0KSxuKCkpOmMoKX0sby5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHUodCksbigpKTp1KCl9LG8uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9mPWU9cj1pPW51bGw6KGY9K3RbMF1bMF0sZT0rdFswXVsxXSxyPSt0WzFdWzBdLGk9K3RbMV1bMV0pLG4oKSk6bnVsbD09Zj9udWxsOltbZixlXSxbcixpXV19LG4oKX1mdW5jdGlvbiBPaSh0KXtyZXR1cm4ga2QoKHNkK3QpLzIpfWZ1bmN0aW9uIEZpKHQsbil7ZnVuY3Rpb24gZSh0LG4pe28+MD9uPC1zZCthZCYmKG49LXNkK2FkKTpuPnNkLWFkJiYobj1zZC1hZCk7dmFyIGU9by9iZChPaShuKSxpKTtyZXR1cm5bZSp3ZChpKnQpLG8tZSp5ZChpKnQpXX12YXIgcj15ZCh0KSxpPXQ9PT1uP3dkKHQpOnhkKHIveWQobikpL3hkKE9pKG4pL09pKHQpKSxvPXIqYmQoT2kodCksaSkvaTtyZXR1cm4gaT8oZS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1vLW4scj1NZChpKSpUZCh0KnQrZSplKTtyZXR1cm5bX2QodCxkZChlKSkvaSpNZChlKSwyKnZkKGJkKG8vciwxL2kpKS1zZF19LGUpOlVpfWZ1bmN0aW9uIElpKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gWWkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9by1uLHI9aSp0O3JldHVybltlKndkKHIpLG8tZSp5ZChyKV19dmFyIHI9eWQodCksaT10PT09bj93ZCh0KTooci15ZChuKSkvKG4tdCksbz1yL2krdDtyZXR1cm4gZGQoaSk8YWQ/SWk6KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltfZCh0LGRkKGUpKS9pKk1kKGUpLG8tTWQoaSkqVGQodCp0K2UqZSldfSxlKX1mdW5jdGlvbiBCaSh0LG4pe3ZhciBlPXlkKG4pLHI9eWQodCkqZTtyZXR1cm5bZSp3ZCh0KS9yLHdkKG4pL3JdfWZ1bmN0aW9uIGppKHQsbixlLHIpe3JldHVybiAxPT09dCYmMT09PW4mJjA9PT1lJiYwPT09cj9sdjp3aSh7cG9pbnQ6ZnVuY3Rpb24oaSxvKXt0aGlzLnN0cmVhbS5wb2ludChpKnQrZSxvKm4rcil9fSl9ZnVuY3Rpb24gSGkodCxuKXtyZXR1cm5beWQobikqd2QodCksd2QobildfWZ1bmN0aW9uIFhpKHQsbil7dmFyIGU9eWQobikscj0xK3lkKHQpKmU7cmV0dXJuW2Uqd2QodCkvcix3ZChuKS9yXX1mdW5jdGlvbiAkaSh0LG4pe3JldHVyblt4ZChrZCgoc2QrbikvMikpLC10XX1mdW5jdGlvbiBWaSh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBXaSh0KXtyZXR1cm4gdC5yZWR1Y2UoWmksMCkvdC5sZW5ndGh9ZnVuY3Rpb24gWmkodCxuKXtyZXR1cm4gdCtuLnh9ZnVuY3Rpb24gR2kodCl7cmV0dXJuIDErdC5yZWR1Y2UoSmksMCl9ZnVuY3Rpb24gSmkodCxuKXtyZXR1cm4gTWF0aC5tYXgodCxuLnkpfWZ1bmN0aW9uIFFpKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9blswXTtyZXR1cm4gdH1mdW5jdGlvbiBLaSh0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bbi5sZW5ndGgtMV07cmV0dXJuIHR9ZnVuY3Rpb24gdG8odCl7dmFyIG49MCxlPXQuY2hpbGRyZW4scj1lJiZlLmxlbmd0aDtpZihyKWZvcig7LS1yPj0wOyluKz1lW3JdLnZhbHVlO2Vsc2Ugbj0xO3QudmFsdWU9bn1mdW5jdGlvbiBubyh0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9ZnVuY3Rpb24gZW8odCxuKXt2YXIgZSxyLGksbyx1LGE9bmV3IHVvKHQpLGM9K3QudmFsdWUmJihhLnZhbHVlPXQudmFsdWUpLHM9W2FdO2ZvcihudWxsPT1uJiYobj1ybyk7ZT1zLnBvcCgpOylpZihjJiYoZS52YWx1ZT0rZS5kYXRhLnZhbHVlKSwoaT1uKGUuZGF0YSkpJiYodT1pLmxlbmd0aCkpZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KHUpLG89dS0xO28+PTA7LS1vKXMucHVzaChyPWUuY2hpbGRyZW5bb109bmV3IHVvKGlbb10pKSxyLnBhcmVudD1lLHIuZGVwdGg9ZS5kZXB0aCsxO3JldHVybiBhLmVhY2hCZWZvcmUob28pfWZ1bmN0aW9uIHJvKHQpe3JldHVybiB0LmNoaWxkcmVufWZ1bmN0aW9uIGlvKHQpe3QuZGF0YT10LmRhdGEuZGF0YX1mdW5jdGlvbiBvbyh0KXt2YXIgbj0wO2Rve3QuaGVpZ2h0PW59d2hpbGUoKHQ9dC5wYXJlbnQpJiZ0LmhlaWdodDwrK24pfWZ1bmN0aW9uIHVvKHQpe3RoaXMuZGF0YT10LHRoaXMuZGVwdGg9dGhpcy5oZWlnaHQ9MCx0aGlzLnBhcmVudD1udWxsfWZ1bmN0aW9uIGFvKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fWZ1bmN0aW9uIGNvKHQsbil7dmFyIGUscjtpZihsbyhuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKHNvKG4sdFtlXSkmJmxvKHZvKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihzbyh2byh0W2VdLHRbcl0pLG4pJiZzbyh2byh0W2VdLG4pLHRbcl0pJiZzbyh2byh0W3JdLG4pLHRbZV0pJiZsbyhfbyh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gc28odCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24gZm8odCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBsbyh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCFmbyh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGhvKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiBwbyh0WzBdKTtjYXNlIDI6cmV0dXJuIHZvKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBfbyh0WzBdLHRbMV0sdFsyXSl9fWZ1bmN0aW9uIHBvKHQpe3JldHVybnt4OnQueCx5OnQueSxyOnQucn19ZnVuY3Rpb24gdm8odCxuKXt2YXIgZT10Lngscj10LnksaT10LnIsbz1uLngsdT1uLnksYT1uLnIsYz1vLWUscz11LXIsZj1hLWksbD1NYXRoLnNxcnQoYypjK3Mqcyk7cmV0dXJue3g6KGUrbytjL2wqZikvMix5OihyK3Urcy9sKmYpLzIscjoobCtpK2EpLzJ9fWZ1bmN0aW9uIF9vKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz10LnIsdT1uLngsYT1uLnksYz1uLnIscz1lLngsZj1lLnksbD1lLnIsaD1yLXUscD1yLXMsZD1pLWEsdj1pLWYsXz1jLW8seT1sLW8sZz1yKnIraSppLW8qbyxtPWctdSp1LWEqYStjKmMseD1nLXMqcy1mKmYrbCpsLGI9cCpkLWgqdix3PShkKngtdiptKS8oMipiKS1yLE09KHYqXy1kKnkpL2IsVD0ocCptLWgqeCkvKDIqYiktaSxrPShoKnktcCpfKS9iLE49TSpNK2sqay0xLFM9Mioobyt3Kk0rVCprKSxFPXcqdytUKlQtbypvLEE9LShOPyhTK01hdGguc3FydChTKlMtNCpOKkUpKS8oMipOKTpFL1MpO3JldHVybnt4OnIrdytNKkEseTppK1QraypBLHI6QX19ZnVuY3Rpb24geW8odCxuLGUpe3ZhciByPXQueCxpPXQueSxvPW4ucitlLnIsdT10LnIrZS5yLGE9bi54LXIsYz1uLnktaSxzPWEqYStjKmM7aWYocyl7dmFyIGY9LjUrKCh1Kj11KS0obyo9bykpLygyKnMpLGw9TWF0aC5zcXJ0KE1hdGgubWF4KDAsMipvKih1K3MpLSh1LT1zKSp1LW8qbykpLygyKnMpO2UueD1yK2YqYStsKmMsZS55PWkrZipjLWwqYX1lbHNlIGUueD1yK3UsZS55PWl9ZnVuY3Rpb24gZ28odCxuKXt2YXIgZT1uLngtdC54LHI9bi55LXQueSxpPXQucituLnI7cmV0dXJuIGkqaS0xZS02PmUqZStyKnJ9ZnVuY3Rpb24gbW8odCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24geG8odCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIGJvKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyx1LGEsYyxzLGYsbDtpZihuPXRbMF0sbi54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3lvKGUsbixyPXRbMl0pLG49bmV3IHhvKG4pLGU9bmV3IHhvKGUpLHI9bmV3IHhvKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKGE9MzthPGk7KythKXt5byhuLl8sZS5fLHI9dFthXSkscj1uZXcgeG8ociksYz1lLm5leHQscz1uLnByZXZpb3VzLGY9ZS5fLnIsbD1uLl8ucjtkb3tpZihmPD1sKXtpZihnbyhjLl8sci5fKSl7ZT1jLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1mKz1jLl8ucixjPWMubmV4dH1lbHNle2lmKGdvKHMuXyxyLl8pKXsobj1zKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tYTtjb250aW51ZSB0fWwrPXMuXy5yLHM9cy5wcmV2aW91c319d2hpbGUoYyE9PXMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1tbyhuKTsocj1yLm5leHQpIT09ZTspKHU9bW8ocikpPG8mJihuPXIsbz11KTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPVp2KG4pLGE9MDthPGk7KythKW49dFthXSxuLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIHdvKHQpe3JldHVybiBudWxsPT10P251bGw6TW8odCl9ZnVuY3Rpb24gTW8odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0fWZ1bmN0aW9uIFRvKCl7cmV0dXJuIDB9ZnVuY3Rpb24ga28odCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBObyh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIFNvKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLHU9ci5sZW5ndGgsYT10KGUpKm58fDA7aWYoYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yKz1hO2lmKG89Ym8ociksYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yLT1hO2Uucj1vK2F9fX1mdW5jdGlvbiBFbyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBDbyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiB6byh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBQbyh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIFJvKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gTG8odCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gcW8odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9ZnVuY3Rpb24gVW8odCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gRG8odCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBPbyh0KXtmb3IodmFyIG4sZSxyLGksbyx1PW5ldyBEbyh0LDApLGE9W3VdO249YS5wb3AoKTspaWYocj1uLl8uY2hpbGRyZW4pZm9yKG4uY2hpbGRyZW49bmV3IEFycmF5KG89ci5sZW5ndGgpLGk9by0xO2k+PTA7LS1pKWEucHVzaChlPW4uY2hpbGRyZW5baV09bmV3IERvKHJbaV0saSkpLGUucGFyZW50PW47cmV0dXJuKHUucGFyZW50PW5ldyBEbyhudWxsLDApKS5jaGlsZHJlbj1bdV0sdX1mdW5jdGlvbiBGbyh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGEsYyxzLGYsbCxoLHAsZCx2LF8seT1bXSxnPW4uY2hpbGRyZW4sbT0wLHg9MCxiPWcubGVuZ3RoLHc9bi52YWx1ZTttPGI7KXtjPWktZSxzPW8tcjtkb3tmPWdbeCsrXS52YWx1ZX13aGlsZSghZiYmeDxiKTtmb3IobD1oPWYsXz1mKmYqKHY9TWF0aC5tYXgocy9jLGMvcykvKHcqdCkpLGQ9TWF0aC5tYXgoaC9fLF8vbCk7eDxiOysreCl7aWYoZis9YT1nW3hdLnZhbHVlLGE8bCYmKGw9YSksYT5oJiYoaD1hKSxfPWYqZip2LChwPU1hdGgubWF4KGgvXyxfL2wpKT5kKXtmLT1hO2JyZWFrfWQ9cH15LnB1c2godT17dmFsdWU6ZixkaWNlOmM8cyxjaGlsZHJlbjpnLnNsaWNlKG0seCl9KSx1LmRpY2U/UXYodSxlLHIsaSx3P3IrPXMqZi93Om8pOmVfKHUsZSxyLHc/ZSs9YypmL3c6aSxvKSx3LT1mLG09eH1yZXR1cm4geX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBZbyh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1bMCwxXSxyPTIsaT0yO2k8bjsrK2kpe2Zvcig7cj4xJiZ1Xyh0W2Vbci0yXV0sdFtlW3ItMV1dLHRbaV0pPD0wOyktLXI7ZVtyKytdPWl9cmV0dXJuIGUuc2xpY2UoMCxyKX1mdW5jdGlvbiBCbyh0KXt0aGlzLl9zaXplPXQsdGhpcy5fY2FsbD10aGlzLl9lcnJvcj1udWxsLHRoaXMuX3Rhc2tzPVtdLHRoaXMuX2RhdGE9W10sdGhpcy5fd2FpdGluZz10aGlzLl9hY3RpdmU9dGhpcy5fZW5kZWQ9dGhpcy5fc3RhcnQ9MH1mdW5jdGlvbiBqbyh0KXtpZighdC5fc3RhcnQpdHJ5e0hvKHQpfWNhdGNoKG4pe2lmKHQuX3Rhc2tzW3QuX2VuZGVkK3QuX2FjdGl2ZS0xXSkkbyh0LG4pO2Vsc2UgaWYoIXQuX2RhdGEpdGhyb3cgbn19ZnVuY3Rpb24gSG8odCl7Zm9yKDt0Ll9zdGFydD10Ll93YWl0aW5nJiZ0Ll9hY3RpdmU8dC5fc2l6ZTspe3ZhciBuPXQuX2VuZGVkK3QuX2FjdGl2ZSxlPXQuX3Rhc2tzW25dLHI9ZS5sZW5ndGgtMSxpPWVbcl07ZVtyXT1Ybyh0LG4pLC0tdC5fd2FpdGluZywrK3QuX2FjdGl2ZSxlPWkuYXBwbHkobnVsbCxlKSx0Ll90YXNrc1tuXSYmKHQuX3Rhc2tzW25dPWV8fGNfKX19ZnVuY3Rpb24gWG8odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXt0Ll90YXNrc1tuXSYmKC0tdC5fYWN0aXZlLCsrdC5fZW5kZWQsdC5fdGFza3Nbbl09bnVsbCxudWxsPT10Ll9lcnJvciYmKG51bGwhPWU/JG8odCxlKToodC5fZGF0YVtuXT1yLHQuX3dhaXRpbmc/am8odCk6Vm8odCkpKSl9fWZ1bmN0aW9uICRvKHQsbil7dmFyIGUscj10Ll90YXNrcy5sZW5ndGg7Zm9yKHQuX2Vycm9yPW4sdC5fZGF0YT12b2lkIDAsdC5fd2FpdGluZz1OYU47LS1yPj0wOylpZigoZT10Ll90YXNrc1tyXSkmJih0Ll90YXNrc1tyXT1udWxsLGUuYWJvcnQpKXRyeXtlLmFib3J0KCl9Y2F0Y2gobil7fXQuX2FjdGl2ZT1OYU4sVm8odCl9ZnVuY3Rpb24gVm8odCl7aWYoIXQuX2FjdGl2ZSYmdC5fY2FsbCl7dmFyIG49dC5fZGF0YTt0Ll9kYXRhPXZvaWQgMCx0Ll9jYWxsKHQuX2Vycm9yLG4pfX1mdW5jdGlvbiBXbyh0KXtpZihudWxsPT10KXQ9MS8wO2Vsc2UgaWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjb25jdXJyZW5jeSIpO3JldHVybiBuZXcgQm8odCl9ZnVuY3Rpb24gWm8odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dChudWxsPT1uP2U6bnVsbCl9fWZ1bmN0aW9uIEdvKHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9ZnVuY3Rpb24gSm8odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZS5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIFFvKHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09RV8pcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPXdlKCkscj1bXSxpPUVfO3JldHVybiB0PW51bGw9PXQ/W106U18uY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT13ZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1TXy5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFFvKCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gS28oKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxsPXVbci0wXSxoPXVbMS1yXTtuPShoLWwpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksbCs9KGgtbC1uKih0LWMpKSpmLGU9biooMS1jKSxhJiYobD1NYXRoLnJvdW5kKGwpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9TXModCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBsK24qdH0pO3JldHVybiBvKHI/cC5yZXZlcnNlKCk6cCl9dmFyIG4sZSxyPVFvKCkudW5rbm93bih2b2lkIDApLGk9ci5kb21haW4sbz1yLnJhbmdlLHU9WzAsMV0sYT0hMSxjPTAscz0wLGY9LjU7cmV0dXJuIGRlbGV0ZSByLnVua25vd24sci5kb21haW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkobiksdCgpKTppKCl9LHIucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9WytuWzBdLCtuWzFdXSx0KCkpOnUuc2xpY2UoKX0sci5yYW5nZVJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiB1PVsrblswXSwrblsxXV0sYT0hMCx0KCl9LHIuYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuc3RlcD1mdW5jdGlvbigpe3JldHVybiBufSxyLnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhbix0KCkpOmF9LHIucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1zPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdJbm5lcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6Y30sci5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOnN9LHIuYWxpZ249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmZ9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBLbygpLmRvbWFpbihpKCkpLnJhbmdlKHUpLnJvdW5kKGEpLnBhZGRpbmdJbm5lcihjKS5wYWRkaW5nT3V0ZXIocykuYWxpZ24oZil9LHQoKX1mdW5jdGlvbiB0dSh0KXt2YXIgbj10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiB0dShuKCkpfSx0fWZ1bmN0aW9uIG51KHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OkFfKG4pfWZ1bmN0aW9uIGV1KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PW4/MDp0Pj1lPzE6cih0KX19fWZ1bmN0aW9uIHJ1KHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fWZ1bmN0aW9uIGl1KHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLHU9blswXSxhPW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksdT1yKGEsdSkpOihpPWUoaSxvKSx1PXIodSxhKSksZnVuY3Rpb24odCl7cmV0dXJuIHUoaSh0KSl9fWZ1bmN0aW9uIG91KHQsbixlLHIpe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylvW2FdPWUodFthXSx0W2ErMV0pLHVbYV09cihuW2FdLG5bYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPWhzKHQsbiwxLGkpLTE7cmV0dXJuIHVbZV0ob1tlXShuKSl9fWZ1bmN0aW9uIHV1KHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIGF1KHQsbil7ZnVuY3Rpb24gZSgpe3JldHVybiBpPU1hdGgubWluKGEubGVuZ3RoLGMubGVuZ3RoKT4yP291Oml1LG89dT1udWxsLHJ9ZnVuY3Rpb24gcihuKXtyZXR1cm4ob3x8KG89aShhLGMsZj9ldSh0KTp0LHMpKSkoK24pfXZhciBpLG8sdSxhPXpfLGM9el8scz1jbCxmPSExO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4odXx8KHU9aShjLGEsbnUsZj9ydShuKTpuKSkpKCt0KX0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9Tl8uY2FsbCh0LENfKSxlKCkpOmEuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1TXy5jYWxsKHQpLGUoKSk6Yy5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGM9U18uY2FsbCh0KSxzPXNsLGUoKX0sci5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsZSgpKTpmfSxyLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsZSgpKTpzfSxlKCl9ZnVuY3Rpb24gY3UodCl7dmFyIG49dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIGU9bigpO3JldHVybiBTcyhlWzBdLGVbZS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFBfKG4oKSx0LGUpfSx0Lm5pY2U9ZnVuY3Rpb24oZSl7bnVsbD09ZSYmKGU9MTApO3ZhciBpLG89bigpLHU9MCxhPW8ubGVuZ3RoLTEsYz1vW3VdLHM9b1thXTtyZXR1cm4gczxjJiYoaT1jLGM9cyxzPWksaT11LHU9YSxhPWkpLChpPXIoYyxzLGUpKT4wP2k9cihjPU1hdGguZmxvb3IoYy9pKSppLHM9TWF0aC5jZWlsKHMvaSkqaSxlKTppPDAmJihpPXIoYz1NYXRoLmNlaWwoYyppKS9pLHM9TWF0aC5mbG9vcihzKmkpL2ksZSkpLGk+MD8ob1t1XT1NYXRoLmZsb29yKGMvaSkqaSxvW2FdPU1hdGguY2VpbChzL2kpKmksbihvKSk6aTwwJiYob1t1XT1NYXRoLmNlaWwoYyppKS9pLG9bYV09TWF0aC5mbG9vcihzKmkpL2ksbihvKSksdH0sdH1mdW5jdGlvbiBzdSgpe3ZhciB0PWF1KG51LHJsKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KHQsc3UoKSl9LGN1KHQpfWZ1bmN0aW9uIGZ1KCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4rdH12YXIgbj1bMCwxXTtyZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPU5fLmNhbGwoZSxDXyksdCk6bi5zbGljZSgpfSx0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnUoKS5kb21haW4obil9LGN1KHQpfWZ1bmN0aW9uIGx1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06QV8obil9ZnVuY3Rpb24gaHUodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIHB1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBkdSh0KXtyZXR1cm4gMTA9PT10P3B1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIHZ1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBfdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiB5dSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz12dShpKSx1PWR1KGkpLHIoKVswXTwwJiYobz1fdShvKSx1PV91KHUpKSxlfXZhciBlPWF1KGx1LGh1KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz12dSgxMCksdT1kdSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKGg9YSxhPWMsYz1oKTt2YXIgcyxmLGwsaD1vKGEpLHA9byhjKSxkPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJnAtaDxkKXtpZihoPU1hdGgucm91bmQoaCktMSxwPU1hdGgucm91bmQocCkrMSxhPjApe2Zvcig7aDxwOysraClmb3IoZj0xLHM9dShoKTtmPGk7KytmKWlmKCEoKGw9cypmKTxhKSl7aWYobD5jKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8cDsrK2gpZm9yKGY9aS0xLHM9dShoKTtmPj0xOy0tZilpZighKChsPXMqZik8YSkpe2lmKGw+YylicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1TcyhoLHAsTWF0aC5taW4ocC1oLGQpKS5tYXAodSk7cmV0dXJuIG4/di5yZXZlcnNlKCk6dn0sZS50aWNrRm9ybWF0PWZ1bmN0aW9uKG4scil7aWYobnVsbD09ciYmKHI9MTA9PT1pPyIuMGUiOiIsIiksImZ1bmN0aW9uIiE9dHlwZW9mIHImJihyPXQuZm9ybWF0KHIpKSxuPT09MS8wKXJldHVybiByO251bGw9PW4mJihuPTEwKTt2YXIgYT1NYXRoLm1heCgxLGkqbi9lLnRpY2tzKCkubGVuZ3RoKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49dC91KE1hdGgucm91bmQobyh0KSkpO3JldHVybiBuKmk8aS0uNSYmKG4qPWkpLG48PWE/cih0KToiIn19LGUubmljZT1mdW5jdGlvbigpe3JldHVybiByKFJfKHIoKSx7Zmxvb3I6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5mbG9vcihvKHQpKSl9LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIHUoTWF0aC5jZWlsKG8odCkpKX19KSl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiB1dShlLHl1KCkuYmFzZShpKSl9LGV9ZnVuY3Rpb24gZ3UodCxuKXtyZXR1cm4gdDwwPy1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfWZ1bmN0aW9uIG11KCl7dmFyIHQ9MSxuPWF1KGZ1bmN0aW9uKG4sZSl7cmV0dXJuKGU9Z3UoZSx0KS0obj1ndShuLHQpKSk/ZnVuY3Rpb24ocil7cmV0dXJuKGd1KHIsdCktbikvZX06QV8oZSl9LGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGU9Z3UoZSx0KS0obj1ndShuLHQpKSxmdW5jdGlvbihyKXtyZXR1cm4gZ3UobitlKnIsMS90KX19KSxlPW4uZG9tYWluO3JldHVybiBuLmV4cG9uZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGUoZSgpKSk6dH0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KG4sbXUoKS5leHBvbmVudCh0KSl9LGN1KG4pfWZ1bmN0aW9uIHh1KCl7ZnVuY3Rpb24gdCgpe3ZhciB0PTAsbz1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoby0xKTsrK3Q8bzspaVt0LTFdPUFzKGUsdC9vKTtyZXR1cm4gbn1mdW5jdGlvbiBuKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gcltocyhpLHQpXX12YXIgZT1bXSxyPVtdLGk9W107cmV0dXJuIG4uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP2lbbi0xXTplWzBdLG48aS5sZW5ndGg/aVtuXTplW2UubGVuZ3RoLTFdXX0sbi5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz1uLmxlbmd0aDtpPG87KytpKW51bGw9PShyPW5baV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQoc3MpLHQoKX0sbi5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1TXy5jYWxsKG4pLHQoKSk6ci5zbGljZSgpfSxuLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBpLnNsaWNlKCl9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiB4dSgpLmRvbWFpbihlKS5yYW5nZShyKX0sbn1mdW5jdGlvbiBidSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtocyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1TXy5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJ1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sY3UodCl9ZnVuY3Rpb24gd3UoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbaHMobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPVNfLmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9U18uY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiB3dSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBNdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2gobmV3IERhdGUoK2UpKX13aGlsZShuKGUsbyksdChlKSxlPHIpO3JldHVybiB1fSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gTXUoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpaWYocjwwKWZvcig7KytyPD0wOylmb3IoO24odCwtMSksIWUodCk7KTtlbHNlIGZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pfSxlJiYoaS5jb3VudD1mdW5jdGlvbihuLHIpe3JldHVybiBMXy5zZXRUaW1lKCtuKSxxXy5zZXRUaW1lKCtyKSx0KExfKSx0KHFfKSxNYXRoLmZsb29yKGUoTF8scV8pKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKHI/ZnVuY3Rpb24obil7cmV0dXJuIHIobikldD09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT0wfSk6aTpudWxsfSksaX1mdW5jdGlvbiBUdSh0KXtyZXR1cm4gTXUoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpPXykvRl99KX1mdW5jdGlvbiBrdSh0KXtyZXR1cm4gTXUoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9GX30pfWZ1bmN0aW9uIE51KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBTdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBFdSh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBBdSh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyx1PVtdLGE9LTEsYz0wLHM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrYTxzOykzNz09PXQuY2hhckNvZGVBdChhKSYmKHUucHVzaCh0LnNsaWNlKGMsYSkpLG51bGwhPShpPUR5W3I9dC5jaGFyQXQoKythKV0pP3I9dC5jaGFyQXQoKythKTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSx1LnB1c2gociksYz1hKzEpO3JldHVybiB1LnB1c2godC5zbGljZShjLGEpKSx1LmpvaW4oIiIpfX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpPUV1KDE5MDApO2lmKHIoaSx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigicCJpbiBpJiYoaS5IPWkuSCUxMisxMippLnApLCJXImluIGl8fCJVImluIGkpeyJ3ImluIGl8fChpLnc9IlciaW4gaT8xOjApO3ZhciBvPSJaImluIGk/U3UoRXUoaS55KSkuZ2V0VVRDRGF5KCk6bihFdShpLnkpKS5nZXREYXkoKTtpLm09MCxpLmQ9IlciaW4gaT8oaS53KzYpJTcrNyppLlctKG8rNSklNzppLncrNyppLlUtKG8rNiklN31yZXR1cm4iWiJpbiBpPyhpLkgrPWkuWi8xMDB8MCxpLk0rPWkuWiUxMDAsU3UoaSkpOm4oaSl9fWZ1bmN0aW9uIHIodCxuLGUscil7Zm9yKHZhciBpLG8sdT0wLGE9bi5sZW5ndGgsYz1lLmxlbmd0aDt1PGE7KXtpZihyPj1jKXJldHVybi0xO2lmKDM3PT09KGk9bi5jaGFyQ29kZUF0KHUrKykpKXtpZihpPW4uY2hhckF0KHUrKyksIShvPVRbaSBpbiBEeT9uLmNoYXJBdCh1KyspOmldKXx8KHI9byh0LGUscikpPDApcmV0dXJuLTF9ZWxzZSBpZihpIT1lLmNoYXJDb2RlQXQocisrKSlyZXR1cm4tMX1yZXR1cm4gcn12YXIgaT10LmRhdGVUaW1lLG89dC5kYXRlLHU9dC50aW1lLGE9dC5wZXJpb2RzLGM9dC5kYXlzLHM9dC5zaG9ydERheXMsZj10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsaD1QdShhKSxwPVJ1KGEpLGQ9UHUoYyksdj1SdShjKSxfPVB1KHMpLHk9UnUocyksZz1QdShmKSxtPVJ1KGYpLHg9UHUobCksYj1SdShsKSx3PXthOmZ1bmN0aW9uKHQpe3JldHVybiBzW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0RGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBsW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6V3UsZTpXdSxIOlp1LEk6R3UsajpKdSxMOlF1LG06S3UsTTp0YSxwOmZ1bmN0aW9uKHQpe3JldHVybiBhWysodC5nZXRIb3VycygpPj0xMildfSxTOm5hLFU6ZWEsdzpyYSxXOmlhLHg6bnVsbCxYOm51bGwseTpvYSxZOnVhLFo6YWEsIiUiOndhfSxNPXthOmZ1bmN0aW9uKHQpe3JldHVybiBzW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6Y2EsZTpjYSxIOnNhLEk6ZmEsajpsYSxMOmhhLG06cGEsTTpkYSxwOmZ1bmN0aW9uKHQpe3JldHVybiBhWysodC5nZXRVVENIb3VycygpPj0xMildfSxTOnZhLFU6X2Esdzp5YSxXOmdhLHg6bnVsbCxYOm51bGwseTptYSxZOnhhLFo6YmEsIiUiOndhfSxUPXthOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1fLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz15W3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LEE6ZnVuY3Rpb24odCxuLGUpe3ZhciByPWQuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC53PXZbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9eC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09YltyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1nLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQubT1tW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGM6ZnVuY3Rpb24odCxuLGUpe3JldHVybiByKHQsaSxuLGUpfSxkOll1LGU6WXUsSDpqdSxJOmp1LGo6QnUsTDokdSxtOkl1LE06SHUscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9aC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxTOlh1LFU6cXUsdzpMdSxXOlV1LHg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiByKHQsbyxuLGUpfSxYOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gcih0LHUsbixlKX0seTpPdSxZOkR1LFo6RnUsIiUiOlZ1fTtyZXR1cm4gdy54PW4obyx3KSx3Llg9bih1LHcpLHcuYz1uKGksdyksTS54PW4obyxNKSxNLlg9bih1LE0pLE0uYz1uKGksTSkse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1uKHQrPSIiLHcpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBuPWUodCs9IiIsTnUpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1uKHQrPSIiLE0pO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBuPWUodCxTdSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn19fWZ1bmN0aW9uIEN1KHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIHp1KHQpe3JldHVybiB0LnJlcGxhY2UoSXksIlxcJCYiKX1mdW5jdGlvbiBQdSh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoenUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBSdSh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBMdSh0LG4sZSl7dmFyIHI9T3kuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBxdSh0LG4sZSl7dmFyIHI9T3kuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFV1KHQsbixlKXt2YXIgcj1PeS5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Llc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gRHUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrNCkpO3JldHVybiByPyh0Lnk9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gT3UodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lnk9K3JbMF0rKCtyWzBdPjY4PzE5MDA6MmUzKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBGdSh0LG4sZSl7dmFyIHI9L14oWil8KFsrLV1cZFxkKSg/Olw6PyhcZFxkKSk/Ly5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5aPXJbMV0/MDotKHJbMl0rKHJbM118fCIwMCIpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBJdSh0LG4sZSl7dmFyIHI9T3kuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWXUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQnUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lm09MCx0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24ganUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSHUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gJHUodCxuLGUpe3ZhciByPU95LmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gVnUodCxuLGUpe3ZhciByPUZ5LmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gV3UodCxuKXtyZXR1cm4gQ3UodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiBadSh0LG4pe3JldHVybiBDdSh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBHdSh0LG4pe3JldHVybiBDdSh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gSnUodCxuKXtyZXR1cm4gQ3UoMSskXy5jb3VudChmeSh0KSx0KSxuLDMpfWZ1bmN0aW9uIFF1KHQsbil7cmV0dXJuIEN1KHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBLdSh0LG4pe3JldHVybiBDdSh0LmdldE1vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIHRhKHQsbil7cmV0dXJuIEN1KHQuZ2V0TWludXRlcygpLG4sMil9ZnVuY3Rpb24gbmEodCxuKXtyZXR1cm4gQ3UodC5nZXRTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBlYSh0LG4pe3JldHVybiBDdShXXy5jb3VudChmeSh0KSx0KSxuLDIpfWZ1bmN0aW9uIHJhKHQpe3JldHVybiB0LmdldERheSgpfWZ1bmN0aW9uIGlhKHQsbil7cmV0dXJuIEN1KFpfLmNvdW50KGZ5KHQpLHQpLG4sMil9ZnVuY3Rpb24gb2EodCxuKXtyZXR1cm4gQ3UodC5nZXRGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIHVhKHQsbil7cmV0dXJuIEN1KHQuZ2V0RnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBhYSh0KXt2YXIgbj10LmdldFRpbWV6b25lT2Zmc2V0KCk7cmV0dXJuKG4+MD8iLSI6KG4qPS0xLCIrIikpK0N1KG4vNjB8MCwiMCIsMikrQ3UobiU2MCwiMCIsMil9ZnVuY3Rpb24gY2EodCxuKXtyZXR1cm4gQ3UodC5nZXRVVENEYXRlKCksbiwyKX1mdW5jdGlvbiBzYSh0LG4pe3JldHVybiBDdSh0LmdldFVUQ0hvdXJzKCksbiwyKX1mdW5jdGlvbiBmYSh0LG4pe3JldHVybiBDdSh0LmdldFVUQ0hvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24gbGEodCxuKXtyZXR1cm4gQ3UoMStfeS5jb3VudChMeSh0KSx0KSxuLDMpfWZ1bmN0aW9uIGhhKHQsbil7cmV0dXJuIEN1KHQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBwYSh0LG4pe3JldHVybiBDdSh0LmdldFVUQ01vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIGRhKHQsbil7cmV0dXJuIEN1KHQuZ2V0VVRDTWludXRlcygpLG4sMil9ZnVuY3Rpb24gdmEodCxuKXtyZXR1cm4gQ3UodC5nZXRVVENTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBfYSh0LG4pe3JldHVybiBDdShneS5jb3VudChMeSh0KSx0KSxuLDIpfWZ1bmN0aW9uIHlhKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIGdhKHQsbil7cmV0dXJuIEN1KG15LmNvdW50KEx5KHQpLHQpLG4sMil9ZnVuY3Rpb24gbWEodCxuKXtyZXR1cm4gQ3UodC5nZXRVVENGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIHhhKHQsbil7cmV0dXJuIEN1KHQuZ2V0VVRDRnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBiYSgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gd2EoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gTWEobil7cmV0dXJuIHF5PUF1KG4pLHQudGltZUZvcm1hdD1xeS5mb3JtYXQsdC50aW1lUGFyc2U9cXkucGFyc2UsdC51dGNGb3JtYXQ9cXkudXRjRm9ybWF0LHQudXRjUGFyc2U9cXkudXRjUGFyc2UscXl9ZnVuY3Rpb24gVGEodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIGthKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIE5hKHQsbixlLHIsbyx1LGEsYyxzKXtmdW5jdGlvbiBmKGkpe3JldHVybihhKGkpPGk/djp1KGkpPGk/XzpvKGkpPGk/eTpyKGkpPGk/ZzpuKGkpPGk/ZShpKTxpP206eDp0KGkpPGk/Yjp3KShpKX1mdW5jdGlvbiBsKG4sZSxyLG8pe2lmKG51bGw9PW4mJihuPTEwKSwibnVtYmVyIj09dHlwZW9mIG4pe3ZhciB1PU1hdGguYWJzKHItZSkvbixhPWZzKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkucmlnaHQoTSx1KTthPT09TS5sZW5ndGg/KG89aShlL1p5LHIvWnksbiksbj10KTphPyhvPShhPU1bdS9NW2EtMV1bMl08TVthXVsyXS91P2EtMTphXSlbMV0sbj1hWzBdKToobz1pKGUscixuKSxuPWMpfXJldHVybiBudWxsPT1vP246bi5ldmVyeShvKX12YXIgaD1hdShudSxybCkscD1oLmludmVydCxkPWguZG9tYWluLHY9cygiLiVMIiksXz1zKCI6JVMiKSx5PXMoIiVJOiVNIiksZz1zKCIlSSAlcCIpLG09cygiJWEgJWQiKSx4PXMoIiViICVkIiksYj1zKCIlQiIpLHc9cygiJVkiKSxNPVtbYSwxLGp5XSxbYSw1LDUqanldLFthLDE1LDE1Kmp5XSxbYSwzMCwzMCpqeV0sW3UsMSxIeV0sW3UsNSw1Kkh5XSxbdSwxNSwxNSpIeV0sW3UsMzAsMzAqSHldLFtvLDEsWHldLFtvLDMsMypYeV0sW28sNiw2Klh5XSxbbywxMiwxMipYeV0sW3IsMSwkeV0sW3IsMiwyKiR5XSxbZSwxLFZ5XSxbbiwxLFd5XSxbbiwzLDMqV3ldLFt0LDEsWnldXTtyZXR1cm4gaC5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRlKHAodCkpfSxoLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9kKE5fLmNhbGwodCxrYSkpOmQoKS5tYXAoVGEpfSxoLnRpY2tzPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1kKCksaT1yWzBdLG89cltyLmxlbmd0aC0xXSx1PW88aTtyZXR1cm4gdSYmKGU9aSxpPW8sbz1lKSxlPWwodCxpLG8sbiksZT1lP2UucmFuZ2UoaSxvKzEpOltdLHU/ZS5yZXZlcnNlKCk6ZX0saC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PW4/ZjpzKG4pfSxoLm5pY2U9ZnVuY3Rpb24odCxuKXt2YXIgZT1kKCk7cmV0dXJuKHQ9bCh0LGVbMF0sZVtlLmxlbmd0aC0xXSxuKSk/ZChSXyhlLHQpKTpofSxoLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdXUoaCxOYSh0LG4sZSxyLG8sdSxhLGMscykpfSxofWZ1bmN0aW9uIFNhKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fWZ1bmN0aW9uIEVhKHQpe2Z1bmN0aW9uIG4obil7dmFyIG89KG4tZSkvKHItZSk7cmV0dXJuIHQoaT9NYXRoLm1heCgwLE1hdGgubWluKDEsbykpOm8pfXZhciBlPTAscj0xLGk9ITE7cmV0dXJuIG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbik6W2Uscl19LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LG4pOml9LG4uaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEVhKHQpLmRvbWFpbihbZSxyXSkuY2xhbXAoaSl9LGN1KG4pfWZ1bmN0aW9uIEFhKHQpe3JldHVybiB0PjE/MDp0PC0xP2dnOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBDYSh0KXtyZXR1cm4gdD49MT9tZzp0PD0tMT8tbWc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIHphKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFBhKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uIFJhKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gTGEodCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gcWEodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gVWEodCxuLGUscixpLG8sdSxhKXt2YXIgYz1lLXQscz1yLW4sZj11LWksbD1hLW8saD0oZioobi1vKS1sKih0LWkpKS8obCpjLWYqcyk7cmV0dXJuW3QraCpjLG4raCpzXX1mdW5jdGlvbiBEYSh0LG4sZSxyLGksbyx1KXt2YXIgYT10LWUsYz1uLXIscz0odT9vOi1vKS9fZyhhKmErYypjKSxmPXMqYyxsPS1zKmEsaD10K2YscD1uK2wsZD1lK2Ysdj1yK2wsXz0oaCtkKS8yLHk9KHArdikvMixnPWQtaCxtPXYtcCx4PWcqZyttKm0sYj1pLW8sdz1oKnYtZCpwLE09KG08MD8tMToxKSpfZyhwZygwLGIqYip4LXcqdykpLFQ9KHcqbS1nKk0pL3gsaz0oLXcqZy1tKk0pL3gsTj0odyptK2cqTSkveCxTPSgtdypnK20qTSkveCxFPVQtXyxBPWsteSxDPU4tXyx6PVMteTtyZXR1cm4gRSpFK0EqQT5DKkMreip6JiYoVD1OLGs9Uykse2N4OlQsY3k6ayx4MDE6LWYseTAxOi1sLHgxMTpUKihpL2ItMSkseTExOmsqKGkvYi0xKX19ZnVuY3Rpb24gT2EodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEZhKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIElhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIFlhKHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gQmEodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IFlhKHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gamEodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oQmEodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gSGEodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIFhhKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiAkYSh0KXtmdW5jdGlvbiBuKCl7dmFyIG4sYT1DZy5jYWxsKGFyZ3VtZW50cyksYz1lLmFwcGx5KHRoaXMsYSkscz1yLmFwcGx5KHRoaXMsYSk7aWYodXx8KHU9bj12ZSgpKSx0KHUsK2kuYXBwbHkodGhpcywoYVswXT1jLGEpKSwrby5hcHBseSh0aGlzLGEpLCtpLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksK28uYXBwbHkodGhpcyxhKSksbilyZXR1cm4gdT1udWxsLG4rIiJ8fG51bGx9dmFyIGU9SGEscj1YYSxpPUZhLG89SWEsdT1udWxsO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6c2coK3QpLG4pOml9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnNnKCt0KSxuKTpvfSxuLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09dD9udWxsOnQsbik6dX0sbn1mdW5jdGlvbiBWYSh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIFdhKHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gWmEodCxuLGUscixpKXt2YXIgbz1BZyhuLGUpLHU9QWcobixlPShlK2kpLzIpLGE9QWcocixlKSxjPUFnKHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8odVswXSx1WzFdLGFbMF0sYVsxXSxjWzBdLGNbMV0pfWZ1bmN0aW9uIEdhKHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBKYSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gUWEodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEthKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB0Yyh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBKYSh0KSx0aGlzLl9iZXRhPW59ZnVuY3Rpb24gbmModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiBlYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gcmModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIGljKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBvYyh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLHU9dC5feTI7aWYodC5fbDAxX2E+eWcpe3ZhciBhPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGM9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqYS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9jLGk9KGkqYS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9jfWlmKHQuX2wyM19hPnlnKXt2YXIgcz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxmPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKnMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9mLHU9KHUqcyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL2Z9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLHUsdC5feDIsdC5feTIpfWZ1bmN0aW9uIHVjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gYWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBjYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIHNjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBmYyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gbGModCxuLGUpe3ZhciByPXQuX3gxLXQuX3gwLGk9bi10Ll94MSxvPSh0Ll95MS10Ll95MCkvKHJ8fGk8MCYmLTApLHU9KGUtdC5feTEpLyhpfHxyPDAmJi0wKSxhPShvKmkrdSpyKS8ocitpKTtyZXR1cm4oZmMobykrZmModSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKHUpLC41Kk1hdGguYWJzKGEpKXx8MH1mdW5jdGlvbiBoYyh0LG4pe3ZhciBlPXQuX3gxLXQuX3gwO3JldHVybiBlPygzKih0Ll95MS10Ll95MCkvZS1uKS8yOm59ZnVuY3Rpb24gcGModCxuLGUpe3ZhciByPXQuX3gwLGk9dC5feTAsbz10Ll94MSx1PXQuX3kxLGE9KG8tcikvMzt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocithLGkrYSpuLG8tYSx1LWEqZSxvLHUpfWZ1bmN0aW9uIGRjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiB2Yyh0KXt0aGlzLl9jb250ZXh0PW5ldyBfYyh0KX1mdW5jdGlvbiBfYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24geWModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGdjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gbWModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIHhjKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gYmModCl7Zm9yKHZhciBuLGU9MCxyPS0xLGk9dC5sZW5ndGg7KytyPGk7KShuPSt0W3JdWzFdKSYmKGUrPW4pO3JldHVybiBlfWZ1bmN0aW9uIHdjKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIE1jKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIFRjKCl7dGhpcy5fPW51bGx9ZnVuY3Rpb24ga2ModCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBOYyh0LG4pe3ZhciBlPW4scj1uLlIsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuUj1yLkwsZS5SJiYoZS5SLlU9ZSksci5MPWV9ZnVuY3Rpb24gU2ModCxuKXt2YXIgZT1uLHI9bi5MLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLkw9ci5SLGUuTCYmKGUuTC5VPWUpLHIuUj1lfWZ1bmN0aW9uIEVjKHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBBYyh0LG4sZSxyKXt2YXIgaT1bbnVsbCxudWxsXSxvPWxtLnB1c2goaSktMTtyZXR1cm4gaS5sZWZ0PXQsaS5yaWdodD1uLGUmJnpjKGksdCxuLGUpLHImJnpjKGksbix0LHIpLHNtW3QuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLHNtW24uaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLGl9ZnVuY3Rpb24gQ2ModCxuLGUpe3ZhciByPVtuLGVdO3JldHVybiByLmxlZnQ9dCxyfWZ1bmN0aW9uIHpjKHQsbixlLHIpe3RbMF18fHRbMV0/dC5sZWZ0PT09ZT90WzFdPXI6dFswXT1yOih0WzBdPXIsdC5sZWZ0PW4sdC5yaWdodD1lKX1mdW5jdGlvbiBQYyh0LG4sZSxyLGkpe3ZhciBvLHU9dFswXSxhPXRbMV0sYz11WzBdLHM9dVsxXSxmPTAsbD0xLGg9YVswXS1jLHA9YVsxXS1zO2lmKG89bi1jLGh8fCEobz4wKSl7aWYoby89aCxoPDApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKGg+MCl7aWYobz5sKXJldHVybjtvPmYmJihmPW8pfWlmKG89ci1jLGh8fCEobzwwKSl7aWYoby89aCxoPDApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1lbHNlIGlmKGg+MCl7aWYobzxmKXJldHVybjtvPGwmJihsPW8pfWlmKG89ZS1zLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1lbHNlIGlmKHA+MCl7aWYobz5sKXJldHVybjtvPmYmJihmPW8pfWlmKG89aS1zLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1lbHNlIGlmKHA+MCl7aWYobzxmKXJldHVybjtvPGwmJihsPW8pfXJldHVybiEoZj4wfHxsPDEpfHwoZj4wJiYodFswXT1bYytmKmgscytmKnBdKSxsPDEmJih0WzFdPVtjK2wqaCxzK2wqcF0pLCEwKX19fX19ZnVuY3Rpb24gUmModCxuLGUscixpKXt2YXIgbz10WzFdO2lmKG8pcmV0dXJuITA7dmFyIHUsYSxjPXRbMF0scz10LmxlZnQsZj10LnJpZ2h0LGw9c1swXSxoPXNbMV0scD1mWzBdLGQ9ZlsxXSx2PShsK3ApLzIsXz0oaCtkKS8yO2lmKGQ9PT1oKXtpZih2PG58fHY+PXIpcmV0dXJuO2lmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVt2LGVdO289W3YsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bdixpXTtvPVt2LGVdfX1lbHNlIGlmKHU9KGwtcCkvKGQtaCksYT1fLXUqdix1PC0xfHx1PjEpaWYobD5wKXtpZihjKXtpZihjWzFdPj1pKXJldHVybn1lbHNlIGM9WyhlLWEpL3UsZV07bz1bKGktYSkvdSxpXX1lbHNle2lmKGMpe2lmKGNbMV08ZSlyZXR1cm59ZWxzZSBjPVsoaS1hKS91LGldO289WyhlLWEpL3UsZV19ZWxzZSBpZihoPGQpe2lmKGMpe2lmKGNbMF0+PXIpcmV0dXJufWVsc2UgYz1bbix1Km4rYV07bz1bcix1KnIrYV19ZWxzZXtpZihjKXtpZihjWzBdPG4pcmV0dXJufWVsc2UgYz1bcix1KnIrYV07bz1bbix1Km4rYV19cmV0dXJuIHRbMF09Yyx0WzFdPW8sITB9ZnVuY3Rpb24gTGModCxuLGUscil7Zm9yKHZhciBpLG89bG0ubGVuZ3RoO28tLTspUmMoaT1sbVtvXSx0LG4sZSxyKSYmUGMoaSx0LG4sZSxyKSYmKE1hdGguYWJzKGlbMF1bMF0taVsxXVswXSk+ZG18fE1hdGguYWJzKGlbMF1bMV0taVsxXVsxXSk+ZG0pfHxkZWxldGUgbG1bb119ZnVuY3Rpb24gcWModCl7cmV0dXJuIHNtW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX1mdW5jdGlvbiBVYyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIERjKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBPYyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19ZnVuY3Rpb24gRmMoKXtmb3IodmFyIHQsbixlLHIsaT0wLG89c20ubGVuZ3RoO2k8bzsrK2kpaWYoKHQ9c21baV0pJiYocj0obj10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIHU9bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxyOysrZSl1W2VdPWUsYVtlXT1VYyh0LGxtW25bZV1dKTtmb3IodS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGFbbl0tYVt0XX0pLGU9MDtlPHI7KytlKWFbZV09blt1W2VdXTtmb3IoZT0wO2U8cjsrK2UpbltlXT1hW2VdfX1mdW5jdGlvbiBJYyh0LG4sZSxyKXt2YXIgaSxvLHUsYSxjLHMsZixsLGgscCxkLHYsXz1zbS5sZW5ndGgseT0hMDtmb3IoaT0wO2k8XzsrK2kpaWYobz1zbVtpXSl7Zm9yKHU9by5zaXRlLGE9KGM9by5oYWxmZWRnZXMpLmxlbmd0aDthLS07KWxtW2NbYV1dfHxjLnNwbGljZShhLDEpO2ZvcihhPTAscz1jLmxlbmd0aDthPHM7KWQ9KHA9T2MobyxsbVtjW2FdXSkpWzBdLHY9cFsxXSxsPShmPURjKG8sbG1bY1srK2Elc11dKSlbMF0saD1mWzFdLChNYXRoLmFicyhkLWwpPmRtfHxNYXRoLmFicyh2LWgpPmRtKSYmKGMuc3BsaWNlKGEsMCxsbS5wdXNoKENjKHUscCxNYXRoLmFicyhkLXQpPGRtJiZyLXY+ZG0/W3QsTWF0aC5hYnMobC10KTxkbT9oOnJdOk1hdGguYWJzKHYtcik8ZG0mJmUtZD5kbT9bTWF0aC5hYnMoaC1yKTxkbT9sOmUscl06TWF0aC5hYnMoZC1lKTxkbSYmdi1uPmRtP1tlLE1hdGguYWJzKGwtZSk8ZG0/aDpuXTpNYXRoLmFicyh2LW4pPGRtJiZkLXQ+ZG0/W01hdGguYWJzKGgtbik8ZG0/bDp0LG5dOm51bGwpKS0xKSwrK3MpO3MmJih5PSExKX1pZih5KXt2YXIgZyxtLHgsYj0xLzA7Zm9yKGk9MCx5PW51bGw7aTxfOysraSkobz1zbVtpXSkmJih4PShnPSh1PW8uc2l0ZSlbMF0tdCkqZysobT11WzFdLW4pKm0pPGImJihiPXgseT1vKTtpZih5KXt2YXIgdz1bdCxuXSxNPVt0LHJdLFQ9W2Uscl0saz1bZSxuXTt5LmhhbGZlZGdlcy5wdXNoKGxtLnB1c2goQ2ModT15LnNpdGUsdyxNKSktMSxsbS5wdXNoKENjKHUsTSxUKSktMSxsbS5wdXNoKENjKHUsVCxrKSktMSxsbS5wdXNoKENjKHUsayx3KSktMSl9fWZvcihpPTA7aTxfOysraSkobz1zbVtpXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBzbVtpXSl9ZnVuY3Rpb24gWWMoKXtrYyh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24gQmModCl7dmFyIG49dC5QLGU9dC5OO2lmKG4mJmUpe3ZhciByPW4uc2l0ZSxpPXQuc2l0ZSxvPWUuc2l0ZTtpZihyIT09byl7dmFyIHU9aVswXSxhPWlbMV0sYz1yWzBdLXUscz1yWzFdLWEsZj1vWzBdLXUsbD1vWzFdLWEsaD0yKihjKmwtcypmKTtpZighKGg+PS12bSkpe3ZhciBwPWMqYytzKnMsZD1mKmYrbCpsLHY9KGwqcC1zKmQpL2gsXz0oYypkLWYqcCkvaCx5PWhtLnBvcCgpfHxuZXcgWWM7eS5hcmM9dCx5LnNpdGU9aSx5Lng9dit1LHkueT0oeS5jeT1fK2EpK01hdGguc3FydCh2KnYrXypfKSx0LmNpcmNsZT15O2Zvcih2YXIgZz1udWxsLG09Zm0uXzttOylpZih5Lnk8bS55fHx5Lnk9PT1tLnkmJnkueDw9bS54KXtpZighbS5MKXtnPW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe2c9bTticmVha31tPW0uUn1mbS5pbnNlcnQoZyx5KSxnfHwoYW09eSl9fX19ZnVuY3Rpb24gamModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KGFtPW4uTiksZm0ucmVtb3ZlKG4pLGhtLnB1c2gobiksa2MobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24gSGMoKXtrYyh0aGlzKSx0aGlzLmVkZ2U9dGhpcy5zaXRlPXRoaXMuY2lyY2xlPW51bGx9ZnVuY3Rpb24gWGModCl7dmFyIG49cG0ucG9wKCl8fG5ldyBIYztyZXR1cm4gbi5zaXRlPXQsbn1mdW5jdGlvbiAkYyh0KXtqYyh0KSxjbS5yZW1vdmUodCkscG0ucHVzaCh0KSxrYyh0KX1mdW5jdGlvbiBWYyh0KXt2YXIgbj10LmNpcmNsZSxlPW4ueCxyPW4uY3ksaT1bZSxyXSxvPXQuUCx1PXQuTixhPVt0XTskYyh0KTtmb3IodmFyIGM9bztjLmNpcmNsZSYmTWF0aC5hYnMoZS1jLmNpcmNsZS54KTxkbSYmTWF0aC5hYnMoci1jLmNpcmNsZS5jeSk8ZG07KW89Yy5QLGEudW5zaGlmdChjKSwkYyhjKSxjPW87YS51bnNoaWZ0KGMpLGpjKGMpO2Zvcih2YXIgcz11O3MuY2lyY2xlJiZNYXRoLmFicyhlLXMuY2lyY2xlLngpPGRtJiZNYXRoLmFicyhyLXMuY2lyY2xlLmN5KTxkbTspdT1zLk4sYS5wdXNoKHMpLCRjKHMpLHM9dTthLnB1c2gocyksamMocyk7dmFyIGYsbD1hLmxlbmd0aDtmb3IoZj0xO2Y8bDsrK2Ypcz1hW2ZdLGM9YVtmLTFdLHpjKHMuZWRnZSxjLnNpdGUscy5zaXRlLGkpO2M9YVswXSwocz1hW2wtMV0pLmVkZ2U9QWMoYy5zaXRlLHMuc2l0ZSxudWxsLGkpLEJjKGMpLEJjKHMpfWZ1bmN0aW9uIFdjKHQpe2Zvcih2YXIgbixlLHIsaSxvPXRbMF0sdT10WzFdLGE9Y20uXzthOylpZigocj1aYyhhLHUpLW8pPmRtKWE9YS5MO2Vsc2V7aWYoISgoaT1vLUdjKGEsdSkpPmRtKSl7cj4tZG0/KG49YS5QLGU9YSk6aT4tZG0/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfXFjKHQpO3ZhciBjPVhjKHQpO2lmKGNtLmluc2VydChuLGMpLG58fGUpe2lmKG49PT1lKXJldHVybiBqYyhuKSxlPVhjKG4uc2l0ZSksY20uaW5zZXJ0KGMsZSksYy5lZGdlPWUuZWRnZT1BYyhuLnNpdGUsYy5zaXRlKSxCYyhuKSx2b2lkIEJjKGUpO2lmKGUpe2pjKG4pLGpjKGUpO3ZhciBzPW4uc2l0ZSxmPXNbMF0sbD1zWzFdLGg9dFswXS1mLHA9dFsxXS1sLGQ9ZS5zaXRlLHY9ZFswXS1mLF89ZFsxXS1sLHk9MiooaCpfLXAqdiksZz1oKmgrcCpwLG09dip2K18qXyx4PVsoXypnLXAqbSkveStmLChoKm0tdipnKS95K2xdO3pjKGUuZWRnZSxzLGQseCksYy5lZGdlPUFjKHMsdCxudWxsLHgpLGUuZWRnZT1BYyh0LGQsbnVsbCx4KSxCYyhuKSxCYyhlKX1lbHNlIGMuZWRnZT1BYyhuLnNpdGUsYy5zaXRlKX19ZnVuY3Rpb24gWmModCxuKXt2YXIgZT10LnNpdGUscj1lWzBdLGk9ZVsxXSxvPWktbjtpZighbylyZXR1cm4gcjt2YXIgdT10LlA7aWYoIXUpcmV0dXJuLTEvMDt2YXIgYT0oZT11LnNpdGUpWzBdLGM9ZVsxXSxzPWMtbjtpZighcylyZXR1cm4gYTt2YXIgZj1hLXIsbD0xL28tMS9zLGg9Zi9zO3JldHVybiBsPygtaCtNYXRoLnNxcnQoaCpoLTIqbCooZipmLygtMipzKS1jK3MvMitpLW8vMikpKS9sK3I6KHIrYSkvMn1mdW5jdGlvbiBHYyh0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiBaYyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9ZnVuY3Rpb24gSmModCxuLGUpe3JldHVybih0WzBdLWVbMF0pKihuWzFdLXRbMV0pLSh0WzBdLW5bMF0pKihlWzFdLXRbMV0pfWZ1bmN0aW9uIFFjKHQsbil7cmV0dXJuIG5bMV0tdFsxXXx8blswXS10WzBdfWZ1bmN0aW9uIEtjKHQsbil7dmFyIGUscixpLG89dC5zb3J0KFFjKS5wb3AoKTtmb3IobG09W10sc209bmV3IEFycmF5KHQubGVuZ3RoKSxjbT1uZXcgVGMsZm09bmV3IFRjOzspaWYoaT1hbSxvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpb1swXT09PWUmJm9bMV09PT1yfHwoV2MobyksZT1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7VmMoaS5hcmMpfWlmKEZjKCksbil7dmFyIHU9K25bMF1bMF0sYT0rblswXVsxXSxjPStuWzFdWzBdLHM9K25bMV1bMV07TGModSxhLGMscyksSWModSxhLGMscyl9dGhpcy5lZGdlcz1sbSx0aGlzLmNlbGxzPXNtLGNtPWZtPWxtPXNtPW51bGx9ZnVuY3Rpb24gdHModCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBucyh0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZnVuY3Rpb24gZXModCl7cmV0dXJuIHQuX196b29tfHx5bX1mdW5jdGlvbiBycygpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gaXMoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gb3MoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gdXMoKXtyZXR1cm4gdGhpcy5fX3pvb218fHltfWZ1bmN0aW9uIGFzKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIGNzKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfXZhciBzcz1mdW5jdGlvbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn0sZnM9ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9bih0KSkse2xlZnQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKTwwP3I9bysxOmk9b31yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24obixlLHIsaSl7Zm9yKG51bGw9PXImJihyPTApLG51bGw9PWkmJihpPW4ubGVuZ3RoKTtyPGk7KXt2YXIgbz1yK2k+Pj4xO3QobltvXSxlKT4wP2k9bzpyPW8rMX1yZXR1cm4gcn19fSxscz1mcyhzcyksaHM9bHMucmlnaHQscHM9bHMubGVmdCxkcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fSx2cz1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPTAsdT0tMSxhPTAsYz0wO2lmKG51bGw9PW4pZm9yKDsrK3U8aTspaXNOYU4oZT1kcyh0W3VdKSl8fChjKz0ocj1lLWEpKihlLShhKz1yLysrbykpKTtlbHNlIGZvcig7Kyt1PGk7KWlzTmFOKGU9ZHMobih0W3VdLHUsdCkpKXx8KGMrPShyPWUtYSkqKGUtKGErPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX0sX3M9ZnVuY3Rpb24odCxuKXt2YXIgZT12cyh0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfSx5cz1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaSxvPXQubGVuZ3RoLHU9LTE7aWYobnVsbD09bil7Zm9yKDsrK3U8bzspaWYobnVsbCE9KGU9dFt1XSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT10W3VdKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSl9ZWxzZSBmb3IoOysrdTxvOylpZihudWxsIT0oZT1uKHRbdV0sdSx0KSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT1uKHRbdV0sdSx0KSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpO3JldHVybltyLGldfSxncz1BcnJheS5wcm90b3R5cGUsbXM9Z3Muc2xpY2UseHM9Z3MubWFwLGJzPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sd3M9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LE1zPWZ1bmN0aW9uKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfSxUcz1NYXRoLnNxcnQoNTApLGtzPU1hdGguc3FydCgxMCksTnM9TWF0aC5zcXJ0KDIpLFNzPWZ1bmN0aW9uKHQsbixlKXt2YXIgaSxvLHUsYT1uPHQsYz0tMTtpZihhJiYoaT10LHQ9bixuPWkpLDA9PT0odT1yKHQsbixlKSl8fCFpc0Zpbml0ZSh1KSlyZXR1cm5bXTtpZih1PjApZm9yKHQ9TWF0aC5jZWlsKHQvdSksbj1NYXRoLmZsb29yKG4vdSksbz1uZXcgQXJyYXkoaT1NYXRoLmNlaWwobi10KzEpKTsrK2M8aTspb1tjXT0odCtjKSp1O2Vsc2UgZm9yKHQ9TWF0aC5mbG9vcih0KnUpLG49TWF0aC5jZWlsKG4qdSksbz1uZXcgQXJyYXkoaT1NYXRoLmNlaWwodC1uKzEpKTsrK2M8aTspb1tjXT0odC1jKS91O3JldHVybiBhJiZvLnJldmVyc2UoKSxvfSxFcz1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX0sQXM9ZnVuY3Rpb24odCxuLGUpe2lmKG51bGw9PWUmJihlPWRzKSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksdT0rZSh0W29dLG8sdCk7cmV0dXJuIHUrKCtlKHRbbysxXSxvKzEsdCktdSkqKGktbyl9fSxDcz1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSx1PTA7KytvPGk7KXUrPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheSh1KTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS11XT1yW25dO3JldHVybiBlfSx6cz1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZyPmUmJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmcj5lJiYocj1lKTtyZXR1cm4gcn0sUHM9ZnVuY3Rpb24odCl7aWYoIShpPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIG49LTEsZT16cyh0LG8pLHI9bmV3IEFycmF5KGUpOysrbjxlOylmb3IodmFyIGksdT0tMSxhPXJbbl09bmV3IEFycmF5KGkpOysrdTxpOylhW3VdPXRbdV1bbl07cmV0dXJuIHJ9LFJzPUFycmF5LnByb3RvdHlwZS5zbGljZSxMcz1mdW5jdGlvbih0KXtyZXR1cm4gdH0scXM9MSxVcz0yLERzPTMsT3M9NCxGcz0xZS02LElzPXt2YWx1ZTpmdW5jdGlvbigpe319O3AucHJvdG90eXBlPWgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscj10aGlzLl8saT1kKHQrIiIsciksbz0tMSx1PWkubGVuZ3RoO3tpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2lmKG51bGwhPW4mJiJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtmb3IoOysrbzx1OylpZihlPSh0PWlbb10pLnR5cGUpcltlXT1fKHJbZV0sdC5uYW1lLG4pO2Vsc2UgaWYobnVsbD09bilmb3IoZSBpbiByKXJbZV09XyhyW2VdLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzx1OylpZigoZT0odD1pW29dKS50eXBlKSYmKGU9dihyW2VdLHQubmFtZSkpKXJldHVybiBlfX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgcCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIFlzPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixCcz17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6WXMseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifSxqcz1mdW5jdGlvbih0KXt2YXIgbj10Kz0iIixlPW4uaW5kZXhPZigiOiIpO3JldHVybiBlPj0wJiYieG1sbnMiIT09KG49dC5zbGljZSgwLGUpKSYmKHQ9dC5zbGljZShlKzEpKSxCcy5oYXNPd25Qcm9wZXJ0eShuKT97c3BhY2U6QnNbbl0sbG9jYWw6dH06dH0sSHM9ZnVuY3Rpb24odCl7dmFyIG49anModCk7cmV0dXJuKG4ubG9jYWw/Zzp5KShuKX0sWHM9MDt4LnByb3RvdHlwZT1tLnByb3RvdHlwZT17Y29uc3RydWN0b3I6eCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgJHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBWcz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIVZzLm1hdGNoZXMpe3ZhciBXcz1Wcy53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fFZzLm1zTWF0Y2hlc1NlbGVjdG9yfHxWcy5tb3pNYXRjaGVzU2VsZWN0b3J8fFZzLm9NYXRjaGVzU2VsZWN0b3I7JHM9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFdzLmNhbGwodGhpcyx0KX19fX12YXIgWnM9JHMsR3M9e307dC5ldmVudD1udWxsLCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KEdzPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pKTt2YXIgSnM9ZnVuY3Rpb24oKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfSxRcz1mdW5jdGlvbih0LG4pe3ZhciBlPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKGUuY3JlYXRlU1ZHUG9pbnQpe3ZhciByPWUuY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gci54PW4uY2xpZW50WCxyLnk9bi5jbGllbnRZLHI9ci5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFtyLngsci55XX12YXIgaT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltuLmNsaWVudFgtaS5sZWZ0LXQuY2xpZW50TGVmdCxuLmNsaWVudFktaS50b3AtdC5jbGllbnRUb3BdfSxLcz1mdW5jdGlvbih0KXt2YXIgbj1KcygpO3JldHVybiBuLmNoYW5nZWRUb3VjaGVzJiYobj1uLmNoYW5nZWRUb3VjaGVzWzBdKSxRcyh0LG4pfSx0Zj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9TOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcih0KX19LG5mPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P0U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX0sZWY9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9O0EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpBLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciByZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LG9mPSIkIix1Zj1mdW5jdGlvbih0KXtyZXR1cm4gdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fHQuZG9jdW1lbnQmJnR8fHQuZGVmYXVsdFZpZXd9O1cucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgYWY9W251bGxdO3B0LnByb3RvdHlwZT1kdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnB0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGYodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sdSxhPW5baV0sYz1hLmxlbmd0aCxzPXJbaV09bmV3IEFycmF5KGMpLGY9MDtmPGM7KytmKShvPWFbZl0pJiYodT10LmNhbGwobyxvLl9fZGF0YV9fLGYsYSkpJiYoIl9fZGF0YV9fImluIG8mJih1Ll9fZGF0YV9fPW8uX19kYXRhX18pLHNbZl09dSk7cmV0dXJuIG5ldyBwdChyLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5mKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1bXSxpPVtdLG89MDtvPGU7KytvKWZvcih2YXIgdSxhPW5bb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcykodT1hW3NdKSYmKHIucHVzaCh0LmNhbGwodSx1Ll9fZGF0YV9fLHMsYSkpLGkucHVzaCh1KSk7cmV0dXJuIG5ldyBwdChyLGkpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVpzKHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLHU9bltpXSxhPXUubGVuZ3RoLGM9cltpXT1bXSxzPTA7czxhOysrcykobz11W3NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxzLHUpJiZjLnB1c2gobyk7cmV0dXJuIG5ldyBwdChyLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uKHQsbil7aWYoIXQpcmV0dXJuIHA9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxzPS0xLHRoaXMuZWFjaChmdW5jdGlvbih0KXtwWysrc109dH0pLHA7dmFyIGU9bj96OkMscj10aGlzLl9wYXJlbnRzLGk9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1yZih0KSk7Zm9yKHZhciBvPWkubGVuZ3RoLHU9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLGM9bmV3IEFycmF5KG8pLHM9MDtzPG87KytzKXt2YXIgZj1yW3NdLGw9aVtzXSxoPWwubGVuZ3RoLHA9dC5jYWxsKGYsZiYmZi5fX2RhdGFfXyxzLHIpLGQ9cC5sZW5ndGgsdj1hW3NdPW5ldyBBcnJheShkKSxfPXVbc109bmV3IEFycmF5KGQpO2UoZixsLHYsXyxjW3NdPW5ldyBBcnJheShoKSxwLG4pO2Zvcih2YXIgeSxnLG09MCx4PTA7bTxkOysrbSlpZih5PXZbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoZz1fW3hdKSYmKyt4PGQ7KTt5Ll9uZXh0PWd8fG51bGx9fXJldHVybiB1PW5ldyBwdCh1LHIpLHUuX2VudGVyPWEsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChlZiksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHB0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoZWYpLHRoaXMuX3BhcmVudHMpfSxtZXJnZTpmdW5jdGlvbih0KXtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgcHQodSx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49LTEsZT10Lmxlbmd0aDsrK248ZTspZm9yKHZhciByLGk9dFtuXSxvPWkubGVuZ3RoLTEsdT1pW29dOy0tbz49MDspKHI9aVtvXSkmJih1JiZ1IT09ci5uZXh0U2libGluZyYmdS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShyLHUpLHU9cik7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24odCl7dHx8KHQ9UCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKXtmb3IodmFyIG8sdT1uW2ldLGE9dS5sZW5ndGgsYz1yW2ldPW5ldyBBcnJheShhKSxzPTA7czxhOysrcykobz11W3NdKSYmKGNbc109byk7Yy5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfSl9cmV0dXJuIG5ldyBwdChyLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIHU9cltpXTtpZih1KXJldHVybiB1fXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sdT0wLGE9by5sZW5ndGg7dTxhOysrdSkoaT1vW3VdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyx1LG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9anModCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP0w6UjoiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP086RDplLmxvY2FsP1U6cSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9GOiJmdW5jdGlvbiI9PXR5cGVvZiBuP1k6SSkodCxuLG51bGw9PWU/IiI6ZSkpOkIodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PW4/ajoiZnVuY3Rpb24iPT10eXBlb2Ygbj9YOkgpKHQsbikpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcj1WKHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP0s6bj9KOlEpKGUsbikpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3R0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9ldDpudCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3J0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9vdDppdCkodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHV0KX0sbG93ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKGF0KX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SHModCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6SHModCkscj1udWxsPT1uP2N0OiJmdW5jdGlvbiI9PXR5cGVvZiBuP246dGYobik7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHIuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lYWNoKHN0KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPU0odCsiIiksdT1vLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP2s6VCxudWxsPT1lJiYoZT0hMSkscj0wO3I8dTsrK3IpdGhpcy5lYWNoKGEob1tyXSxuLGUpKTtyZXR1cm4gdGhpc312YXIgYT10aGlzLm5vZGUoKS5fX29uO2lmKGEpZm9yKHZhciBjLHM9MCxmPWEubGVuZ3RoO3M8ZjsrK3MpZm9yKHI9MCxjPWFbc107cjx1OysrcilpZigoaT1vW3JdKS50eXBlPT09Yy50eXBlJiZpLm5hbWU9PT1jLm5hbWUpcmV0dXJuIGMudmFsdWV9fSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2h0Omx0KSh0LG4pKX19O3ZhciBjZj1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHB0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgcHQoW1t0XV0sYWYpfSxzZj1mdW5jdGlvbih0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49SnMoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBRcyh0LHIpO3JldHVybiBudWxsfSxmZj1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxsZj1mdW5jdGlvbih0KXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlPWNmKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsZmYsITApOyJvbnNlbGVjdHN0YXJ0ImluIG4/ZS5vbigic2VsZWN0c3RhcnQuZHJhZyIsZmYsITApOihuLl9fbm9zZWxlY3Q9bi5zdHlsZS5Nb3pVc2VyU2VsZWN0LG4uc3R5bGUuTW96VXNlclNlbGVjdD0ibm9uZSIpfSxoZj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O3l0LnByb3RvdHlwZS5vbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuXy5vbi5hcHBseSh0aGlzLl8sYXJndW1lbnRzKTtyZXR1cm4gdD09PXRoaXMuXz90aGlzOnR9O3ZhciBwZj1mdW5jdGlvbih0LG4sZSl7dC5wcm90b3R5cGU9bi5wcm90b3R5cGU9ZSxlLmNvbnN0cnVjdG9yPXR9LGRmPSJcXHMqKFsrLV0/XFxkKylcXHMqIix2Zj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixfZj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIseWY9L14jKFswLTlhLWZdezN9KSQvLGdmPS9eIyhbMC05YS1mXXs2fSkkLyxtZj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZGYsZGYsZGZdKyJcXCkkIikseGY9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW19mLF9mLF9mXSsiXFwpJCIpLGJmPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZGYsZGYsZGYsdmZdKyJcXCkkIiksd2Y9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tfZixfZixfZix2Zl0rIlxcKSQiKSxNZj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbdmYsX2YsX2ZdKyJcXCkkIiksVGY9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1t2ZixfZixfZix2Zl0rIlxcKSQiKSxrZj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtwZihNdCxUdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLHBmKEF0LEV0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgQXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IEF0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSkscGYoUnQsUHQsd3QoTXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBSdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBSdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IEF0KEx0KHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLEx0KHQsaSxyKSxMdCh0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTmY9TWF0aC5QSS8xODAsU2Y9MTgwL01hdGguUEksRWY9Ljk1MDQ3LEFmPTEsQ2Y9MS4wODg4Myx6Zj00LzI5LFBmPTYvMjksUmY9MypQZipQZixMZj1QZipQZipQZjtwZihEdCxVdCx3dChNdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEdCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IER0KHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIHQ9QWYqRnQodCksbj1FZipGdChuKSxlPUNmKkZ0KGUpLG5ldyBBdChJdCgzLjI0MDQ1NDIqbi0xLjUzNzEzODUqdC0uNDk4NTMxNCplKSxJdCgtLjk2OTI2NipuKzEuODc2MDEwOCp0Ky4wNDE1NTYqZSksSXQoLjA1NTY0MzQqbi0uMjA0MDI1OSp0KzEuMDU3MjI1MiplKSx0aGlzLm9wYWNpdHkpfX0pKSxwZihIdCxqdCx3dChNdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBIdCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEh0KHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHF0KHRoaXMpLnJnYigpfX0pKTt2YXIgcWY9LS4xNDg2MSxVZj0xLjc4Mjc3LERmPS0uMjkyMjcsT2Y9LS45MDY0OSxGZj0xLjk3Mjk0LElmPUZmKk9mLFlmPUZmKlVmLEJmPVVmKkRmLU9mKnFmO3BmKFZ0LCR0LHd0KE10LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgVnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgVnQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5mLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBBdCgyNTUqKG4rZSoocWYqcitVZippKSksMjU1KihuK2UqKERmKnIrT2YqaSkpLDI1NSoobitlKihGZipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGpmLEhmLFhmLCRmLFZmLFdmLFpmPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sdT1yPjA/dFtyLTFdOjIqaS1vLGE9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBXdCgoZS1yL24pKm4sdSxpLG8sYSl9fSxHZj1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHI9TWF0aC5mbG9vcigoKGUlPTEpPDA/KytlOmUpKm4pLGk9dFsocituLTEpJW5dLG89dFtyJW5dLHU9dFsocisxKSVuXSxhPXRbKHIrMiklbl07cmV0dXJuIFd0KChlLXIvbikqbixpLG8sdSxhKX19LEpmPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sUWY9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9cigodD1FdCh0KSkuciwobj1FdChuKSkuciksaT1yKHQuZyxuLmcpLG89cih0LmIsbi5iKSx1PUt0KHQub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdC5yPWUobiksdC5nPWkobiksdC5iPW8obiksdC5vcGFjaXR5PXUobiksdCsiIn19dmFyIHI9UXQobik7cmV0dXJuIGUuZ2FtbWE9dCxlfSgxKSxLZj10bihaZiksdGw9dG4oR2YpLG5sPWZ1bmN0aW9uKHQsbil7dmFyIGUscj1uP24ubGVuZ3RoOjAsaT10P01hdGgubWluKHIsdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPGk7KytlKW9bZV09Y2wodFtlXSxuW2VdKTtmb3IoO2U8cjsrK2UpdVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZT0wO2U8aTsrK2UpdVtlXT1vW2VdKHQpO3JldHVybiB1fX0sZWw9ZnVuY3Rpb24odCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gdD0rdCxuLT10LGZ1bmN0aW9uKHIpe3JldHVybiBlLnNldFRpbWUodCtuKnIpLGV9fSxybD1mdW5jdGlvbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIHQrbiplfX0saWw9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXt9LGk9e307bnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KTtmb3IoZSBpbiBuKWUgaW4gdD9yW2VdPWNsKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19LG9sPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyx1bD1uZXcgUmVnRXhwKG9sLnNvdXJjZSwiZyIpLGFsPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpLG89b2wubGFzdEluZGV4PXVsLmxhc3RJbmRleD0wLHU9LTEsYT1bXSxjPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT1vbC5leGVjKHQpKSYmKHI9dWwuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSxhW3VdP2FbdV0rPWk6YVsrK3VdPWkpLChlPWVbMF0pPT09KHI9clswXSk/YVt1XT9hW3VdKz1yOmFbKyt1XT1yOihhWysrdV09bnVsbCxjLnB1c2goe2k6dSx4OnJsKGUscil9KSksbz11bC5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSxhLmxlbmd0aDwyP2NbMF0/ZW4oY1swXS54KTpubihuKToobj1jLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpYVsoZT1jW3JdKS5pXT1lLngodCk7cmV0dXJuIGEuam9pbigiIil9KX0sY2w9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXR5cGVvZiBuO3JldHVybiBudWxsPT1ufHwiYm9vbGVhbiI9PT1yP0pmKG4pOigibnVtYmVyIj09PXI/cmw6InN0cmluZyI9PT1yPyhlPVR0KG4pKT8obj1lLFFmKTphbDpuIGluc3RhbmNlb2YgVHQ/UWY6biBpbnN0YW5jZW9mIERhdGU/ZWw6QXJyYXkuaXNBcnJheShuKT9ubDoiZnVuY3Rpb24iIT10eXBlb2Ygbi52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2Ygbi50b1N0cmluZ3x8aXNOYU4obik/aWw6cmwpKHQsbil9LHNsPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5yb3VuZCh0K24qZSl9fSxmbD0xODAvTWF0aC5QSSxsbD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfSxobD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSpmbCxza2V3WDpNYXRoLmF0YW4oYykqZmwsc2NhbGVYOnUsc2NhbGVZOmF9fSxwbD1ybihmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P2xsOihqZnx8KGpmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEhmPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxYZj1kb2N1bWVudC5kZWZhdWx0VmlldyksamYuc3R5bGUudHJhbnNmb3JtPXQsdD1YZi5nZXRDb21wdXRlZFN0eWxlKEhmLmFwcGVuZENoaWxkKGpmKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxIZi5yZW1vdmVDaGlsZChqZiksdD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIiksaGwoK3RbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksZGw9cm4oZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bGw6KCRmfHwoJGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksJGYuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PSRmLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpPyh0PXQubWF0cml4LGhsKHQuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKSk6bGwpfSwiLCAiLCIpIiwiKSIpLHZsPU1hdGguU1FSVDIsX2w9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sdT10WzJdLGE9blswXSxjPW5bMV0scz1uWzJdLGY9YS1pLGw9Yy1vLGg9ZipmK2wqbDtpZihoPDFlLTEyKXI9TWF0aC5sb2cocy91KS92bCxlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqZixvK3QqbCx1Kk1hdGguZXhwKHZsKnQqcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxkPShzKnMtdSp1KzQqaCkvKDIqdSoyKnApLHY9KHMqcy11KnUtNCpoKS8oMipzKjIqcCksXz1NYXRoLmxvZyhNYXRoLnNxcnQoZCpkKzEpLWQpLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LV8pL3ZsLGU9ZnVuY3Rpb24odCl7dmFyIG49dCpyLGU9b24oXyksYT11LygyKnApKihlKmFuKHZsKm4rXyktdW4oXykpO3JldHVybltpK2EqZixvK2EqbCx1KmUvb24odmwqbitfKV19fXJldHVybiBlLmR1cmF0aW9uPTFlMypyLGV9LHlsPWNuKEp0KSxnbD1jbihLdCksbWw9c24oSnQpLHhsPXNuKEt0KSxibD1mbihKdCksd2w9Zm4oS3QpLE1sPTAsVGw9MCxrbD0wLE5sPTFlMyxTbD0wLEVsPTAsQWw9MCxDbD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSx6bD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtwbi5wcm90b3R5cGU9ZG4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpwbixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/bG4oKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8V2Y9PT10aGlzfHwoV2Y/V2YuX25leHQ9dGhpczpWZj10aGlzLFdmPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbW4oKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbW4oKSl9fTt2YXIgUGw9ZnVuY3Rpb24odCxuLGUpe3ZhciByPW5ldyBwbjtyZXR1cm4gbj1udWxsPT1uPzA6K24sci5yZXN0YXJ0KGZ1bmN0aW9uKGUpe3Iuc3RvcCgpLHQoZStuKX0sbixlKSxyfSxSbD1oKCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLExsPVtdLHFsPTAsVWw9MSxEbD0yLE9sPTMsRmw9NCxJbD01LFlsPTYsQmw9ZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTtNbih0LGUse25hbWU6bixpbmRleDpyLGdyb3VwOmksb246UmwsdHdlZW46TGwsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6cWx9KX0samw9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGksbz10Ll9fdHJhbnNpdGlvbix1PSEwO2lmKG8pe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKGkgaW4gbykoZT1vW2ldKS5uYW1lPT09bj8ocj1lLnN0YXRlPkRsJiZlLnN0YXRlPElsLGUuc3RhdGU9WWwsZS50aW1lci5zdG9wKCksciYmZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLGRlbGV0ZSBvW2ldKTp1PSExO3UmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19LEhsPWZ1bmN0aW9uKHQsbil7dmFyIGU7cmV0dXJuKCJudW1iZXIiPT10eXBlb2Ygbj9ybDpuIGluc3RhbmNlb2YgVHQ/UWY6KGU9VHQobikpPyhuPWUsUWYpOmFsKSh0LG4pfSxYbD1kdC5wcm90b3R5cGUuY29uc3RydWN0b3IsJGw9MCxWbD1kdC5wcm90b3R5cGU7R24ucHJvdG90eXBlPUpuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6R24sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGYodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSx1PTA7dTxpOysrdSlmb3IodmFyIGEsYyxzPXJbdV0sZj1zLmxlbmd0aCxsPW9bdV09bmV3IEFycmF5KGYpLGg9MDtoPGY7KytoKShhPXNbaF0pJiYoYz10LmNhbGwoYSxhLl9fZGF0YV9fLGgscykpJiYoIl9fZGF0YV9fImluIGEmJihjLl9fZGF0YV9fPWEuX19kYXRhX18pLGxbaF09YyxCbChsW2hdLG4sZSxoLGwsd24oYSxlKSkpO3JldHVybiBuZXcgR24obyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PW5mKHQpKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz1bXSx1PVtdLGE9MDthPGk7KythKWZvcih2YXIgYyxzPXJbYV0sZj1zLmxlbmd0aCxsPTA7bDxmOysrbClpZihjPXNbbF0pe2Zvcih2YXIgaCxwPXQuY2FsbChjLGMuX19kYXRhX18sbCxzKSxkPXduKGMsZSksdj0wLF89cC5sZW5ndGg7djxfOysrdikoaD1wW3ZdKSYmQmwoaCxuLGUsdixwLGQpO28ucHVzaChwKSx1LnB1c2goYyl9cmV0dXJuIG5ldyBHbihvLHUsbixlKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1acyh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgR24ocix0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9dC5fZ3JvdXBzLHI9bi5sZW5ndGgsaT1lLmxlbmd0aCxvPU1hdGgubWluKHIsaSksdT1uZXcgQXJyYXkociksYT0wO2E8bzsrK2EpZm9yKHZhciBjLHM9blthXSxmPWVbYV0sbD1zLmxlbmd0aCxoPXVbYV09bmV3IEFycmF5KGwpLHA9MDtwPGw7KytwKShjPXNbcF18fGZbcF0pJiYoaFtwXT1jKTtmb3IoO2E8cjsrK2EpdVthXT1uW2FdO3JldHVybiBuZXcgR24odSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxzZWxlY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFhsKHRoaXMuX2dyb3Vwcyx0aGlzLl9wYXJlbnRzKX0sdHJhbnNpdGlvbjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9uYW1lLG49dGhpcy5faWQsZT1RbigpLHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciB1LGE9cltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKWlmKHU9YVtzXSl7dmFyIGY9d24odSxuKTtCbCh1LHQsZSxzLGEse3RpbWU6Zi50aW1lK2YuZGVsYXkrZi5kdXJhdGlvbixkZWxheTowLGR1cmF0aW9uOmYuZHVyYXRpb24sZWFzZTpmLmVhc2V9KX1yZXR1cm4gbmV3IEduKHIsdGhpcy5fcGFyZW50cyx0LGUpfSxjYWxsOlZsLmNhbGwsbm9kZXM6Vmwubm9kZXMsbm9kZTpWbC5ub2RlLHNpemU6Vmwuc2l6ZSxlbXB0eTpWbC5lbXB0eSxlYWNoOlZsLmVhY2gsb246ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3duKHRoaXMubm9kZSgpLGUpLm9uLm9uKHQpOnRoaXMuZWFjaChZbihlLHQsbikpfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9anModCkscj0idHJhbnNmb3JtIj09PWU/ZGw6SGw7cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/KGUubG9jYWw/UG46em4pKGUscixObih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9FbjpTbikoZSk6KGUubG9jYWw/Q246QW4pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9anModCk7cmV0dXJuIHRoaXMudHdlZW4oZSwoci5sb2NhbD9SbjpMbikocixuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9wbDpIbDtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxqbih0LHIpKS5vbigiZW5kLnN0eWxlLiIrdCxIbih0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/JG4odCxyLE5uKHRoaXMsInN0eWxlLiIrdCxuKSk6WG4odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLFZuKHQsbixudWxsPT1lPyIiOmUpKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/Wm4oTm4odGhpcywidGV4dCIsdCkpOlduKG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsQm4odGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPXduKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCx1PWkubGVuZ3RoO288dTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9UbjprbikoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9xbjpVbikobix0KSk6d24odGhpcy5ub2RlKCksbikuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/RG46T24pKG4sdCkpOnduKHRoaXMubm9kZSgpLG4pLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChGbihuLHQpKTp3bih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIFdsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksR2w9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksSmw9TWF0aC5QSSxRbD1KbC8yLEtsPTQvMTEsdGg9Ni8xMSxuaD04LzExLGVoPS43NSxyaD05LzExLGloPTEwLzExLG9oPS45Mzc1LHVoPTIxLzIyLGFoPTYzLzY0LGNoPTEvS2wvS2wsc2g9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxmaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuLS10KnQqKChuKzEpKnQrbikrMX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLGxoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigobisxKSp0LW4pOih0LT0yKSp0KigobisxKSp0K24pKzIpLzJ9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxoaD0yKk1hdGguUEkscGg9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4qTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChpLXQpL2UpfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aGgpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaGgpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfSgxLC4zKSxkaD1mdW5jdGlvbiB0KG4sZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gMS1uKk1hdGgucG93KDIsLTEwKih0PSt0KSkqTWF0aC5zaW4oKHQraSkvZSl9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1oaCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSpoaCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KDEsLjMpLHZoPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybigodD0yKnQtMSk8MD9uKk1hdGgucG93KDIsMTAqdCkqTWF0aC5zaW4oKGktdCkvZSk6Mi1uKk1hdGgucG93KDIsLTEwKnQpKk1hdGguc2luKChpK3QpL2UpKS8yfXZhciBpPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89aGgpO3JldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqaGgpfSxyLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxyfSgxLC4zKSxfaD17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6dGV9O2R0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpe2psKHRoaXMsdCl9KX0sZHQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24odCl7dmFyIG4sZTt0IGluc3RhbmNlb2YgR24/KG49dC5faWQsdD10Ll9uYW1lKToobj1RbigpLChlPV9oKS50aW1lPWxuKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcykodT1hW3NdKSYmQmwodSx0LG4scyxhLGV8fG9lKHUsbikpO3JldHVybiBuZXcgR24ocix0aGlzLl9wYXJlbnRzLHQsbil9O3ZhciB5aD1bbnVsbF0sZ2g9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxtaD1mdW5jdGlvbih0LG4sZSl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9bix0aGlzLnNlbGVjdGlvbj1lfSx4aD1mdW5jdGlvbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxiaD17bmFtZToiZHJhZyJ9LHdoPXtuYW1lOiJzcGFjZSJ9LE1oPXtuYW1lOiJoYW5kbGUifSxUaD17bmFtZToiY2VudGVyIn0sa2g9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChhZSksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1t0WzBdLG5bMF1bMV1dLFt0WzFdLG5bMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LE5oPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoYWUpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbblswXVswXSx0WzBdXSxbblsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxTaD17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoYWUpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxFaD17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sQWg9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LENoPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSx6aD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSxQaD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfSxSaD1NYXRoLmNvcyxMaD1NYXRoLnNpbixxaD1NYXRoLlBJLFVoPXFoLzIsRGg9MipxaCxPaD1NYXRoLm1heCxGaD1BcnJheS5wcm90b3R5cGUuc2xpY2UsSWg9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxZaD1NYXRoLlBJLEJoPTIqWWgsamg9QmgtMWUtNjtkZS5wcm90b3R5cGU9dmUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpkZSxtb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rbil9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iUSIrICt0KyIsIisgK24rIiwiKyh0aGlzLl94MT0rZSkrIiwiKyh0aGlzLl95MT0rcil9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxuLGUscixpLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtuKyIsIisgK2UrIiwiKyArcisiLCIrKHRoaXMuX3gxPStpKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxuLGUscixpKXt0PSt0LG49K24sZT0rZSxyPStyLGk9K2k7dmFyIG89dGhpcy5feDEsdT10aGlzLl95MSxhPWUtdCxjPXItbixzPW8tdCxmPXUtbixsPXMqcytmKmY7aWYoaTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2kpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlIGlmKGw+MWUtNilpZihNYXRoLmFicyhmKmEtYypzKT4xZS02JiZpKXt2YXIgaD1lLW8scD1yLXUsZD1hKmErYypjLHY9aCpoK3AqcCxfPU1hdGguc3FydChkKSx5PU1hdGguc3FydChsKSxnPWkqTWF0aC50YW4oKFloLU1hdGguYWNvcygoZCtsLXYpLygyKl8qeSkpKS8yKSxtPWcveSx4PWcvXztNYXRoLmFicyhtLTEpPjFlLTYmJih0aGlzLl8rPSJMIisodCttKnMpKyIsIisobittKmYpKSx0aGlzLl8rPSJBIitpKyIsIitpKyIsMCwwLCIrICsoZipoPnMqcCkrIiwiKyh0aGlzLl94MT10K3gqYSkrIiwiKyh0aGlzLl95MT1uK3gqYyl9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1uKTtlbHNlO30sYXJjOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0PSt0LG49K247dmFyIHU9KGU9K2UpKk1hdGguY29zKHIpLGE9ZSpNYXRoLnNpbihyKSxjPXQrdSxzPW4rYSxmPTFebyxsPW8/ci1pOmktcjtpZihlPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrZSk7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2MrIiwiK3M6KE1hdGguYWJzKHRoaXMuX3gxLWMpPjFlLTZ8fE1hdGguYWJzKHRoaXMuX3kxLXMpPjFlLTYpJiYodGhpcy5fKz0iTCIrYysiLCIrcyksZSYmKGw8MCYmKGw9bCVCaCtCaCksbD5qaD90aGlzLl8rPSJBIitlKyIsIitlKyIsMCwxLCIrZisiLCIrKHQtdSkrIiwiKyhuLWEpKyJBIitlKyIsIitlKyIsMCwxLCIrZisiLCIrKHRoaXMuX3gxPWMpKyIsIisodGhpcy5feTE9cyk6bD4xZS02JiYodGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsIisgKyhsPj1ZaCkrIiwiK2YrIiwiKyh0aGlzLl94MT10K2UqTWF0aC5jb3MoaSkpKyIsIisodGhpcy5feTE9bitlKk1hdGguc2luKGkpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbikrImgiKyArZSsidiIrICtyKyJoIistZSsiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O2JlLnByb3RvdHlwZT13ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmJlLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBIaD13ZS5wcm90b3R5cGU7U2UucHJvdG90eXBlPUVlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6U2UsaGFzOkhoLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQrPSIiLHRoaXNbIiQiK3RdPXQsdGhpc30scmVtb3ZlOkhoLnJlbW92ZSxjbGVhcjpIaC5jbGVhcix2YWx1ZXM6SGgua2V5cyxzaXplOkhoLnNpemUsZW1wdHk6SGguZW1wdHksZWFjaDpIaC5lYWNofTt2YXIgWGg9e30sJGg9e30sVmg9MzQsV2g9MTAsWmg9MTMsR2g9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0LG4pe2Z1bmN0aW9uIGUoKXtpZihzKXJldHVybiAkaDtpZihmKXJldHVybiBmPSExLFhoO3ZhciBuLGUscj1hO2lmKHQuY2hhckNvZGVBdChyKT09PVZoKXtmb3IoO2ErKzx1JiZ0LmNoYXJDb2RlQXQoYSkhPT1WaHx8dC5jaGFyQ29kZUF0KCsrYSk9PT1WaDspO3JldHVybihuPWEpPj11P3M9ITA6KGU9dC5jaGFyQ29kZUF0KGErKykpPT09V2g/Zj0hMDplPT09WmgmJihmPSEwLHQuY2hhckNvZGVBdChhKT09PVdoJiYrK2EpLHQuc2xpY2UocisxLG4tMSkucmVwbGFjZSgvIiIvZywnIicpfWZvcig7YTx1Oyl7aWYoKGU9dC5jaGFyQ29kZUF0KG49YSsrKSk9PT1XaClmPSEwO2Vsc2UgaWYoZT09PVpoKWY9ITAsdC5jaGFyQ29kZUF0KGEpPT09V2gmJisrYTtlbHNlIGlmKGUhPT1vKWNvbnRpbnVlO3JldHVybiB0LnNsaWNlKHIsbil9cmV0dXJuIHM9ITAsdC5zbGljZShyLHUpfXZhciByLGk9W10sdT10Lmxlbmd0aCxhPTAsYz0wLHM9dTw9MCxmPSExO2Zvcih0LmNoYXJDb2RlQXQodS0xKT09PVdoJiYtLXUsdC5jaGFyQ29kZUF0KHUtMSk9PT1aaCYmLS11OyhyPWUoKSkhPT0kaDspe2Zvcih2YXIgbD1bXTtyIT09WGgmJnIhPT0kaDspbC5wdXNoKHIpLHI9ZSgpO24mJm51bGw9PShsPW4obCxjKyspKXx8aS5wdXNoKGwpfXJldHVybiBpfWZ1bmN0aW9uIGUobil7cmV0dXJuIG4ubWFwKHIpLmpvaW4odCl9ZnVuY3Rpb24gcih0KXtyZXR1cm4gbnVsbD09dD8iIjppLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH12YXIgaT1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxvPXQuY2hhckNvZGVBdCgwKTtyZXR1cm57cGFyc2U6ZnVuY3Rpb24odCxlKXt2YXIgcixpLG89bih0LGZ1bmN0aW9uKHQsbil7aWYocilyZXR1cm4gcih0LG4tMSk7aT10LHI9ZT9DZSh0LGUpOkFlKHQpfSk7cmV0dXJuIG8uY29sdW1ucz1pLG99LHBhcnNlUm93czpuLGZvcm1hdDpmdW5jdGlvbihuLGUpe3JldHVybiBudWxsPT1lJiYoZT16ZShuKSksW2UubWFwKHIpLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHIoblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGUpLmpvaW4oIlxuIil9fX0sSmg9R2goIiwiKSxRaD1KaC5wYXJzZSxLaD1KaC5wYXJzZVJvd3MsdHA9SmguZm9ybWF0LG5wPUpoLmZvcm1hdFJvd3MsZXA9R2goIlx0IikscnA9ZXAucGFyc2UsaXA9ZXAucGFyc2VSb3dzLG9wPWVwLmZvcm1hdCx1cD1lcC5mb3JtYXRSb3dzLGFwPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sY3A9ZnVuY3Rpb24oKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9LHNwPWZ1bmN0aW9uKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfSxmcD1xZS5wcm90b3R5cGU9VWUucHJvdG90eXBlO2ZwLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IFVlKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1EZShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPURlKG4pKTtyZXR1cm4gZX0sZnAuYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4gUGUodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sZnAuYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsdT1uZXcgQXJyYXkobyksYT1uZXcgQXJyYXkobyksYz0xLzAscz0xLzAsZj0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KHVbZV09cixhW2VdPWkscjxjJiYoYz1yKSxyPmYmJihmPXIpLGk8cyYmKHM9aSksaT5sJiYobD1pKSk7Zm9yKGY8YyYmKGM9dGhpcy5feDAsZj10aGlzLl94MSksbDxzJiYocz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGMscykuY292ZXIoZixsKSxlPTA7ZTxvOysrZSlQZSh0aGlzLHVbZV0sYVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sZnAuY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxmcC5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LGZwLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sZnAuZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLHUsYSxjLHMsZj10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEscD10aGlzLl95MSxkPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmZC5wdXNoKG5ldyBzcCh2LGYsbCxoLHApKSxudWxsPT1lP2U9MS8wOihmPXQtZSxsPW4tZSxoPXQrZSxwPW4rZSxlKj1lKTtjPWQucG9wKCk7KWlmKCEoISh2PWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPnB8fCh1PWMueDEpPGZ8fChhPWMueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgXz0oaSt1KS8yLHk9KG8rYSkvMjtkLnB1c2gobmV3IHNwKHZbM10sXyx5LHUsYSksbmV3IHNwKHZbMl0saSx5LF8sYSksbmV3IHNwKHZbMV0sXyxvLHUseSksbmV3IHNwKHZbMF0saSxvLF8seSkpLChzPShuPj15KTw8MXx0Pj1fKSYmKGM9ZFtkLmxlbmd0aC0xXSxkW2QubGVuZ3RoLTFdPWRbZC5sZW5ndGgtMS1zXSxkW2QubGVuZ3RoLTEtc109Yyl9ZWxzZXt2YXIgZz10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLG09bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSx4PWcqZyttKm07aWYoeDxlKXt2YXIgYj1NYXRoLnNxcnQoZT14KTtmPXQtYixsPW4tYixoPXQrYixwPW4rYixyPXYuZGF0YX19cmV0dXJuIHJ9LGZwLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKHU9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLHUsYSxjLHMsZixsLGgscD10aGlzLl9yb290LGQ9dGhpcy5feDAsdj10aGlzLl95MCxfPXRoaXMuX3gxLHk9dGhpcy5feTE7aWYoIXApcmV0dXJuIHRoaXM7aWYocC5sZW5ndGgpZm9yKDs7KXtpZigocz1vPj0oYT0oZCtfKS8yKSk/ZD1hOl89YSwoZj11Pj0oYz0odit5KS8yKSk/dj1jOnk9YyxuPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gdGhpcztpZighcC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtwLmRhdGEhPT10OylpZihyPXAsIShwPXAubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9cC5uZXh0KSYmZGVsZXRlIHAubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKHA9blswXXx8blsxXXx8blsyXXx8blszXSkmJnA9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFwLmxlbmd0aCYmKGU/ZVtoXT1wOnRoaXMuX3Jvb3Q9cCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sZnAucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sZnAucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxmcC5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LGZwLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhPVtdLGM9dGhpcy5fcm9vdDtmb3IoYyYmYS5wdXNoKG5ldyBzcChjLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj1hLnBvcCgpOylpZighdChjPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSx1PW4ueTEpJiZjLmxlbmd0aCl7dmFyIHM9KHIrbykvMixmPShpK3UpLzI7KGU9Y1szXSkmJmEucHVzaChuZXcgc3AoZSxzLGYsbyx1KSksKGU9Y1syXSkmJmEucHVzaChuZXcgc3AoZSxyLGYscyx1KSksKGU9Y1sxXSkmJmEucHVzaChuZXcgc3AoZSxzLGksbyxmKSksKGU9Y1swXSkmJmEucHVzaChuZXcgc3AoZSxyLGkscyxmKSl9cmV0dXJuIHRoaXN9LGZwLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IHNwKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IHNwKG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IHNwKG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IHNwKG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IHNwKG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LGZwLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxmcC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIGxwLGhwPTEwLHBwPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxkcD1mdW5jdGlvbih0LG4pe2lmKChlPSh0PW4/dC50b0V4cG9uZW50aWFsKG4tMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgZSxyPXQuc2xpY2UoMCxlKTtyZXR1cm5bci5sZW5ndGg+MT9yWzBdK3Iuc2xpY2UoMik6ciwrdC5zbGljZShlKzEpXX0sdnA9ZnVuY3Rpb24odCl7cmV0dXJuKHQ9ZHAoTWF0aC5hYnModCkpKT90WzFdOk5hTn0sX3A9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9ZS5sZW5ndGgsbz1bXSx1PTAsYT10WzBdLGM9MDtpPjAmJmE+MCYmKGMrYSsxPnImJihhPU1hdGgubWF4KDEsci1jKSksby5wdXNoKGUuc3Vic3RyaW5nKGktPWEsaSthKSksISgoYys9YSsxKT5yKSk7KWE9dFt1PSh1KzEpJXQubGVuZ3RoXTtyZXR1cm4gby5yZXZlcnNlKCkuam9pbihuKX19LHlwPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0sZ3A9ZnVuY3Rpb24odCxuKXt2YXIgZT1kcCh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfSxtcD17IiI6ZnVuY3Rpb24odCxuKXt0OmZvcih2YXIgZSxyPSh0PXQudG9QcmVjaXNpb24obikpLmxlbmd0aCxpPTEsbz0tMTtpPHI7KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOm89ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PW8mJihvPWkpLGU9aTticmVhaztjYXNlImUiOmJyZWFrIHQ7ZGVmYXVsdDpvPjAmJihvPTApfXJldHVybiBvPjA/dC5zbGljZSgwLG8pK3Quc2xpY2UoZSsxKTp0fSwiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiBncCgxMDAqdCxuKX0scjpncCxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9ZHAodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKGxwPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSx1PXIubGVuZ3RoO3JldHVybiBvPT09dT9yOm8+dT9yK25ldyBBcnJheShvLXUrMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrZHAodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0seHA9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2k7SGUucHJvdG90eXBlPVhlLnByb3RvdHlwZSxYZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSt0aGlzLnR5cGV9O3ZhciBicCx3cD1mdW5jdGlvbih0KXtyZXR1cm4gdH0sTXA9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdLFRwPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7ZnVuY3Rpb24gbih0KXt2YXIgbixyLHUsZj1fLHg9eTtpZigiYyI9PT12KXg9Zyh0KSt4LHQ9IiI7ZWxzZXt2YXIgYj0odD0rdCk8MDtpZih0PWcoTWF0aC5hYnModCksZCksYiYmMD09K3QmJihiPSExKSxmPShiPyIoIj09PXM/czoiLSI6Ii0iPT09c3x8IigiPT09cz8iIjpzKStmLHg9eCsoInMiPT09dj9NcFs4K2xwLzNdOiIiKSsoYiYmIigiPT09cz8iKSI6IiIpLG0pZm9yKG49LTEscj10Lmxlbmd0aDsrK248cjspaWYoNDg+KHU9dC5jaGFyQ29kZUF0KG4pKXx8dT41Nyl7eD0oNDY9PT11P2krdC5zbGljZShuKzEpOnQuc2xpY2UobikpK3gsdD10LnNsaWNlKDAsbik7YnJlYWt9fXAmJiFsJiYodD1lKHQsMS8wKSk7dmFyIHc9Zi5sZW5ndGgrdC5sZW5ndGgreC5sZW5ndGgsTT13PGg/bmV3IEFycmF5KGgtdysxKS5qb2luKGEpOiIiO3N3aXRjaChwJiZsJiYodD1lKE0rdCxNLmxlbmd0aD9oLXgubGVuZ3RoOjEvMCksTT0iIiksYyl7Y2FzZSI8Ijp0PWYrdCt4K007YnJlYWs7Y2FzZSI9Ijp0PWYrTSt0K3g7YnJlYWs7Y2FzZSJeIjp0PU0uc2xpY2UoMCx3PU0ubGVuZ3RoPj4xKStmK3QreCtNLnNsaWNlKHcpO2JyZWFrO2RlZmF1bHQ6dD1NK2YrdCt4fXJldHVybiBvKHQpfXZhciBhPSh0PUhlKHQpKS5maWxsLGM9dC5hbGlnbixzPXQuc2lnbixmPXQuc3ltYm9sLGw9dC56ZXJvLGg9dC53aWR0aCxwPXQuY29tbWEsZD10LnByZWNpc2lvbix2PXQudHlwZSxfPSIkIj09PWY/clswXToiIyI9PT1mJiYvW2JveFhdLy50ZXN0KHYpPyIwIit2LnRvTG93ZXJDYXNlKCk6IiIseT0iJCI9PT1mP3JbMV06L1slcF0vLnRlc3Qodik/dToiIixnPW1wW3ZdLG09IXZ8fC9bZGVmZ3BycyVdLy50ZXN0KHYpO3JldHVybiBkPW51bGw9PWQ/dj82OjEyOi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxufXZhciBlPXQuZ3JvdXBpbmcmJnQudGhvdXNhbmRzP19wKHQuZ3JvdXBpbmcsdC50aG91c2FuZHMpOndwLHI9dC5jdXJyZW5jeSxpPXQuZGVjaW1hbCxvPXQubnVtZXJhbHM/eXAodC5udW1lcmFscyk6d3AsdT10LnBlcmNlbnR8fCIlIjtyZXR1cm57Zm9ybWF0Om4sZm9ybWF0UHJlZml4OmZ1bmN0aW9uKHQsZSl7dmFyIHI9bigodD1IZSh0KSx0LnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHZwKGUpLzMpKSksbz1NYXRoLnBvdygxMCwtaSksdT1NcFs4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByKG8qdCkrdX19fX07JGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSk7dmFyIGtwPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLm1heCgwLC12cChNYXRoLmFicyh0KSkpfSxOcD1mdW5jdGlvbih0LG4pe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHZwKG4pLzMpKSktdnAoTWF0aC5hYnModCkpKX0sU3A9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLXQsTWF0aC5tYXgoMCx2cChuKS12cCh0KSkrMX0sRXA9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFZlfTtWZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlZlLHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5zPXRoaXMudD0wfSxhZGQ6ZnVuY3Rpb24odCl7V2UodWQsdCx0aGlzLnQpLFdlKHRoaXMsdWQucyx0aGlzLnMpLHRoaXMucz90aGlzLnQrPXVkLnQ6dGhpcy5zPXVkLnR9LHZhbHVlT2Y6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zfX07dmFyIEFwLENwLHpwLFBwLFJwLExwLHFwLFVwLERwLE9wLEZwLElwLFlwLEJwLGpwLEhwLFhwLCRwLFZwLFdwLFpwLEdwLEpwLFFwLEtwLHRkLG5kLGVkLHJkLGlkLG9kLHVkPW5ldyBWZSxhZD0xZS02LGNkPU1hdGguUEksc2Q9Y2QvMixmZD1jZC80LGxkPTIqY2QsaGQ9MTgwL2NkLHBkPWNkLzE4MCxkZD1NYXRoLmFicyx2ZD1NYXRoLmF0YW4sX2Q9TWF0aC5hdGFuMix5ZD1NYXRoLmNvcyxnZD1NYXRoLmNlaWwsbWQ9TWF0aC5leHAseGQ9TWF0aC5sb2csYmQ9TWF0aC5wb3csd2Q9TWF0aC5zaW4sTWQ9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LFRkPU1hdGguc3FydCxrZD1NYXRoLnRhbixOZD17RmVhdHVyZTpmdW5jdGlvbih0LG4pe0tlKHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylLZShlW3JdLmdlb21ldHJ5LG4pfX0sU2Q9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXt0cih0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdHIoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7bnIodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylucihlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspS2UoZVtyXSxuKX19LEVkPWZ1bmN0aW9uKHQsbil7dCYmTmQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OZFt0LnR5cGVdKHQsbik6S2UodCxuKX0sQWQ9RXAoKSxDZD1FcCgpLHpkPXtwb2ludDpRZSxsaW5lU3RhcnQ6UWUsbGluZUVuZDpRZSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtBZC5yZXNldCgpLHpkLmxpbmVTdGFydD1lcix6ZC5saW5lRW5kPXJyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K0FkO0NkLmFkZCh0PDA/bGQrdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1RZX0sc3BoZXJlOmZ1bmN0aW9uKCl7Q2QuYWRkKGxkKX19LFBkPUVwKCksUmQ9e3BvaW50OnByLGxpbmVTdGFydDp2cixsaW5lRW5kOl9yLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1JkLnBvaW50PXlyLFJkLmxpbmVTdGFydD1ncixSZC5saW5lRW5kPW1yLFBkLnJlc2V0KCksemQucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt6ZC5wb2x5Z29uRW5kKCksUmQucG9pbnQ9cHIsUmQubGluZVN0YXJ0PXZyLFJkLmxpbmVFbmQ9X3IsQWQ8MD8oTHA9LShVcD0xODApLHFwPS0oRHA9OTApKTpQZD5hZD9EcD05MDpQZDwtYWQmJihxcD0tOTApLGpwWzBdPUxwLGpwWzFdPVVwfX0sTGQ9e3NwaGVyZTpRZSxwb2ludDpNcixsaW5lU3RhcnQ6a3IsbGluZUVuZDpFcixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtMZC5saW5lU3RhcnQ9QXIsTGQubGluZUVuZD1Dcn0scG9seWdvbkVuZDpmdW5jdGlvbigpe0xkLmxpbmVTdGFydD1rcixMZC5saW5lRW5kPUVyfX0scWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxVZD1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybihlPW4uaW52ZXJ0KGUscikpJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX07UnIuaW52ZXJ0PVJyO3ZhciBEZCxPZCxGZCxJZCxZZCxCZCxqZCxIZCxYZCwkZCxWZCxXZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuPXQoblswXSpwZCxuWzFdKnBkKSxuWzBdKj1oZCxuWzFdKj1oZCxufXJldHVybiB0PUxyKHRbMF0qcGQsdFsxXSpwZCx0Lmxlbmd0aD4yP3RbMl0qcGQ6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuIG49dC5pbnZlcnQoblswXSpwZCxuWzFdKnBkKSxuWzBdKj1oZCxuWzFdKj1oZCxufSxufSxaZD1mdW5jdGlvbigpe3ZhciB0LG49W107cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sZSl7dC5wdXNoKFtuLGVdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5wdXNoKHQ9W10pfSxsaW5lRW5kOlFlLHJlam9pbjpmdW5jdGlvbigpe24ubGVuZ3RoPjEmJm4ucHVzaChuLnBvcCgpLmNvbmNhdChuLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9bjtyZXR1cm4gbj1bXSx0PW51bGwsZX19fSxHZD1mdW5jdGlvbih0LG4sZSxyLGksbyl7dmFyIHUsYT10WzBdLGM9dFsxXSxzPTAsZj0xLGw9blswXS1hLGg9blsxXS1jO2lmKHU9ZS1hLGx8fCEodT4wKSl7aWYodS89bCxsPDApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1lbHNlIGlmKGw+MCl7aWYodT5mKXJldHVybjt1PnMmJihzPXUpfWlmKHU9aS1hLGx8fCEodTwwKSl7aWYodS89bCxsPDApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1lbHNlIGlmKGw+MCl7aWYodTxzKXJldHVybjt1PGYmJihmPXUpfWlmKHU9ci1jLGh8fCEodT4wKSl7aWYodS89aCxoPDApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1lbHNlIGlmKGg+MCl7aWYodT5mKXJldHVybjt1PnMmJihzPXUpfWlmKHU9by1jLGh8fCEodTwwKSl7aWYodS89aCxoPDApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1lbHNlIGlmKGg+MCl7aWYodTxzKXJldHVybjt1PGYmJihmPXUpfXJldHVybiBzPjAmJih0WzBdPWErcypsLHRbMV09YytzKmgpLGY8MSYmKG5bMF09YStmKmwsblsxXT1jK2YqaCksITB9fX19fSxKZD1mdW5jdGlvbih0LG4pe3JldHVybiBkZCh0WzBdLW5bMF0pPGFkJiZkZCh0WzFdLW5bMV0pPGFkfSxRZD1mdW5jdGlvbih0LG4sZSxyLGkpe3ZhciBvLHUsYT1bXSxjPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sdT10W25dO2lmKEpkKHIsdSkpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPG47KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7aS5saW5lRW5kKCl9ZWxzZSBhLnB1c2goZT1uZXcgSXIocix0LG51bGwsITApKSxjLnB1c2goZS5vPW5ldyBJcihyLG51bGwsZSwhMSkpLGEucHVzaChlPW5ldyBJcih1LHQsbnVsbCwhMSkpLGMucHVzaChlLm89bmV3IElyKHUsbnVsbCxlLCEwKSl9fSksYS5sZW5ndGgpe2ZvcihjLnNvcnQobiksWXIoYSksWXIoYyksbz0wLHU9Yy5sZW5ndGg7bzx1OysrbyljW29dLmU9ZT0hZTtmb3IodmFyIHMsZixsPWFbMF07Oyl7Zm9yKHZhciBoPWwscD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtzPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKHApZm9yKG89MCx1PXMubGVuZ3RoO288dTsrK28paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihwKWZvcihzPWgucC56LG89cy5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9cz0oaD1oLm8pLnoscD0hcH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fSxLZD0xZTksdHY9LUtkLG52PUVwKCksZXY9ZnVuY3Rpb24odCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVt3ZChlKSwteWQoZSksMF0sbz0wLHU9MDtudi5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7YTxjOysrYSlpZihmPShzPXRbYV0pLmxlbmd0aClmb3IodmFyIHMsZixsPXNbZi0xXSxoPWxbMF0scD1sWzFdLzIrZmQsZD13ZChwKSx2PXlkKHApLF89MDtfPGY7KytfLGg9ZyxkPXgsdj1iLGw9eSl7dmFyIHk9c1tfXSxnPXlbMF0sbT15WzFdLzIrZmQseD13ZChtKSxiPXlkKG0pLHc9Zy1oLE09dz49MD8xOi0xLFQ9TSp3LGs9VD5jZCxOPWQqeDtpZihudi5hZGQoX2QoTipNKndkKFQpLHYqYitOKnlkKFQpKSksbys9az93K00qbGQ6dyxrXmg+PWVeZz49ZSl7dmFyIFM9c3IoYXIobCksYXIoeSkpO2hyKFMpO3ZhciBFPXNyKGksUyk7aHIoRSk7dmFyIEE9KGtedz49MD8tMToxKSpHZShFWzJdKTsocj5BfHxyPT09QSYmKFNbMF18fFNbMV0pKSYmKHUrPWtedz49MD8xOi0xKX19cmV0dXJuKG88LWFkfHxvPGFkJiZudjwtYWQpXjEmdX0scnY9RXAoKSxpdj17c3BoZXJlOlFlLHBvaW50OlFlLGxpbmVTdGFydDpmdW5jdGlvbigpe2l2LnBvaW50PUhyLGl2LmxpbmVFbmQ9anJ9LGxpbmVFbmQ6UWUscG9seWdvblN0YXJ0OlFlLHBvbHlnb25FbmQ6UWV9LG92PWZ1bmN0aW9uKHQpe3JldHVybiBydi5yZXNldCgpLEVkKHQsaXYpLCtydn0sdXY9W251bGwsbnVsbF0sYXY9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnV2fSxjdj1mdW5jdGlvbih0LG4pe3JldHVybiB1dlswXT10LHV2WzFdPW4sb3YoYXYpfSxzdj17RmVhdHVyZTpmdW5jdGlvbih0LG4pe3JldHVybiAkcih0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoJHIoZVtyXS5nZW9tZXRyeSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LGZ2PXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gVnIodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoVnIoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe3JldHVybiBXcih0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKFdyKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gWnIodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihacihlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoJHIoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LGx2PWZ1bmN0aW9uKHQpe3JldHVybiB0fSxodj1FcCgpLHB2PUVwKCksZHY9e3BvaW50OlFlLGxpbmVTdGFydDpRZSxsaW5lRW5kOlFlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2R2LmxpbmVTdGFydD1uaSxkdi5saW5lRW5kPWlpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7ZHYubGluZVN0YXJ0PWR2LmxpbmVFbmQ9ZHYucG9pbnQ9UWUsaHYuYWRkKGRkKHB2KSkscHYucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9aHYvMjtyZXR1cm4gaHYucmVzZXQoKSx0fX0sdnY9MS8wLF92PXZ2LHl2PS12dixndj15dixtdj17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHZ2JiYodnY9dCksdD55diYmKHl2PXQpLG48X3YmJihfdj1uKSxuPmd2JiYoZ3Y9bil9LGxpbmVTdGFydDpRZSxsaW5lRW5kOlFlLHBvbHlnb25TdGFydDpRZSxwb2x5Z29uRW5kOlFlLHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbdnYsX3ZdLFt5dixndl1dO3JldHVybiB5dj1ndj0tKF92PXZ2PTEvMCksdH19LHh2PTAsYnY9MCx3dj0wLE12PTAsVHY9MCxrdj0wLE52PTAsU3Y9MCxFdj0wLEF2PXtwb2ludDpvaSxsaW5lU3RhcnQ6dWksbGluZUVuZDpzaSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtBdi5saW5lU3RhcnQ9ZmksQXYubGluZUVuZD1saX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0F2LnBvaW50PW9pLEF2LmxpbmVTdGFydD11aSxBdi5saW5lRW5kPXNpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1Fdj9bTnYvRXYsU3YvRXZdOmt2P1tNdi9rdixUdi9rdl06d3Y/W3h2L3d2LGJ2L3d2XTpbTmFOLE5hTl07cmV0dXJuIHh2PWJ2PXd2PU12PVR2PWt2PU52PVN2PUV2PTAsdH19O2RpLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxsZCl9fSxyZXN1bHQ6UWV9O3ZhciBDdix6dixQdixSdixMdixxdj1FcCgpLFV2PXtwb2ludDpRZSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtVdi5wb2ludD12aX0sbGluZUVuZDpmdW5jdGlvbigpe0N2JiZfaSh6dixQdiksVXYucG9pbnQ9UWV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0N2PSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Q3Y9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K3F2O3JldHVybiBxdi5yZXNldCgpLHR9fTt5aS5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6Z2koNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1naSh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19O3ZhciBEdj1mdW5jdGlvbih0LG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSxvKXtmdW5jdGlvbiB1KG4sZSl7dmFyIHI9aShuLGUpO3Qobj1yWzBdLGU9clsxXSkmJm8ucG9pbnQobixlKX1mdW5jdGlvbiBhKHQsbil7dmFyIGU9aSh0LG4pO18ucG9pbnQoZVswXSxlWzFdKX1mdW5jdGlvbiBjKCl7Yi5wb2ludD1hLF8ubGluZVN0YXJ0KCl9ZnVuY3Rpb24gcygpe2IucG9pbnQ9dSxfLmxpbmVFbmQoKX1mdW5jdGlvbiBmKHQsbil7di5wdXNoKFt0LG5dKTt2YXIgZT1pKHQsbik7bS5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGwoKXttLmxpbmVTdGFydCgpLHY9W119ZnVuY3Rpb24gaCgpe2YodlswXVswXSx2WzBdWzFdKSxtLmxpbmVFbmQoKTt2YXIgdCxuLGUscixpPW0uY2xlYW4oKSx1PWcucmVzdWx0KCksYT11Lmxlbmd0aDtpZih2LnBvcCgpLHAucHVzaCh2KSx2PW51bGwsYSlpZigxJmkpe2lmKGU9dVswXSwobj1lLmxlbmd0aC0xKT4wKXtmb3IoeHx8KG8ucG9seWdvblN0YXJ0KCkseD0hMCksby5saW5lU3RhcnQoKSx0PTA7dDxuOysrdClvLnBvaW50KChyPWVbdF0pWzBdLHJbMV0pO28ubGluZUVuZCgpfX1lbHNlIGE+MSYmMiZpJiZ1LnB1c2godS5wb3AoKS5jb25jYXQodS5zaGlmdCgpKSksZC5wdXNoKHUuZmlsdGVyKG1pKSl9dmFyIHAsZCx2LF89bihvKSx5PWkuaW52ZXJ0KHJbMF0sclsxXSksZz1aZCgpLG09bihnKSx4PSExLGI9e3BvaW50OnUsbGluZVN0YXJ0OmMsbGluZUVuZDpzLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2IucG9pbnQ9ZixiLmxpbmVTdGFydD1sLGIubGluZUVuZD1oLGQ9W10scD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2IucG9pbnQ9dSxiLmxpbmVTdGFydD1jLGIubGluZUVuZD1zLGQ9Q3MoZCk7dmFyIHQ9ZXYocCx5KTtkLmxlbmd0aD8oeHx8KG8ucG9seWdvblN0YXJ0KCkseD0hMCksUWQoZCx4aSx0LGUsbykpOnQmJih4fHwoby5wb2x5Z29uU3RhcnQoKSx4PSEwKSxvLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsbyksby5saW5lRW5kKCkpLHgmJihvLnBvbHlnb25FbmQoKSx4PSExKSxkPXA9bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7by5wb2x5Z29uU3RhcnQoKSxvLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsbyksby5saW5lRW5kKCksby5wb2x5Z29uRW5kKCl9fTtyZXR1cm4gYn19LE92PUR2KGZ1bmN0aW9uKCl7cmV0dXJuITB9LGZ1bmN0aW9uKHQpe3ZhciBuLGU9TmFOLHI9TmFOLGk9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLG49MX0scG9pbnQ6ZnVuY3Rpb24obyx1KXt2YXIgYT1vPjA/Y2Q6LWNkLGM9ZGQoby1lKTtkZChjLWNkKTxhZD8odC5wb2ludChlLHI9KHIrdSkvMj4wP3NkOi1zZCksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLHQucG9pbnQobyxyKSxuPTApOmkhPT1hJiZjPj1jZCYmKGRkKGUtaSk8YWQmJihlLT1pKmFkKSxkZChvLWEpPGFkJiYoby09YSphZCkscj1iaShlLHIsbyx1KSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksbj0wKSx0LnBvaW50KGU9byxyPXUpLGk9YX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpzZCxyLnBvaW50KC1jZCxpKSxyLnBvaW50KDAsaSksci5wb2ludChjZCxpKSxyLnBvaW50KGNkLDApLHIucG9pbnQoY2QsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtY2QsLWkpLHIucG9pbnQoLWNkLDApLHIucG9pbnQoLWNkLGkpO2Vsc2UgaWYoZGQodFswXS1uWzBdKT5hZCl7dmFyIG89dFswXTxuWzBdP2NkOi1jZDtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1jZCwtc2RdKSxGdj1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUodCxuKXtyZXR1cm4geWQodCkqeWQobik+b31mdW5jdGlvbiByKHQsbixlKXt2YXIgcj1bMSwwLDBdLGk9c3IoYXIodCksYXIobikpLHU9Y3IoaSxpKSxhPWlbMF0sYz11LWEqYTtpZighYylyZXR1cm4hZSYmdDt2YXIgcz1vKnUvYyxmPS1vKmEvYyxsPXNyKHIsaSksaD1scihyLHMpO2ZyKGgsbHIoaSxmKSk7dmFyIHA9bCxkPWNyKGgscCksdj1jcihwLHApLF89ZCpkLXYqKGNyKGgsaCktMSk7aWYoIShfPDApKXt2YXIgeT1UZChfKSxnPWxyKHAsKC1kLXkpL3YpO2lmKGZyKGcsaCksZz11cihnKSwhZSlyZXR1cm4gZzt2YXIgbSx4PXRbMF0sYj1uWzBdLHc9dFsxXSxNPW5bMV07Yjx4JiYobT14LHg9YixiPW0pO3ZhciBUPWIteCxrPWRkKFQtY2QpPGFkLE49a3x8VDxhZDtpZighayYmTTx3JiYobT13LHc9TSxNPW0pLE4/az93K00+MF5nWzFdPChkZChnWzBdLXgpPGFkP3c6TSk6dzw9Z1sxXSYmZ1sxXTw9TTpUPmNkXih4PD1nWzBdJiZnWzBdPD1iKSl7dmFyIFM9bHIocCwoLWQreSkvdik7cmV0dXJuIGZyKFMsaCksW2csdXIoUyldfX19ZnVuY3Rpb24gaShuLGUpe3ZhciByPXU/dDpjZC10LGk9MDtyZXR1cm4gbjwtcj9pfD0xOm4+ciYmKGl8PTIpLGU8LXI/aXw9NDplPnImJihpfD04KSxpfXZhciBvPXlkKHQpLHU9bz4wLGE9ZGQobyk+YWQ7cmV0dXJuIER2KGUsZnVuY3Rpb24odCl7dmFyIG4sbyxjLHMsZjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7cz1jPSExLGY9MX0scG9pbnQ6ZnVuY3Rpb24obCxoKXt2YXIgcCxkPVtsLGhdLHY9ZShsLGgpLF89dT92PzA6aShsLGgpOnY/aShsKyhsPDA/Y2Q6LWNkKSxoKTowO2lmKCFuJiYocz1jPXYpJiZ0LmxpbmVTdGFydCgpLHYhPT1jJiYoIShwPXIobixkKSl8fEpkKG4scCl8fEpkKGQscCkpJiYoZFswXSs9YWQsZFsxXSs9YWQsdj1lKGRbMF0sZFsxXSkpLHYhPT1jKWY9MCx2Pyh0LmxpbmVTdGFydCgpLHA9cihkLG4pLHQucG9pbnQocFswXSxwWzFdKSk6KHA9cihuLGQpLHQucG9pbnQocFswXSxwWzFdKSx0LmxpbmVFbmQoKSksbj1wO2Vsc2UgaWYoYSYmbiYmdV52KXt2YXIgeTtfJm98fCEoeT1yKGQsbiwhMCkpfHwoZj0wLHU/KHQubGluZVN0YXJ0KCksdC5wb2ludCh5WzBdWzBdLHlbMF1bMV0pLHQucG9pbnQoeVsxXVswXSx5WzFdWzFdKSx0LmxpbmVFbmQoKSk6KHQucG9pbnQoeVsxXVswXSx5WzFdWzFdKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSkpfSF2fHxuJiZKZChuLGQpfHx0LnBvaW50KGRbMF0sZFsxXSksbj1kLGM9dixvPV99LGxpbmVFbmQ6ZnVuY3Rpb24oKXtjJiZ0LmxpbmVFbmQoKSxuPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIGZ8KHMmJmMpPDwxfX19LGZ1bmN0aW9uKGUscixpLG8pe09yKG8sdCxuLGksZSxyKX0sdT9bMCwtdF06Wy1jZCx0LWNkXSl9O01pLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TWkscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIEl2PTE2LFl2PXlkKDMwKnBkKSxCdj1mdW5jdGlvbih0LG4pe3JldHVybituP1NpKHQsbik6TmkodCl9LGp2PXdpKHtwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQqcGQsbipwZCl9fSksSHY9ZnVuY3Rpb24oKXtyZXR1cm4gQ2koUGkpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9LFh2PWZ1bmN0aW9uKCl7cmV0dXJuIEh2KCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9LCR2PUxpKGZ1bmN0aW9uKHQpe3JldHVybiBUZCgyLygxK3QpKX0pOyR2LmludmVydD1xaShmdW5jdGlvbih0KXtyZXR1cm4gMipHZSh0LzIpfSk7dmFyIFZ2PUxpKGZ1bmN0aW9uKHQpe3JldHVybih0PVplKHQpKSYmdC93ZCh0KX0pO1Z2LmludmVydD1xaShmdW5jdGlvbih0KXtyZXR1cm4gdH0pO1VpLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0LDIqdmQobWQobikpLXNkXX07SWkuaW52ZXJ0PUlpO0JpLmludmVydD1xaSh2ZCk7SGkuaW52ZXJ0PXFpKEdlKTtYaS5pbnZlcnQ9cWkoZnVuY3Rpb24odCl7cmV0dXJuIDIqdmQodCl9KTskaS5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bLW4sMip2ZChtZCh0KSktc2RdfTt1by5wcm90b3R5cGU9ZW8ucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp1byxjb3VudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2hBZnRlcih0byl9LGVhY2g6ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10aGlzLHU9W29dO2Rve2ZvcihuPXUucmV2ZXJzZSgpLHU9W107bz1uLnBvcCgpOylpZih0KG8pLGU9by5jaGlsZHJlbilmb3Iocj0wLGk9ZS5sZW5ndGg7cjxpOysrcil1LnB1c2goZVtyXSl9d2hpbGUodS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscixpPXRoaXMsbz1baV0sdT1bXTtpPW8ucG9wKCk7KWlmKHUucHVzaChpKSxuPWkuY2hpbGRyZW4pZm9yKGU9MCxyPW4ubGVuZ3RoO2U8cjsrK2Upby5wdXNoKG5bZV0pO2Zvcig7aT11LnBvcCgpOyl0KGkpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dGhpcyxpPVtyXTtyPWkucG9wKCk7KWlmKHQociksbj1yLmNoaWxkcmVuKWZvcihlPW4ubGVuZ3RoLTE7ZT49MDstLWUpaS5wdXNoKG5bZV0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe2Zvcih2YXIgZT0rdChuLmRhdGEpfHwwLHI9bi5jaGlsZHJlbixpPXImJnIubGVuZ3RoOy0taT49MDspZSs9cltpXS52YWx1ZTtuLnZhbHVlPWV9KX0sc29ydDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG4pe24uY2hpbGRyZW4mJm4uY2hpbGRyZW4uc29ydCh0KX0pfSxwYXRoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLGU9bm8obix0KSxyPVtuXTtuIT09ZTspbj1uLnBhcmVudCxyLnB1c2gobik7Zm9yKHZhciBpPXIubGVuZ3RoO3QhPT1lOylyLnNwbGljZShpLDAsdCksdD10LnBhcmVudDtyZXR1cm4gcn0sYW5jZXN0b3JzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMsbj1bdF07dD10LnBhcmVudDspbi5wdXNoKHQpO3JldHVybiBufSxkZXNjZW5kYW50czpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24obil7dC5wdXNoKG4pfSksdH0sbGVhdmVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihuKXtuLmNoaWxkcmVufHx0LnB1c2gobil9KSx0fSxsaW5rczpmdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1bXTtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKGUpe2UhPT10JiZuLnB1c2goe3NvdXJjZTplLnBhcmVudCx0YXJnZXQ6ZX0pfSksbn0sY29weTpmdW5jdGlvbigpe3JldHVybiBlbyh0aGlzKS5lYWNoQmVmb3JlKGlvKX19O3ZhciBXdj1BcnJheS5wcm90b3R5cGUuc2xpY2UsWnY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0wLGk9KHQ9YW8oV3YuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJmZvKGUsbik/KytyOihlPWhvKG89Y28obyxuKSkscj0wKTtyZXR1cm4gZX0sR3Y9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSxKdj1mdW5jdGlvbih0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9LFF2PWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrYTxjOykobz11W2FdKS55MD1lLG8ueTE9aSxvLngwPW4sby54MT1uKz1vLnZhbHVlKnN9LEt2PSIkIix0Xz17ZGVwdGg6LTF9LG5fPXt9O0RvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHVvLnByb3RvdHlwZSk7dmFyIGVfPWZ1bmN0aW9uKHQsbixlLHIsaSl7Zm9yKHZhciBvLHU9dC5jaGlsZHJlbixhPS0xLGM9dS5sZW5ndGgscz10LnZhbHVlJiYoaS1lKS90LnZhbHVlOysrYTxjOykobz11W2FdKS54MD1uLG8ueDE9cixvLnkwPWUsby55MT1lKz1vLnZhbHVlKnN9LHJfPSgxK01hdGguc3FydCg1KSkvMixpXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtGbyhuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0ocl8pLG9fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihjPShhPXVbbF0pLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9RdihhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6ZV8oYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PUZvKG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0ocl8pLHVfPWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKS0oblsxXS10WzFdKSooZVswXS10WzBdKX0sYV89W10uc2xpY2UsY189e307Qm8ucHJvdG90eXBlPVdvLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Qm8sZGVmZXI6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoImRlZmVyIGFmdGVyIGF3YWl0Iik7aWYobnVsbCE9dGhpcy5fZXJyb3IpcmV0dXJuIHRoaXM7dmFyIG49YV8uY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIG4ucHVzaCh0KSwrK3RoaXMuX3dhaXRpbmcsdGhpcy5fdGFza3MucHVzaChuKSxqbyh0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9lcnJvciYmJG8odGhpcyxuZXcgRXJyb3IoImFib3J0IikpLHRoaXN9LGF3YWl0OmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBhd2FpdCIpO3JldHVybiB0aGlzLl9jYWxsPWZ1bmN0aW9uKG4sZSl7dC5hcHBseShudWxsLFtuXS5jb25jYXQoZSkpfSxWbyh0aGlzKSx0aGlzfSxhd2FpdEFsbDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD10LFZvKHRoaXMpLHRoaXN9fTt2YXIgc189ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5yYW5kb20oKX0sZl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuIHQ9bnVsbD09dD8wOit0LGU9bnVsbD09ZT8xOitlLDE9PT1hcmd1bWVudHMubGVuZ3RoPyhlPXQsdD0wKTplLT10LGZ1bmN0aW9uKCl7cmV0dXJuIG4oKSplK3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHNfKSxsXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlKXt2YXIgcixpO3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSxmdW5jdGlvbigpe3ZhciBvO2lmKG51bGwhPXIpbz1yLHI9bnVsbDtlbHNlIGRve3I9MipuKCktMSxvPTIqbigpLTEsaT1yKnIrbypvfXdoaWxlKCFpfHxpPjEpO3JldHVybiB0K2UqbypNYXRoLnNxcnQoLTIqTWF0aC5sb2coaSkvaSl9fXJldHVybiBlLnNvdXJjZT10LGV9KHNfKSxoXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUoKXt2YXIgdD1sXy5zb3VyY2UobikuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfShzXykscF89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgZT0wLHI9MDtyPHQ7KytyKWUrPW4oKTtyZXR1cm4gZX19cmV0dXJuIGUuc291cmNlPXQsZX0oc18pLGRfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXt2YXIgZT1wXy5zb3VyY2UobikodCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUoKS90fX1yZXR1cm4gZS5zb3VyY2U9dCxlfShzXyksdl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLW4oKSkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0oc18pLF9fPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSh0KXt2YXIgbixlPXMuc3RhdHVzO2lmKCFlJiZHbyhzKXx8ZT49MjAwJiZlPDMwMHx8MzA0PT09ZSl7aWYobyl0cnl7bj1vLmNhbGwocixzKX1jYXRjaCh0KXtyZXR1cm4gdm9pZCBhLmNhbGwoImVycm9yIixyLHQpfWVsc2Ugbj1zO2EuY2FsbCgibG9hZCIscixuKX1lbHNlIGEuY2FsbCgiZXJyb3IiLHIsdCl9dmFyIHIsaSxvLHUsYT1oKCJiZWZvcmVzZW5kIiwicHJvZ3Jlc3MiLCJsb2FkIiwiZXJyb3IiKSxjPXdlKCkscz1uZXcgWE1MSHR0cFJlcXVlc3QsZj1udWxsLGw9bnVsbCxwPTA7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBYRG9tYWluUmVxdWVzdHx8IndpdGhDcmVkZW50aWFscyJpbiBzfHwhL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHQpfHwocz1uZXcgWERvbWFpblJlcXVlc3QpLCJvbmxvYWQiaW4gcz9zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9ZTpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbih0KXtzLnJlYWR5U3RhdGU+MyYmZSh0KX0scy5vbnByb2dyZXNzPWZ1bmN0aW9uKHQpe2EuY2FsbCgicHJvZ3Jlc3MiLHIsdCl9LHI9e2hlYWRlcjpmdW5jdGlvbih0LG4pe3JldHVybiB0PSh0KyIiKS50b0xvd2VyQ2FzZSgpLGFyZ3VtZW50cy5sZW5ndGg8Mj9jLmdldCh0KToobnVsbD09bj9jLnJlbW92ZSh0KTpjLnNldCh0LG4rIiIpLHIpfSxtaW1lVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6dCsiIixyKTppfSxyZXNwb25zZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxyKTp1fSx0aW1lb3V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSt0LHIpOnB9LHVzZXI6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT9mOihmPW51bGw9PXQ/bnVsbDp0KyIiLHIpfSxwYXNzd29yZDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2w6KGw9bnVsbD09dD9udWxsOnQrIiIscil9LHJlc3BvbnNlOmZ1bmN0aW9uKHQpe3JldHVybiBvPXQscn0sZ2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiR0VUIix0LG4pfSxwb3N0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHIuc2VuZCgiUE9TVCIsdCxuKX0sc2VuZDpmdW5jdGlvbihuLGUsbyl7cmV0dXJuIHMub3BlbihuLHQsITAsZixsKSxudWxsPT1pfHxjLmhhcygiYWNjZXB0Iil8fGMuc2V0KCJhY2NlcHQiLGkrIiwqLyoiKSxzLnNldFJlcXVlc3RIZWFkZXImJmMuZWFjaChmdW5jdGlvbih0LG4pe3Muc2V0UmVxdWVzdEhlYWRlcihuLHQpfSksbnVsbCE9aSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoaSksbnVsbCE9dSYmKHMucmVzcG9uc2VUeXBlPXUpLHA+MCYmKHMudGltZW91dD1wKSxudWxsPT1vJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKG89ZSxlPW51bGwpLG51bGwhPW8mJjE9PT1vLmxlbmd0aCYmKG89Wm8obykpLG51bGwhPW8mJnIub24oImVycm9yIixvKS5vbigibG9hZCIsZnVuY3Rpb24odCl7byhudWxsLHQpfSksYS5jYWxsKCJiZWZvcmVzZW5kIixyLHMpLHMuc2VuZChudWxsPT1lP251bGw6ZSkscn0sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gcy5hYm9ydCgpLHJ9LG9uOmZ1bmN0aW9uKCl7dmFyIHQ9YS5vbi5hcHBseShhLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1hP3I6dH19LG51bGwhPW4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIituKTtyZXR1cm4gci5nZXQobil9cmV0dXJuIHJ9LHlfPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIGk9X18oZSkubWltZVR5cGUodCkucmVzcG9uc2Uobik7aWYobnVsbCE9cil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK3IpO3JldHVybiBpLmdldChyKX1yZXR1cm4gaX19LGdfPXlfKCJ0ZXh0L2h0bWwiLGZ1bmN0aW9uKHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVSYW5nZSgpLmNyZWF0ZUNvbnRleHR1YWxGcmFnbWVudCh0LnJlc3BvbnNlVGV4dCl9KSxtXz15XygiYXBwbGljYXRpb24vanNvbiIsZnVuY3Rpb24odCl7cmV0dXJuIEpTT04ucGFyc2UodC5yZXNwb25zZVRleHQpfSkseF89eV8oInRleHQvcGxhaW4iLGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlVGV4dH0pLGJfPXlfKCJhcHBsaWNhdGlvbi94bWwiLGZ1bmN0aW9uKHQpe3ZhciBuPXQucmVzcG9uc2VYTUw7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJwYXJzZSBlcnJvciIpO3JldHVybiBufSksd189ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9cixyPW51bGwpO3ZhciBvPV9fKGUpLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKEpvKG4scj10KSk6cn0sby5yb3cociksaT9vLmdldChpKTpvfX0sTV89d18oInRleHQvY3N2IixRaCksVF89d18oInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLHJwKSxrXz1BcnJheS5wcm90b3R5cGUsTl89a18ubWFwLFNfPWtfLnNsaWNlLEVfPXtuYW1lOiJpbXBsaWNpdCJ9LEFfPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0sQ189ZnVuY3Rpb24odCl7cmV0dXJuK3R9LHpfPVswLDFdLFBfPWZ1bmN0aW9uKG4sZSxyKXt2YXIgbyx1PW5bMF0sYT1uW24ubGVuZ3RoLTFdLGM9aSh1LGEsbnVsbD09ZT8xMDplKTtzd2l0Y2goKHI9SGUobnVsbD09cj8iLGYiOnIpKS50eXBlKXtjYXNlInMiOnZhciBzPU1hdGgubWF4KE1hdGguYWJzKHUpLE1hdGguYWJzKGEpKTtyZXR1cm4gbnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKG89TnAoYyxzKSl8fChyLnByZWNpc2lvbj1vKSx0LmZvcm1hdFByZWZpeChyLHMpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihvPVNwKGMsTWF0aC5tYXgoTWF0aC5hYnModSksTWF0aC5hYnMoYSkpKSl8fChyLnByZWNpc2lvbj1vLSgiZSI9PT1yLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKG89a3AoYykpfHwoci5wcmVjaXNpb249by0yKigiJSI9PT1yLnR5cGUpKX1yZXR1cm4gdC5mb3JtYXQocil9LFJfPWZ1bmN0aW9uKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sdT10W2ldO3JldHVybiB1PG8mJihlPXIscj1pLGk9ZSxlPW8sbz11LHU9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKHUpLHR9LExfPW5ldyBEYXRlLHFfPW5ldyBEYXRlLFVfPU11KGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7VV8uZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9NdShmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpVXzpudWxsfTt2YXIgRF89VV8ucmFuZ2UsT189NmU0LEZfPTYwNDhlNSxJXz1NdShmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWV89SV8ucmFuZ2UsQl89TXUoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9PXykqT18pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKk9fKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9PX30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksal89Ql8ucmFuZ2UsSF89TXUoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKk9fJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLFhfPUhfLnJhbmdlLCRfPU11KGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKk9fKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxWXz0kXy5yYW5nZSxXXz1UdSgwKSxaXz1UdSgxKSxHXz1UdSgyKSxKXz1UdSgzKSxRXz1UdSg0KSxLXz1UdSg1KSx0eT1UdSg2KSxueT1XXy5yYW5nZSxleT1aXy5yYW5nZSxyeT1HXy5yYW5nZSxpeT1KXy5yYW5nZSxveT1RXy5yYW5nZSx1eT1LXy5yYW5nZSxheT10eS5yYW5nZSxjeT1NdShmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldE1vbnRoKHQuZ2V0TW9udGgoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMioobi5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSxzeT1jeS5yYW5nZSxmeT1NdShmdW5jdGlvbih0KXt0LnNldE1vbnRoKDAsMSksdC5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0pO2Z5LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/TXUoZnVuY3Rpb24obil7bi5zZXRGdWxsWWVhcihNYXRoLmZsb29yKG4uZ2V0RnVsbFllYXIoKS90KSp0KSxuLnNldE1vbnRoKDAsMSksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24obixlKXtuLnNldEZ1bGxZZWFyKG4uZ2V0RnVsbFllYXIoKStlKnQpfSk6bnVsbH07dmFyIGx5PWZ5LnJhbmdlLGh5PU11KGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKk9fKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9PX30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfSkscHk9aHkucmFuZ2UsZHk9TXUoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMzZlNSpuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8zNmU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENIb3VycygpfSksdnk9ZHkucmFuZ2UsX3k9TXUoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkseXk9X3kucmFuZ2UsZ3k9a3UoMCksbXk9a3UoMSkseHk9a3UoMiksYnk9a3UoMyksd3k9a3UoNCksTXk9a3UoNSksVHk9a3UoNiksa3k9Z3kucmFuZ2UsTnk9bXkucmFuZ2UsU3k9eHkucmFuZ2UsRXk9YnkucmFuZ2UsQXk9d3kucmFuZ2UsQ3k9TXkucmFuZ2Usenk9VHkucmFuZ2UsUHk9TXUoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSksUnk9UHkucmFuZ2UsTHk9TXUoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KTtMeS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP011KGZ1bmN0aW9uKG4pe24uc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihuLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksbi5zZXRVVENNb250aCgwLDEpLG4uc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRVVENGdWxsWWVhcihuLmdldFVUQ0Z1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBxeSxVeT1MeS5yYW5nZSxEeT17Ii0iOiIiLF86IiAiLDA6IjAifSxPeT0vXlxzKlxkKy8sRnk9L14lLyxJeT0vW1xcXF5cJFwqXCtcP1x8XFtcXVwoXClcLlx7XH1dL2c7TWEoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgWXk9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLEJ5PStuZXcgRGF0ZSgiMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaIik/ZnVuY3Rpb24odCl7dmFyIG49bmV3IERhdGUodCk7cmV0dXJuIGlzTmFOKG4pP251bGw6bn06dC51dGNQYXJzZSgiJVktJW0tJWRUJUg6JU06JVMuJUxaIiksank9MWUzLEh5PTYwKmp5LFh5PTYwKkh5LCR5PTI0Klh5LFZ5PTcqJHksV3k9MzAqJHksWnk9MzY1KiR5LEd5PWZ1bmN0aW9uKHQpe3JldHVybiB0Lm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4iIyIrdH0pfSxKeT1HeSgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksUXk9R3koIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLEt5PUd5KCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSx0Zz1HeSgiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1Iiksbmc9d2woJHQoMzAwLC41LDApLCR0KC0yNDAsLjUsMSkpLGVnPXdsKCR0KC0xMDAsLjc1LC4zNSksJHQoODAsMS41LC44KSkscmc9d2woJHQoMjYwLC43NSwuMzUpLCR0KDgwLDEuNSwuOCkpLGlnPSR0KCksb2c9U2EoR3koIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSx1Zz1TYShHeSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLGFnPVNhKEd5KCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksY2c9U2EoR3koIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKSxzZz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19LGZnPU1hdGguYWJzLGxnPU1hdGguYXRhbjIsaGc9TWF0aC5jb3MscGc9TWF0aC5tYXgsZGc9TWF0aC5taW4sdmc9TWF0aC5zaW4sX2c9TWF0aC5zcXJ0LHlnPTFlLTEyLGdnPU1hdGguUEksbWc9Z2cvMix4Zz0yKmdnO09hLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pfX19O3ZhciBiZz1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IE9hKHQpfSx3Zz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIGEsYyxzLGY9dC5sZW5ndGgsbD0hMTtmb3IobnVsbD09aSYmKHU9byhzPXZlKCkpKSxhPTA7YTw9ZjsrK2EpIShhPGYmJnIoYz10W2FdLGEsdCkpPT09bCYmKChsPSFsKT91LmxpbmVTdGFydCgpOnUubGluZUVuZCgpKSxsJiZ1LnBvaW50KCtuKGMsYSx0KSwrZShjLGEsdCkpO2lmKHMpcmV0dXJuIHU9bnVsbCxzKyIifHxudWxsfXZhciBuPUZhLGU9SWEscj1zZyghMCksaT1udWxsLG89YmcsdT1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpzZygrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOmV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnNnKCEhbiksdCk6cn0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLG51bGwhPWkmJih1PW8oaSkpLHQpOm99LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPXU9bnVsbDp1PW8oaT1uKSx0KTppfSx0fSxNZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG4sZixsLGgscCxkPXQubGVuZ3RoLHY9ITEsXz1uZXcgQXJyYXkoZCkseT1uZXcgQXJyYXkoZCk7Zm9yKG51bGw9PWEmJihzPWMocD12ZSgpKSksbj0wO248PWQ7KytuKXtpZighKG48ZCYmdShoPXRbbl0sbix0KSk9PT12KWlmKHY9IXYpZj1uLHMuYXJlYVN0YXJ0KCkscy5saW5lU3RhcnQoKTtlbHNle2ZvcihzLmxpbmVFbmQoKSxzLmxpbmVTdGFydCgpLGw9bi0xO2w+PWY7LS1sKXMucG9pbnQoX1tsXSx5W2xdKTtzLmxpbmVFbmQoKSxzLmFyZWFFbmQoKX12JiYoX1tuXT0rZShoLG4sdCkseVtuXT0raShoLG4sdCkscy5wb2ludChyPytyKGgsbix0KTpfW25dLG8/K28oaCxuLHQpOnlbbl0pKX1pZihwKXJldHVybiBzPW51bGwscCsiInx8bnVsbH1mdW5jdGlvbiBuKCl7cmV0dXJuIHdnKCkuZGVmaW5lZCh1KS5jdXJ2ZShjKS5jb250ZXh0KGEpfXZhciBlPUZhLHI9bnVsbCxpPXNnKDApLG89SWEsdT1zZyghMCksYT1udWxsLGM9Ymcscz1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbikscj1udWxsLHQpOmV9LHQueDA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6ZX0sdC54MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6cn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLG89bnVsbCx0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOml9LHQueTE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOm99LHQubGluZVgwPXQubGluZVkwPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkoaSl9LHQubGluZVkxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KGUpLnkobyl9LHQubGluZVgxPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS54KHIpLnkoaSl9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnNnKCEhbiksdCk6dX0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1uLG51bGwhPWEmJihzPWMoYSkpLHQpOmN9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9hPXM9bnVsbDpzPWMoYT1uKSx0KTphfSx0fSxUZz1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0sa2c9ZnVuY3Rpb24odCl7cmV0dXJuIHR9LE5nPUJhKGJnKTtZYS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLl9jdXJ2ZS5wb2ludChuKk1hdGguc2luKHQpLG4qLU1hdGguY29zKHQpKX19O3ZhciBTZz1mdW5jdGlvbigpe3JldHVybiBqYSh3ZygpLmN1cnZlKE5nKSl9LEVnPWZ1bmN0aW9uKCl7dmFyIHQ9TWcoKS5jdXJ2ZShOZyksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBqYShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gamEocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGphKGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBqYShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKEJhKHQpKTpuKCkuX2N1cnZlfSx0fSxBZz1mdW5jdGlvbih0LG4pe3JldHVyblsobj0rbikqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxuKk1hdGguc2luKHQpXX0sQ2c9QXJyYXkucHJvdG90eXBlLnNsaWNlLHpnPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vZ2cpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCx4Zyl9fSxQZz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSxSZz1NYXRoLnNxcnQoMS8zKSxMZz0yKlJnLHFnPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTGcpLHI9ZSpSZzt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFVnPU1hdGguc2luKGdnLzEwKS9NYXRoLnNpbig3KmdnLzEwKSxEZz1NYXRoLnNpbih4Zy8xMCkqVWcsT2c9LU1hdGguY29zKHhnLzEwKSpVZyxGZz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPURnKmUsaT1PZyplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIHU9eGcqby81LGE9TWF0aC5jb3ModSksYz1NYXRoLnNpbih1KTt0LmxpbmVUbyhjKmUsLWEqZSksdC5saW5lVG8oYSpyLWMqaSxjKnIrYSppKX10LmNsb3NlUGF0aCgpfX0sSWc9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LFlnPU1hdGguc3FydCgzKSxCZz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypZZykpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtWWcqZSwtZSksdC5saW5lVG8oWWcqZSwtZSksdC5jbG9zZVBhdGgoKX19LGpnPS0uNSxIZz1NYXRoLnNxcnQoMykvMixYZz0xL01hdGguc3FydCgxMiksJGc9MyooWGcvMisxKSxWZz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLyRnKSxyPWUvMixpPWUqWGcsbz1yLHU9ZSpYZytlLGE9LW8sYz11O3QubW92ZVRvKHIsaSksdC5saW5lVG8obyx1KSx0LmxpbmVUbyhhLGMpLHQubGluZVRvKGpnKnItSGcqaSxIZypyK2pnKmkpLHQubGluZVRvKGpnKm8tSGcqdSxIZypvK2pnKnUpLHQubGluZVRvKGpnKmEtSGcqYyxIZyphK2pnKmMpLHQubGluZVRvKGpnKnIrSGcqaSxqZyppLUhnKnIpLHQubGluZVRvKGpnKm8rSGcqdSxqZyp1LUhnKm8pLHQubGluZVRvKGpnKmErSGcqYyxqZypjLUhnKmEpLHQuY2xvc2VQYXRoKCl9fSxXZz1bemcsUGcscWcsSWcsRmcsQmcsVmddLFpnPWZ1bmN0aW9uKCl7fTtKYS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOkdhKHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0OkdhKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fTtRYS5wcm90b3R5cGU9e2FyZWFTdGFydDpaZyxhcmVhRW5kOlpnLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpHYSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07S2EucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpHYSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX07dGMucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLHU9dFtlXS1pLGE9bltlXS1vLGM9LTE7KytjPD1lOylyPWMvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbY10rKDEtdGhpcy5fYmV0YSkqKGkrcip1KSx0aGlzLl9iZXRhKm5bY10rKDEtdGhpcy5fYmV0YSkqKG8rciphKSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBHZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBKYSh0KTpuZXcgdGModCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtlYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6bmModGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Om5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgSmc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgZWModCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7cmMucHJvdG90eXBlPXthcmVhU3RhcnQ6WmcsYXJlYUVuZDpaZyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0Om5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgUWc9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgcmModCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7aWMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6bmModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBLZz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBpYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTt1Yy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Om9jKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHRtPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgdWModCxuKTpuZXcgZWModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTthYy5wcm90b3R5cGU9e2FyZWFTdGFydDpaZyxhcmVhRW5kOlpnLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PW4pO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9bjticmVhaztkZWZhdWx0Om9jKHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIG5tPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgYWModCxuKTpuZXcgcmModCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtjYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6b2ModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgZW09ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBjYyh0LG4pOm5ldyBpYyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO3NjLnByb3RvdHlwZT17YXJlYVN0YXJ0OlpnLGFyZWFFbmQ6WmcsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3Q9K3Qsbj0rbix0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsbikpfX07ZGMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5fdDA9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSk7YnJlYWs7Y2FzZSAzOnBjKHRoaXMsdGhpcy5fdDAsaGModGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXt2YXIgZT1OYU47aWYodD0rdCxuPStuLHQhPT10aGlzLl94MXx8biE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHBjKHRoaXMsaGModGhpcyxlPWxjKHRoaXMsdCxuKSksZSk7YnJlYWs7ZGVmYXVsdDpwYyh0aGlzLHRoaXMuX3QwLGU9bGModGhpcyx0LG4pKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW4sdGhpcy5fdDA9ZX19fSwodmMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZGMucHJvdG90eXBlKSkucG9pbnQ9ZnVuY3Rpb24odCxuKXtkYy5wcm90b3R5cGUucG9pbnQuY2FsbCh0aGlzLG4sdCl9LF9jLnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5tb3ZlVG8obix0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fY29udGV4dC5saW5lVG8obix0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKG4sdCxyLGUsbyxpKX19LHljLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGg7aWYoZSlpZih0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRbMF0sblswXSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odFswXSxuWzBdKSwyPT09ZSl0aGlzLl9jb250ZXh0LmxpbmVUbyh0WzFdLG5bMV0pO2Vsc2UgZm9yKHZhciByPWdjKHQpLGk9Z2Mobiksbz0wLHU9MTt1PGU7KytvLCsrdSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oclswXVtvXSxpWzBdW29dLHJbMV1bb10saVsxXVtvXSx0W3VdLG5bdV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PWUpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O21jLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9dGhpcy5feT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA8dGhpcy5fdCYmdGhpcy5fdDwxJiYyPT09dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsdGhpcy5feSksKHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU+PTAmJih0aGlzLl90PTEtdGhpcy5fdCx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSl9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7ZGVmYXVsdDppZih0aGlzLl90PD0wKXRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gsbiksdGhpcy5fY29udGV4dC5saW5lVG8odCxuKTtlbHNle3ZhciBlPXRoaXMuX3gqKDEtdGhpcy5fdCkrdCp0aGlzLl90O3RoaXMuX2NvbnRleHQubGluZVRvKGUsdGhpcy5feSksdGhpcy5fY29udGV4dC5saW5lVG8oZSxuKX19dGhpcy5feD10LHRoaXMuX3k9bn19O3ZhciBybT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLHU9dFtuWzBdXSxhPXUubGVuZ3RoO288aTsrK28pZm9yKHI9dSx1PXRbbltvXV0sZT0wO2U8YTsrK2UpdVtlXVsxXSs9dVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19LGltPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10Lmxlbmd0aCxlPW5ldyBBcnJheShuKTstLW4+PTA7KWVbbl09bjtyZXR1cm4gZX0sb209ZnVuY3Rpb24odCl7dmFyIG49dC5tYXAoYmMpO3JldHVybiBpbSh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfSx1bT1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O1RjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VGMsaW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGUscixpO2lmKHQpe2lmKG4uUD10LG4uTj10Lk4sdC5OJiYodC5OLlA9biksdC5OPW4sdC5SKXtmb3IodD10LlI7dC5MOyl0PXQuTDt0Lkw9bn1lbHNlIHQuUj1uO2U9dH1lbHNlIHRoaXMuXz8odD1FYyh0aGlzLl8pLG4uUD1udWxsLG4uTj10LHQuUD10Lkw9bixlPXQpOihuLlA9bi5OPW51bGwsdGhpcy5fPW4sZT1udWxsKTtmb3Iobi5MPW4uUj1udWxsLG4uVT1lLG4uQz0hMCx0PW47ZSYmZS5DOyllPT09KHI9ZS5VKS5MPyhpPXIuUikmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuUiYmKE5jKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLFNjKHRoaXMscikpOihpPXIuTCkmJmkuQz8oZS5DPWkuQz0hMSxyLkM9ITAsdD1yKToodD09PWUuTCYmKFNjKHRoaXMsZSksZT0odD1lKS5VKSxlLkM9ITEsci5DPSEwLE5jKHRoaXMscikpLGU9dC5VO3RoaXMuXy5DPSExfSxyZW1vdmU6ZnVuY3Rpb24odCl7dC5OJiYodC5OLlA9dC5QKSx0LlAmJih0LlAuTj10Lk4pLHQuTj10LlA9bnVsbDt2YXIgbixlLHIsaT10LlUsbz10LkwsdT10LlI7aWYoZT1vP3U/RWModSk6bzp1LGk/aS5MPT09dD9pLkw9ZTppLlI9ZTp0aGlzLl89ZSxvJiZ1PyhyPWUuQyxlLkM9dC5DLGUuTD1vLG8uVT1lLGUhPT11PyhpPWUuVSxlLlU9dC5VLHQ9ZS5SLGkuTD10LGUuUj11LHUuVT1lKTooZS5VPWksaT1lLHQ9ZS5SKSk6KHI9dC5DLHQ9ZSksdCYmKHQuVT1pKSwhcilpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09aS5MKXtpZigobj1pLlIpLkMmJihuLkM9ITEsaS5DPSEwLE5jKHRoaXMsaSksbj1pLlIpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uUiYmbi5SLkN8fChuLkwuQz0hMSxuLkM9ITAsU2ModGhpcyxuKSxuPWkuUiksbi5DPWkuQyxpLkM9bi5SLkM9ITEsTmModGhpcyxpKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigobj1pLkwpLkMmJihuLkM9ITEsaS5DPSEwLFNjKHRoaXMsaSksbj1pLkwpLG4uTCYmbi5MLkN8fG4uUiYmbi5SLkMpe24uTCYmbi5MLkN8fChuLlIuQz0hMSxuLkM9ITAsTmModGhpcyxuKSxuPWkuTCksbi5DPWkuQyxpLkM9bi5MLkM9ITEsU2ModGhpcyxpKSx0PXRoaXMuXzticmVha31uLkM9ITAsdD1pLGk9aS5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBhbSxjbSxzbSxmbSxsbSxobT1bXSxwbT1bXSxkbT0xZS02LHZtPTFlLTEyO0tjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2MscG9seWdvbnM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihuKXt2YXIgZT1uLmhhbGZlZGdlcy5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIERjKG4sdFtlXSl9KTtyZXR1cm4gZS5kYXRhPW4uc2l0ZS5kYXRhLGV9KX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sbj10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oZSxyKXtpZihvPShpPWUuaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciBpLG8sdSxhPWUuc2l0ZSxjPS0xLHM9bltpW28tMV1dLGY9cy5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdDsrK2M8bzspdT1mLGY9KHM9bltpW2NdXSkubGVmdD09PWE/cy5yaWdodDpzLmxlZnQsdSYmZiYmcjx1LmluZGV4JiZyPGYuaW5kZXgmJkpjKGEsdSxmKTwwJiZ0LnB1c2goW2EuZGF0YSx1LmRhdGEsZi5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyx1PW8uX2ZvdW5kfHwwLGE9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbdV0pOylpZigrK3U+PWEpcmV0dXJuIG51bGw7dmFyIGM9dC1pLnNpdGVbMF0scz1uLWkuc2l0ZVsxXSxmPWMqYytzKnM7ZG97aT1vLmNlbGxzW3I9dV0sdT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSxhPXIubGVmdDtpZihhIT09aS5zaXRlJiZhfHwoYT1yLnJpZ2h0KSl7dmFyIGM9dC1hWzBdLHM9bi1hWzFdLGw9YypjK3MqcztsPGYmJihmPWwsdT1hLmluZGV4KX19KX13aGlsZShudWxsIT09dSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8Zjw9ZSplP2kuc2l0ZTpudWxsfX07dmFyIF9tPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX07bnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpucyxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgbnModGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBucyh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciB5bT1uZXcgbnMoMSwwLDApO2VzLnByb3RvdHlwZT1ucy5wcm90b3R5cGU7dmFyIGdtPWZ1bmN0aW9uKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9O3QudmVyc2lvbj0iNC4xMC4yIix0LmJpc2VjdD1ocyx0LmJpc2VjdFJpZ2h0PWhzLHQuYmlzZWN0TGVmdD1wcyx0LmFzY2VuZGluZz1zcyx0LmJpc2VjdG9yPWZzLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLHIpe3ZhciBpLG8sdSxhLGM9dC5sZW5ndGgscz1uLmxlbmd0aCxmPW5ldyBBcnJheShjKnMpO2ZvcihudWxsPT1yJiYocj1lKSxpPXU9MDtpPGM7KytpKWZvcihhPXRbaV0sbz0wO288czsrK28sKyt1KWZbdV09cihhLG5bb10pO3JldHVybiBmfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPV9zLHQuZXh0ZW50PXlzLHQuaGlzdG9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1LGE9dC5sZW5ndGgsYz1uZXcgQXJyYXkoYSk7Zm9yKG89MDtvPGE7KytvKWNbb109bih0W29dLG8sdCk7dmFyIHM9ZShjKSxmPXNbMF0sbD1zWzFdLGg9cihjLGYsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9aShmLGwsaCksaD1NcyhNYXRoLmNlaWwoZi9oKSpoLE1hdGguZmxvb3IobC9oKSpoLGgpKTtmb3IodmFyIHA9aC5sZW5ndGg7aFswXTw9ZjspaC5zaGlmdCgpLC0tcDtmb3IoO2hbcC0xXT5sOyloLnBvcCgpLC0tcDt2YXIgZCx2PW5ldyBBcnJheShwKzEpO2ZvcihvPTA7bzw9cDsrK28pKGQ9dltvXT1bXSkueDA9bz4wP2hbby0xXTpmLGQueDE9bzxwP2hbb106bDtmb3Iobz0wO288YTsrK28pZjw9KHU9Y1tvXSkmJnU8PWwmJnZbaHMoaCx1LDAscCldLnB1c2godFtvXSk7cmV0dXJuIHZ9dmFyIG49d3MsZT15cyxyPUVzO3JldHVybiB0LnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6YnMoZSksdCk6bn0sdC5kb21haW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpicyhbblswXSxuWzFdXSksdCk6ZX0sdC50aHJlc2hvbGRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246YnMoQXJyYXkuaXNBcnJheShuKT9tcy5jYWxsKG4pOm4pLHQpOnJ9LHR9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9eHMuY2FsbCh0LGRzKS5zb3J0KHNzKSxNYXRoLmNlaWwoKGUtbikvKDIqKEFzKHQsLjc1KS1Bcyh0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LHQudGhyZXNob2xkU2NvdHQ9ZnVuY3Rpb24odCxuLGUpe3JldHVybiBNYXRoLmNlaWwoKGUtbikvKDMuNSpfcyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9RXMsdC5tYXg9ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9LHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsdT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT1kcyh0W29dKSk/LS1pOnUrPWU7ZWxzZSBmb3IoOysrbzxyOylpc05hTihlPWRzKG4odFtvXSxvLHQpKSk/LS1pOnUrPWU7aWYoaSlyZXR1cm4gdS9pfSx0Lm1lZGlhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT0tMSxvPVtdO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspaXNOYU4oZT1kcyh0W2ldKSl8fG8ucHVzaChlKTtlbHNlIGZvcig7KytpPHI7KWlzTmFOKGU9ZHMobih0W2ldLGksdCkpKXx8by5wdXNoKGUpO3JldHVybiBBcyhvLnNvcnQoc3MpLC41KX0sdC5tZXJnZT1Dcyx0Lm1pbj16cyx0LnBhaXJzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49ZSk7Zm9yKHZhciByPTAsaT10Lmxlbmd0aC0xLG89dFswXSx1PW5ldyBBcnJheShpPDA/MDppKTtyPGk7KXVbcl09bihvLG89dFsrK3JdKTtyZXR1cm4gdX0sdC5wZXJtdXRlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W25bZV1dO3JldHVybiByfSx0LnF1YW50aWxlPUFzLHQucmFuZ2U9TXMsdC5zY2FuPWZ1bmN0aW9uKHQsbil7aWYoZT10Lmxlbmd0aCl7dmFyIGUscixpPTAsbz0wLHU9dFtvXTtmb3IobnVsbD09biYmKG49c3MpOysraTxlOykobihyPXRbaV0sdSk8MHx8MCE9PW4odSx1KSkmJih1PXIsbz1pKTtyZXR1cm4gMD09PW4odSx1KT9vOnZvaWQgMH19LHQuc2h1ZmZsZT1mdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz0obnVsbD09ZT90Lmxlbmd0aDplKS0obj1udWxsPT1uPzA6K24pO287KWk9TWF0aC5yYW5kb20oKSpvLS18MCxyPXRbbytuXSx0W28rbl09dFtpK25dLHRbaStuXT1yO3JldHVybiB0fSx0LnN1bT1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT0tMSxvPTA7aWYobnVsbD09bilmb3IoOysraTxyOykoZT0rdFtpXSkmJihvKz1lKTtlbHNlIGZvcig7KytpPHI7KShlPStuKHRbaV0saSx0KSkmJihvKz1lKTtyZXR1cm4gb30sdC50aWNrcz1Tcyx0LnRpY2tJbmNyZW1lbnQ9cix0LnRpY2tTdGVwPWksdC50cmFuc3Bvc2U9UHMsdC52YXJpYW5jZT12cyx0LnppcD1mdW5jdGlvbigpe3JldHVybiBQcyhhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGwocXMsdCl9LHQuYXhpc1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBsKFVzLHQpfSx0LmF4aXNCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIGwoRHMsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGwoT3MsdCl9LHQuYnJ1c2g9ZnVuY3Rpb24oKXtyZXR1cm4gaGUoU2gpfSx0LmJydXNoWD1mdW5jdGlvbigpe3JldHVybiBoZShraCl9LHQuYnJ1c2hZPWZ1bmN0aW9uKCl7cmV0dXJuIGhlKE5oKX0sdC5icnVzaFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgbj10Ll9fYnJ1c2g7cmV0dXJuIG4/bi5kaW0ub3V0cHV0KG4uc2VsZWN0aW9uKTpudWxsfSx0LmNob3JkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbyx1LGEsYyxzLGYsbD10Lmxlbmd0aCxoPVtdLHA9TXMobCksZD1bXSx2PVtdLF89di5ncm91cHM9bmV3IEFycmF5KGwpLHk9bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxzPS0xOysrczxsOyl7Zm9yKHU9MCxmPS0xOysrZjxsOyl1Kz10W3NdW2ZdO2gucHVzaCh1KSxkLnB1c2goTXMobCkpLG8rPXV9Zm9yKGUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGhbdF0saFtuXSl9KSxyJiZkLmZvckVhY2goZnVuY3Rpb24obixlKXtuLnNvcnQoZnVuY3Rpb24obixpKXtyZXR1cm4gcih0W2VdW25dLHRbZV1baV0pfSl9KSxjPShvPU9oKDAsRGgtbipsKS9vKT9uOkRoL2wsdT0wLHM9LTE7KytzPGw7KXtmb3IoYT11LGY9LTE7KytmPGw7KXt2YXIgZz1wW3NdLG09ZFtnXVtmXSx4PXRbZ11bbV0sYj11LHc9dSs9eCpvO3lbbSpsK2ddPXtpbmRleDpnLHN1YmluZGV4Om0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOncsdmFsdWU6eH19X1tnXT17aW5kZXg6ZyxzdGFydEFuZ2xlOmEsZW5kQW5nbGU6dSx2YWx1ZTpoW2ddfSx1Kz1jfWZvcihzPS0xOysrczxsOylmb3IoZj1zLTE7KytmPGw7KXt2YXIgTT15W2YqbCtzXSxUPXlbcypsK2ZdOyhNLnZhbHVlfHxULnZhbHVlKSYmdi5wdXNoKE0udmFsdWU8VC52YWx1ZT97c291cmNlOlQsdGFyZ2V0Ok19Ontzb3VyY2U6TSx0YXJnZXQ6VH0pfXJldHVybiBpP3Yuc29ydChpKTp2fXZhciBuPTAsZT1udWxsLHI9bnVsbCxpPW51bGw7cmV0dXJuIHQucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49T2goMCxlKSx0KTpufSx0LnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LnNvcnRDaG9yZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/aT1udWxsOihpPXBlKG4pKS5fPW4sdCk6aSYmaS5ffSx0fSx0LnJpYmJvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdCxhPUZoLmNhbGwoYXJndW1lbnRzKSxjPW4uYXBwbHkodGhpcyxhKSxzPWUuYXBwbHkodGhpcyxhKSxmPStyLmFwcGx5KHRoaXMsKGFbMF09YyxhKSksbD1pLmFwcGx5KHRoaXMsYSktVWgsaD1vLmFwcGx5KHRoaXMsYSktVWgscD1mKlJoKGwpLGQ9ZipMaChsKSx2PStyLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksXz1pLmFwcGx5KHRoaXMsYSktVWgseT1vLmFwcGx5KHRoaXMsYSktVWg7aWYodXx8KHU9dD12ZSgpKSx1Lm1vdmVUbyhwLGQpLHUuYXJjKDAsMCxmLGwsaCksbD09PV8mJmg9PT15fHwodS5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KlJoKF8pLHYqTGgoXykpLHUuYXJjKDAsMCx2LF8seSkpLHUucXVhZHJhdGljQ3VydmVUbygwLDAscCxkKSx1LmNsb3NlUGF0aCgpLHQpcmV0dXJuIHU9bnVsbCx0KyIifHxudWxsfXZhciBuPV9lLGU9eWUscj1nZSxpPW1lLG89eGUsdT1udWxsO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkloKCtuKSx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpJaCgrbiksdCk6aX0sdC5lbmRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkloKCtuKSx0KTpvfSx0LnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQudGFyZ2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PW4/bnVsbDpuLHQpOnV9LHR9LHQubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobixpLHUsYSl7aWYoaT49by5sZW5ndGgpcmV0dXJuIG51bGwhPWUmJm4uc29ydChlKSxudWxsIT1yP3Iobik6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPXdlKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsTWUsVGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLGtlLE5lKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxrZSxOZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sdC5zZXQ9RWUsdC5tYXA9d2UsdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaChlKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHRbZV0pO3JldHVybiBufSx0LmVudHJpZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHtrZXk6ZSx2YWx1ZTp0W2VdfSk7cmV0dXJuIG59LHQuY29sb3I9VHQsdC5yZ2I9RXQsdC5oc2w9UHQsdC5sYWI9VXQsdC5oY2w9anQsdC5jdWJlaGVsaXg9JHQsdC5kaXNwYXRjaD1oLHQuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLmZpbHRlcihidCkub24oInRvdWNoc3RhcnQuZHJhZyIsbykub24oInRvdWNobW92ZS5kcmFnIix1KS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIixhKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gZSgpe2lmKCFwJiZkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49YygibW91c2UiLHYuYXBwbHkodGhpcyxhcmd1bWVudHMpLEtzLHRoaXMsYXJndW1lbnRzKTtuJiYoY2YodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLHIsITApLm9uKCJtb3VzZXVwLmRyYWciLGksITApLGxmKHQuZXZlbnQudmlldyksdnQoKSxsPSExLHM9dC5ldmVudC5jbGllbnRYLGY9dC5ldmVudC5jbGllbnRZLG4oInN0YXJ0IikpfX1mdW5jdGlvbiByKCl7aWYoZmYoKSwhbCl7dmFyIG49dC5ldmVudC5jbGllbnRYLXMsZT10LmV2ZW50LmNsaWVudFktZjtsPW4qbitlKmU+eH15Lm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gaSgpe2NmKHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsbnVsbCksX3QodC5ldmVudC52aWV3LGwpLGZmKCkseS5tb3VzZSgiZW5kIil9ZnVuY3Rpb24gbygpe2lmKGQuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXYuYXBwbHkodGhpcyxhcmd1bWVudHMpLG89ci5sZW5ndGg7Zm9yKG49MDtuPG87KytuKShlPWMocltuXS5pZGVudGlmaWVyLGksc2YsdGhpcyxhcmd1bWVudHMpKSYmKHZ0KCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIHUoKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihuPTA7bjxpOysrbikoZT15W3Jbbl0uaWRlbnRpZmllcl0pJiYoZmYoKSxlKCJkcmFnIikpfWZ1bmN0aW9uIGEoKXt2YXIgbixlLHI9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxpPXIubGVuZ3RoO2ZvcihwJiZjbGVhclRpbWVvdXQocCkscD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cD1udWxsfSw1MDApLG49MDtuPGk7KytuKShlPXlbcltuXS5pZGVudGlmaWVyXSkmJih2dCgpLGUoImVuZCIpKX1mdW5jdGlvbiBjKGUscixpLG8sdSl7dmFyIGEsYyxzLGY9aShyLGUpLGw9Zy5jb3B5KCk7aWYoTihuZXcgeXQobiwiYmVmb3Jlc3RhcnQiLGEsZSxtLGZbMF0sZlsxXSwwLDAsbCksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPV8uYXBwbHkobyx1KSkmJihjPWEueC1mWzBdfHwwLHM9YS55LWZbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQoaCl7dmFyIHAsZD1mO3N3aXRjaChoKXtjYXNlInN0YXJ0Ijp5W2VdPXQscD1tKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSB5W2VdLC0tbTtjYXNlImRyYWciOmY9aShyLGUpLHA9bX1OKG5ldyB5dChuLGgsYSxlLHAsZlswXStjLGZbMV0rcyxmWzBdLWRbMF0sZlsxXS1kWzFdLGwpLGwuYXBwbHksbCxbaCxvLHVdKX19dmFyIHMsZixsLHAsZD1ndCx2PW10LF89eHQseT17fSxnPWgoInN0YXJ0IiwiZHJhZyIsImVuZCIpLG09MCx4PTA7cmV0dXJuIG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGYoISF0KSxuKTpkfSxuLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhmKHQpLG4pOnZ9LG4uc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmhmKHQpLG4pOl99LG4ub249ZnVuY3Rpb24oKXt2YXIgdD1nLm9uLmFwcGx5KGcsYXJndW1lbnRzKTtyZXR1cm4gdD09PWc/bjp0fSxuLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9KHQ9K3QpKnQsbik6TWF0aC5zcXJ0KHgpfSxufSx0LmRyYWdEaXNhYmxlPWxmLHQuZHJhZ0VuYWJsZT1fdCx0LmRzdkZvcm1hdD1HaCx0LmNzdlBhcnNlPVFoLHQuY3N2UGFyc2VSb3dzPUtoLHQuY3N2Rm9ybWF0PXRwLHQuY3N2Rm9ybWF0Um93cz1ucCx0LnRzdlBhcnNlPXJwLHQudHN2UGFyc2VSb3dzPWlwLHQudHN2Rm9ybWF0PW9wLHQudHN2Rm9ybWF0Um93cz11cCx0LmVhc2VMaW5lYXI9ZnVuY3Rpb24odCl7cmV0dXJuK3R9LHQuZWFzZVF1YWQ9S24sdC5lYXNlUXVhZEluPWZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LHQuZWFzZVF1YWRPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQqKDItdCl9LHQuZWFzZVF1YWRJbk91dD1Lbix0LmVhc2VDdWJpYz10ZSx0LmVhc2VDdWJpY0luPWZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdH0sdC5lYXNlQ3ViaWNPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuLS10KnQqdCsxfSx0LmVhc2VDdWJpY0luT3V0PXRlLHQuZWFzZVBvbHk9R2wsdC5lYXNlUG9seUluPVdsLHQuZWFzZVBvbHlPdXQ9WmwsdC5lYXNlUG9seUluT3V0PUdsLHQuZWFzZVNpbj1uZSx0LmVhc2VTaW5Jbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KlFsKX0sdC5lYXNlU2luT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNpbih0KlFsKX0sdC5lYXNlU2luSW5PdXQ9bmUsdC5lYXNlRXhwPWVlLHQuZWFzZUV4cEluPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfSx0LmVhc2VFeHBPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqdCl9LHQuZWFzZUV4cEluT3V0PWVlLHQuZWFzZUNpcmNsZT1yZSx0LmVhc2VDaXJjbGVJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSx0LmVhc2VDaXJjbGVPdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLXQqdCl9LHQuZWFzZUNpcmNsZUluT3V0PXJlLHQuZWFzZUJvdW5jZT1pZSx0LmVhc2VCb3VuY2VJbj1mdW5jdGlvbih0KXtyZXR1cm4gMS1pZSgxLXQpfSx0LmVhc2VCb3VuY2VPdXQ9aWUsdC5lYXNlQm91bmNlSW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuKCh0Kj0yKTw9MT8xLWllKDEtdCk6aWUodC0xKSsxKS8yfSx0LmVhc2VCYWNrPWxoLHQuZWFzZUJhY2tJbj1zaCx0LmVhc2VCYWNrT3V0PWZoLHQuZWFzZUJhY2tJbk91dD1saCx0LmVhc2VFbGFzdGljPWRoLHQuZWFzZUVsYXN0aWNJbj1waCx0LmVhc2VFbGFzdGljT3V0PWRoLHQuZWFzZUVsYXN0aWNJbk91dD12aCx0LmZvcmNlQ2VudGVyPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlLGksbz1yLmxlbmd0aCx1PTAsYT0wO2ZvcihlPTA7ZTxvOysrZSl1Kz0oaT1yW2VdKS54LGErPWkueTtmb3IodT11L28tdCxhPWEvby1uLGU9MDtlPG87KytlKShpPXJbZV0pLngtPXUsaS55LT1hfXZhciByO3JldHVybiBudWxsPT10JiYodD0wKSxudWxsPT1uJiYobj0wKSxlLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10fSxlLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZSk6dH0sZS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LGUpOm59LGV9LHQuZm9yY2VDb2xsaWRlPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtmb3IodmFyIHQsbixyLGMscyxmLGwsaD1pLmxlbmd0aCxwPTA7cDxhOysrcClmb3Iobj1xZShpLE9lLEZlKS52aXNpdEFmdGVyKGUpLHQ9MDt0PGg7Kyt0KXI9aVt0XSxmPW9bci5pbmRleF0sbD1mKmYsYz1yLngrci52eCxzPXIueStyLnZ5LG4udmlzaXQoZnVuY3Rpb24odCxuLGUsaSxvKXt2YXIgYT10LmRhdGEsaD10LnIscD1mK2g7aWYoIWEpcmV0dXJuIG4+YytwfHxpPGMtcHx8ZT5zK3B8fG88cy1wO2lmKGEuaW5kZXg+ci5pbmRleCl7dmFyIGQ9Yy1hLngtYS52eCx2PXMtYS55LWEudnksXz1kKmQrdip2O188cCpwJiYoMD09PWQmJihkPWNwKCksXys9ZCpkKSwwPT09diYmKHY9Y3AoKSxfKz12KnYpLF89KHAtKF89TWF0aC5zcXJ0KF8pKSkvXyp1LHIudngrPShkKj1fKSoocD0oaCo9aCkvKGwraCkpLHIudnkrPSh2Kj1fKSpwLGEudngtPWQqKHA9MS1wKSxhLnZ5LT12KnApfX0pfWZ1bmN0aW9uIGUodCl7aWYodC5kYXRhKXJldHVybiB0LnI9b1t0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiByKCl7aWYoaSl7dmFyIG4sZSxyPWkubGVuZ3RoO2ZvcihvPW5ldyBBcnJheShyKSxuPTA7bjxyOysrbillPWlbbl0sb1tlLmluZGV4XT0rdChlLG4saSl9fXZhciBpLG8sdT0xLGE9MTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9YXAobnVsbD09dD8xOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxyKCl9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxuKTphfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6YXAoK2UpLHIoKSxuKTp0fSxufSx0LmZvcmNlTGluaz1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4pe2Zvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxwOysrZSlmb3IodmFyIGksYSxjLGYsbCxoLGQsdj0wO3Y8cjsrK3YpYT0oaT10W3ZdKS5zb3VyY2UsZj0oYz1pLnRhcmdldCkueCtjLnZ4LWEueC1hLnZ4fHxjcCgpLGw9Yy55K2MudnktYS55LWEudnl8fGNwKCksZio9aD0oKGg9TWF0aC5zcXJ0KGYqZitsKmwpKS11W3ZdKS9oKm4qb1t2XSxsKj1oLGMudngtPWYqKGQ9c1t2XSksYy52eS09bCpkLGEudngrPWYqKGQ9MS1kKSxhLnZ5Kz1sKmR9ZnVuY3Rpb24gZSgpe2lmKGEpe3ZhciBuLGUsbD1hLmxlbmd0aCxoPXQubGVuZ3RoLHA9d2UoYSxmKTtmb3Iobj0wLGM9bmV3IEFycmF5KGwpO248aDsrK24pKGU9dFtuXSkuaW5kZXg9biwib2JqZWN0IiE9dHlwZW9mIGUuc291cmNlJiYoZS5zb3VyY2U9WWUocCxlLnNvdXJjZSkpLCJvYmplY3QiIT10eXBlb2YgZS50YXJnZXQmJihlLnRhcmdldD1ZZShwLGUudGFyZ2V0KSksY1tlLnNvdXJjZS5pbmRleF09KGNbZS5zb3VyY2UuaW5kZXhdfHwwKSsxLGNbZS50YXJnZXQuaW5kZXhdPShjW2UudGFyZ2V0LmluZGV4XXx8MCkrMTtmb3Iobj0wLHM9bmV3IEFycmF5KGgpO248aDsrK24pZT10W25dLHNbbl09Y1tlLnNvdXJjZS5pbmRleF0vKGNbZS5zb3VyY2UuaW5kZXhdK2NbZS50YXJnZXQuaW5kZXhdKTtvPW5ldyBBcnJheShoKSxyKCksdT1uZXcgQXJyYXkoaCksaSgpfX1mdW5jdGlvbiByKCl7aWYoYSlmb3IodmFyIG49MCxlPXQubGVuZ3RoO248ZTsrK24pb1tuXT0rbCh0W25dLG4sdCl9ZnVuY3Rpb24gaSgpe2lmKGEpZm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXVbbl09K2godFtuXSxuLHQpfXZhciBvLHUsYSxjLHMsZj1JZSxsPWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGNbdC5zb3VyY2UuaW5kZXhdLGNbdC50YXJnZXQuaW5kZXhdKX0saD1hcCgzMCkscD0xO3JldHVybiBudWxsPT10JiYodD1bXSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2E9dCxlKCl9LG4ubGlua3M9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9cixlKCksbik6dH0sbi5pZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10LG4pOmZ9LG4uaXRlcmF0aW9ucz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdCxuKTpwfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YXAoK3QpLHIoKSxuKTpsfSxuLmRpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YXAoK3QpLGkoKSxuKTpofSxufSx0LmZvcmNlTWFueUJvZHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBuLGE9aS5sZW5ndGgsYz1xZShpLEJlLGplKS52aXNpdEFmdGVyKGUpO2Zvcih1PXQsbj0wO248YTsrK24pbz1pW25dLGMudmlzaXQocil9ZnVuY3Rpb24gbigpe2lmKGkpe3ZhciB0LG4sZT1pLmxlbmd0aDtmb3IoYT1uZXcgQXJyYXkoZSksdD0wO3Q8ZTsrK3Qpbj1pW3RdLGFbbi5pbmRleF09K2Mobix0LGkpfX1mdW5jdGlvbiBlKHQpe3ZhciBuLGUscixpLG8sdT0wO2lmKHQubGVuZ3RoKXtmb3Iocj1pPW89MDtvPDQ7KytvKShuPXRbb10pJiYoZT1uLnZhbHVlKSYmKHUrPWUscis9ZSpuLngsaSs9ZSpuLnkpO3QueD1yL3UsdC55PWkvdX1lbHNleyhuPXQpLng9bi5kYXRhLngsbi55PW4uZGF0YS55O2Rve3UrPWFbbi5kYXRhLmluZGV4XX13aGlsZShuPW4ubmV4dCl9dC52YWx1ZT11fWZ1bmN0aW9uIHIodCxuLGUscil7aWYoIXQudmFsdWUpcmV0dXJuITA7dmFyIGk9dC54LW8ueCxjPXQueS1vLnksaD1yLW4scD1pKmkrYypjO2lmKGgqaC9sPHApcmV0dXJuIHA8ZiYmKDA9PT1pJiYoaT1jcCgpLHArPWkqaSksMD09PWMmJihjPWNwKCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSxvLnZ4Kz1pKnQudmFsdWUqdS9wLG8udnkrPWMqdC52YWx1ZSp1L3ApLCEwO2lmKCEodC5sZW5ndGh8fHA+PWYpKXsodC5kYXRhIT09b3x8dC5uZXh0KSYmKDA9PT1pJiYoaT1jcCgpLHArPWkqaSksMD09PWMmJihjPWNwKCkscCs9YypjKSxwPHMmJihwPU1hdGguc3FydChzKnApKSk7ZG97dC5kYXRhIT09byYmKGg9YVt0LmRhdGEuaW5kZXhdKnUvcCxvLnZ4Kz1pKmgsby52eSs9YypoKX13aGlsZSh0PXQubmV4dCl9fXZhciBpLG8sdSxhLGM9YXAoLTMwKSxzPTEsZj0xLzAsbD0uODE7cmV0dXJuIHQuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQsbigpfSx0LnN0cmVuZ3RoPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6YXAoK2UpLG4oKSx0KTpjfSx0LmRpc3RhbmNlTWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPW4qbix0KTpNYXRoLnNxcnQocyl9LHQuZGlzdGFuY2VNYXg9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9bipuLHQpOk1hdGguc3FydChmKX0sdC50aGV0YT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uKm4sdCk6TWF0aC5zcXJ0KGwpfSx0fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7ZSgpLGQuY2FsbCgidGljayIsbyksdTxhJiYocC5zdG9wKCksZC5jYWxsKCJlbmQiLG8pKX1mdW5jdGlvbiBlKCl7dmFyIG4sZSxyPXQubGVuZ3RoO2Zvcih1Kz0ocy11KSpjLGwuZWFjaChmdW5jdGlvbih0KXt0KHUpfSksbj0wO248cjsrK24pbnVsbD09KGU9dFtuXSkuZng/ZS54Kz1lLnZ4Kj1mOihlLng9ZS5meCxlLnZ4PTApLG51bGw9PWUuZnk/ZS55Kz1lLnZ5Kj1mOihlLnk9ZS5meSxlLnZ5PTApfWZ1bmN0aW9uIHIoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYobj10W2VdLG4uaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1ocCpNYXRoLnNxcnQoZSksbz1lKnBwO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBpKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXZhciBvLHU9MSxhPS4wMDEsYz0xLU1hdGgucG93KGEsMS8zMDApLHM9MCxmPS42LGw9d2UoKSxwPWRuKG4pLGQ9aCgidGljayIsImVuZCIpO3JldHVybiBudWxsPT10JiYodD1bXSkscigpLG89e3RpY2s6ZSxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHAucmVzdGFydChuKSxvfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIHAuc3RvcCgpLG99LG5vZGVzOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4scigpLGwuZWFjaChpKSxvKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxvKTp1fSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxvKTphfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LG8pOitjfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCxvKTpzfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPTEtdCxvKToxLWZ9LGZvcmNlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09bj9sLnJlbW92ZSh0KTpsLnNldCh0LGkobikpLG8pOmwuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLHUsYSxjLHM9MCxmPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIscz0wO3M8ZjsrK3MpKHU9KGk9bi0oYT10W3NdKS54KSppKyhvPWUtYS55KSpvKTxyJiYoYz1hLHI9dSk7cmV0dXJuIGN9LG9uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oZC5vbih0LG4pLG8pOmQub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSkobj1yW2VdKS52eCs9KG9bZV0tbi54KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT1hcCguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWFwKG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6YXAoK3QpLGUoKSxuKTp1fSxuLng9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjphcCgrciksZSgpLG4pOnR9LG59LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4odCl7Zm9yKHZhciBuLGU9MCx1PXIubGVuZ3RoO2U8dTsrK2UpKG49cltlXSkudnkrPShvW2VdLW4ueSkqaVtlXSp0fWZ1bmN0aW9uIGUoKXtpZihyKXt2YXIgbixlPXIubGVuZ3RoO2ZvcihpPW5ldyBBcnJheShlKSxvPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilpW25dPWlzTmFOKG9bbl09K3QocltuXSxuLHIpKT8wOit1KHJbbl0sbixyKX19dmFyIHIsaSxvLHU9YXAoLjEpO3JldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1hcChudWxsPT10PzA6K3QpKSxuLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGUoKX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmFwKCt0KSxlKCksbik6dX0sbi55PWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6YXAoK3IpLGUoKSxuKTp0fSxufSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9JGUsdC5mb3JtYXRMb2NhbGU9VHAsdC5mb3JtYXRTcGVjaWZpZXI9SGUsdC5wcmVjaXNpb25GaXhlZD1rcCx0LnByZWNpc2lvblByZWZpeD1OcCx0LnByZWNpc2lvblJvdW5kPVNwLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gQ2QucmVzZXQoKSxFZCh0LHpkKSwyKkNkfSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLHUsYTtpZihEcD1VcD0tKExwPXFwPTEvMCksQnA9W10sRWQodCxSZCksZT1CcC5sZW5ndGgpe2ZvcihCcC5zb3J0KGJyKSxuPTEsbz1bcj1CcFswXV07bjxlOysrbil3cihyLChpPUJwW25dKVswXSl8fHdyKHIsaVsxXSk/KHhyKHJbMF0saVsxXSk+eHIoclswXSxyWzFdKSYmKHJbMV09aVsxXSkseHIoaVswXSxyWzFdKT54cihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKHU9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwoYT14cihyWzFdLGlbMF0pKT51JiYodT1hLExwPWlbMF0sVXA9clsxXSl9cmV0dXJuIEJwPWpwPW51bGwsTHA9PT0xLzB8fHFwPT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0xwLHFwXSxbVXAsRHBdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtIcD1YcD0kcD1WcD1XcD1acD1HcD1KcD1RcD1LcD10ZD0wLEVkKHQsTGQpO3ZhciBuPVFwLGU9S3Ascj10ZCxpPW4qbitlKmUrcipyO3JldHVybiBpPDFlLTEyJiYobj1acCxlPUdwLHI9SnAsWHA8YWQmJihuPSRwLGU9VnAscj1XcCksKGk9bipuK2UqZStyKnIpPDFlLTEyKT9bTmFOLE5hTl06W19kKGUsbikqaGQsR2Uoci9UZChpKSkqaGRdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxhPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKnBkLGM9by5hcHBseSh0aGlzLGFyZ3VtZW50cykqcGQ7cmV0dXJuIG49W10sZT1McigtdFswXSpwZCwtdFsxXSpwZCwwKS5pbnZlcnQsT3IodSxhLGMsMSksdD17dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W25dfSxuPWU9bnVsbCx0fXZhciBuLGUscj1xZChbMCwwXSksaT1xZCg5MCksbz1xZCg2KSx1PXtwb2ludDpmdW5jdGlvbih0LHIpe24ucHVzaCh0PWUodCxyKSksdFswXSo9aGQsdFsxXSo9aGR9fTtyZXR1cm4gdC5jZW50ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpxZChbK25bMF0sK25bMV1dKSx0KTpyfSx0LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnFkKCtuKSx0KTppfSx0LnByZWNpc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnFkKCtuKSx0KTpvfSx0fSx0Lmdlb0NsaXBFeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscj0wLGk9MCxvPTk2MCx1PTUwMDtyZXR1cm4gZT17c3RyZWFtOmZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OnQ9QnIocixpLG8sdSkobj1lKX0sZXh0ZW50OmZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSthWzBdWzBdLGk9K2FbMF1bMV0sbz0rYVsxXVswXSx1PSthWzFdWzFdLHQ9bj1udWxsLGUpOltbcixpXSxbbyx1XV19fX0sdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZzdi5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP3N2W3QudHlwZV06JHIpKHQsbil9LHQuZ2VvRGlzdGFuY2U9Y3YsdC5nZW9HcmF0aWN1bGU9dGksdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiB0aSgpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKnBkLHI9dFsxXSpwZCxpPW5bMF0qcGQsbz1uWzFdKnBkLHU9eWQociksYT13ZChyKSxjPXlkKG8pLHM9d2QobyksZj11KnlkKGUpLGw9dSp3ZChlKSxoPWMqeWQoaSkscD1jKndkKGkpLGQ9MipHZShUZChKZShvLXIpK3UqYypKZShpLWUpKSksdj13ZChkKSxfPWQ/ZnVuY3Rpb24odCl7dmFyIG49d2QodCo9ZCkvdixlPXdkKGQtdCkvdixyPWUqZituKmgsaT1lKmwrbipwLG89ZSphK24qcztyZXR1cm5bX2QoaSxyKSpoZCxfZChvLFRkKHIqcitpKmkpKSpoZF19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqaGQscipoZF19O3JldHVybiBfLmRpc3RhbmNlPWQsX30sdC5nZW9MZW5ndGg9b3YsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCYmKCJmdW5jdGlvbiI9PXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKCtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksRWQodCxyKGkpKSksaS5yZXN1bHQoKX12YXIgcixpLG89NC41O3JldHVybiBlLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIEVkKHQscihkdikpLGR2LnJlc3VsdCgpfSxlLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIEVkKHQscihVdikpLFV2LnJlc3VsdCgpfSxlLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gRWQodCxyKG12KSksbXYucmVzdWx0KCl9LGUuY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIEVkKHQscihBdikpLEF2LnJlc3VsdCgpfSxlLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj8odD1udWxsLGx2KToodD1uKS5zdHJlYW0sZSk6dH0sZS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/KG49bnVsbCxuZXcgeWkpOm5ldyBkaShuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBvJiZpLnBvaW50UmFkaXVzKG8pLGUpOm59LGUucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooaS5wb2ludFJhZGl1cygrdCksK3QpLGUpOm99LGUucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ydix0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG49dFswXSxlPXRbMV07cmV0dXJuIGE9bnVsbCxpLnBvaW50KG4sZSksYXx8KG8ucG9pbnQobixlKSxhKXx8KHUucG9pbnQobixlKSxhKX1mdW5jdGlvbiBuKCl7cmV0dXJuIGU9cj1udWxsLHR9dmFyIGUscixpLG8sdSxhLGM9WHYoKSxzPUh2KCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxmPUh2KCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGw9e3BvaW50OmZ1bmN0aW9uKHQsbil7YT1bdCxuXX19O3JldHVybiB0LmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1jLnNjYWxlKCksZT1jLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND9zOmk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjpjKS5pbnZlcnQodCl9LHQuc3RyZWFtPWZ1bmN0aW9uKHQpe3JldHVybiBlJiZyPT09dD9lOmU9UmkoW2Muc3RyZWFtKHI9dCkscy5zdHJlYW0odCksZi5zdHJlYW0odCldKX0sdC5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMucHJlY2lzaW9uKHQpLHMucHJlY2lzaW9uKHQpLGYucHJlY2lzaW9uKHQpLG4oKSk6Yy5wcmVjaXNpb24oKX0sdC5zY2FsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYy5zY2FsZShuKSxzLnNjYWxlKC4zNSpuKSxmLnNjYWxlKG4pLHQudHJhbnNsYXRlKGMudHJhbnNsYXRlKCkpKTpjLnNjYWxlKCl9LHQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBjLnRyYW5zbGF0ZSgpO3ZhciBlPWMuc2NhbGUoKSxyPSt0WzBdLGE9K3RbMV07cmV0dXJuIGk9Yy50cmFuc2xhdGUodCkuY2xpcEV4dGVudChbW3ItLjQ1NSplLGEtLjIzOCplXSxbcisuNDU1KmUsYSsuMjM4KmVdXSkuc3RyZWFtKGwpLG89cy50cmFuc2xhdGUoW3ItLjMwNyplLGErLjIwMSplXSkuY2xpcEV4dGVudChbW3ItLjQyNSplK2FkLGErLjEyKmUrYWRdLFtyLS4yMTQqZS1hZCxhKy4yMzQqZS1hZF1dKS5zdHJlYW0obCksdT1mLnRyYW5zbGF0ZShbci0uMjA1KmUsYSsuMjEyKmVdKS5jbGlwRXh0ZW50KFtbci0uMjE0KmUrYWQsYSsuMTY2KmUrYWRdLFtyLS4xMTUqZS1hZCxhKy4yMzQqZS1hZF1dKS5zdHJlYW0obCksbigpfSx0LmZpdEV4dGVudD1mdW5jdGlvbihuLGUpe3JldHVybiBUaSh0LG4sZSl9LHQuZml0U2l6ZT1mdW5jdGlvbihuLGUpe3JldHVybiBraSh0LG4sZSl9LHQuc2NhbGUoMTA3MCl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIEVpKCR2KS5zY2FsZSgxMjQuNzUpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWFSYXc9JHYsdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBFaShWdikuc2NhbGUoNzkuNDE4OCkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3PVZ2LHQuZ2VvQ29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gQ2koRmkpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LHQuZ2VvQ29uaWNDb25mb3JtYWxSYXc9RmksdC5nZW9Db25pY0VxdWFsQXJlYT1Idix0Lmdlb0NvbmljRXF1YWxBcmVhUmF3PVBpLHQuZ2VvQ29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBDaShZaSkuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sdC5nZW9Db25pY0VxdWlkaXN0YW50UmF3PVlpLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIEVpKElpKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1JaSx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIEVpKEJpKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUJpLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7cmV0dXJuIGk9bz1udWxsLHV9dmFyIG4sZSxyLGksbyx1LGE9MSxjPTAscz0wLGY9MSxsPTEsaD1sdixwPW51bGwsZD1sdjtyZXR1cm4gdT17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBpJiZvPT09dD9pOmk9aChkKG89dCkpfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PWk/KHA9bj1lPXI9bnVsbCxsdik6QnIocD0raVswXVswXSxuPStpWzBdWzFdLGU9K2lbMV1bMF0scj0raVsxXVsxXSksdCgpKTpudWxsPT1wP251bGw6W1twLG5dLFtlLHJdXX0sc2NhbGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9amkoKGE9K24pKmYsYSpsLGMscyksdCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9amkoYSpmLGEqbCxjPStuWzBdLHM9K25bMV0pLHQoKSk6W2Msc119LHJlZmxlY3RYOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPWppKGEqKGY9bj8tMToxKSxhKmwsYyxzKSx0KCkpOmY8MH0scmVmbGVjdFk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9amkoYSpmLGEqKGw9bj8tMToxKSxjLHMpLHQoKSk6bDwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gVGkodSx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGtpKHUsdCxuKX19fSx0Lmdlb1Byb2plY3Rpb249RWksdC5nZW9Qcm9qZWN0aW9uTXV0YXRvcj1BaSx0Lmdlb01lcmNhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIERpKFVpKS5zY2FsZSg5NjEvbGQpfSx0Lmdlb01lcmNhdG9yUmF3PVVpLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIEVpKEhpKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK2FkKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9SGksdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIEVpKFhpKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9WGksdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1EaSgkaSksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdz0kaSx0Lmdlb1JvdGF0aW9uPVdkLHQuZ2VvU3RyZWFtPUVkLHQuZ2VvVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06d2kodCl9fSx0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHU9MDt0LmVhY2hBZnRlcihmdW5jdGlvbih0KXt2YXIgZT10LmNoaWxkcmVuO2U/KHQueD1XaShlKSx0Lnk9R2koZSkpOih0Lng9bz91Kz1uKHQsbyk6MCx0Lnk9MCxvPXQpfSk7dmFyIGE9UWkodCksYz1LaSh0KSxzPWEueC1uKGEsYykvMixmPWMueCtuKGMsYSkvMjtyZXR1cm4gdC5lYWNoQWZ0ZXIoaT9mdW5jdGlvbihuKXtuLng9KG4ueC10LngpKmUsbi55PSh0Lnktbi55KSpyfTpmdW5jdGlvbihuKXtuLng9KG4ueC1zKS8oZi1zKSplLG4ueT0oMS0odC55P24ueS90Lnk6MSkpKnJ9KX12YXIgbj1WaSxlPTEscj0xLGk9ITE7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPStuWzBdLHI9K25bMV0sdCk6aT9udWxsOltlLHJdfSx0Lm5vZGVTaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K25bMF0scj0rblsxXSx0KTppP1tlLHJdOm51bGx9LHR9LHQuaGllcmFyY2h5PWVvLHQucGFjaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQueD1lLzIsdC55PXIvMixuP3QuZWFjaEJlZm9yZShObyhuKSkuZWFjaEFmdGVyKFNvKGksLjUpKS5lYWNoQmVmb3JlKEVvKDEpKTp0LmVhY2hCZWZvcmUoTm8oa28pKS5lYWNoQWZ0ZXIoU28oVG8sMSkpLmVhY2hBZnRlcihTbyhpLHQuci9NYXRoLm1pbihlLHIpKSkuZWFjaEJlZm9yZShFbyhNYXRoLm1pbihlLHIpLygyKnQucikpKSx0fXZhciBuPW51bGwsZT0xLHI9MSxpPVRvO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj13byhlKSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R3YoK24pLHQpOml9LHR9LHQucGFja1NpYmxpbmdzPWZ1bmN0aW9uKHQpe3JldHVybiBibyh0KSx0fSx0LnBhY2tFbmNsb3NlPVp2LHQucGFydGl0aW9uPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgdT10LmhlaWdodCsxO3JldHVybiB0LngwPXQueTA9aSx0LngxPWUsdC55MT1yL3UsdC5lYWNoQmVmb3JlKG4ocix1KSksbyYmdC5lYWNoQmVmb3JlKEp2KSx0fWZ1bmN0aW9uIG4odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbiYmUXYoZSxlLngwLHQqKGUuZGVwdGgrMSkvbixlLngxLHQqKGUuZGVwdGgrMikvbik7dmFyIHI9ZS54MCxvPWUueTAsdT1lLngxLWksYT1lLnkxLWk7dTxyJiYocj11PShyK3UpLzIpLGE8byYmKG89YT0obythKS8yKSxlLngwPXIsZS55MD1vLGUueDE9dSxlLnkxPWF9fXZhciBlPTEscj0xLGk9MCxvPSExO3JldHVybiB0LnJvdW5kPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhbix0KTpvfSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K25bMF0scj0rblsxXSx0KTpbZSxyXX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuLHQpOml9LHR9LHQuc3RyYXRpZnk9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciByLGksbyx1LGEsYyxzLGY9dC5sZW5ndGgsbD1uZXcgQXJyYXkoZiksaD17fTtmb3IoaT0wO2k8ZjsrK2kpcj10W2ldLGE9bFtpXT1uZXcgdW8ociksbnVsbCE9KGM9bihyLGksdCkpJiYoYys9IiIpJiYoaFtzPUt2KyhhLmlkPWMpXT1zIGluIGg/bl86YSk7Zm9yKGk9MDtpPGY7KytpKWlmKGE9bFtpXSxudWxsIT0oYz1lKHRbaV0saSx0KSkmJihjKz0iIikpe2lmKCEodT1oW0t2K2NdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrYyk7aWYodT09PW5fKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2MpO3UuY2hpbGRyZW4/dS5jaGlsZHJlbi5wdXNoKGEpOnUuY2hpbGRyZW49W2FdLGEucGFyZW50PXV9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPWF9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9dF8sby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLWZ9KS5lYWNoQmVmb3JlKG9vKSxvLnBhcmVudD1udWxsLGY+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99dmFyIG49QW8sZT1DbztyZXR1cm4gdC5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1NbyhlKSx0KTpufSx0LnBhcmVudElkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPU1vKG4pLHQpOmV9LHR9LHQudHJlZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIHI9T28odCk7aWYoci5lYWNoQWZ0ZXIobiksci5wYXJlbnQubT0tci56LHIuZWFjaEJlZm9yZShlKSxjKXQuZWFjaEJlZm9yZShpKTtlbHNle3ZhciBzPXQsZj10LGw9dDt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PHMueCYmKHM9dCksdC54PmYueCYmKGY9dCksdC5kZXB0aD5sLmRlcHRoJiYobD10KX0pO3ZhciBoPXM9PT1mPzE6byhzLGYpLzIscD1oLXMueCxkPXUvKGYueCtoK3ApLHY9YS8obC5kZXB0aHx8MSk7dC5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QueD0odC54K3ApKmQsdC55PXQuZGVwdGgqdn0pfXJldHVybiB0fWZ1bmN0aW9uIG4odCl7dmFyIG49dC5jaGlsZHJlbixlPXQucGFyZW50LmNoaWxkcmVuLGk9dC5pP2VbdC5pLTFdOm51bGw7aWYobil7cW8odCk7dmFyIHU9KG5bMF0ueituW24ubGVuZ3RoLTFdLnopLzI7aT8odC56PWkueitvKHQuXyxpLl8pLHQubT10LnotdSk6dC56PXV9ZWxzZSBpJiYodC56PWkueitvKHQuXyxpLl8pKTt0LnBhcmVudC5BPXIodCxpLHQucGFyZW50LkF8fGVbMF0pfWZ1bmN0aW9uIGUodCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIHIodCxuLGUpe2lmKG4pe2Zvcih2YXIgcixpPXQsdT10LGE9bixjPWkucGFyZW50LmNoaWxkcmVuWzBdLHM9aS5tLGY9dS5tLGw9YS5tLGg9Yy5tO2E9Um8oYSksaT1QbyhpKSxhJiZpOyljPVBvKGMpLCh1PVJvKHUpKS5hPXQsKHI9YS56K2wtaS56LXMrbyhhLl8saS5fKSk+MCYmKExvKFVvKGEsdCxlKSx0LHIpLHMrPXIsZis9ciksbCs9YS5tLHMrPWkubSxoKz1jLm0sZis9dS5tO2EmJiFSbyh1KSYmKHUudD1hLHUubSs9bC1mKSxpJiYhUG8oYykmJihjLnQ9aSxjLm0rPXMtaCxlPXQpfXJldHVybiBlfWZ1bmN0aW9uIGkodCl7dC54Kj11LHQueT10LmRlcHRoKmF9dmFyIG89em8sdT0xLGE9MSxjPW51bGw7cmV0dXJuIHQuc2VwYXJhdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0hMSx1PStuWzBdLGE9K25bMV0sdCk6Yz9udWxsOlt1LGFdfSx0Lm5vZGVTaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSEwLHU9K25bMF0sYT0rblsxXSx0KTpjP1t1LGFdOm51bGx9LHR9LHQudHJlZW1hcD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9aSx0LnkxPW8sdC5lYWNoQmVmb3JlKG4pLHU9WzBdLHImJnQuZWFjaEJlZm9yZShKdiksdH1mdW5jdGlvbiBuKHQpe3ZhciBuPXVbdC5kZXB0aF0scj10LngwK24saT10LnkwK24sbz10LngxLW4saD10LnkxLW47bzxyJiYocj1vPShyK28pLzIpLGg8aSYmKGk9aD0oaStoKS8yKSx0LngwPXIsdC55MD1pLHQueDE9byx0LnkxPWgsdC5jaGlsZHJlbiYmKG49dVt0LmRlcHRoKzFdPWEodCkvMixyKz1sKHQpLW4saSs9Yyh0KS1uLG8tPXModCktbixoLT1mKHQpLW4sbzxyJiYocj1vPShyK28pLzIpLGg8aSYmKGk9aD0oaStoKS8yKSxlKHQscixpLG8saCkpfXZhciBlPWlfLHI9ITEsaT0xLG89MSx1PVswXSxhPVRvLGM9VG8scz1UbyxmPVRvLGw9VG87cmV0dXJuIHQucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ISFuLHQpOnJ9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rblswXSxvPStuWzFdLHQpOltpLG9dfSx0LnRpbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9TW8obiksdCk6ZX0sdC5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QucGFkZGluZ0lubmVyKG4pLnBhZGRpbmdPdXRlcihuKTp0LnBhZGRpbmdJbm5lcigpfSx0LnBhZGRpbmdJbm5lcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkd2KCtuKSx0KTphfSx0LnBhZGRpbmdPdXRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LnBhZGRpbmdUb3AobikucGFkZGluZ1JpZ2h0KG4pLnBhZGRpbmdCb3R0b20obikucGFkZGluZ0xlZnQobik6dC5wYWRkaW5nVG9wKCl9LHQucGFkZGluZ1RvcD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkd2KCtuKSx0KTpjfSx0LnBhZGRpbmdSaWdodD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkd2KCtuKSx0KTpzfSx0LnBhZGRpbmdCb3R0b209ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHdigrbiksdCk6Zn0sdC5wYWRkaW5nTGVmdD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkd2KCtuKSx0KTpsfSx0fSx0LnRyZWVtYXBCaW5hcnk9ZnVuY3Rpb24odCxuLGUscixpKXtmdW5jdGlvbiBvKHQsbixlLHIsaSx1LGEpe2lmKHQ+PW4tMSl7dmFyIHM9Y1t0XTtyZXR1cm4gcy54MD1yLHMueTA9aSxzLngxPXUsdm9pZChzLnkxPWEpfWZvcih2YXIgbD1mW3RdLGg9ZS8yK2wscD10KzEsZD1uLTE7cDxkOyl7dmFyIHY9cCtkPj4+MTtmW3ZdPGg/cD12KzE6ZD12fWgtZltwLTFdPGZbcF0taCYmdCsxPHAmJi0tcDt2YXIgXz1mW3BdLWwseT1lLV87aWYodS1yPmEtaSl7dmFyIGc9KHIqeSt1Kl8pL2U7byh0LHAsXyxyLGksZyxhKSxvKHAsbix5LGcsaSx1LGEpfWVsc2V7dmFyIG09KGkqeSthKl8pL2U7byh0LHAsXyxyLGksdSxtKSxvKHAsbix5LHIsbSx1LGEpfX12YXIgdSxhLGM9dC5jaGlsZHJlbixzPWMubGVuZ3RoLGY9bmV3IEFycmF5KHMrMSk7Zm9yKGZbMF09YT11PTA7dTxzOysrdSlmW3UrMV09YSs9Y1t1XS52YWx1ZTtvKDAscyx0LnZhbHVlLG4sZSxyLGkpfSx0LnRyZWVtYXBEaWNlPVF2LHQudHJlZW1hcFNsaWNlPWVfLHQudHJlZW1hcFNsaWNlRGljZT1mdW5jdGlvbih0LG4sZSxyLGkpeygxJnQuZGVwdGg/ZV86UXYpKHQsbixlLHIsaSl9LHQudHJlZW1hcFNxdWFyaWZ5PWlfLHQudHJlZW1hcFJlc3F1YXJpZnk9b18sdC5pbnRlcnBvbGF0ZT1jbCx0LmludGVycG9sYXRlQXJyYXk9bmwsdC5pbnRlcnBvbGF0ZUJhc2lzPVpmLHQuaW50ZXJwb2xhdGVCYXNpc0Nsb3NlZD1HZix0LmludGVycG9sYXRlRGF0ZT1lbCx0LmludGVycG9sYXRlTnVtYmVyPXJsLHQuaW50ZXJwb2xhdGVPYmplY3Q9aWwsdC5pbnRlcnBvbGF0ZVJvdW5kPXNsLHQuaW50ZXJwb2xhdGVTdHJpbmc9YWwsdC5pbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcz1wbCx0LmludGVycG9sYXRlVHJhbnNmb3JtU3ZnPWRsLHQuaW50ZXJwb2xhdGVab29tPV9sLHQuaW50ZXJwb2xhdGVSZ2I9UWYsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzPUtmLHQuaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZD10bCx0LmludGVycG9sYXRlSHNsPXlsLHQuaW50ZXJwb2xhdGVIc2xMb25nPWdsLHQuaW50ZXJwb2xhdGVMYWI9ZnVuY3Rpb24odCxuKXt2YXIgZT1LdCgodD1VdCh0KSkubCwobj1VdChuKSkubCkscj1LdCh0LmEsbi5hKSxpPUt0KHQuYixuLmIpLG89S3QodC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmw9ZShuKSx0LmE9cihuKSx0LmI9aShuKSx0Lm9wYWNpdHk9byhuKSx0KyIifX0sdC5pbnRlcnBvbGF0ZUhjbD1tbCx0LmludGVycG9sYXRlSGNsTG9uZz14bCx0LmludGVycG9sYXRlQ3ViZWhlbGl4PWJsLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhMb25nPXdsLHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPXZlLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLHU9MCxhPXRbaS0xXSxjPTA7KytyPGk7KW49YSxhPXRbcl0sYys9ZT1uWzBdKmFbMV0tYVswXSpuWzFdLG8rPShuWzBdK2FbMF0pKmUsdSs9KG5bMV0rYVsxXSkqZTtyZXR1cm4gYyo9Myxbby9jLHUvY119LHQucG9seWdvbkh1bGw9ZnVuY3Rpb24odCl7aWYoKGU9dC5sZW5ndGgpPDMpcmV0dXJuIG51bGw7dmFyIG4sZSxyPW5ldyBBcnJheShlKSxpPW5ldyBBcnJheShlKTtmb3Iobj0wO248ZTsrK24pcltuXT1bK3Rbbl1bMF0sK3Rbbl1bMV0sbl07Zm9yKHIuc29ydChJbyksbj0wO248ZTsrK24paVtuXT1bcltuXVswXSwtcltuXVsxXV07dmFyIG89WW8ociksdT1ZbyhpKSxhPXVbMF09PT1vWzBdLGM9dVt1Lmxlbmd0aC0xXT09PW9bby5sZW5ndGgtMV0scz1bXTtmb3Iobj1vLmxlbmd0aC0xO24+PTA7LS1uKXMucHVzaCh0W3Jbb1tuXV1bMl1dKTtmb3Iobj0rYTtuPHUubGVuZ3RoLWM7KytuKXMucHVzaCh0W3JbdVtuXV1bMl1dKTtyZXR1cm4gc30sdC5wb2x5Z29uQ29udGFpbnM9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscixpPXQubGVuZ3RoLG89dFtpLTFdLHU9blswXSxhPW5bMV0sYz1vWzBdLHM9b1sxXSxmPSExLGw9MDtsPGk7KytsKWU9KG89dFtsXSlbMF0sKHI9b1sxXSk+YSE9cz5hJiZ1PChjLWUpKihhLXIpLyhzLXIpK2UmJihmPSFmKSxjPWUscz1yO3JldHVybiBmfSx0LnBvbHlnb25MZW5ndGg9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj0tMSxpPXQubGVuZ3RoLG89dFtpLTFdLHU9b1swXSxhPW9bMV0sYz0wOysrcjxpOyluPXUsZT1hLG4tPXU9KG89dFtyXSlbMF0sZS09YT1vWzFdLGMrPU1hdGguc3FydChuKm4rZSplKTtyZXR1cm4gY30sdC5xdWFkdHJlZT1xZSx0LnF1ZXVlPVdvLHQucmFuZG9tVW5pZm9ybT1mXyx0LnJhbmRvbU5vcm1hbD1sXyx0LnJhbmRvbUxvZ05vcm1hbD1oXyx0LnJhbmRvbUJhdGVzPWRfLHQucmFuZG9tSXJ3aW5IYWxsPXBfLHQucmFuZG9tRXhwb25lbnRpYWw9dl8sdC5yZXF1ZXN0PV9fLHQuaHRtbD1nXyx0Lmpzb249bV8sdC50ZXh0PXhfLHQueG1sPWJfLHQuY3N2PU1fLHQudHN2PVRfLHQuc2NhbGVCYW5kPUtvLHQuc2NhbGVQb2ludD1mdW5jdGlvbigpe3JldHVybiB0dShLbygpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdSx0LnNjYWxlTGluZWFyPXN1LHQuc2NhbGVMb2c9eXUsdC5zY2FsZU9yZGluYWw9UW8sdC5zY2FsZUltcGxpY2l0PUVfLHQuc2NhbGVQb3c9bXUsdC5zY2FsZVNxcnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbXUoKS5leHBvbmVudCguNSl9LHQuc2NhbGVRdWFudGlsZT14dSx0LnNjYWxlUXVhbnRpemU9YnUsdC5zY2FsZVRocmVzaG9sZD13dSx0LnNjYWxlVGltZT1mdW5jdGlvbigpe3JldHVybiBOYShmeSxjeSxXXywkXyxIXyxCXyxJXyxVXyx0LnRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sdC5zY2FsZVV0Yz1mdW5jdGlvbigpe3JldHVybiBOYShMeSxQeSxneSxfeSxkeSxoeSxJXyxVXyx0LnV0Y0Zvcm1hdCkuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pfSx0LnNjaGVtZUNhdGVnb3J5MTA9SnksdC5zY2hlbWVDYXRlZ29yeTIwYj1ReSx0LnNjaGVtZUNhdGVnb3J5MjBjPUt5LHQuc2NoZW1lQ2F0ZWdvcnkyMD10Zyx0LmludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdD1uZyx0LmludGVycG9sYXRlUmFpbmJvdz1mdW5jdGlvbih0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIG49TWF0aC5hYnModC0uNSk7cmV0dXJuIGlnLmg9MzYwKnQtMTAwLGlnLnM9MS41LTEuNSpuLGlnLmw9LjgtLjkqbixpZysiIn0sdC5pbnRlcnBvbGF0ZVdhcm09ZWcsdC5pbnRlcnBvbGF0ZUNvb2w9cmcsdC5pbnRlcnBvbGF0ZVZpcmlkaXM9b2csdC5pbnRlcnBvbGF0ZU1hZ21hPXVnLHQuaW50ZXJwb2xhdGVJbmZlcm5vPWFnLHQuaW50ZXJwb2xhdGVQbGFzbWE9Y2csdC5zY2FsZVNlcXVlbnRpYWw9RWEsdC5jcmVhdG9yPUhzLHQubG9jYWw9bSx0Lm1hdGNoZXI9WnMsdC5tb3VzZT1Lcyx0Lm5hbWVzcGFjZT1qcyx0Lm5hbWVzcGFjZXM9QnMsdC5zZWxlY3Q9Y2YsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBwdChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBwdChbbnVsbD09dD9bXTp0XSxhZil9LHQuc2VsZWN0aW9uPWR0LHQuc2VsZWN0b3I9dGYsdC5zZWxlY3RvckFsbD1uZix0LnN0eWxlPUIsdC50b3VjaD1zZix0LnRvdWNoZXM9ZnVuY3Rpb24odCxuKXtudWxsPT1uJiYobj1KcygpLnRvdWNoZXMpO2Zvcih2YXIgZT0wLHI9bj9uLmxlbmd0aDowLGk9bmV3IEFycmF5KHIpO2U8cjsrK2UpaVtlXT1Rcyh0LG5bZV0pO3JldHVybiBpfSx0LndpbmRvdz11Zix0LmN1c3RvbUV2ZW50PU4sdC5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dmFyIHQscyxmPStuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxoPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLW1nLHA9dS5hcHBseSh0aGlzLGFyZ3VtZW50cyktbWcsZD1mZyhwLWgpLHY9cD5oO2lmKGN8fChjPXQ9dmUoKSksbDxmJiYocz1sLGw9ZixmPXMpLGw+eWcpaWYoZD54Zy15ZyljLm1vdmVUbyhsKmhnKGgpLGwqdmcoaCkpLGMuYXJjKDAsMCxsLGgscCwhdiksZj55ZyYmKGMubW92ZVRvKGYqaGcocCksZip2ZyhwKSksYy5hcmMoMCwwLGYscCxoLHYpKTtlbHNle3ZhciBfLHksZz1oLG09cCx4PWgsYj1wLHc9ZCxNPWQsVD1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS8yLGs9VD55ZyYmKGk/K2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOl9nKGYqZitsKmwpKSxOPWRnKGZnKGwtZikvMiwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLFM9TixFPU47aWYoaz55Zyl7dmFyIEE9Q2Eoay9mKnZnKFQpKSxDPUNhKGsvbCp2ZyhUKSk7KHctPTIqQSk+eWc/KEEqPXY/MTotMSx4Kz1BLGItPUEpOih3PTAseD1iPShoK3ApLzIpLChNLT0yKkMpPnlnPyhDKj12PzE6LTEsZys9QyxtLT1DKTooTT0wLGc9bT0oaCtwKS8yKX12YXIgej1sKmhnKGcpLFA9bCp2ZyhnKSxSPWYqaGcoYiksTD1mKnZnKGIpO2lmKE4+eWcpe3ZhciBxPWwqaGcobSksVT1sKnZnKG0pLEQ9ZipoZyh4KSxPPWYqdmcoeCk7aWYoZDxnZyl7dmFyIEY9dz55Zz9VYSh6LFAsRCxPLHEsVSxSLEwpOltSLExdLEk9ei1GWzBdLFk9UC1GWzFdLEI9cS1GWzBdLGo9VS1GWzFdLEg9MS92ZyhBYSgoSSpCK1kqaikvKF9nKEkqSStZKlkpKl9nKEIqQitqKmopKSkvMiksWD1fZyhGWzBdKkZbMF0rRlsxXSpGWzFdKTtTPWRnKE4sKGYtWCkvKEgtMSkpLEU9ZGcoTiwobC1YKS8oSCsxKSl9fU0+eWc/RT55Zz8oXz1EYShELE8seixQLGwsRSx2KSx5PURhKHEsVSxSLEwsbCxFLHYpLGMubW92ZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksRTxOP2MuYXJjKF8uY3gsXy5jeSxFLGxnKF8ueTAxLF8ueDAxKSxsZyh5LnkwMSx5LngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksRSxsZyhfLnkwMSxfLngwMSksbGcoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsbCxsZyhfLmN5K18ueTExLF8uY3grXy54MTEpLGxnKHkuY3kreS55MTEseS5jeCt5LngxMSksIXYpLGMuYXJjKHkuY3gseS5jeSxFLGxnKHkueTExLHkueDExKSxsZyh5LnkwMSx5LngwMSksIXYpKSk6KGMubW92ZVRvKHosUCksYy5hcmMoMCwwLGwsZyxtLCF2KSk6Yy5tb3ZlVG8oeixQKSxmPnlnJiZ3PnlnP1M+eWc/KF89RGEoUixMLHEsVSxmLC1TLHYpLHk9RGEoeixQLEQsTyxmLC1TLHYpLGMubGluZVRvKF8uY3grXy54MDEsXy5jeStfLnkwMSksUzxOP2MuYXJjKF8uY3gsXy5jeSxTLGxnKF8ueTAxLF8ueDAxKSxsZyh5LnkwMSx5LngwMSksIXYpOihjLmFyYyhfLmN4LF8uY3ksUyxsZyhfLnkwMSxfLngwMSksbGcoXy55MTEsXy54MTEpLCF2KSxjLmFyYygwLDAsZixsZyhfLmN5K18ueTExLF8uY3grXy54MTEpLGxnKHkuY3kreS55MTEseS5jeCt5LngxMSksdiksYy5hcmMoeS5jeCx5LmN5LFMsbGcoeS55MTEseS54MTEpLGxnKHkueTAxLHkueDAxKSwhdikpKTpjLmFyYygwLDAsZixiLHgsdik6Yy5saW5lVG8oUixMKX1lbHNlIGMubW92ZVRvKDAsMCk7aWYoYy5jbG9zZVBhdGgoKSx0KXJldHVybiBjPW51bGwsdCsiInx8bnVsbH12YXIgbj16YSxlPVBhLHI9c2coMCksaT1udWxsLG89UmEsdT1MYSxhPXFhLGM9bnVsbDtyZXR1cm4gdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1nZy8yO3JldHVybltoZyhyKSp0LHZnKHIpKnRdfSx0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6c2coK2UpLHQpOm59LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6ZX0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6cn0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOml9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnNnKCtuKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOnV9LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6YX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PW4/bnVsbDpuLHQpOmN9LHR9LHQuYXJlYT1NZyx0LmxpbmU9d2csdC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksXz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cykseT1NYXRoLm1pbih4ZyxNYXRoLm1heCgteGcsby5hcHBseSh0aGlzLGFyZ3VtZW50cyktXykpLGc9TWF0aC5taW4oTWF0aC5hYnMoeSkvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT1nKih5PDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KHktaCptKS9wOjA7YTxoOysrYSxfPWYpYz1kW2FdLGY9XysoKGw9dltjXSk+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6XyxlbmRBbmdsZTpmLHBhZEFuZ2xlOmd9O3JldHVybiB2fXZhciBuPWtnLGU9VGcscj1udWxsLGk9c2coMCksbz1zZyh4ZyksdT1zZygwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnNnKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnNnKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6dX0sdH0sdC5hcmVhUmFkaWFsPUVnLHQucmFkaWFsQXJlYT1FZyx0LmxpbmVSYWRpYWw9U2csdC5yYWRpYWxMaW5lPVNnLHQucG9pbnRSYWRpYWw9QWcsdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiAkYShWYSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuICRhKFdhKX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9JGEoWmEpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0O2lmKHJ8fChyPXQ9dmUoKSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhyLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdClyZXR1cm4gcj1udWxsLHQrIiJ8fG51bGx9dmFyIG49c2coemcpLGU9c2coNjQpLHI9bnVsbDtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6c2coZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coK24pLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6bix0KTpyfSx0fSx0LnN5bWJvbHM9V2csdC5zeW1ib2xDaXJjbGU9emcsdC5zeW1ib2xDcm9zcz1QZyx0LnN5bWJvbERpYW1vbmQ9cWcsdC5zeW1ib2xTcXVhcmU9SWcsdC5zeW1ib2xTdGFyPUZnLHQuc3ltYm9sVHJpYW5nbGU9QmcsdC5zeW1ib2xXeWU9VmcsdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgUWEodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBLYSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgSmEodCl9LHQuY3VydmVCdW5kbGU9R2csdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPVFnLHQuY3VydmVDYXJkaW5hbE9wZW49S2csdC5jdXJ2ZUNhcmRpbmFsPUpnLHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5tLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1lbSx0LmN1cnZlQ2F0bXVsbFJvbT10bSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc2ModCl9LHQuY3VydmVMaW5lYXI9YmcsdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGRjKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgdmModCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgeWModCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgbWModCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBtYyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IG1jKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjPXQubGVuZ3RoLHM9YS5sZW5ndGgsZj1uZXcgQXJyYXkocyk7Zm9yKG89MDtvPHM7KytvKXtmb3IodmFyIGwsaD1hW29dLHA9ZltvXT1uZXcgQXJyYXkoYyksZD0wO2Q8YzsrK2QpcFtkXT1sPVswLCtpKHRbZF0saCxkLHQpXSxsLmRhdGE9dFtkXTtwLmtleT1ofWZvcihvPTAsdT1lKGYpO288czsrK28pZlt1W29dXS5pbmRleD1vO3JldHVybiByKGYsdSksZn12YXIgbj1zZyhbXSksZT1pbSxyPXJtLGk9eGM7cmV0dXJuIHQua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnNnKENnLmNhbGwoZSkpLHQpOm59LHQudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpzZygrbiksdCk6aX0sdC5vcmRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uP2ltOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246c2coQ2cuY2FsbChuKSksdCk6ZX0sdC5vZmZzZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9ybTpuLHQpOnJ9LHR9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsdT10WzBdLmxlbmd0aDtvPHU7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9cm0odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigoYT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sdSxhLGM9MCxzPXRbblswXV0ubGVuZ3RoO2M8czsrK2MpZm9yKG89dT0wLGU9MDtlPGE7KytlKShpPShyPXRbbltlXV1bY10pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09dSxyWzBdPXUrPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9cm0sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1ybSh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLHU9MTt1PHI7Kyt1KXtmb3IodmFyIGE9MCxjPTAscz0wO2E8aTsrK2Epe2Zvcih2YXIgZj10W25bYV1dLGw9Zlt1XVsxXXx8MCxoPShsLShmW3UtMV1bMV18fDApKS8yLHA9MDtwPGE7KytwKXt2YXIgZD10W25bcF1dO2grPShkW3VdWzFdfHwwKS0oZFt1LTFdWzFdfHwwKX1jKz1sLHMrPWgqbH1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGMmJihvLT1zL2MpfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8scm0odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1vbSx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBvbSh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiYyksbz1pbSh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLHU9MCxhPTAsYz1bXSxzPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sdTxhPyh1Kz1pW2VdLGMucHVzaChlKSk6KGErPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSx0LnN0YWNrT3JkZXJOb25lPWltLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGltKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9TXUsdC50aW1lTWlsbGlzZWNvbmQ9VV8sdC50aW1lTWlsbGlzZWNvbmRzPURfLHQudXRjTWlsbGlzZWNvbmQ9VV8sdC51dGNNaWxsaXNlY29uZHM9RF8sdC50aW1lU2Vjb25kPUlfLHQudGltZVNlY29uZHM9WV8sdC51dGNTZWNvbmQ9SV8sdC51dGNTZWNvbmRzPVlfLHQudGltZU1pbnV0ZT1CXyx0LnRpbWVNaW51dGVzPWpfLHQudGltZUhvdXI9SF8sdC50aW1lSG91cnM9WF8sdC50aW1lRGF5PSRfLHQudGltZURheXM9Vl8sdC50aW1lV2Vlaz1XXyx0LnRpbWVXZWVrcz1ueSx0LnRpbWVTdW5kYXk9V18sdC50aW1lU3VuZGF5cz1ueSx0LnRpbWVNb25kYXk9Wl8sdC50aW1lTW9uZGF5cz1leSx0LnRpbWVUdWVzZGF5PUdfLHQudGltZVR1ZXNkYXlzPXJ5LHQudGltZVdlZG5lc2RheT1KXyx0LnRpbWVXZWRuZXNkYXlzPWl5LHQudGltZVRodXJzZGF5PVFfLHQudGltZVRodXJzZGF5cz1veSx0LnRpbWVGcmlkYXk9S18sdC50aW1lRnJpZGF5cz11eSx0LnRpbWVTYXR1cmRheT10eSx0LnRpbWVTYXR1cmRheXM9YXksdC50aW1lTW9udGg9Y3ksdC50aW1lTW9udGhzPXN5LHQudGltZVllYXI9ZnksdC50aW1lWWVhcnM9bHksdC51dGNNaW51dGU9aHksdC51dGNNaW51dGVzPXB5LHQudXRjSG91cj1keSx0LnV0Y0hvdXJzPXZ5LHQudXRjRGF5PV95LHQudXRjRGF5cz15eSx0LnV0Y1dlZWs9Z3ksdC51dGNXZWVrcz1reSx0LnV0Y1N1bmRheT1neSx0LnV0Y1N1bmRheXM9a3ksdC51dGNNb25kYXk9bXksdC51dGNNb25kYXlzPU55LHQudXRjVHVlc2RheT14eSx0LnV0Y1R1ZXNkYXlzPVN5LHQudXRjV2VkbmVzZGF5PWJ5LHQudXRjV2VkbmVzZGF5cz1FeSx0LnV0Y1RodXJzZGF5PXd5LHQudXRjVGh1cnNkYXlzPUF5LHQudXRjRnJpZGF5PU15LHQudXRjRnJpZGF5cz1DeSx0LnV0Y1NhdHVyZGF5PVR5LHQudXRjU2F0dXJkYXlzPXp5LHQudXRjTW9udGg9UHksdC51dGNNb250aHM9UnksdC51dGNZZWFyPUx5LHQudXRjWWVhcnM9VXksdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1NYSx0LnRpbWVGb3JtYXRMb2NhbGU9QXUsdC5pc29Gb3JtYXQ9WXksdC5pc29QYXJzZT1CeSx0Lm5vdz1sbix0LnRpbWVyPWRuLHQudGltZXJGbHVzaD12bix0LnRpbWVvdXQ9UGwsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IHBuLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/bG4oKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyh1KXt1Kz1pLHIucmVzdGFydChvLGkrPW4sZSksdCh1KX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPUpuLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKHIgaW4gaSlpZigoZT1pW3JdKS5zdGF0ZT5VbCYmZS5uYW1lPT09bilyZXR1cm4gbmV3IEduKFtbdF1dLHloLG4sK3IpfXJldHVybiBudWxsfSx0LmludGVycnVwdD1qbCx0LnZvcm9ub2k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBuZXcgS2ModC5tYXAoZnVuY3Rpb24ocixpKXt2YXIgbz1bTWF0aC5yb3VuZChuKHIsaSx0KS9kbSkqZG0sTWF0aC5yb3VuZChlKHIsaSx0KS9kbSkqZG1dO3JldHVybiBvLmluZGV4PWksby5kYXRhPXIsb30pLHIpfXZhciBuPXdjLGU9TWMscj1udWxsO3JldHVybiB0LnBvbHlnb25zPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnBvbHlnb25zKCl9LHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIHQobikubGlua3MoKX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikudHJpYW5nbGVzKCl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnVtKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp1bSgrbiksdCk6ZX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbK25bMF1bMF0sK25bMF1bMV1dLFsrblsxXVswXSwrblsxXVsxXV1dLHQpOnImJltbclswXVswXSxyWzBdWzFdXSxbclsxXVswXSxyWzFdWzFdXV19LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1swLDBdLFsrblswXSwrblsxXV1dLHQpOnImJltyWzFdWzBdLXJbMF1bMF0sclsxXVsxXS1yWzBdWzFdXX0sdH0sdC56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LnByb3BlcnR5KCJfX3pvb20iLHVzKS5vbigid2hlZWwuem9vbSIscykub24oIm1vdXNlZG93bi56b29tIixmKS5vbigiZGJsY2xpY2suem9vbSIsbCkuZmlsdGVyKGNzKS5vbigidG91Y2hzdGFydC56b29tIixwKS5vbigidG91Y2htb3ZlLnpvb20iLGQpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLHYpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuKG49TWF0aC5tYXgoYixNYXRoLm1pbih3LG4pKSk9PT10Lms/dDpuZXcgbnMobix0LngsdC55KX1mdW5jdGlvbiByKHQsbixlKXt2YXIgcj1uWzBdLWVbMF0qdC5rLGk9blsxXS1lWzFdKnQuaztyZXR1cm4gcj09PXQueCYmaT09PXQueT90Om5ldyBucyh0LmsscixpKX1mdW5jdGlvbiBpKHQsbil7dmFyIGU9dC5pbnZlcnRYKG5bMF1bMF0pLU0scj10LmludmVydFgoblsxXVswXSktVCxpPXQuaW52ZXJ0WShuWzBdWzFdKS1rLG89dC5pbnZlcnRZKG5bMV1bMV0pLVM7cmV0dXJuIHQudHJhbnNsYXRlKHI+ZT8oZStyKS8yOk1hdGgubWluKDAsZSl8fE1hdGgubWF4KDAsciksbz5pPyhpK28pLzI6TWF0aC5taW4oMCxpKXx8TWF0aC5tYXgoMCxvKSl9ZnVuY3Rpb24gbyh0KXtyZXR1cm5bKCt0WzBdWzBdKyArdFsxXVswXSkvMiwoK3RbMF1bMV0rICt0WzFdWzFdKS8yXX1mdW5jdGlvbiB1KHQsbixlKXt0Lm9uKCJzdGFydC56b29tIixmdW5jdGlvbigpe2EodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCl9KS5vbigiaW50ZXJydXB0Lnpvb20gZW5kLnpvb20iLGZ1bmN0aW9uKCl7YSh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2Vlbigiem9vbSIsZnVuY3Rpb24oKXt2YXIgdD10aGlzLHI9YXJndW1lbnRzLGk9YSh0LHIpLHU9bS5hcHBseSh0LHIpLGM9ZXx8byh1KSxzPU1hdGgubWF4KHVbMV1bMF0tdVswXVswXSx1WzFdWzFdLXVbMF1bMV0pLGY9dC5fX3pvb20sbD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHQscik6bixoPUEoZi5pbnZlcnQoYykuY29uY2F0KHMvZi5rKSxsLmludmVydChjKS5jb25jYXQocy9sLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1sO2Vsc2V7dmFyIG49aCh0KSxlPXMvblsyXTt0PW5ldyBucyhlLGNbMF0tblswXSplLGNbMV0tblsxXSplKX1pLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiBhKHQsbil7Zm9yKHZhciBlLHI9MCxpPUMubGVuZ3RoO3I8aTsrK3IpaWYoKGU9Q1tyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBjKHQsbil9ZnVuY3Rpb24gYyh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1tLmFwcGx5KHQsbil9ZnVuY3Rpb24gcygpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD1hKHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLG89TWF0aC5tYXgoYixNYXRoLm1pbih3LG4uaypNYXRoLnBvdygyLHguYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLHU9S3ModGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09dVswXSYmdC5tb3VzZVswXVsxXT09PXVbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09dSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PW8pcmV0dXJuO3QubW91c2U9W3Usbi5pbnZlcnQodSldLGpsKHRoaXMpLHQuc3RhcnQoKX1nbSgpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSxSKSx0Lnpvb20oIm1vdXNlIixpKHIoZShuLG8pLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQpKX19ZnVuY3Rpb24gZigpe2lmKCF5JiZnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG49YSh0aGlzLGFyZ3VtZW50cyksZT1jZih0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsZnVuY3Rpb24oKXtpZihnbSgpLCFuLm1vdmVkKXt2YXIgZT10LmV2ZW50LmNsaWVudFgtdSxvPXQuZXZlbnQuY2xpZW50WS1jO24ubW92ZWQ9ZSplK28qbz5MfW4uem9vbSgibW91c2UiLGkocihuLnRoYXQuX196b29tLG4ubW91c2VbMF09S3Mobi50aGF0KSxuLm1vdXNlWzFdKSxuLmV4dGVudCkpfSwhMCkub24oIm1vdXNldXAuem9vbSIsZnVuY3Rpb24oKXtlLm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLG51bGwpLF90KHQuZXZlbnQudmlldyxuLm1vdmVkKSxnbSgpLG4uZW5kKCl9LCEwKSxvPUtzKHRoaXMpLHU9dC5ldmVudC5jbGllbnRYLGM9dC5ldmVudC5jbGllbnRZO2xmKHQuZXZlbnQudmlldykscnMoKSxuLm1vdXNlPVtvLHRoaXMuX196b29tLmludmVydChvKV0samwodGhpcyksbi5zdGFydCgpfX1mdW5jdGlvbiBsKCl7aWYoZy5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBvPXRoaXMuX196b29tLGE9S3ModGhpcyksYz1vLmludmVydChhKSxzPWkocihlKG8sby5rKih0LmV2ZW50LnNoaWZ0S2V5Py41OjIpKSxhLGMpLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKTtnbSgpLEU+MD9jZih0aGlzKS50cmFuc2l0aW9uKCkuZHVyYXRpb24oRSkuY2FsbCh1LHMsYSk6Y2YodGhpcykuY2FsbChuLnRyYW5zZm9ybSxzKX19ZnVuY3Rpb24gcCgpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixlLHIsaSxvPWEodGhpcyxhcmd1bWVudHMpLHU9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxjPXUubGVuZ3RoO2ZvcihycygpLGU9MDtlPGM7KytlKXI9dVtlXSxpPVtpPXNmKHRoaXMsdSxyLmlkZW50aWZpZXIpLHRoaXMuX196b29tLmludmVydChpKSxyLmlkZW50aWZpZXJdLG8udG91Y2gwP28udG91Y2gxfHwoby50b3VjaDE9aSk6KG8udG91Y2gwPWksbj0hMCk7aWYoXyYmKF89Y2xlYXJUaW1lb3V0KF8pLCFvLnRvdWNoMSkpcmV0dXJuIG8uZW5kKCksdm9pZCgoaT1jZih0aGlzKS5vbigiZGJsY2xpY2suem9vbSIpKSYmaS5hcHBseSh0aGlzLGFyZ3VtZW50cykpO24mJihfPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtfPW51bGx9LFApLGpsKHRoaXMpLG8uc3RhcnQoKSl9fWZ1bmN0aW9uIGQoKXt2YXIgbixvLHUsYyxzPWEodGhpcyxhcmd1bWVudHMpLGY9dC5ldmVudC5jaGFuZ2VkVG91Y2hlcyxsPWYubGVuZ3RoO2ZvcihnbSgpLF8mJihfPWNsZWFyVGltZW91dChfKSksbj0wO248bDsrK24pbz1mW25dLHU9c2YodGhpcyxmLG8uaWRlbnRpZmllcikscy50b3VjaDAmJnMudG91Y2gwWzJdPT09by5pZGVudGlmaWVyP3MudG91Y2gwWzBdPXU6cy50b3VjaDEmJnMudG91Y2gxWzJdPT09by5pZGVudGlmaWVyJiYocy50b3VjaDFbMF09dSk7aWYobz1zLnRoYXQuX196b29tLHMudG91Y2gxKXt2YXIgaD1zLnRvdWNoMFswXSxwPXMudG91Y2gwWzFdLGQ9cy50b3VjaDFbMF0sdj1zLnRvdWNoMVsxXSx5PSh5PWRbMF0taFswXSkqeSsoeT1kWzFdLWhbMV0pKnksZz0oZz12WzBdLXBbMF0pKmcrKGc9dlsxXS1wWzFdKSpnO289ZShvLE1hdGguc3FydCh5L2cpKSx1PVsoaFswXStkWzBdKS8yLChoWzFdK2RbMV0pLzJdLGM9WyhwWzBdK3ZbMF0pLzIsKHBbMV0rdlsxXSkvMl19ZWxzZXtpZighcy50b3VjaDApcmV0dXJuO3U9cy50b3VjaDBbMF0sYz1zLnRvdWNoMFsxXX1zLnpvb20oInRvdWNoIixpKHIobyx1LGMpLHMuZXh0ZW50KSl9ZnVuY3Rpb24gdigpe3ZhciBuLGUscj1hKHRoaXMsYXJndW1lbnRzKSxpPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsbz1pLmxlbmd0aDtmb3IocnMoKSx5JiZjbGVhclRpbWVvdXQoeSkseT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7eT1udWxsfSxQKSxuPTA7bjxvOysrbillPWlbbl0sci50b3VjaDAmJnIudG91Y2gwWzJdPT09ZS5pZGVudGlmaWVyP2RlbGV0ZSByLnRvdWNoMDpyLnRvdWNoMSYmci50b3VjaDFbMl09PT1lLmlkZW50aWZpZXImJmRlbGV0ZSByLnRvdWNoMTtyLnRvdWNoMSYmIXIudG91Y2gwJiYoci50b3VjaDA9ci50b3VjaDEsZGVsZXRlIHIudG91Y2gxKSxyLnRvdWNoMD9yLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoci50b3VjaDBbMF0pOnIuZW5kKCl9dmFyIF8seSxnPWlzLG09b3MseD1hcyxiPTAsdz0xLzAsTT0tdyxUPXcsaz1NLFM9VCxFPTI1MCxBPV9sLEM9W10sej1oKCJzdGFydCIsInpvb20iLCJlbmQiKSxQPTUwMCxSPTE1MCxMPTA7cmV0dXJuIG4udHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsdXMpLHQhPT1lP3UodCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSxuLnNjYWxlQnk9ZnVuY3Rpb24odCxlKXtuLnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKX0pfSxuLnNjYWxlVG89ZnVuY3Rpb24odCx1KXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9bS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj10aGlzLl9fem9vbSxhPW8odCksYz1uLmludmVydChhKTtyZXR1cm4gaShyKGUobiwiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KSxhLGMpLHQpfSl9LG4udHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLHIpe24udHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gaSh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxtLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0sbi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUscil7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PW0uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sdT1vKHQpO3JldHVybiBpKHltLnRyYW5zbGF0ZSh1WzBdLHVbMV0pLnNjYWxlKG4uaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj8tci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LXIpLHQpfSl9LGMucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5pbmRleD1DLnB1c2godGhpcyktMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LHpvb206ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5tb3VzZSYmIm1vdXNlIiE9PXQmJih0aGlzLm1vdXNlWzFdPW4uaW52ZXJ0KHRoaXMubW91c2VbMF0pKSx0aGlzLnRvdWNoMCYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMFsxXT1uLmludmVydCh0aGlzLnRvdWNoMFswXSkpLHRoaXMudG91Y2gxJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gxWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gxWzBdKSksdGhpcy50aGF0Ll9fem9vbT1uLHRoaXMuZW1pdCgiem9vbSIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoQy5zcGxpY2UodGhpcy5pbmRleCwxKSx0aGlzLmluZGV4PS0xLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7TihuZXcgdHMobix0LHRoaXMudGhhdC5fX3pvb20pLHouYXBwbHkseixbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxuLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpfbSgrdCksbik6eH0sbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpfbSghIXQpLG4pOmd9LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6X20oW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLG4pOm19LG4uc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9K3RbMF0sdz0rdFsxXSxuKTpbYix3XX0sbi50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09K3RbMF1bMF0sVD0rdFsxXVswXSxrPSt0WzBdWzFdLFM9K3RbMV1bMV0sbik6W1tNLGtdLFtULFNdXX0sbi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT0rdCxuKTpFfSxuLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhBPXQsbik6QX0sbi5vbj1mdW5jdGlvbigpe3ZhciB0PXoub24uYXBwbHkoeixhcmd1bWVudHMpO3JldHVybiB0PT09ej9uOnR9LG4uY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTD0odD0rdCkqdCxuKTpNYXRoLnNxcnQoTCl9LG59LHQuem9vbVRyYW5zZm9ybT1lcyx0Lnpvb21JZGVudGl0eT15bSxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs="></script>
<link href="data:text/css;charset=utf-8,%2Enode%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Enode%20circle%20%7B%0Afill%3A%20%23fff%3B%0Astroke%3A%20%23000%3B%0A%7D%0A%2Enode%20text%20%7B%0Afont%3A%2010px%20sans%2Dserif%3B%0A%7D%0A%2Elink%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20%23ccc%3B%0Astroke%2Dwidth%3A%201%2E5px%3B%0A%7D%0Adiv%2Etooltip%20%7B%0Aposition%3A%20absolute%3B%0Atext%2Dalign%3A%20center%3B%0Apadding%3A%203px%3B%0Afont%3A%2010px%20sans%2Dserif%3B%0Abackground%3A%20%23fff%3B%0Aborder%3A%202px%3B%0Aborder%2Dradius%3A%208px%3B%0Aborder%2Dstyle%3A%20solid%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ2NvbGxhcHNpYmxlVHJlZScsCiAgdHlwZTogJ291dHB1dCcsCgogIGZhY3Rvcnk6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CgogICAgdmFyIGkgPSAwLAogICAgZHVyYXRpb24gPSA3NTAsCiAgICByb290ID0ge30sCiAgICBvcHRpb25zID0ge30sCiAgICB0cmVlbWFwOwoKICAgIC8vIE9wdGlvbmFsbHkgZW5hYmxlIHpvb21pbmcsIGFuZCBsaW1pdCB0byAxLzV4IG9yIDV4IG9mIHRoZSBvcmlnaW5hbCB2aWV3cG9ydAogICAgdmFyIHpvb20gPSBkMy56b29tKCkKICAgIC5zY2FsZUV4dGVudChbMS81LCA1XSkKICAgIC5vbignem9vbScsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKG9wdGlvbnMuem9vbWFibGUpIHN2Zy5hdHRyKCd0cmFuc2Zvcm0nLCBkMy5ldmVudC50cmFuc2Zvcm0pCiAgICB9KQoKICAgIC8vIGNyZWF0ZSBvdXIgdHJlZSBvYmplY3QgYW5kIGJpbmQgaXQgdG8gdGhlIGVsZW1lbnQKICAgIC8vIGFwcGVuZHMgYSAnZ3JvdXAnIGVsZW1lbnQgdG8gJ3N2ZycKICAgIC8vIG1vdmVzIHRoZSAnZ3JvdXAnIGVsZW1lbnQgdG8gdGhlIHRvcCBsZWZ0IG1hcmdpbgogICAgdmFyIHN2ZyA9IGQzLnNlbGVjdChlbCkuYXBwZW5kKCdzdmcnKQogICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpCiAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0KQogICAgLmNhbGwoem9vbSkKICAgIC5hcHBlbmQoJ2cnKTsKCiAgICAvLyBEZWZpbmUgdGhlIGRpdiBmb3IgdGhlIHRvb2x0aXAKICAgIHZhciB0b29sdGlwID0gZDMuc2VsZWN0KGVsKS5hcHBlbmQoJ2RpdicpCiAgICAuYXR0cignY2xhc3MnLCAndG9vbHRpcCcpCiAgICAuc3R5bGUoJ29wYWNpdHknLCAwKTsKCiAgICBmdW5jdGlvbiB1cGRhdGUoc291cmNlKSB7CgogICAgICAvLyBBc3NpZ25zIHRoZSB4IGFuZCB5IHBvc2l0aW9uIGZvciB0aGUgbm9kZXMKICAgICAgdmFyIHRyZWVEYXRhID0gdHJlZW1hcChyb290KTsKCiAgICAgIC8vIENvbXB1dGUgdGhlIG5ldyB0cmVlIGxheW91dC4KICAgICAgdmFyIG5vZGVzID0gdHJlZURhdGEuZGVzY2VuZGFudHMoKSwKICAgICAgbGlua3MgPSB0cmVlRGF0YS5kZXNjZW5kYW50cygpLnNsaWNlKDEpOwoKICAgICAgLy8gTm9ybWFsaXplIGZvciBmaXhlZC1kZXB0aC4KICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7ZC55ID0gZC5kZXB0aCAqIG9wdGlvbnMubGlua0xlbmd0aH0pOwoKICAgICAgLy8gKioqKioqKioqKioqKioqKioqIE5vZGVzIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAvLyBVcGRhdGUgdGhlIG5vZGVzLi4uCiAgICAgIHZhciBub2RlID0gc3ZnLnNlbGVjdEFsbCgnZy5ub2RlJykKICAgICAgLmRhdGEobm9kZXMsIGZ1bmN0aW9uKGQpIHtyZXR1cm4gZC5pZCB8fCAoZC5pZCA9ICsraSk7IH0pOwoKICAgICAgLy8gRW50ZXIgYW55IG5ldyBtb2RlcyBhdCB0aGUgcGFyZW50J3MgcHJldmlvdXMgcG9zaXRpb24uCiAgICAgIHZhciBub2RlRW50ZXIgPSBub2RlLmVudGVyKCkuYXBwZW5kKCdnJykKICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGUnKQogICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBzb3VyY2UueTAgKyAnLCcgKyBzb3VyY2UueDAgKyAnKSc7CiAgICAgIH0pCiAgICAgIC5vbignY2xpY2snLCBjbGljayk7CgogICAgICAvLyBBZGQgdG9vbHRpcHMsIGlmIHNwZWNpZmllZCBpbiBvcHRpb25zCiAgICAgIGlmIChvcHRpb25zLnRvb2x0aXApIHsKICAgICAgICBub2RlRW50ZXIgPSBub2RlRW50ZXIKICAgICAgICAub24oJ21vdXNlb3ZlcicsIG1vdXNlb3ZlcikKICAgICAgICAub24oJ21vdXNlb3V0JywgbW91c2VvdXQpOwogICAgICB9CgogICAgICAvLyBBZGQgQ2lyY2xlIGZvciB0aGUgbm9kZXMKICAgICAgbm9kZUVudGVyLmFwcGVuZCgnY2lyY2xlJykKICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGUnKQogICAgICAuYXR0cigncicsIDFlLTYpCiAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZC5kYXRhLmZpbGwgfHwgKGQuX2NoaWxkcmVuID8gb3B0aW9ucy5maWxsIDogJyNmZmYnKTsKICAgICAgfSkKICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQuX2NoaWxkcmVuID8gMyA6IDE7CiAgICAgIH0pOwoKICAgICAgLy8gQWRkIGxhYmVscyBmb3IgdGhlIG5vZGVzCiAgICAgIG5vZGVFbnRlci5hcHBlbmQoJ3RleHQnKQogICAgICAuYXR0cignZHknLCAnLjM1ZW0nKQogICAgICAuYXR0cigneCcsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAvLyBTY2FsZSBwYWRkaW5nIGZvciBsYWJlbCB0byB0aGUgc2l6ZSBvZiBub2RlCiAgICAgICAgdmFyIHBhZGRpbmcgPSAoZC5kYXRhLlNpemVPZk5vZGUgfHwgMTApICsgMwogICAgICAgIHJldHVybiBkLmNoaWxkcmVuIHx8IGQuX2NoaWxkcmVuID8gLTEgKiBwYWRkaW5nIDogcGFkZGluZzsKICAgICAgfSkKICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiBkLmNoaWxkcmVuIHx8IGQuX2NoaWxkcmVuID8gJ2VuZCcgOiAnc3RhcnQnOwogICAgICB9KQogICAgICAuc3R5bGUoJ2ZvbnQtc2l6ZScsIG9wdGlvbnMuZm9udFNpemUgKyAncHgnKQogICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmRhdGEubmFtZTsgfSk7CgogICAgICAvLyBVUERBVEUKICAgICAgdmFyIG5vZGVVcGRhdGUgPSBub2RlRW50ZXIubWVyZ2Uobm9kZSk7CgogICAgICAvLyBUcmFuc2l0aW9uIHRvIHRoZSBwcm9wZXIgcG9zaXRpb24gZm9yIHRoZSBub2RlCiAgICAgIG5vZGVVcGRhdGUudHJhbnNpdGlvbigpCiAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgZC55ICsgJywnICsgZC54ICsgJyknOwogICAgICB9KTsKCiAgICAgIC8vIFVwZGF0ZSB0aGUgbm9kZSBhdHRyaWJ1dGVzIGFuZCBzdHlsZQogICAgICBub2RlVXBkYXRlLnNlbGVjdCgnY2lyY2xlLm5vZGUnKQogICAgICAuYXR0cigncicsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZC5kYXRhLlNpemVPZk5vZGUgfHwgMTA7IC8vIGRlZmF1bHQgcmFkaXVzIGlzIDEwCiAgICAgIH0pCiAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gZC5kYXRhLmZpbGwgfHwgKGQuX2NoaWxkcmVuID8gb3B0aW9ucy5maWxsIDogJyNmZmYnKTsKICAgICAgfSkKICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuIGQuX2NoaWxkcmVuID8gMyA6IDE7CiAgICAgIH0pCiAgICAgIC5hdHRyKCdjdXJzb3InLCAncG9pbnRlcicpOwoKCiAgICAgIC8vIFJlbW92ZSBhbnkgZXhpdGluZyBub2RlcwogICAgICB2YXIgbm9kZUV4aXQgPSBub2RlLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQogICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiAndHJhbnNsYXRlKCcgKyBzb3VyY2UueSArICcsJyArIHNvdXJjZS54ICsgJyknOwogICAgICB9KQogICAgICAucmVtb3ZlKCk7CgogICAgICAvLyBPbiBleGl0IHJlZHVjZSB0aGUgbm9kZSBjaXJjbGVzIHNpemUgdG8gMAogICAgICBub2RlRXhpdC5zZWxlY3QoJ2NpcmNsZScpCiAgICAgIC5hdHRyKCdyJywgMWUtNik7CgogICAgICAvLyBPbiBleGl0IHJlZHVjZSB0aGUgb3BhY2l0eSBvZiB0ZXh0IGxhYmVscwogICAgICBub2RlRXhpdC5zZWxlY3QoJ3RleHQnKQogICAgICAuc3R5bGUoJ2ZpbGwtb3BhY2l0eScsIDFlLTYpOwoKICAgICAgLy8gKioqKioqKioqKioqKioqKioqIGxpbmtzIHNlY3Rpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICAgICAvLyBVcGRhdGUgdGhlIGxpbmtzLi4uCiAgICAgIHZhciBsaW5rID0gc3ZnLnNlbGVjdEFsbCgncGF0aC5saW5rJykKICAgICAgLmRhdGEobGlua3MsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQuaWQ7IH0pOwoKICAgICAgLy8gRW50ZXIgYW55IG5ldyBsaW5rcyBhdCB0aGUgcGFyZW50J3MgcHJldmlvdXMgcG9zaXRpb24uCiAgICAgIHZhciBsaW5rRW50ZXIgPSBsaW5rLmVudGVyKCkuaW5zZXJ0KCdwYXRoJywgJ2cnKQogICAgICAuYXR0cignY2xhc3MnLCAnbGluaycpCiAgICAgIC8vIFBvdGVudGlhbGx5LCB0aGlzIG1heSBvbmUgZGF5IGJlIG1hcHBhYmxlCiAgICAgIC8vIC5zdHlsZSgnc3Ryb2tlLXdpZHRoJywgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5kYXRhLmxpbmtXaWR0aCB8fCAxIH0pCiAgICAgIC5hdHRyKCdkJywgZnVuY3Rpb24oZCl7CiAgICAgICAgdmFyIG8gPSB7IHg6IHNvdXJjZS54MCwgeTogc291cmNlLnkwIH0KICAgICAgICByZXR1cm4gZGlhZ29uYWwobywgbykKICAgICAgfSk7CgogICAgICAvLyBVUERBVEUKICAgICAgdmFyIGxpbmtVcGRhdGUgPSBsaW5rRW50ZXIubWVyZ2UobGluayk7CgogICAgICAvLyBUcmFuc2l0aW9uIGJhY2sgdG8gdGhlIHBhcmVudCBlbGVtZW50IHBvc2l0aW9uCiAgICAgIGxpbmtVcGRhdGUudHJhbnNpdGlvbigpCiAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgLmF0dHIoJ2QnLCBmdW5jdGlvbihkKXsgcmV0dXJuIGRpYWdvbmFsKGQsIGQucGFyZW50KSB9KTsKCiAgICAgIC8vIFJlbW92ZSBhbnkgZXhpdGluZyBsaW5rcwogICAgICB2YXIgbGlua0V4aXQgPSBsaW5rLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQogICAgICAuYXR0cignZCcsIGZ1bmN0aW9uKGQpIHsKICAgICAgICB2YXIgbyA9IHt4OiBzb3VyY2UueCwgeTogc291cmNlLnl9CiAgICAgICAgcmV0dXJuIGRpYWdvbmFsKG8sIG8pCiAgICAgIH0pCiAgICAgIC5yZW1vdmUoKTsKCiAgICAgIC8vIFN0b3JlIHRoZSBvbGQgcG9zaXRpb25zIGZvciB0cmFuc2l0aW9uLgogICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgIGQueDAgPSBkLng7CiAgICAgICAgZC55MCA9IGQueTsKICAgICAgfSk7CgogICAgICAvLyBDcmVhdGVzIGEgY3VydmVkIChkaWFnb25hbCkgcGF0aCBmcm9tIHBhcmVudCB0byB0aGUgY2hpbGQgbm9kZXMKICAgICAgZnVuY3Rpb24gZGlhZ29uYWwocywgZCkgewoKICAgICAgICBwYXRoID0gJ00gJyArIHMueSArICcgJyArIHMueCArICcgQyAnICsKICAgICAgICAocy55ICsgZC55KSAvIDIgKyAnICcgKyBzLnggKyAnLCAnICsKICAgICAgICAocy55ICsgZC55KSAvIDIgKyAnICcgKyBkLnggKyAnLCAnICsKICAgICAgICBkLnkgKyAnICcgKyBkLng7CgogICAgICAgIHJldHVybiBwYXRoCiAgICAgIH0KCiAgICAgIC8vIFRvZ2dsZSBjaGlsZHJlbiBvbiBjbGljay4KICAgICAgZnVuY3Rpb24gY2xpY2soZCkgewogICAgICAgIGlmIChkLmNoaWxkcmVuKSB7CiAgICAgICAgICBkLl9jaGlsZHJlbiA9IGQuY2hpbGRyZW47CiAgICAgICAgICBkLmNoaWxkcmVuID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZC5jaGlsZHJlbiA9IGQuX2NoaWxkcmVuOwogICAgICAgICAgZC5fY2hpbGRyZW4gPSBudWxsOwogICAgICAgIH0KICAgICAgICB1cGRhdGUoZCk7CiAgICAgICAgLy8gSGlkZSB0aGUgdG9vbHRpcCBhZnRlciBjbGlja2luZwogICAgICAgIHRvb2x0aXAudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDEwMCkKICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwKQogICAgICAgIC8vIFVwZGF0ZSBTaGlueSBpbnB1dHMsIGlmIGFwcGxpY2FibGUKICAgICAgICBpZiAob3B0aW9ucy5pbnB1dCkgewogICAgICAgICAgdmFyIG5lc3QgPSB7fSwKICAgICAgICAgIG9iaiA9IGQ7CiAgICAgICAgICAvLyBOYXZpZ2F0ZSB1cCB0aGUgbGlzdCBhbmQgcmVjdXJzaXZlbHkgZmluZCBwYXJlbnRhbCBub2RlcwogICAgICAgICAgZm9yICh2YXIgbiA9IGQuZGVwdGg7IG4gPiAwOyBuLS0pIHsKICAgICAgICAgICAgbmVzdFtvcHRpb25zLmhpZXJhcmNoeVtuLTFdXSA9IG9iai5kYXRhLm5hbWUKICAgICAgICAgICAgb2JqID0gb2JqLnBhcmVudAogICAgICAgICAgfQogICAgICAgICAgU2hpbnkub25JbnB1dENoYW5nZShvcHRpb25zLmlucHV0LCBuZXN0KQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gU2hvdyB0b29sdGlwIG9uIG1vdXNlb3ZlcgogICAgICBmdW5jdGlvbiBtb3VzZW92ZXIoZCkgewogICAgICAgIHRvb2x0aXAudHJhbnNpdGlvbigpCiAgICAgICAgLmR1cmF0aW9uKDIwMCkKICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAuOSk7CgogICAgICAgIC8vIFNob3cgZWl0aGVyIGEgY29uc3RydWN0ZWQgdG9vbHRpcCwgb3Igb3ZlcnJpZGUgd2l0aCBvbmUgZnJvbSB0aGUgZGF0YQogICAgICAgIHRvb2x0aXAuaHRtbCgKICAgICAgICAgIGQuZGF0YS50b29sdGlwIHx8IGQuZGF0YS5uYW1lICsgJzxicj4nICsKICAgICAgICAgIG9wdGlvbnMuYXR0cmlidXRlICsgJzogJyArIGQuZGF0YS5XZWlnaHRPZk5vZGUKICAgICAgICApCiAgICAgICAgLy8gTWFrZSB0aGUgdG9vbHRpcCBmb250IHNpemUganVzdCBhIGxpdHRsZSBiaXQgYmlnZ2VyCiAgICAgICAgLnN0eWxlKCdmb250LXNpemUnLCAob3B0aW9ucy5mb250U2l6ZSArIDEpICsgJ3B4JykKICAgICAgICAuc3R5bGUoJ2xlZnQnLCAoZDMuZXZlbnQubGF5ZXJYKSArICdweCcpCiAgICAgICAgLnN0eWxlKCd0b3AnLCAoZDMuZXZlbnQubGF5ZXJZIC0gMzApICsgJ3B4Jyk7CiAgICAgIH0KICAgICAgLy8gSGlkZSB0b29sdGlwIG9uIG1vdXNlb3V0CiAgICAgIGZ1bmN0aW9uIG1vdXNlb3V0KGQpIHsKICAgICAgICB0b29sdGlwLnRyYW5zaXRpb24oKQogICAgICAgIC5kdXJhdGlvbig1MDApCiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oeCkgewogICAgICAgIC8vIEFzc2lnbnMgcGFyZW50LCBjaGlsZHJlbiwgaGVpZ2h0LCBkZXB0aAogICAgICAgIHJvb3QgPSBkMy5oaWVyYXJjaHkoeC5kYXRhLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmNoaWxkcmVuOyB9KTsKICAgICAgICByb290LngwID0gaGVpZ2h0IC8gMjsKICAgICAgICByb290LnkwID0gMDsKCiAgICAgICAgLy8gQXR0YWNoIG9wdGlvbnMgYXMgYSBwcm9wZXJ0eSBvZiB0aGUgaW5zdGFuY2UKICAgICAgICBvcHRpb25zID0geC5vcHRpb25zOwoKICAgICAgICAvLyBVcGRhdGUgdGhlIGNhbnZhcyB3aXRoIHRoZSBuZXcgZGltZW5zaW9ucwogICAgICAgIHN2ZyA9IHN2Zy5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcKICAgICAgICArIG9wdGlvbnMubWFyZ2luLmxlZnQgKyAnLCcgKyBvcHRpb25zLm1hcmdpbi50b3AgKyAnKScpCgogICAgICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQsIGNvcnJlY3RlZCBmb3IgbWFyZ2lucwogICAgICAgIHZhciBoZWlnaHRNYXJnaW4gPSBoZWlnaHQgLSBvcHRpb25zLm1hcmdpbi50b3AgLSBvcHRpb25zLm1hcmdpbi5ib3R0b20sCiAgICAgICAgd2lkdGhNYXJnaW4gPSB3aWR0aCAtIG9wdGlvbnMubWFyZ2luLmxlZnQgLSBvcHRpb25zLm1hcmdpbi5yaWdodDsKICAgICAgICAvLyBkZWNsYXJlcyBhIHRyZWUgbGF5b3V0IGFuZCBhc3NpZ25zIHRoZSBzaXplCiAgICAgICAgdHJlZW1hcCA9IGQzLnRyZWUoKS5zaXplKFtoZWlnaHRNYXJnaW4sIHdpZHRoTWFyZ2luXSk7CgogICAgICAgIC8vIENhbGN1bGF0ZSBhIHJlYXNvbmFibGUgbGluayBsZW5ndGgsIGlmIG5vdCBvdGhlcndpc2Ugc3BlY2lmaWVkCiAgICAgICAgaWYgKCFvcHRpb25zLmxpbmtMZW5ndGgpIHsKICAgICAgICAgIG9wdGlvbnMubGlua1Jlc3BvbnNpdmUgPSB0cnVlCiAgICAgICAgICBvcHRpb25zLmxpbmtMZW5ndGggPSB3aWR0aE1hcmdpbiAvIG9wdGlvbnMuaGllcmFyY2h5Lmxlbmd0aAogICAgICAgICAgaWYgKG9wdGlvbnMubGlua0xlbmd0aCA8IDEwKSB7CiAgICAgICAgICAgIG9wdGlvbnMubGlua0xlbmd0aCA9IDEwIC8vIE9mZnNjcmVlbiBvciB0b28gc2hvcnQKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9wdGlvbmFsbHkgY29sbGFwc2UgYWZ0ZXIgdGhlIHNlY29uZCBsZXZlbAogICAgICAgIGlmIChvcHRpb25zLmNvbGxhcHNlZCkgcm9vdC5jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTsKICAgICAgICB1cGRhdGUocm9vdCk7CgogICAgICAgIC8vIENvbGxhcHNlIHRoZSBub2RlIGFuZCBhbGwgaXQncyBjaGlsZHJlbgogICAgICAgIGZ1bmN0aW9uIGNvbGxhcHNlKGQpIHsKICAgICAgICAgIGlmKGQuY2hpbGRyZW4pIHsKICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBkLmNoaWxkcmVuCiAgICAgICAgICAgIGQuX2NoaWxkcmVuLmZvckVhY2goY29sbGFwc2UpCiAgICAgICAgICAgIGQuY2hpbGRyZW4gPSBudWxsCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgLy8gUmVzaXplIHRoZSBjYW52YXMKICAgICAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdCgnc3ZnJykKICAgICAgICAuYXR0cignd2lkdGgnLCB3aWR0aCkKICAgICAgICAuYXR0cignaGVpZ2h0JywgaGVpZ2h0KTsKCiAgICAgICAgLy8gd2lkdGggYW5kIGhlaWdodCwgY29ycmVjdGVkIGZvciBtYXJnaW5zCiAgICAgICAgdmFyIGhlaWdodE1hcmdpbiA9IGhlaWdodCAtIG9wdGlvbnMubWFyZ2luLnRvcCAtIG9wdGlvbnMubWFyZ2luLmJvdHRvbSwKICAgICAgICB3aWR0aE1hcmdpbiA9IHdpZHRoIC0gb3B0aW9ucy5tYXJnaW4ubGVmdCAtIG9wdGlvbnMubWFyZ2luLnJpZ2h0OwoKICAgICAgICAvLyBDYWxjdWxhdGUgYSByZWFzb25hYmxlIGxpbmsgbGVuZ3RoLCBpZiBub3Qgb3JpZ2luYWxseSBzcGVjaWZpZWQKICAgICAgICBpZiAob3B0aW9ucy5saW5rUmVzcG9uc2l2ZSkgewogICAgICAgICAgb3B0aW9ucy5saW5rTGVuZ3RoID0gd2lkdGhNYXJnaW4gLyBvcHRpb25zLmhpZXJhcmNoeS5sZW5ndGgKICAgICAgICAgIGlmIChvcHRpb25zLmxpbmtMZW5ndGggPCAxMCkgewogICAgICAgICAgICBvcHRpb25zLmxpbmtMZW5ndGggPSAxMCAvLyBPZmZzY3JlZW4gb3IgdG9vIHNob3J0CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSB0aGUgdHJlZW1hcCB0byBmaXQgdGhlIG5ldyBjYW52YXMgc2l6ZQogICAgICAgIHRyZWVtYXAgPSBkMy50cmVlKCkuc2l6ZShbaGVpZ2h0TWFyZ2luLCB3aWR0aE1hcmdpbl0pOwogICAgICAgIHVwZGF0ZShyb290KQogICAgICB9LAogICAgICAvLyBNYWtlIHRoZSBpbnN0YW5jZSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBhcyBhIHByb3BlcnR5IG9mIHRoZSB3aWRnZXQKICAgICAgc3ZnOiBzdmcsCiAgICAgIHJvb3Q6IHJvb3QsCiAgICAgIG9wdGlvbnM6IG9wdGlvbnMKICAgIH07CiAgfQp9KTsK"></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-09147cfc3f5165bdd0fa" class="collapsibleTree html-widget" style="width:1000px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-09147cfc3f5165bdd0fa">{"x":{"data":{"name":"mergetermsdocs","WeightOfNode":"57","children":[{"name":" 1","WeightOfNode":"3","children":[{"name":"garlic, bread, book, pie","WeightOfNode":"3","children":[{"name":"The Year’s Best Baking Cookbooks, for Novices and Pros","WeightOfNode":"1"},{"name":"Have Your Date and Your Garlic Too","WeightOfNode":"1"},{"name":"For Russian Artists in 1917, Art Was the Thing, Not Revolution","WeightOfNode":"1"}]}]},{"name":" 2","WeightOfNode":"3","children":[{"name":"new, time, brief","WeightOfNode":"3","children":[{"name":"Rex Tillerson, Angela Merkel, Turkey: Your Friday Briefing","WeightOfNode":"1"},{"name":"Michael Flynn, Kathryn Steinle, Jim Nabors: Your Friday Briefing","WeightOfNode":"1"},{"name":"‘Coco’ and Mexico’s Infatuation With the Afterlife","WeightOfNode":"1"}]}]},{"name":" 3","WeightOfNode":"3","children":[{"name":"bread, zaro, bakeri","WeightOfNode":"3","children":[{"name":"Using Science and History to Unlock the Secrets of Bread","WeightOfNode":"1"},{"name":"In a Nod to Its Roots, Zaro’s Is Opening 2 Bakeries in the Bronx","WeightOfNode":"1"},{"name":"A Pull-Apart Bread Worth Sharing (Even if You Don’t Want to)","WeightOfNode":"1"}]}]},{"name":" 4","WeightOfNode":"3","children":[{"name":"butterscotch, flavor, india, indian","WeightOfNode":"3","children":[{"name":"Letter of Recommendation: Indian Butterscotch Ice Cream","WeightOfNode":"1"},{"name":"Traditional Ethiopian Food in a Cosmopolitan Setting","WeightOfNode":"1"},{"name":"Sort With a Full Schedule","WeightOfNode":"1"}]}]},{"name":" 5","WeightOfNode":"3","children":[{"name":"cook, recip, bread","WeightOfNode":"3","children":[{"name":"Love to Love You, Baby","WeightOfNode":"1"},{"name":"The Glory of Democracy","WeightOfNode":"1"},{"name":"Panera Bread Buys Au Bon Pain, Adding to JAB’s Breakfast Empire","WeightOfNode":"1"}]}]},{"name":" 6","WeightOfNode":"3","children":[{"name":"new, york, paint","WeightOfNode":"3","children":[{"name":"New York Today: A Holiday Market for El Barrio","WeightOfNode":"1"},{"name":"A Tasmanian Fantasy Amid the Ruins of a Mental Hospital","WeightOfNode":"1"},{"name":"What to See in New York Art Galleries This Week","WeightOfNode":"1"}]}]},{"name":" 7","WeightOfNode":"3","children":[{"name":"skate, rink, new","WeightOfNode":"3","children":[{"name":"A Barn, a Cookbook, a Bangle: Gifts That Touched the Heart","WeightOfNode":"1"},{"name":"Where Winter’s Silver Skates Warmed the Soul","WeightOfNode":"1"},{"name":"Carbohydrates","WeightOfNode":"1"}]}]},{"name":" 8","WeightOfNode":"3","children":[{"name":"tax, livingston, restaur","WeightOfNode":"3","children":[{"name":"The Lobster Club, From Major Food Group, Opens in Midtown","WeightOfNode":"1"},{"name":"In One New Jersey Town, Pending Tax Changes Create Anxiety","WeightOfNode":"1"},{"name":"A Rich Pappa From Malaysia Serves Up Delicacies in Queens","WeightOfNode":"1"}]}]},{"name":" 9","WeightOfNode":"3","children":[{"name":"emoji, one, make, thanksgiv","WeightOfNode":"3","children":[{"name":"Will We Get a Sad Poop Emoji? Well, There's a Process","WeightOfNode":"1"},{"name":"It’s Almost Thanksgiving! Let Us Be Your Guide","WeightOfNode":"1"},{"name":"Weekend Breakfasts to Warm the Heart, and Belly","WeightOfNode":"1"}]}]},{"name":"10","WeightOfNode":"3","children":[{"name":"plastic, bag, year","WeightOfNode":"3","children":[{"name":"Public Shaming and Even Prison for Plastic Bag Use in Rwanda","WeightOfNode":"1"},{"name":"Russia Is Returning to Growth. (Just in Time for an Election.)","WeightOfNode":"1"},{"name":"The Horses on Standing Rock Get a Checkup","WeightOfNode":"1"}]}]},{"name":"11","WeightOfNode":"3","children":[{"name":"panetton, one, will","WeightOfNode":"3","children":[{"name":"Panettone Has Become an Obsession for American Bakers","WeightOfNode":"1"},{"name":"5 Cheap(ish) Things to Help You Prep Thanksgiving Dinner","WeightOfNode":"1"},{"name":"A 45-Minute Roast Turkey","WeightOfNode":"1"}]}]},{"name":"12","WeightOfNode":"3","children":[{"name":"cake, pandoro, melegatti","WeightOfNode":"3","children":[{"name":"Pandoro Is Italy’s Christmas Miracle. Easter Is Another Story.","WeightOfNode":"1"},{"name":"Tang Hotpot, Restorative Sichuan-Style Fare, Opens","WeightOfNode":"1"},{"name":"How Peter Zaharatos, Chocolate Artist, Spends His Sundays","WeightOfNode":"1"}]}]},{"name":"13","WeightOfNode":"3","children":[{"name":"make, roll, susan","WeightOfNode":"3","children":[{"name":"God Is in the Salad Dressing","WeightOfNode":"1"},{"name":"Buttered Roll Redux: A Lowly Breakfast Food Begets High Drama","WeightOfNode":"1"},{"name":"Lamb Shanks Show Off Their Inner Beauty","WeightOfNode":"1"}]}]},{"name":"14","WeightOfNode":"3","children":[{"name":"home, can, citi","WeightOfNode":"3","children":[{"name":"How Tech Expanded From Silicon Valley to Bubblegum Alley","WeightOfNode":"1"},{"name":"How My Sundays Spend Me","WeightOfNode":"1"},{"name":"Yehoshua Hershkowitz, 92, Founder of a Kosher Meal Program, Dies","WeightOfNode":"1"}]}]},{"name":"15","WeightOfNode":"3","children":[{"name":"weah, elect, hovat, presid","WeightOfNode":"3","children":[{"name":"George Weah Wins Liberia Election","WeightOfNode":"1"},{"name":"Sundays at the Altar of Science","WeightOfNode":"1"},{"name":"I Interviewed a White Nationalist and Fascist. What Was I Left With?","WeightOfNode":"1"}]}]},{"name":"16","WeightOfNode":"3","children":[{"name":"live, new, will","WeightOfNode":"3","children":[{"name":"As ‘Ban the Box’ Spreads, Private Employers Still Have Questions","WeightOfNode":"1"},{"name":"California Today: Rain Brings Health Hazards to the Homeless","WeightOfNode":"1"},{"name":"What to Cook This Week","WeightOfNode":"1"}]}]},{"name":"17","WeightOfNode":"3","children":[{"name":"world, gees, tea","WeightOfNode":"3","children":[{"name":"The Sun Never Set on the British Empire, or Its Food","WeightOfNode":"1"},{"name":"Deaths of Dozens of Canada Geese Linked to Moldy Bread or Grain","WeightOfNode":"1"},{"name":"Carbohydrates","WeightOfNode":"1"}]}]},{"name":"18","WeightOfNode":"3","children":[{"name":"new, recip, cook","WeightOfNode":"3","children":[{"name":"Aleksei Navalny, Turkey, Meghan Markle: Your Tuesday Briefing","WeightOfNode":"1"},{"name":"What to Cook This Weekend","WeightOfNode":"1"},{"name":"How to Build a Gingerbread House","WeightOfNode":"1"}]}]},{"name":"19","WeightOfNode":"3","children":[{"name":"restaur, nun, year","WeightOfNode":"3","children":[{"name":"Get Me to a Nunnery","WeightOfNode":"1"},{"name":"Matt Orlando Brings California Sun to Copenhagen","WeightOfNode":"1"},{"name":"Chat With the Waiter","WeightOfNode":"1"}]}]}]},"options":{"hierarchy":["topic","vector","heading"],"input":null,"attribute":"leafCount","linkLength":null,"fontSize":10,"tooltip":true,"collapsed":true,"zoomable":false,"margin":{"top":20,"bottom":20,"left":95,"right":365},"fill":"lightsteelblue"}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-09147cfc3f5165bdd0fa">{"viewer":{"width":1000,"height":500,"padding":0,"fill":false},"browser":{"width":1000,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>