-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.html
22 lines (20 loc) · 365 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>chorddiag</title>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gdHJ5RXZhbCh0YXNrKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gQXR0ZW1wdCBldmFsKCkgYm90aCB3aXRoIGFuZCB3aXRob3V0IGVuY2xvc2luZyBpbiBwYXJlbnRoZXNlcy4KICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGNvZXJjZXMgYSBmdW5jdGlvbiBkZWNsYXJhdGlvbiBpbnRvCiAgLy8gYW4gZXhwcmVzc2lvbiB0aGF0IGV2YWwoKSBjYW4gcGFyc2UKICAvLyAob3RoZXJ3aXNlLCBhIFN5bnRheEVycm9yIGlzIHRocm93bikKICBmdW5jdGlvbiB0cnlFdmFsKGNvZGUpIHsKICAgIHZhciByZXN1bHQgPSBudWxsOwogICAgdHJ5IHsKICAgICAgcmVzdWx0ID0gZXZhbCgiKCIgKyBjb2RlICsgIikiKTsKICAgIH0gY2F0Y2goZXJyb3IpIHsKICAgICAgaWYgKCEoZXJyb3IgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikpIHsKICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgfQogICAgICB0cnkgewogICAgICAgIHJlc3VsdCA9IGV2YWwoY29kZSk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIGlmIChlIGluc3RhbmNlb2YgU3ludGF4RXJyb3IpIHsKICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIGluaXRTaXppbmcoZWwpIHsKICAgIHZhciBzaXppbmcgPSBzaXppbmdQb2xpY3koZWwpOwogICAgaWYgKCFzaXppbmcpCiAgICAgIHJldHVybjsKCiAgICB2YXIgY2VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImh0bWx3aWRnZXRfY29udGFpbmVyIik7CiAgICBpZiAoIWNlbCkKICAgICAgcmV0dXJuOwoKICAgIGlmICh0eXBlb2Yoc2l6aW5nLnBhZGRpbmcpICE9PSAidW5kZWZpbmVkIikgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm1hcmdpbiA9ICIwIjsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nID0gcGFkZGluZ1RvQ3NzKHVucGFja1BhZGRpbmcoc2l6aW5nLnBhZGRpbmcpKTsKICAgIH0KCiAgICBpZiAoc2l6aW5nLmZpbGwpIHsKICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBpZiAoY2VsKSB7CiAgICAgICAgY2VsLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgICAgICB2YXIgcGFkID0gdW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZyk7CiAgICAgICAgY2VsLnN0eWxlLnRvcCA9IHBhZC50b3AgKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5yaWdodCA9IHBhZC5yaWdodCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmJvdHRvbSA9IHBhZC5ib3R0b20gKyAicHgiOwogICAgICAgIGNlbC5zdHlsZS5sZWZ0ID0gcGFkLmxlZnQgKyAicHgiOwogICAgICAgIGVsLnN0eWxlLndpZHRoID0gIjEwMCUiOwogICAgICAgIGVsLnN0eWxlLmhlaWdodCA9ICIxMDAlIjsKICAgICAgfQoKICAgICAgcmV0dXJuIHsKICAgICAgICBnZXRXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjZWwub2Zmc2V0V2lkdGg7IH0sCiAgICAgICAgZ2V0SGVpZ2h0OiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKCiAgICB9IGVsc2UgewogICAgICBlbC5zdHlsZS53aWR0aCA9IHB4KHNpemluZy53aWR0aCk7CiAgICAgIGVsLnN0eWxlLmhlaWdodCA9IHB4KHNpemluZy5oZWlnaHQpOwoKICAgICAgcmV0dXJuIHsKICAgICAgICBnZXRXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gZWwub2Zmc2V0SGVpZ2h0OyB9CiAgICAgIH07CiAgICB9CiAgfQoKICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgbWV0aG9kcwogIHZhciBkZWZhdWx0cyA9IHsKICAgIGZpbmQ6IGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCAiLiIgKyB0aGlzLm5hbWUpOwogICAgfSwKICAgIHJlbmRlckVycm9yOiBmdW5jdGlvbihlbCwgZXJyKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKCiAgICAgIHRoaXMuY2xlYXJFcnJvcihlbCk7CgogICAgICAvLyBBZGQgYWxsIHRoZXNlIGVycm9yIGNsYXNzZXMsIGFzIFNoaW55IGRvZXMKICAgICAgdmFyIGVyckNsYXNzID0gInNoaW55LW91dHB1dC1lcnJvciI7CiAgICAgIGlmIChlcnIudHlwZSAhPT0gbnVsbCkgewogICAgICAgIC8vIHVzZSB0aGUgY2xhc3NlcyBvZiB0aGUgZXJyb3IgY29uZGl0aW9uIGFzIENTUyBjbGFzcyBuYW1lcwogICAgICAgIGVyckNsYXNzID0gZXJyQ2xhc3MgKyAiICIgKyAkLm1hcChhc0FycmF5KGVyci50eXBlKSwgZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgcmV0dXJuIGVyckNsYXNzICsgIi0iICsgdHlwZTsKICAgICAgICB9KS5qb2luKCIgIik7CiAgICAgIH0KICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgaHRtbHdpZGdldHMtZXJyb3IiOwoKICAgICAgLy8gSXMgZWwgaW5saW5lIG9yIGJsb2NrPyBJZiBpbmxpbmUgb3IgaW5saW5lLWJsb2NrLCBqdXN0IGRpc3BsYXk6bm9uZSBpdAogICAgICAvLyBhbmQgYWRkIGFuIGlubGluZSBlcnJvci4KICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuY3NzKCJkaXNwbGF5Iik7CiAgICAgICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIsIGRpc3BsYXkpOwoKICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7CiAgICAgICAgJGVsLmhpZGUoKTsKICAgICAgICBpZiAoZXJyLm1lc3NhZ2UgIT09ICIiKSB7CiAgICAgICAgICB2YXIgZXJyb3JTcGFuID0gJCgiPHNwYW4+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpOwogICAgICAgICAgZXJyb3JTcGFuLnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yU3Bhbik7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpIHsKICAgICAgICAvLyBJZiBibG9jaywgYWRkIGFuIGVycm9yIGp1c3QgYWZ0ZXIgdGhlIGVsLCBzZXQgdmlzaWJpbGl0eTpub25lIG9uIHRoZQogICAgICAgIC8vIGVsLCBhbmQgcG9zaXRpb24gdGhlIGVycm9yIHRvIGJlIG9uIHRvcCBvZiB0aGUgZWwuCiAgICAgICAgLy8gTWFyayBpdCB3aXRoIGEgdW5pcXVlIElEIGFuZCBDU1MgY2xhc3Mgc28gd2UgY2FuIHJlbW92ZSBpdCBsYXRlci4KICAgICAgICAkZWwuY3NzKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvckRpdiA9ICQoIjxkaXY+IikuYWRkQ2xhc3MoZXJyQ2xhc3MpLmNzcygicG9zaXRpb24iLCAiYWJzb2x1dGUiKQogICAgICAgICAgICAuY3NzKCJ0b3AiLCBlbC5vZmZzZXRUb3ApCiAgICAgICAgICAgIC5jc3MoImxlZnQiLCBlbC5vZmZzZXRMZWZ0KQogICAgICAgICAgICAvLyBzZXR0aW5nIHdpZHRoIGNhbiBwdXNoIG91dCB0aGUgcGFnZSBzaXplLCBmb3JjaW5nIG90aGVyd2lzZQogICAgICAgICAgICAvLyB1bm5lY2Vzc2FyeSBzY3JvbGxiYXJzIHRvIGFwcGVhciBhbmQgbWFraW5nIGl0IGltcG9zc2libGUgZm9yCiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHRvIHNocmluazsgc28gdXNlIG1heC13aWR0aCBpbnN0ZWFkCiAgICAgICAgICAgIC5jc3MoIm1heFdpZHRoIiwgZWwub2Zmc2V0V2lkdGgpCiAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICBlcnJvckRpdi50ZXh0KGVyci5tZXNzYWdlKTsKICAgICAgICAgICRlbC5hZnRlcihlcnJvckRpdik7CgogICAgICAgICAgLy8gUmVhbGx5IGR1bWIgd2F5IHRvIGtlZXAgdGhlIHNpemUvcG9zaXRpb24gb2YgdGhlIGVycm9yIGluIHN5bmMgd2l0aAogICAgICAgICAgLy8gdGhlIHBhcmVudCBlbGVtZW50IGFzIHRoZSB3aW5kb3cgaXMgcmVzaXplZCBvciB3aGF0ZXZlci4KICAgICAgICAgIHZhciBpbnRJZCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoIWVycm9yRGl2WzBdLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICBjbGVhckludGVydmFsKGludElkKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3JEaXYKICAgICAgICAgICAgICAuY3NzKCJ0b3AiLCBlbC5vZmZzZXRUb3ApCiAgICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgICAuY3NzKCJoZWlnaHQiLCBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgfSwgNTAwKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBjbGVhckVycm9yOiBmdW5jdGlvbihlbCkgewogICAgICB2YXIgJGVsID0gJChlbCk7CiAgICAgIHZhciBkaXNwbGF5ID0gJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIik7CiAgICAgICRlbC5kYXRhKCJyZXN0b3JlLWRpc3BsYXktbW9kZSIsIG51bGwpOwoKICAgICAgaWYgKGRpc3BsYXkgPT09ICJpbmxpbmUiIHx8IGRpc3BsYXkgPT09ICJpbmxpbmUtYmxvY2siKSB7CiAgICAgICAgaWYgKGRpc3BsYXkpCiAgICAgICAgICAkZWwuY3NzKCJkaXNwbGF5IiwgZGlzcGxheSk7CiAgICAgICAgJChlbC5uZXh0U2libGluZykuZmlsdGVyKCIuaHRtbHdpZGdldHMtZXJyb3IiKS5yZW1vdmUoKTsKICAgICAgfSBlbHNlIGlmIChkaXNwbGF5ID09PSAiYmxvY2siKXsKICAgICAgICAkZWwuY3NzKCJ2aXNpYmlsaXR5IiwgImluaGVyaXQiKTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9CiAgICB9LAogICAgc2l6aW5nOiB7fQogIH07CgogIC8vIENhbGxlZCBieSB3aWRnZXQgYmluZGluZ3MgdG8gcmVnaXN0ZXIgYSBuZXcgdHlwZSBvZiB3aWRnZXQuIFRoZSBkZWZpbml0aW9uCiAgLy8gb2JqZWN0IGNhbiBjb250YWluIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAvLyAtIG5hbWUgKHJlcXVpcmVkKSAtIEEgc3RyaW5nIGluZGljYXRpbmcgdGhlIGJpbmRpbmcgbmFtZSwgd2hpY2ggd2lsbCBiZQogIC8vICAgdXNlZCBieSBkZWZhdWx0IGFzIHRoZSBDU1MgY2xhc3NuYW1lIHRvIGxvb2sgZm9yLgogIC8vIC0gaW5pdGlhbGl6ZSAob3B0aW9uYWwpIC0gQSBmdW5jdGlvbihlbCkgdGhhdCB3aWxsIGJlIGNhbGxlZCBvbmNlIHBlcgogIC8vICAgd2lkZ2V0IGVsZW1lbnQ7IGlmIGEgdmFsdWUgaXMgcmV0dXJuZWQsIGl0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSB0aGlyZAogIC8vICAgdmFsdWUgdG8gcmVuZGVyVmFsdWUuCiAgLy8gLSByZW5kZXJWYWx1ZSAocmVxdWlyZWQpIC0gQSBmdW5jdGlvbihlbCwgZGF0YSwgaW5pdFZhbHVlKSB0aGF0IHdpbGwgYmUKICAvLyAgIGNhbGxlZCB3aXRoIGRhdGEuIFN0YXRpYyBjb250ZXh0cyB3aWxsIGNhdXNlIHRoaXMgdG8gYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICBlbGVtZW50OyBTaGlueSBhcHBzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgcGVyCiAgLy8gICBlbGVtZW50LCBhcyB0aGUgZGF0YSBjaGFuZ2VzLgogIHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXQgPSBmdW5jdGlvbihkZWZpbml0aW9uKSB7CiAgICBpZiAoIWRlZmluaXRpb24ubmFtZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSBuYW1lIik7CiAgICB9CiAgICBpZiAoIWRlZmluaXRpb24udHlwZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSB0eXBlIik7CiAgICB9CiAgICAvLyBDdXJyZW50bHkgd2Ugb25seSBzdXBwb3J0IG91dHB1dCB3aWRnZXRzCiAgICBpZiAoZGVmaW5pdGlvbi50eXBlICE9PSAib3V0cHV0IikgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCB3aWRnZXQgdHlwZSAnIiArIGRlZmluaXRpb24udHlwZSArICInIik7CiAgICB9CiAgICAvLyBUT0RPOiBWZXJpZnkgdGhhdCAubmFtZSBpcyBhIHZhbGlkIENTUyBjbGFzc25hbWUKCiAgICAvLyBTdXBwb3J0IG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9ucy4gT2xkLXN0eWxlIGNsYXNzLWJvdW5kCiAgICAvLyBkZWZpbml0aW9ucyBoYXZlIG9uZSB3aWRnZXQgIm9iamVjdCIgcGVyIHdpZGdldCBwZXIgdHlwZS9jbGFzcyBvZgogICAgLy8gd2lkZ2V0OyB0aGUgcmVuZGVyVmFsdWUgYW5kIHJlc2l6ZSBtZXRob2RzIG9uIHN1Y2ggd2lkZ2V0IG9iamVjdHMKICAgIC8vIHRha2UgZWwgYW5kIGluc3RhbmNlIGFyZ3VtZW50cywgYmVjYXVzZSB0aGUgd2lkZ2V0IG9iamVjdCBjYW4ndAogICAgLy8gc3RvcmUgdGhlbS4gTmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldAogICAgLy8gb2JqZWN0IHBlciB3aWRnZXQgaW5zdGFuY2U7IHRoZSBkZWZpbml0aW9uIHRoYXQncyBwYXNzZWQgaW4gZG9lc24ndAogICAgLy8gcHJvdmlkZSByZW5kZXJWYWx1ZSBvciByZXNpemUgbWV0aG9kcyBhdCBhbGwsIGp1c3QgdGhlIHNpbmdsZSBtZXRob2QKICAgIC8vICAgZmFjdG9yeShlbCwgd2lkdGgsIGhlaWdodCkKICAgIC8vIHdoaWNoIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgaGFzIHJlbmRlclZhbHVlKHgpIGFuZCByZXNpemUodywgaCkuCiAgICAvLyBUaGlzIGVuYWJsZXMgYSBmYXIgbW9yZSBuYXR1cmFsIHByb2dyYW1taW5nIHN0eWxlIGZvciB0aGUgd2lkZ2V0CiAgICAvLyBhdXRob3IsIHdobyBjYW4gc3RvcmUgcGVyLWluc3RhbmNlIHN0YXRlIHVzaW5nIGVpdGhlciBPTy1zdHlsZQogICAgLy8gaW5zdGFuY2UgZmllbGRzIG9yIGZ1bmN0aW9uYWwtc3R5bGUgY2xvc3VyZSB2YXJpYWJsZXMgKEkgZ3Vlc3MgdGhpcwogICAgLy8gaXMgaW4gY29udHJhc3QgdG8gd2hhdCBjYW4gb25seSBiZSBjYWxsZWQgQy1zdHlsZSBwc2V1ZG8tT08gd2hpY2ggaXMKICAgIC8vIHdoYXQgd2UgcmVxdWlyZWQgYmVmb3JlKS4KICAgIGlmIChkZWZpbml0aW9uLmZhY3RvcnkpIHsKICAgICAgZGVmaW5pdGlvbiA9IGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZmluaXRpb24pOwogICAgfQoKICAgIGlmICghZGVmaW5pdGlvbi5yZW5kZXJWYWx1ZSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldpZGdldCBtdXN0IGhhdmUgYSByZW5kZXJWYWx1ZSBmdW5jdGlvbiIpOwogICAgfQoKICAgIC8vIEZvciBzdGF0aWMgcmVuZGVyaW5nIChub24tU2hpbnkpLCB1c2UgYSBzaW1wbGUgd2lkZ2V0IHJlZ2lzdHJhdGlvbgogICAgLy8gc2NoZW1lLiBXZSBhbHNvIHVzZSB0aGlzIHNjaGVtZSBmb3IgU2hpbnkgYXBwcy9kb2N1bWVudHMgdGhhdCBhbHNvCiAgICAvLyBjb250YWluIHN0YXRpYyB3aWRnZXRzLgogICAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsKICAgIC8vIE1lcmdlIGRlZmF1bHRzIGludG8gdGhlIGRlZmluaXRpb247IGRvbid0IG11dGF0ZSB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbi4KICAgIHZhciBzdGF0aWNCaW5kaW5nID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7CiAgICBvdmVycmlkZU1ldGhvZChzdGF0aWNCaW5kaW5nLCAiZmluZCIsIGZ1bmN0aW9uKHN1cGVyZnVuYykgewogICAgICByZXR1cm4gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IHN1cGVyZnVuYyhzY29wZSk7CiAgICAgICAgLy8gRmlsdGVyIG91dCBTaGlueSBvdXRwdXRzLCB3ZSBvbmx5IHdhbnQgdGhlIHN0YXRpYyBraW5kCiAgICAgICAgcmV0dXJuIGZpbHRlckJ5Q2xhc3MocmVzdWx0cywgImh0bWwtd2lkZ2V0LW91dHB1dCIsIGZhbHNlKTsKICAgICAgfTsKICAgIH0pOwogICAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMucHVzaChzdGF0aWNCaW5kaW5nKTsKCiAgICBpZiAoc2hpbnlNb2RlKSB7CiAgICAgIC8vIFNoaW55IGlzIHJ1bm5pbmcuIFJlZ2lzdGVyIHRoZSBkZWZpbml0aW9uIHdpdGggYW4gb3V0cHV0IGJpbmRpbmcuCiAgICAgIC8vIFRoZSBkZWZpbml0aW9uIGl0c2VsZiB3aWxsIG5vdCBiZSB0aGUgb3V0cHV0IGJpbmRpbmcsIGluc3RlYWQKICAgICAgLy8gd2Ugd2lsbCBtYWtlIGFuIG91dHB1dCBiaW5kaW5nIG9iamVjdCB0aGF0IGRlbGVnYXRlcyB0byB0aGUKICAgICAgLy8gZGVmaW5pdGlvbi4gVGhpcyBpcyBiZWNhdXNlIHdlIGZvb2xpc2hseSB1c2VkIHRoZSBzYW1lIG1ldGhvZAogICAgICAvLyBuYW1lIChyZW5kZXJWYWx1ZSkgZm9yIGh0bWx3aWRnZXRzIGRlZmluaXRpb24gYW5kIFNoaW55IGJpbmRpbmdzCiAgICAgIC8vIGJ1dCB0aGV5IGFjdHVhbGx5IGhhdmUgcXVpdGUgZGlmZmVyZW50IHNlbWFudGljcyAodGhlIFNoaW55CiAgICAgIC8vIGJpbmRpbmdzIHJlY2VpdmUgZGF0YSB0aGF0IGluY2x1ZGVzIGxvdHMgb2YgbWV0YWRhdGEgdGhhdCBpdAogICAgICAvLyBzdHJpcHMgb2ZmIGJlZm9yZSBjYWxsaW5nIGh0bWx3aWRnZXRzIHJlbmRlclZhbHVlKS4gV2UgY2FuJ3QKICAgICAgLy8ganVzdCBpZ25vcmUgdGhlIGRpZmZlcmVuY2UgYmVjYXVzZSBpbiBzb21lIHdpZGdldHMgaXQncyBoZWxwZnVsCiAgICAgIC8vIHRvIGNhbGwgdGhpcy5yZW5kZXJWYWx1ZSgpIGZyb20gaW5zaWRlIG9mIHJlc2l6ZSgpLCBhbmQgaWYKICAgICAgLy8gd2UncmUgbm90IGRlbGVnYXRpbmcsIHRoZW4gdGhhdCBjYWxsIHdpbGwgZ28gdG8gdGhlIFNoaW55CiAgICAgIC8vIHZlcnNpb24gaW5zdGVhZCBvZiB0aGUgaHRtbHdpZGdldHMgdmVyc2lvbi4KCiAgICAgIC8vIE1lcmdlIGRlZmF1bHRzIHdpdGggZGVmaW5pdGlvbiwgd2l0aG91dCBtdXRhdGluZyBlaXRoZXIuCiAgICAgIHZhciBiaW5kaW5nRGVmID0gZXh0ZW5kKHt9LCBkZWZhdWx0cywgZGVmaW5pdGlvbik7CgogICAgICAvLyBUaGlzIG9iamVjdCB3aWxsIGJlIG91ciBhY3R1YWwgU2hpbnkgYmluZGluZy4KICAgICAgdmFyIHNoaW55QmluZGluZyA9IG5ldyBTaGlueS5PdXRwdXRCaW5kaW5nKCk7CgogICAgICAvLyBXaXRoIGEgZmV3IGV4Y2VwdGlvbnMsIHdlJ2xsIHdhbnQgdG8gc2ltcGx5IHVzZSB0aGUgYmluZGluZ0RlZidzCiAgICAgIC8vIHZlcnNpb24gb2YgbWV0aG9kcyBpZiB0aGV5IGFyZSBhdmFpbGFibGUsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8KICAgICAgLy8gU2hpbnkncyBkZWZhdWx0cy4gTk9URTogSWYgU2hpbnkncyBvdXRwdXQgYmluZGluZ3MgZ2FpbiBhZGRpdGlvbmFsCiAgICAgIC8vIG1ldGhvZHMgaW4gdGhlIGZ1dHVyZSwgYW5kIHdlIHdhbnQgdGhlbSB0byBiZSBvdmVycmlkZWFibGUgYnkKICAgICAgLy8gSFRNTFdpZGdldCBiaW5kaW5nIGRlZmluaXRpb25zLCB0aGVuIHdlJ2xsIG5lZWQgdG8gYWRkIHRoZW0gdG8gdGhpcwogICAgICAvLyBsaXN0LgogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJnZXRJZCIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJvblZhbHVlQ2hhbmdlIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJyZW5kZXJFcnJvciIpOwogICAgICBkZWxlZ2F0ZU1ldGhvZChzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYsICJjbGVhckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInNob3dQcm9ncmVzcyIpOwoKICAgICAgLy8gVGhlIGZpbmQsIHJlbmRlclZhbHVlLCBhbmQgcmVzaXplIGFyZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBiZWNhdXNlIHdlCiAgICAgIC8vIHdhbnQgdG8gYWN0dWFsbHkgZGVjb3JhdGUgdGhlIGJlaGF2aW9yIG9mIHRoZSBiaW5kaW5nRGVmIG1ldGhvZHMuCgogICAgICBzaGlueUJpbmRpbmcuZmluZCA9IGZ1bmN0aW9uKHNjb3BlKSB7CiAgICAgICAgdmFyIHJlc3VsdHMgPSBiaW5kaW5nRGVmLmZpbmQoc2NvcGUpOwoKICAgICAgICAvLyBPbmx5IHJldHVybiBlbGVtZW50cyB0aGF0IGFyZSBTaGlueSBvdXRwdXRzLCBub3Qgc3RhdGljIG9uZXMKICAgICAgICB2YXIgZHluYW1pY1Jlc3VsdHMgPSByZXN1bHRzLmZpbHRlcigiLmh0bWwtd2lkZ2V0LW91dHB1dCIpOwoKICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgd2hhdGV2ZXIgY2F1c2VkIFNoaW55IHRvIHRoaW5rIHRoZXJlIG1pZ2h0IGJlCiAgICAgICAgLy8gbmV3IGR5bmFtaWMgb3V0cHV0cywgYWxzbyBjYXVzZWQgdGhlcmUgdG8gYmUgbmV3IHN0YXRpYyBvdXRwdXRzLgogICAgICAgIC8vIFNpbmNlIHRoZXJlIG1pZ2h0IGJlIGxvdHMgb2YgZGlmZmVyZW50IGh0bWx3aWRnZXRzIGJpbmRpbmdzLCB3ZQogICAgICAgIC8vIHNjaGVkdWxlIGV4ZWN1dGlvbiBmb3IgbGF0ZXItLW5vIG5lZWQgdG8gc3RhdGljUmVuZGVyIG11bHRpcGxlCiAgICAgICAgLy8gdGltZXMuCiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoICE9PSBkeW5hbWljUmVzdWx0cy5sZW5ndGgpCiAgICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlcigpOwoKICAgICAgICByZXR1cm4gZHluYW1pY1Jlc3VsdHM7CiAgICAgIH07CgogICAgICAvLyBXcmFwIHJlbmRlclZhbHVlIHRvIGhhbmRsZSBpbml0aWFsaXphdGlvbiwgd2hpY2ggdW5mb3J0dW5hdGVseSBpc24ndAogICAgICAvLyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgU2hpbnkgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgoKICAgICAgc2hpbnlCaW5kaW5nLnJlbmRlclZhbHVlID0gZnVuY3Rpb24oZWwsIGRhdGEpIHsKICAgICAgICBTaGlueS5yZW5kZXJEZXBlbmRlbmNpZXMoZGF0YS5kZXBzKTsKICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGRhdGEuZXZhbHMgJiYgaSA8IGRhdGEuZXZhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNbaV0pOwogICAgICAgIH0KICAgICAgICBpZiAoIWJpbmRpbmdEZWYucmVuZGVyT25OdWxsVmFsdWUpIHsKICAgICAgICAgIGlmIChkYXRhLnggPT09IG51bGwpIHsKICAgICAgICAgICAgZWwuc3R5bGUudmlzaWJpbGl0eSA9ICJoaWRkZW4iOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImluaGVyaXQiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgaW5pdFNpemluZyhlbCk7CgogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIsIHRydWUpOwogICAgICAgICAgaWYgKGJpbmRpbmdEZWYuaW5pdGlhbGl6ZSkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gYmluZGluZ0RlZi5pbml0aWFsaXplKGVsLCBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBlbC5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgcmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYmluZGluZ0RlZi5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IikpOwogICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpLCBbZWwsIGRhdGEueF0pOwogICAgICB9OwoKICAgICAgLy8gT25seSBvdmVycmlkZSByZXNpemUgaWYgYmluZGluZ0RlZiBpbXBsZW1lbnRzIGl0CiAgICAgIGlmIChiaW5kaW5nRGVmLnJlc2l6ZSkgewogICAgICAgIHNoaW55QmluZGluZy5yZXNpemUgPSBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgICAgLy8gU2hpbnkgY2FuIGNhbGwgcmVzaXplIGJlZm9yZSBpbml0aWFsaXplL3JlbmRlclZhbHVlIGhhdmUgYmVlbgogICAgICAgICAgLy8gY2FsbGVkLCB3aGljaCBkb2Vzbid0IG1ha2Ugc2Vuc2UgZm9yIHdpZGdldHMuCiAgICAgICAgICBpZiAoZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICAgIGJpbmRpbmdEZWYucmVzaXplKGVsLCB3aWR0aCwgaGVpZ2h0LCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IikpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIFNoaW55Lm91dHB1dEJpbmRpbmdzLnJlZ2lzdGVyKHNoaW55QmluZGluZywgYmluZGluZ0RlZi5uYW1lKTsKICAgIH0KICB9OwoKICB2YXIgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsKICBmdW5jdGlvbiBzY2hlZHVsZVN0YXRpY1JlbmRlcigpIHsKICAgIGlmICghc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkKSB7CiAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gbnVsbDsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0sIDEpOwogICAgfQogIH0KCiAgLy8gUmVuZGVyIHN0YXRpYyB3aWRnZXRzIGFmdGVyIHRoZSBkb2N1bWVudCBmaW5pc2hlcyBsb2FkaW5nCiAgLy8gU3RhdGljYWxseSByZW5kZXIgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIG9mIHRoaXMgd2lkZ2V0J3MgY2xhc3MKICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgYmluZGluZ3MgPSB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyB8fCBbXTsKICAgIGZvckVhY2goYmluZGluZ3MsIGZ1bmN0aW9uKGJpbmRpbmcpIHsKICAgICAgdmFyIG1hdGNoZXMgPSBiaW5kaW5nLmZpbmQoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTsKICAgICAgZm9yRWFjaChtYXRjaGVzLCBmdW5jdGlvbihlbCkgewogICAgICAgIHZhciBzaXplT2JqID0gaW5pdFNpemluZyhlbCwgYmluZGluZyk7CgogICAgICAgIGlmIChoYXNDbGFzcyhlbCwgImh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCIpKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIGVsLmNsYXNzTmFtZSA9IGVsLmNsYXNzTmFtZSArICIgaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIjsKCiAgICAgICAgdmFyIGluaXRSZXN1bHQ7CiAgICAgICAgaWYgKGJpbmRpbmcuaW5pdGlhbGl6ZSkgewogICAgICAgICAgaW5pdFJlc3VsdCA9IGJpbmRpbmcuaW5pdGlhbGl6ZShlbCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0V2lkdGgoKSA6IGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgKTsKICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCBpbml0UmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIGlmIChiaW5kaW5nLnJlc2l6ZSkgewogICAgICAgICAgdmFyIGxhc3RTaXplID0gewogICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIGg6IHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKCiAgZnVuY3Rpb24gaGFzX2pRdWVyeTMoKSB7CiAgICBpZiAoIXdpbmRvdy5qUXVlcnkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyICR2ZXJzaW9uID0gd2luZG93LmpRdWVyeS5mbi5qcXVlcnk7CiAgICB2YXIgJG1ham9yX3ZlcnNpb24gPSBwYXJzZUludCgkdmVyc2lvbi5zcGxpdCgiLiIpWzBdKTsKICAgIHJldHVybiAkbWFqb3JfdmVyc2lvbiA+PSAzOwogIH0KCiAgLyoKICAvIFNoaW55IDEuNCBidW1wZWQgalF1ZXJ5IGZyb20gMS54IHRvIDMueCB3aGljaCBtZWFucyBqUXVlcnkncwogIC8gb24tcmVhZHkgaGFuZGxlciAoaS5lLiwgJChmbikpIGlzIG5vdyBhc3luY3Jvbm91cyAoaS5lLiwgaXQgbm93CiAgLyByZWFsbHkgbWVhbnMgJChzZXRUaW1lb3V0KGZuKSkuCiAgLyBodHRwczovL2pxdWVyeS5jb20vdXBncmFkZS1ndWlkZS8zLjAvI2JyZWFraW5nLWNoYW5nZS1kb2N1bWVudC1yZWFkeS1oYW5kbGVycy1hcmUtbm93LWFzeW5jaHJvbm91cwogIC8KICAvIFNpbmNlIFNoaW55IHVzZXMgJCgpIHRvIHNjaGVkdWxlIGluaXRTaGlueSwgc2hpbnk+PTEuNCBjYWxscyBpbml0U2hpbnkKICAvIG9uZSB0aWNrIGxhdGVyIHRoYW4gaXQgZGlkIGJlZm9yZSwgd2hpY2ggbWVhbnMgc3RhdGljUmVuZGVyKCkgaXMKICAvIGNhbGxlZCByZW5kZXJWYWx1ZSgpIGVhcmxpZXIgdGhhbiAoYWR2YW5jZWQpIHdpZGdldCBhdXRob3JzIG1pZ2h0IGJlIGV4cGVjdGluZy4KICAvIGh0dHBzOi8vZ2l0aHViLmNvbS9yc3R1ZGlvL3NoaW55L2lzc3Vlcy8yNjMwCiAgLwogIC8gRm9yIGEgY29uY3JldGUgZXhhbXBsZSwgbGVhZmxldCBoYXMgc29tZSBtZXRob2RzIChlLmcuLCB1cGRhdGVCb3VuZHMpCiAgLyB3aGljaCByZWZlcmVuY2UgU2hpbnkgbWV0aG9kcyByZWdpc3RlcmVkIGluIGluaXRTaGlueSAoZS5nLiwgc2V0SW5wdXRWYWx1ZSkuCiAgLyBTaW5jZSBsZWFmbGV0IGlzIHByaXZ5IHRvIHRoaXMgbGlmZS1jeWNsZSwgaXQga25vd3MgdG8gdXNlIHNldFRpbWVvdXQoKSB0bwogIC8gZGVsYXkgZXhlY3V0aW9uIG9mIHRob3NlIG1ldGhvZHMgKHVudGlsIFNoaW55IG1ldGhvZHMgYXJlIHJlYWR5KQogIC8gaHR0cHM6Ly9naXRodWIuY29tL3JzdHVkaW8vbGVhZmxldC9ibG9iLzE4ZWM5ODEvamF2YXNjcmlwdC9zcmMvaW5kZXguanMjTDI2Ni1MMjY4CiAgLwogIC8gSWRlYWxseSB3aWRnZXQgYXV0aG9ycyB3b3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzIHNldFRpbWVvdXQoKSBoYWNrIHRoYXQKICAvIGxlYWZsZXQgdXNlcyB0byBjYWxsIFNoaW55IG1ldGhvZHMgb24gYSBzdGF0aWNSZW5kZXIoKS4gSW4gdGhlIGxvbmcgcnVuLAogIC8gdGhlIGxvZ2ljIGluaXRTaGlueSBzaG91bGQgYmUgYnJva2VuIHVwIHNvIHRoYXQgbWV0aG9kIHJlZ2lzdHJhdGlvbiBoYXBwZW5zCiAgLyByaWdodCBhd2F5LCBidXQgYmluZGluZyBoYXBwZW5zIGxhdGVyLgogICovCiAgZnVuY3Rpb24gbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpIHsKICAgIGlmIChzaGlueU1vZGUgJiYgaGFzX2pRdWVyeTMoKSkgewogICAgICB3aW5kb3cualF1ZXJ5KHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfQogIH0KCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgbWF5YmVTdGF0aWNSZW5kZXJMYXRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gdHJ5RXZhbChvW3BhcnRdKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/javascript;base64,Ly8gaHR0cHM6Ly9kM2pzLm9yZyBWZXJzaW9uIDQuMTMuMC4gQ29weXJpZ2h0IDIwMTggTWlrZSBCb3N0b2NrLgooZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0pKHRoaXMsZnVuY3Rpb24odCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdDxuPy0xOnQ+bj8xOnQ+PW4/MDpOYU59ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxyKXtyZXR1cm4gbih0KGUpLHIpfX0odCkpLHtsZWZ0OmZ1bmN0aW9uKG4sZSxyLGkpe2ZvcihudWxsPT1yJiYocj0wKSxudWxsPT1pJiYoaT1uLmxlbmd0aCk7cjxpOyl7dmFyIG89citpPj4+MTt0KG5bb10sZSk8MD9yPW8rMTppPW99cmV0dXJuIHJ9LHJpZ2h0OmZ1bmN0aW9uKG4sZSxyLGkpe2ZvcihudWxsPT1yJiYocj0wKSxudWxsPT1pJiYoaT1uLmxlbmd0aCk7cjxpOyl7dmFyIG89citpPj4+MTt0KG5bb10sZSk+MD9pPW86cj1vKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiByKHQsbil7cmV0dXJuW3Qsbl19ZnVuY3Rpb24gaSh0KXtyZXR1cm4gbnVsbD09PXQ/TmFOOit0fWZ1bmN0aW9uIG8odCxuKXt2YXIgZSxyLG89dC5sZW5ndGgsdT0wLGE9LTEsYz0wLHM9MDtpZihudWxsPT1uKWZvcig7KythPG87KWlzTmFOKGU9aSh0W2FdKSl8fChzKz0ocj1lLWMpKihlLShjKz1yLysrdSkpKTtlbHNlIGZvcig7KythPG87KWlzTmFOKGU9aShuKHRbYV0sYSx0KSkpfHwocys9KHI9ZS1jKSooZS0oYys9ci8rK3UpKSk7aWYodT4xKXJldHVybiBzLyh1LTEpfWZ1bmN0aW9uIHUodCxuKXt2YXIgZT1vKHQsbik7cmV0dXJuIGU/TWF0aC5zcXJ0KGUpOmV9ZnVuY3Rpb24gYSh0LG4pe3ZhciBlLHIsaSxvPXQubGVuZ3RoLHU9LTE7aWYobnVsbD09bil7Zm9yKDsrK3U8bzspaWYobnVsbCE9KGU9dFt1XSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT10W3VdKSYmKHI+ZSYmKHI9ZSksaTxlJiYoaT1lKSl9ZWxzZSBmb3IoOysrdTxvOylpZihudWxsIT0oZT1uKHRbdV0sdSx0KSkmJmU+PWUpZm9yKHI9aT1lOysrdTxvOyludWxsIT0oZT1uKHRbdV0sdSx0KSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpO3JldHVybltyLGldfWZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHModCl7cmV0dXJuIHR9ZnVuY3Rpb24gZih0LG4sZSl7dD0rdCxuPStuLGU9KGk9YXJndW1lbnRzLmxlbmd0aCk8Mj8obj10LHQ9MCwxKTppPDM/MTorZTtmb3IodmFyIHI9LTEsaT0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChuLXQpL2UpKSxvPW5ldyBBcnJheShpKTsrK3I8aTspb1tyXT10K3IqZTtyZXR1cm4gb31mdW5jdGlvbiBsKHQsbixlKXt2YXIgcixpLG8sdSxhPS0xO2lmKG49K24sdD0rdCxlPStlLHQ9PT1uJiZlPjApcmV0dXJuW3RdO2lmKChyPW48dCkmJihpPXQsdD1uLG49aSksMD09PSh1PWgodCxuLGUpKXx8IWlzRmluaXRlKHUpKXJldHVybltdO2lmKHU+MClmb3IodD1NYXRoLmNlaWwodC91KSxuPU1hdGguZmxvb3Iobi91KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbChuLXQrMSkpOysrYTxpOylvW2FdPSh0K2EpKnU7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqdSksbj1NYXRoLmNlaWwobip1KSxvPW5ldyBBcnJheShpPU1hdGguY2VpbCh0LW4rMSkpOysrYTxpOylvW2FdPSh0LWEpL3U7cmV0dXJuIHImJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gaCh0LG4sZSl7dmFyIHI9KG4tdCkvTWF0aC5tYXgoMCxlKSxpPU1hdGguZmxvb3IoTWF0aC5sb2cocikvTWF0aC5MTjEwKSxvPXIvTWF0aC5wb3coMTAsaSk7cmV0dXJuIGk+PTA/KG8+PUhzPzEwOm8+PWpzPzU6bz49WHM/MjoxKSpNYXRoLnBvdygxMCxpKTotTWF0aC5wb3coMTAsLWkpLyhvPj1Icz8xMDpvPj1qcz81Om8+PVhzPzI6MSl9ZnVuY3Rpb24gcCh0LG4sZSl7dmFyIHI9TWF0aC5hYnMobi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApKSxvPXIvaTtyZXR1cm4gbz49SHM/aSo9MTA6bz49anM/aSo9NTpvPj1YcyYmKGkqPTIpLG48dD8taTppfWZ1bmN0aW9uIGQodCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gdih0LG4sZSl7aWYobnVsbD09ZSYmKGU9aSkscj10Lmxlbmd0aCl7aWYoKG49K24pPD0wfHxyPDIpcmV0dXJuK2UodFswXSwwLHQpO2lmKG4+PTEpcmV0dXJuK2UodFtyLTFdLHItMSx0KTt2YXIgcixvPShyLTEpKm4sdT1NYXRoLmZsb29yKG8pLGE9K2UodFt1XSx1LHQpO3JldHVybiBhKygrZSh0W3UrMV0sdSsxLHQpLWEpKihvLXUpfX1mdW5jdGlvbiBnKHQpe2Zvcih2YXIgbixlLHIsaT10Lmxlbmd0aCxvPS0xLHU9MDsrK288aTspdSs9dFtvXS5sZW5ndGg7Zm9yKGU9bmV3IEFycmF5KHUpOy0taT49MDspZm9yKG49KHI9dFtpXSkubGVuZ3RoOy0tbj49MDspZVstLXVdPXJbbl07cmV0dXJuIGV9ZnVuY3Rpb24gXyh0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZyPmUmJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmcj5lJiYocj1lKTtyZXR1cm4gcn1mdW5jdGlvbiB5KHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLGU9Xyh0LG0pLHI9bmV3IEFycmF5KGUpOysrbjxlOylmb3IodmFyIGksbz0tMSx1PXJbbl09bmV3IEFycmF5KGkpOysrbzxpOyl1W29dPXRbb11bbl07cmV0dXJuIHJ9ZnVuY3Rpb24gbSh0KXtyZXR1cm4gdC5sZW5ndGh9ZnVuY3Rpb24geCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBiKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gdyh0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIE0oKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gVCh0LG4pe2Z1bmN0aW9uIGUoZSl7dmFyIGg9bnVsbD09aT9uLnRpY2tzP24udGlja3MuYXBwbHkobixyKTpuLmRvbWFpbigpOmkscD1udWxsPT1vP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixyKTp4Om8sZD1NYXRoLm1heCh1LDApK2Msdj1uLnJhbmdlKCksZz0rdlswXSsuNSxfPSt2W3YubGVuZ3RoLTFdKy41LHk9KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLG09ZS5zZWxlY3Rpb24/ZS5zZWxlY3Rpb24oKTplLGI9bS5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksdz1tLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSxUPXcuZXhpdCgpLE49dy5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLGs9dy5zZWxlY3QoImxpbmUiKSxTPXcuc2VsZWN0KCJ0ZXh0Iik7Yj1iLm1lcmdlKGIuZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpKSx3PXcubWVyZ2UoTiksaz1rLm1lcmdlKE4uYXBwZW5kKCJsaW5lIikuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIoZisiMiIscyp1KSksUz1TLm1lcmdlKE4uYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsIiMwMDAiKS5hdHRyKGYscypkKS5hdHRyKCJkeSIsdD09PSRzPyIwZW0iOnQ9PT1acz8iMC43MWVtIjoiMC4zMmVtIikpLGUhPT1tJiYoYj1iLnRyYW5zaXRpb24oZSksdz13LnRyYW5zaXRpb24oZSksaz1rLnRyYW5zaXRpb24oZSksUz1TLnRyYW5zaXRpb24oZSksVD1ULnRyYW5zaXRpb24oZSkuYXR0cigib3BhY2l0eSIsUXMpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9eSh0KSk/bCh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxOLmF0dHIoIm9wYWNpdHkiLFFzKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIGwobiYmaXNGaW5pdGUobj1uKHQpKT9uOnkodCkpfSkpLFQucmVtb3ZlKCksYi5hdHRyKCJkIix0PT09R3N8fHQ9PVdzPyJNIitzKmErIiwiK2crIkgwLjVWIitfKyJIIitzKmE6Ik0iK2crIiwiK3MqYSsiVjAuNUgiK18rIlYiK3MqYSksdy5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBsKHkodCkpfSksay5hdHRyKGYrIjIiLHMqdSksUy5hdHRyKGYscypkKS50ZXh0KHApLG0uZmlsdGVyKE0pLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1Xcz8ic3RhcnQiOnQ9PT1Hcz8iZW5kIjoibWlkZGxlIiksbS5lYWNoKGZ1bmN0aW9uKCl7dGhpcy5fX2F4aXM9eX0pfXZhciByPVtdLGk9bnVsbCxvPW51bGwsdT02LGE9NixjPTMscz10PT09JHN8fHQ9PT1Hcz8tMToxLGY9dD09PUdzfHx0PT09V3M/IngiOiJ5IixsPXQ9PT0kc3x8dD09PVpzP2I6dztyZXR1cm4gZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gcj1Wcy5jYWxsKGFyZ3VtZW50cyksZX0sZS50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/W106VnMuY2FsbCh0KSxlKTpyLnNsaWNlKCl9LGUudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6VnMuY2FsbCh0KSxlKTppJiZpLnNsaWNlKCl9LGUudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz10LGUpOm99LGUudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9YT0rdCxlKTp1fSxlLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsZSk6dX0sZS50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGUpOmF9LGUudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3QsZSk6Y30sZX1mdW5jdGlvbiBOKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBrKHIpfWZ1bmN0aW9uIGsodCl7dGhpcy5fPXR9ZnVuY3Rpb24gUyh0LG4sZSl7Zm9yKHZhciByPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKHRbcl0ubmFtZT09PW4pe3Rbcl09SnMsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fWZ1bmN0aW9uIEUodCl7dmFyIG49dCs9IiIsZT1uLmluZGV4T2YoIjoiKTtyZXR1cm4gZT49MCYmInhtbG5zIiE9PShuPXQuc2xpY2UoMCxlKSkmJih0PXQuc2xpY2UoZSsxKSksdGYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOnRmW25dLGxvY2FsOnR9OnR9ZnVuY3Rpb24gQSh0KXt2YXIgbj1FKHQpO3JldHVybihuLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10aGlzLm93bmVyRG9jdW1lbnQsZT10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gZT09PUtzJiZuLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1Lcz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBDKCl7fWZ1bmN0aW9uIHoodCl7cmV0dXJuIG51bGw9PXQ/QzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIFAoKXtyZXR1cm5bXX1mdW5jdGlvbiBSKHQpe3JldHVybiBudWxsPT10P1A6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiBMKHQpe3JldHVybiBuZXcgQXJyYXkodC5sZW5ndGgpfWZ1bmN0aW9uIHEodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59ZnVuY3Rpb24gRCh0LG4sZSxyLGksbyl7Zm9yKHZhciB1LGE9MCxjPW4ubGVuZ3RoLHM9by5sZW5ndGg7YTxzOysrYSkodT1uW2FdKT8odS5fX2RhdGFfXz1vW2FdLHJbYV09dSk6ZVthXT1uZXcgcSh0LG9bYV0pO2Zvcig7YTxjOysrYSkodT1uW2FdKSYmKGlbYV09dSl9ZnVuY3Rpb24gVSh0LG4sZSxyLGksbyx1KXt2YXIgYSxjLHMsZj17fSxsPW4ubGVuZ3RoLGg9by5sZW5ndGgscD1uZXcgQXJyYXkobCk7Zm9yKGE9MDthPGw7KythKShjPW5bYV0pJiYocFthXT1zPXVmK3UuY2FsbChjLGMuX19kYXRhX18sYSxuKSxzIGluIGY/aVthXT1jOmZbc109Yyk7Zm9yKGE9MDthPGg7KythKShjPWZbcz11Zit1LmNhbGwodCxvW2FdLGEsbyldKT8oclthXT1jLGMuX19kYXRhX189b1thXSxmW3NdPW51bGwpOmVbYV09bmV3IHEodCxvW2FdKTtmb3IoYT0wO2E8bDsrK2EpKGM9blthXSkmJmZbcFthXV09PT1jJiYoaVthXT1jKX1mdW5jdGlvbiBPKHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIEYodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIEkodCxuKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG4pfHxGKHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIFkodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIEIodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgSCh0KX1mdW5jdGlvbiBIKHQpe3RoaXMuX25vZGU9dCx0aGlzLl9uYW1lcz1ZKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZT1CKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5hZGQobltyXSl9ZnVuY3Rpb24gWCh0LG4pe2Zvcih2YXIgZT1CKHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24gVigpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gJCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIFcoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gWigpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIEcoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBRKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSigpe3JldHVybiB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMuY2xvbmVOb2RlKCExKSx0aGlzLm5leHRTaWJsaW5nKX1mdW5jdGlvbiBLKCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUoITApLHRoaXMubmV4dFNpYmxpbmcpfWZ1bmN0aW9uIHR0KHQsbixlKXtyZXR1cm4gdD1udCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIG50KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIGV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBydCh0LG4sZSl7dmFyIHI9YWYuaGFzT3duUHJvcGVydHkodC50eXBlKT90dDpudDtyZXR1cm4gZnVuY3Rpb24oaSxvLHUpe3ZhciBhLGM9dGhpcy5fX29uLHM9cihuLG8sdSk7aWYoYylmb3IodmFyIGY9MCxsPWMubGVuZ3RoO2Y8bDsrK2YpaWYoKGE9Y1tmXSkudHlwZT09PXQudHlwZSYmYS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXIsYS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoYS50eXBlLGEubGlzdGVuZXI9cyxhLmNhcHR1cmU9ZSksdm9pZChhLnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUscyxlKSxhPXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOnMsY2FwdHVyZTplfSxjP2MucHVzaChhKTp0aGlzLl9fb249W2FdfX1mdW5jdGlvbiBpdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIG90KHQsbixlKXt2YXIgcj1GKHQpLGk9ci5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2YgaT9pPW5ldyBpKG4sZSk6KGk9ci5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxlPyhpLmluaXRFdmVudChuLGUuYnViYmxlcyxlLmNhbmNlbGFibGUpLGkuZGV0YWlsPWUuZGV0YWlsKTppLmluaXRFdmVudChuLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KGkpfWZ1bmN0aW9uIHV0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIGF0KCl7cmV0dXJuIG5ldyB1dChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLGNmKX1mdW5jdGlvbiBjdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IHV0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgdXQoW1t0XV0sY2YpfWZ1bmN0aW9uIHN0KCl7cmV0dXJuIG5ldyBmdH1mdW5jdGlvbiBmdCgpe3RoaXMuXz0iQCIrKCsrc2YpLnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBsdCgpe2Zvcih2YXIgbixlPXQuZXZlbnQ7bj1lLnNvdXJjZUV2ZW50OyllPW47cmV0dXJuIGV9ZnVuY3Rpb24gaHQodCxuKXt2YXIgZT10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihlLmNyZWF0ZVNWR1BvaW50KXt2YXIgcj1lLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIHIueD1uLmNsaWVudFgsci55PW4uY2xpZW50WSxyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSxbci54LHIueV19dmFyIGk9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bbi5jbGllbnRYLWkubGVmdC10LmNsaWVudExlZnQsbi5jbGllbnRZLWkudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBwdCh0KXt2YXIgbj1sdCgpO3JldHVybiBuLmNoYW5nZWRUb3VjaGVzJiYobj1uLmNoYW5nZWRUb3VjaGVzWzBdKSxodCh0LG4pfWZ1bmN0aW9uIGR0KHQsbixlKXthcmd1bWVudHMubGVuZ3RoPDMmJihlPW4sbj1sdCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIHIsaT0wLG89bj9uLmxlbmd0aDowO2k8bzsrK2kpaWYoKHI9bltpXSkuaWRlbnRpZmllcj09PWUpcmV0dXJuIGh0KHQscik7cmV0dXJuIG51bGx9ZnVuY3Rpb24gdnQoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGd0KCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gX3QodCl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsZT1jdCh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLGd0LCEwKTsib25zZWxlY3RzdGFydCJpbiBuP2Uub24oInNlbGVjdHN0YXJ0LmRyYWciLGd0LCEwKToobi5fX25vc2VsZWN0PW4uc3R5bGUuTW96VXNlclNlbGVjdCxuLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiB5dCh0LG4pe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9Y3QodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtuJiYoci5vbigiY2xpY2suZHJhZyIsZ3QsITApLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtyLm9uKCJjbGljay5kcmFnIixudWxsKX0sMCkpLCJvbnNlbGVjdHN0YXJ0ImluIGU/ci5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KGUuc3R5bGUuTW96VXNlclNlbGVjdD1lLl9fbm9zZWxlY3QsZGVsZXRlIGUuX19ub3NlbGVjdCl9ZnVuY3Rpb24gbXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHh0KHQsbixlLHIsaSxvLHUsYSxjLHMpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zdWJqZWN0PWUsdGhpcy5pZGVudGlmaWVyPXIsdGhpcy5hY3RpdmU9aSx0aGlzLng9byx0aGlzLnk9dSx0aGlzLmR4PWEsdGhpcy5keT1jLHRoaXMuXz1zfWZ1bmN0aW9uIGJ0KCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIHd0KCl7cmV0dXJuIHRoaXMucGFyZW50Tm9kZX1mdW5jdGlvbiBNdChuKXtyZXR1cm4gbnVsbD09bj97eDp0LmV2ZW50LngseTp0LmV2ZW50Lnl9Om59ZnVuY3Rpb24gVHQoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gTnQodCxuLGUpe3QucHJvdG90eXBlPW4ucHJvdG90eXBlPWUsZS5jb25zdHJ1Y3Rvcj10fWZ1bmN0aW9uIGt0KHQsbil7dmFyIGU9T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciByIGluIG4pZVtyXT1uW3JdO3JldHVybiBlfWZ1bmN0aW9uIFN0KCl7fWZ1bmN0aW9uIEV0KHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1wZi5leGVjKHQpKT8obj1wYXJzZUludChuWzFdLDE2KSxuZXcgUnQobj4+OCYxNXxuPj40JjI0MCxuPj40JjE1fDI0MCZuLCgxNSZuKTw8NHwxNSZuLDEpKToobj1kZi5leGVjKHQpKT9BdChwYXJzZUludChuWzFdLDE2KSk6KG49dmYuZXhlYyh0KSk/bmV3IFJ0KG5bMV0sblsyXSxuWzNdLDEpOihuPWdmLmV4ZWModCkpP25ldyBSdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCwxKToobj1fZi5leGVjKHQpKT9DdChuWzFdLG5bMl0sblszXSxuWzRdKToobj15Zi5leGVjKHQpKT9DdCgyNTUqblsxXS8xMDAsMjU1Km5bMl0vMTAwLDI1NSpuWzNdLzEwMCxuWzRdKToobj1tZi5leGVjKHQpKT9MdChuWzFdLG5bMl0vMTAwLG5bM10vMTAwLDEpOihuPXhmLmV4ZWModCkpP0x0KG5bMV0sblsyXS8xMDAsblszXS8xMDAsbls0XSk6YmYuaGFzT3duUHJvcGVydHkodCk/QXQoYmZbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBSdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEF0KHQpe3JldHVybiBuZXcgUnQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIEN0KHQsbixlLHIpe3JldHVybiByPD0wJiYodD1uPWU9TmFOKSxuZXcgUnQodCxuLGUscil9ZnVuY3Rpb24genQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBTdHx8KHQ9RXQodCkpLHQ/KHQ9dC5yZ2IoKSxuZXcgUnQodC5yLHQuZyx0LmIsdC5vcGFjaXR5KSk6bmV3IFJ0fWZ1bmN0aW9uIFB0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD96dCh0KTpuZXcgUnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFJ0KHQsbixlLHIpe3RoaXMucj0rdCx0aGlzLmc9K24sdGhpcy5iPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBMdCh0LG4sZSxyKXtyZXR1cm4gcjw9MD90PW49ZT1OYU46ZTw9MHx8ZT49MT90PW49TmFOOm48PTAmJih0PU5hTiksbmV3IER0KHQsbixlLHIpfWZ1bmN0aW9uIHF0KHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgRHQpcmV0dXJuIG5ldyBEdCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBTdHx8KHQ9RXQodCkpLCF0KXJldHVybiBuZXcgRHQ7aWYodCBpbnN0YW5jZW9mIER0KXJldHVybiB0O3ZhciBuPSh0PXQucmdiKCkpLnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT1NYXRoLm1pbihuLGUsciksbz1NYXRoLm1heChuLGUsciksdT1OYU4sYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PW49PT1vPyhlLXIpL2ErNiooZTxyKTplPT09bz8oci1uKS9hKzI6KG4tZSkvYSs0LGEvPWM8LjU/bytpOjItby1pLHUqPTYwKTphPWM+MCYmYzwxPzA6dSxuZXcgRHQodSxhLGMsdC5vcGFjaXR5KX0odCk6bmV3IER0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBEdCh0LG4sZSxyKXt0aGlzLmg9K3QsdGhpcy5zPStuLHRoaXMubD0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gVXQodCxuLGUpe3JldHVybiAyNTUqKHQ8NjA/bisoZS1uKSp0LzYwOnQ8MTgwP2U6dDwyNDA/bisoZS1uKSooMjQwLXQpLzYwOm4pfWZ1bmN0aW9uIE90KHQpe2lmKHQgaW5zdGFuY2VvZiBJdClyZXR1cm4gbmV3IEl0KHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIFZ0KXt2YXIgbj10Lmgqd2Y7cmV0dXJuIG5ldyBJdCh0LmwsTWF0aC5jb3MobikqdC5jLE1hdGguc2luKG4pKnQuYyx0Lm9wYWNpdHkpfXQgaW5zdGFuY2VvZiBSdHx8KHQ9enQodCkpO3ZhciBlPWp0KHQucikscj1qdCh0LmcpLGk9anQodC5iKSxvPVl0KCguNDEyNDU2NCplKy4zNTc1NzYxKnIrLjE4MDQzNzUqaSkvVGYpLHU9WXQoKC4yMTI2NzI5KmUrLjcxNTE1MjIqcisuMDcyMTc1KmkpL05mKTtyZXR1cm4gbmV3IEl0KDExNip1LTE2LDUwMCooby11KSwyMDAqKHUtWXQoKC4wMTkzMzM5KmUrLjExOTE5MipyKy45NTAzMDQxKmkpL2tmKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBGdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/T3QodCk6bmV3IEl0KHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBJdCh0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gWXQodCl7cmV0dXJuIHQ+Q2Y/TWF0aC5wb3codCwxLzMpOnQvQWYrU2Z9ZnVuY3Rpb24gQnQodCl7cmV0dXJuIHQ+RWY/dCp0KnQ6QWYqKHQtU2YpfWZ1bmN0aW9uIEh0KHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24ganQodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gWHQodCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2Z1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBWdClyZXR1cm4gbmV3IFZ0KHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIEl0fHwodD1PdCh0KSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpNZjtyZXR1cm4gbmV3IFZ0KG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfSh0KTpuZXcgVnQodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFZ0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiAkdCh0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIFd0KXJldHVybiBuZXcgV3QodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgUnR8fCh0PXp0KHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oRGYqcitMZipuLXFmKmUpLyhEZitMZi1xZiksbz1yLWksdT0oUmYqKGUtaSktemYqbykvUGYsYT1NYXRoLnNxcnQodSp1K28qbykvKFJmKmkqKDEtaSkpLGM9YT9NYXRoLmF0YW4yKHUsbykqTWYtMTIwOk5hTjtyZXR1cm4gbmV3IFd0KGM8MD9jKzM2MDpjLGEsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgV3QodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIFd0KHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBadCh0LG4sZSxyLGkpe3ZhciBvPXQqdCx1PW8qdDtyZXR1cm4oKDEtMyp0KzMqby11KSpuKyg0LTYqbyszKnUpKmUrKDErMyp0KzMqby0zKnUpKnIrdSppKS82fWZ1bmN0aW9uIEd0KHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sdT1yPjA/dFtyLTFdOjIqaS1vLGE9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBadCgoZS1yL24pKm4sdSxpLG8sYSl9fWZ1bmN0aW9uIFF0KHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sdT10WyhyKzEpJW5dLGE9dFsocisyKSVuXTtyZXR1cm4gWnQoKGUtci9uKSpuLGksbyx1LGEpfX1mdW5jdGlvbiBKdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gS3QodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9LdCh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6SnQoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiBubih0KXtyZXR1cm4gMT09KHQ9K3QpP2VuOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6SnQoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZW4odCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/S3QodCxlKTpKdChpc05hTih0KT9uOnQpfWZ1bmN0aW9uIHJuKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZSxyLGk9bi5sZW5ndGgsbz1uZXcgQXJyYXkoaSksdT1uZXcgQXJyYXkoaSksYT1uZXcgQXJyYXkoaSk7Zm9yKGU9MDtlPGk7KytlKXI9UHQobltlXSksb1tlXT1yLnJ8fDAsdVtlXT1yLmd8fDAsYVtlXT1yLmJ8fDA7cmV0dXJuIG89dChvKSx1PXQodSksYT10KGEpLHIub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiByLnI9byh0KSxyLmc9dSh0KSxyLmI9YSh0KSxyKyIifX19ZnVuY3Rpb24gb24odCxuKXt2YXIgZSxyPW4/bi5sZW5ndGg6MCxpPXQ/TWF0aC5taW4ocix0Lmxlbmd0aCk6MCxvPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShyKTtmb3IoZT0wO2U8aTsrK2Upb1tlXT1mbih0W2VdLG5bZV0pO2Zvcig7ZTxyOysrZSl1W2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlPTA7ZTxpOysrZSl1W2VdPW9bZV0odCk7cmV0dXJuIHV9fWZ1bmN0aW9uIHVuKHQsbil7dmFyIGU9bmV3IERhdGU7cmV0dXJuIHQ9K3Qsbi09dCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiBhbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIHQrbiplfX1mdW5jdGlvbiBjbih0LG4pe3ZhciBlLHI9e30saT17fTtudWxsIT09dCYmIm9iamVjdCI9PXR5cGVvZiB0fHwodD17fSksbnVsbCE9PW4mJiJvYmplY3QiPT10eXBlb2Ygbnx8KG49e30pO2ZvcihlIGluIG4pZSBpbiB0P3JbZV09Zm4odFtlXSxuW2VdKTppW2VdPW5bZV07cmV0dXJuIGZ1bmN0aW9uKHQpe2ZvcihlIGluIHIpaVtlXT1yW2VdKHQpO3JldHVybiBpfX1mdW5jdGlvbiBzbih0LG4pe3ZhciBlLHIsaSxvPVZmLmxhc3RJbmRleD0kZi5sYXN0SW5kZXg9MCx1PS0xLGE9W10sYz1bXTtmb3IodCs9IiIsbis9IiI7KGU9VmYuZXhlYyh0KSkmJihyPSRmLmV4ZWMobikpOykoaT1yLmluZGV4KT5vJiYoaT1uLnNsaWNlKG8saSksYVt1XT9hW3VdKz1pOmFbKyt1XT1pKSwoZT1lWzBdKT09PShyPXJbMF0pP2FbdV0/YVt1XSs9cjphWysrdV09cjooYVsrK3VdPW51bGwsYy5wdXNoKHtpOnUseDphbihlLHIpfSkpLG89JGYubGFzdEluZGV4O3JldHVybiBvPG4ubGVuZ3RoJiYoaT1uLnNsaWNlKG8pLGFbdV0/YVt1XSs9aTphWysrdV09aSksYS5sZW5ndGg8Mj9jWzBdP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuKSsiIn19KGNbMF0ueCk6ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fShuKToobj1jLmxlbmd0aCxmdW5jdGlvbih0KXtmb3IodmFyIGUscj0wO3I8bjsrK3IpYVsoZT1jW3JdKS5pXT1lLngodCk7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBmbih0LG4pe3ZhciBlLHI9dHlwZW9mIG47cmV0dXJuIG51bGw9PW58fCJib29sZWFuIj09PXI/SnQobik6KCJudW1iZXIiPT09cj9hbjoic3RyaW5nIj09PXI/KGU9RXQobikpPyhuPWUsSGYpOnNuOm4gaW5zdGFuY2VvZiBFdD9IZjpuIGluc3RhbmNlb2YgRGF0ZT91bjpBcnJheS5pc0FycmF5KG4pP29uOiJmdW5jdGlvbiIhPXR5cGVvZiBuLnZhbHVlT2YmJiJmdW5jdGlvbiIhPXR5cGVvZiBuLnRvU3RyaW5nfHxpc05hTihuKT9jbjphbikodCxuKX1mdW5jdGlvbiBsbih0LG4pe3JldHVybiB0PSt0LG4tPXQsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX1mdW5jdGlvbiBobih0LG4sZSxyLGksbyl7dmFyIHUsYSxjO3JldHVybih1PU1hdGguc3FydCh0KnQrbipuKSkmJih0Lz11LG4vPXUpLChjPXQqZStuKnIpJiYoZS09dCpjLHItPW4qYyksKGE9TWF0aC5zcXJ0KGUqZStyKnIpKSYmKGUvPWEsci89YSxjLz1hKSx0KnI8biplJiYodD0tdCxuPS1uLGM9LWMsdT0tdSkse3RyYW5zbGF0ZVg6aSx0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIobix0KSpXZixza2V3WDpNYXRoLmF0YW4oYykqV2Ysc2NhbGVYOnUsc2NhbGVZOmF9fWZ1bmN0aW9uIHBuKHQsbixlLHIpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLHUpe3ZhciBhPVtdLGM9W107cmV0dXJuIG89dChvKSx1PXQodSksZnVuY3Rpb24odCxyLGksbyx1LGEpe2lmKHQhPT1pfHxyIT09byl7dmFyIGM9dS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLG4sbnVsbCxlKTthLnB1c2goe2k6Yy00LHg6YW4odCxpKX0se2k6Yy0yLHg6YW4ocixvKX0pfWVsc2UoaXx8bykmJnUucHVzaCgidHJhbnNsYXRlKCIraStuK28rZSl9KG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksdS50cmFuc2xhdGVYLHUudHJhbnNsYXRlWSxhLGMpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uPyh0LW4+MTgwP24rPTM2MDpuLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6ZS5wdXNoKGkoZSkrInJvdGF0ZSgiLG51bGwsciktMix4OmFuKHQsbil9KSk6biYmZS5wdXNoKGkoZSkrInJvdGF0ZSgiK24rcil9KG8ucm90YXRlLHUucm90YXRlLGEsYyksZnVuY3Rpb24odCxuLGUsbyl7dCE9PW4/by5wdXNoKHtpOmUucHVzaChpKGUpKyJza2V3WCgiLG51bGwsciktMix4OmFuKHQsbil9KTpuJiZlLnB1c2goaShlKSsic2tld1goIituK3IpfShvLnNrZXdYLHUuc2tld1gsYSxjKSxmdW5jdGlvbih0LG4sZSxyLG8sdSl7aWYodCE9PWV8fG4hPT1yKXt2YXIgYT1vLnB1c2goaShvKSsic2NhbGUoIixudWxsLCIsIixudWxsLCIpIik7dS5wdXNoKHtpOmEtNCx4OmFuKHQsZSl9LHtpOmEtMix4OmFuKG4scil9KX1lbHNlIDE9PT1lJiYxPT09cnx8by5wdXNoKGkobykrInNjYWxlKCIrZSsiLCIrcisiKSIpfShvLnNjYWxlWCxvLnNjYWxlWSx1LnNjYWxlWCx1LnNjYWxlWSxhLGMpLG89dT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlPS0xLHI9Yy5sZW5ndGg7KytlPHI7KWFbKG49Y1tlXSkuaV09bi54KHQpO3JldHVybiBhLmpvaW4oIiIpfX19ZnVuY3Rpb24gZG4odCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKSsxL3QpLzJ9ZnVuY3Rpb24gdm4odCxuKXt2YXIgZSxyLGk9dFswXSxvPXRbMV0sdT10WzJdLGE9blswXSxjPW5bMV0scz1uWzJdLGY9YS1pLGw9Yy1vLGg9ZipmK2wqbDtpZihoPG5sKXI9TWF0aC5sb2cocy91KS9KZixlPWZ1bmN0aW9uKHQpe3JldHVybltpK3QqZixvK3QqbCx1Kk1hdGguZXhwKEpmKnQqcildfTtlbHNle3ZhciBwPU1hdGguc3FydChoKSxkPShzKnMtdSp1K3RsKmgpLygyKnUqS2YqcCksdj0ocypzLXUqdS10bCpoKS8oMipzKktmKnApLGc9TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSxfPU1hdGgubG9nKE1hdGguc3FydCh2KnYrMSktdik7cj0oXy1nKS9KZixlPWZ1bmN0aW9uKHQpe3ZhciBuPXQqcixlPWRuKGcpLGE9dS8oS2YqcCkqKGUqZnVuY3Rpb24odCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfShKZipuK2cpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krYSpmLG8rYSpsLHUqZS9kbihKZipuK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBnbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPXF0KG4pKS5oLChlPXF0KGUpKS5oKSxpPWVuKG4ucyxlLnMpLG89ZW4obi5sLGUubCksdT1lbihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiBfbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPVh0KG4pKS5oLChlPVh0KGUpKS5oKSxpPWVuKG4uYyxlLmMpLG89ZW4obi5sLGUubCksdT1lbihuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT11KHQpLG4rIiJ9fX1mdW5jdGlvbiB5bih0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj0kdChuKSkuaCwocj0kdChyKSkuaCksbz1lbihuLnMsci5zKSx1PWVuKG4ubCxyLmwpLGE9ZW4obi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9dShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9YSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9ZnVuY3Rpb24gbW4oKXtyZXR1cm4gcGx8fChnbCh4bikscGw9dmwubm93KCkrZGwpfWZ1bmN0aW9uIHhuKCl7cGw9MH1mdW5jdGlvbiBibigpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gd24odCxuLGUpe3ZhciByPW5ldyBibjtyZXR1cm4gci5yZXN0YXJ0KHQsbixlKSxyfWZ1bmN0aW9uIE1uKCl7bW4oKSwrK2NsO2Zvcih2YXIgdCxuPVlmO247KSh0PXBsLW4uX3RpbWUpPj0wJiZuLl9jYWxsLmNhbGwobnVsbCx0KSxuPW4uX25leHQ7LS1jbH1mdW5jdGlvbiBUbigpe3BsPShobD12bC5ub3coKSkrZGwsY2w9c2w9MDt0cnl7TW4oKX1maW5hbGx5e2NsPTAsZnVuY3Rpb24oKXt2YXIgdCxuLGU9WWYscj0xLzA7Zm9yKDtlOyllLl9jYWxsPyhyPmUuX3RpbWUmJihyPWUuX3RpbWUpLHQ9ZSxlPWUuX25leHQpOihuPWUuX25leHQsZS5fbmV4dD1udWxsLGU9dD90Ll9uZXh0PW46WWY9bik7QmY9dCxrbihyKX0oKSxwbD0wfX1mdW5jdGlvbiBObigpe3ZhciB0PXZsLm5vdygpLG49dC1obDtuPmxsJiYoZGwtPW4saGw9dCl9ZnVuY3Rpb24ga24odCl7aWYoIWNsKXtzbCYmKHNsPWNsZWFyVGltZW91dChzbCkpO3QtcGw+MjQ/KHQ8MS8wJiYoc2w9c2V0VGltZW91dChUbix0LXZsLm5vdygpLWRsKSksZmwmJihmbD1jbGVhckludGVydmFsKGZsKSkpOihmbHx8KGhsPXZsLm5vdygpLGZsPXNldEludGVydmFsKE5uLGxsKSksY2w9MSxnbChUbikpfX1mdW5jdGlvbiBTbih0LG4sZSl7dmFyIHI9bmV3IGJuO3JldHVybiBuPW51bGw9PW4/MDorbixyLnJlc3RhcnQoZnVuY3Rpb24oZSl7ci5zdG9wKCksdChlK24pfSxuLGUpLHJ9ZnVuY3Rpb24gRW4odCxuLGUscixpLG8pe3ZhciB1PXQuX190cmFuc2l0aW9uO2lmKHUpe2lmKGUgaW4gdSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTsoZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIoYyl7dmFyIHMsZixsLGg7aWYoZS5zdGF0ZSE9PXhsKXJldHVybiBvKCk7Zm9yKHMgaW4gYSlpZigoaD1hW3NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09d2wpcmV0dXJuIFNuKHIpO2guc3RhdGU9PT1NbD8oaC5zdGF0ZT1ObCxoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGFbc10pOitzPG4mJihoLnN0YXRlPU5sLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBhW3NdKX1pZihTbihmdW5jdGlvbigpe2Uuc3RhdGU9PT13bCYmKGUuc3RhdGU9TWwsZS50aW1lci5yZXN0YXJ0KGksZS5kZWxheSxlLnRpbWUpLGkoYykpfSksZS5zdGF0ZT1ibCxlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09Ymwpe2ZvcihlLnN0YXRlPXdsLHU9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLHM9MCxmPS0xO3M8bDsrK3MpKGg9ZS50d2VlbltzXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHVbKytmXT1oKTt1Lmxlbmd0aD1mKzF9fWZ1bmN0aW9uIGkobil7Zm9yKHZhciByPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydChvKSxlLnN0YXRlPVRsLDEpLGk9LTEsYT11Lmxlbmd0aDsrK2k8YTspdVtpXS5jYWxsKG51bGwscik7ZS5zdGF0ZT09PVRsJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLG8oKSl9ZnVuY3Rpb24gbygpe2Uuc3RhdGU9TmwsZS50aW1lci5zdG9wKCksZGVsZXRlIGFbbl07Zm9yKHZhciByIGluIGEpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn12YXIgdSxhPXQuX190cmFuc2l0aW9uO2Fbbl09ZSxlLnRpbWVyPXduKGZ1bmN0aW9uKHQpe2Uuc3RhdGU9eGwsZS50aW1lci5yZXN0YXJ0KHIsZS5kZWxheSxlLnRpbWUpLGUuZGVsYXk8PXQmJnIodC1lLmRlbGF5KX0sMCxlLnRpbWUpfSkodCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOl9sLHR3ZWVuOnlsLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOm1sfSl9ZnVuY3Rpb24gQW4odCxuKXt2YXIgZT16bih0LG4pO2lmKGUuc3RhdGU+bWwpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBDbih0LG4pe3ZhciBlPXpuKHQsbik7aWYoZS5zdGF0ZT5ibCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiB6bih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIFBuKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sdT0hMDtpZihvKXtuPW51bGw9PW4/bnVsbDpuKyIiO2ZvcihpIGluIG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT5ibCYmZS5zdGF0ZTxUbCxlLnN0YXRlPU5sLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6dT0hMTt1JiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFJuKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9Q24odGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiB6bih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBMbih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/YW46biBpbnN0YW5jZW9mIEV0P0hmOihlPUV0KG4pKT8obj1lLEhmKTpzbikodCxuKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPW4sdGhpcy5fbmFtZT1lLHRoaXMuX2lkPXJ9ZnVuY3Rpb24gRG4odCl7cmV0dXJuIGF0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBVbigpe3JldHVybisrU2x9ZnVuY3Rpb24gT24odCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQqdDoodC09MikqdCp0KzIpLzJ9ZnVuY3Rpb24gSW4odCl7cmV0dXJuKDEtTWF0aC5jb3MoUGwqdCkpLzJ9ZnVuY3Rpb24gWW4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdygyLDEwKnQtMTApOjItTWF0aC5wb3coMiwxMC0xMCp0KSkvMn1mdW5jdGlvbiBCbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtTWF0aC5zcXJ0KDEtdCp0KTpNYXRoLnNxcnQoMS0odC09MikqdCkrMSkvMn1mdW5jdGlvbiBIbih0KXtyZXR1cm4odD0rdCk8TGw/SGwqdCp0OnQ8RGw/SGwqKHQtPXFsKSp0K1VsOnQ8Rmw/SGwqKHQtPU9sKSp0K0lsOkhsKih0LT1ZbCkqdCtCbH1mdW5jdGlvbiBqbih0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBRbC50aW1lPW1uKCksUWw7cmV0dXJuIGV9ZnVuY3Rpb24gWG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFZuKCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiAkbigpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFduKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIFpuKCl7cmV0dXJuIXQuZXZlbnQuYnV0dG9ufWZ1bmN0aW9uIEduKCl7dmFyIHQ9dGhpcy5vd25lclNWR0VsZW1lbnR8fHRoaXM7cmV0dXJuW1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dfWZ1bmN0aW9uIFFuKHQpe2Zvcig7IXQuX19icnVzaDspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0Ll9fYnJ1c2h9ZnVuY3Rpb24gSm4odCl7cmV0dXJuIHRbMF1bMF09PT10WzFdWzBdfHx0WzBdWzFdPT09dFsxXVsxXX1mdW5jdGlvbiBLbihuKXtmdW5jdGlvbiBlKHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGEpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtXbigib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIix1aC5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UW4odGhpcykuZXh0ZW50O2N0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbV24oInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsdWguc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7aS5leGl0KCkucmVtb3ZlKCksaS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiB1aFt0LnR5cGVdfSksdC5lYWNoKHIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcigpe3ZhciB0PWN0KHRoaXMpLG49UW4odGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWgvMjpuWzBdWzBdLWgvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWgvMjpuWzBdWzFdLWgvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0raDpofSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0raDpofSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBpKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgbyh0LG4pfWZ1bmN0aW9uIG8odCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIHUoKXtmdW5jdGlvbiBlKCl7dmFyIHQ9cHQodyk7IUx8fHh8fGJ8fChNYXRoLmFicyh0WzBdLURbMF0pPk1hdGguYWJzKHRbMV0tRFsxXSk/Yj0hMDp4PSEwKSxEPXQsbT0hMCwkbigpLG8oKX1mdW5jdGlvbiBvKCl7dmFyIHQ7c3dpdGNoKF89RFswXS1xWzBdLHk9RFsxXS1xWzFdLFQpe2Nhc2UgdGg6Y2FzZSBLbDpOJiYoXz1NYXRoLm1heChDLWEsTWF0aC5taW4oUC1wLF8pKSxzPWErXyxkPXArXyksayYmKHk9TWF0aC5tYXgoei1sLE1hdGgubWluKFItdix5KSksaD1sK3ksZz12K3kpO2JyZWFrO2Nhc2Ugbmg6TjwwPyhfPU1hdGgubWF4KEMtYSxNYXRoLm1pbihQLWEsXykpLHM9YStfLGQ9cCk6Tj4wJiYoXz1NYXRoLm1heChDLXAsTWF0aC5taW4oUC1wLF8pKSxzPWEsZD1wK18pLGs8MD8oeT1NYXRoLm1heCh6LWwsTWF0aC5taW4oUi1sLHkpKSxoPWwreSxnPXYpOms+MCYmKHk9TWF0aC5tYXgoei12LE1hdGgubWluKFItdix5KSksaD1sLGc9dit5KTticmVhaztjYXNlIGVoOk4mJihzPU1hdGgubWF4KEMsTWF0aC5taW4oUCxhLV8qTikpLGQ9TWF0aC5tYXgoQyxNYXRoLm1pbihQLHArXypOKSkpLGsmJihoPU1hdGgubWF4KHosTWF0aC5taW4oUixsLXkqaykpLGc9TWF0aC5tYXgoeixNYXRoLm1pbihSLHYreSprKSkpfWQ8cyYmKE4qPS0xLHQ9YSxhPXAscD10LHQ9cyxzPWQsZD10LE0gaW4gYWgmJkYuYXR0cigiY3Vyc29yIix1aFtNPWFoW01dXSkpLGc8aCYmKGsqPS0xLHQ9bCxsPXYsdj10LHQ9aCxoPWcsZz10LE0gaW4gY2gmJkYuYXR0cigiY3Vyc29yIix1aFtNPWNoW01dXSkpLFMuc2VsZWN0aW9uJiYoQT1TLnNlbGVjdGlvbikseCYmKHM9QVswXVswXSxkPUFbMV1bMF0pLGImJihoPUFbMF1bMV0sZz1BWzFdWzFdKSxBWzBdWzBdPT09cyYmQVswXVsxXT09PWgmJkFbMV1bMF09PT1kJiZBWzFdWzFdPT09Z3x8KFMuc2VsZWN0aW9uPVtbcyxoXSxbZCxnXV0sci5jYWxsKHcpLFUuYnJ1c2goKSl9ZnVuY3Rpb24gdSgpe2lmKFZuKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtjJiZjbGVhclRpbWVvdXQoYyksYz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yz1udWxsfSw1MDApLE8ub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSB5dCh0LmV2ZW50LnZpZXcsbSksSS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ty5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLEYuYXR0cigiY3Vyc29yIix1aC5vdmVybGF5KSxTLnNlbGVjdGlvbiYmKEE9Uy5zZWxlY3Rpb24pLEpuKEEpJiYoUy5zZWxlY3Rpb249bnVsbCxyLmNhbGwodykpLFUuZW5kKCl9aWYodC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybiAkbigpfWVsc2UgaWYoYylyZXR1cm47aWYoZi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBhLHMsbCxoLHAsZCx2LGcsXyx5LG0seCxiLHc9dGhpcyxNPXQuZXZlbnQudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsVD0ic2VsZWN0aW9uIj09PSh0LmV2ZW50Lm1ldGFLZXk/TT0ib3ZlcmxheSI6TSk/S2w6dC5ldmVudC5hbHRLZXk/ZWg6bmgsTj1uPT09aWg/bnVsbDpzaFtNXSxrPW49PT1yaD9udWxsOmZoW01dLFM9UW4odyksRT1TLmV4dGVudCxBPVMuc2VsZWN0aW9uLEM9RVswXVswXSx6PUVbMF1bMV0sUD1FWzFdWzBdLFI9RVsxXVsxXSxMPU4mJmsmJnQuZXZlbnQuc2hpZnRLZXkscT1wdCh3KSxEPXEsVT1pKHcsYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpOyJvdmVybGF5Ij09PU0/Uy5zZWxlY3Rpb249QT1bW2E9bj09PWloP0M6cVswXSxsPW49PT1yaD96OnFbMV1dLFtwPW49PT1paD9QOmEsdj1uPT09cmg/UjpsXV06KGE9QVswXVswXSxsPUFbMF1bMV0scD1BWzFdWzBdLHY9QVsxXVsxXSkscz1hLGg9bCxkPXAsZz12O3ZhciBPPWN0KHcpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLEY9Ty5zZWxlY3RBbGwoIi5vdmVybGF5IikuYXR0cigiY3Vyc29yIix1aFtNXSk7aWYodC5ldmVudC50b3VjaGVzKU8ub24oInRvdWNobW92ZS5icnVzaCIsZSwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIix1LCEwKTtlbHNle3ZhciBJPWN0KHQuZXZlbnQudmlldykub24oImtleWRvd24uYnJ1c2giLGZ1bmN0aW9uKCl7c3dpdGNoKHQuZXZlbnQua2V5Q29kZSl7Y2FzZSAxNjpMPU4mJms7YnJlYWs7Y2FzZSAxODpUPT09bmgmJihOJiYocD1kLV8qTixhPXMrXypOKSxrJiYodj1nLXkqayxsPWgreSprKSxUPWVoLG8oKSk7YnJlYWs7Y2FzZSAzMjpUIT09bmgmJlQhPT1laHx8KE48MD9wPWQtXzpOPjAmJihhPXMtXyksazwwP3Y9Zy15Oms+MCYmKGw9aC15KSxUPXRoLEYuYXR0cigiY3Vyc29yIix1aC5zZWxlY3Rpb24pLG8oKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59JG4oKX0sITApLm9uKCJrZXl1cC5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OkwmJih4PWI9TD0hMSxvKCkpO2JyZWFrO2Nhc2UgMTg6VD09PWVoJiYoTjwwP3A9ZDpOPjAmJihhPXMpLGs8MD92PWc6az4wJiYobD1oKSxUPW5oLG8oKSk7YnJlYWs7Y2FzZSAzMjpUPT09dGgmJih0LmV2ZW50LmFsdEtleT8oTiYmKHA9ZC1fKk4sYT1zK18qTiksayYmKHY9Zy15KmssbD1oK3kqayksVD1laCk6KE48MD9wPWQ6Tj4wJiYoYT1zKSxrPDA/dj1nOms+MCYmKGw9aCksVD1uaCksRi5hdHRyKCJjdXJzb3IiLHVoW01dKSxvKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufSRuKCl9LCEwKS5vbigibW91c2Vtb3ZlLmJydXNoIixlLCEwKS5vbigibW91c2V1cC5icnVzaCIsdSwhMCk7X3QodC5ldmVudC52aWV3KX1WbigpLFBuKHcpLHIuY2FsbCh3KSxVLnN0YXJ0KCl9fWZ1bmN0aW9uIGEoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXMuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH12YXIgYyxzPUduLGY9Wm4sbD1OKGUsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxoPTY7cmV0dXJuIGUubW92ZT1mdW5jdGlvbih0LGUpe3Quc2VsZWN0aW9uP3Qub24oInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKX0pLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIixmdW5jdGlvbigpe2kodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oImJydXNoIixmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dS5zZWxlY3Rpb249MT09PXQmJkpuKHMpP251bGw6Zih0KSxyLmNhbGwobyksYS5icnVzaCgpfXZhciBvPXRoaXMsdT1vLl9fYnJ1c2gsYT1pKG8sYXJndW1lbnRzKSxjPXUuc2VsZWN0aW9uLHM9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplLHUuZXh0ZW50KSxmPWZuKGMscyk7cmV0dXJuIGMmJnM/dDp0KDEpfSk6dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLG89dGhpcy5fX2JydXNoLHU9bi5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsdCk6ZSxvLmV4dGVudCksYT1pKHRoaXMsdCkuYmVmb3Jlc3RhcnQoKTtQbih0aGlzKSxvLnNlbGVjdGlvbj1udWxsPT11fHxKbih1KT9udWxsOnUsci5jYWxsKHRoaXMpLGEuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSl9LG8ucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZyYmKHRoaXMuc3RhcnRpbmc9ITEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7aXQobmV3IGZ1bmN0aW9uKHQsbixlKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc2VsZWN0aW9uPWV9KGUsdCxuLm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGwuYXBwbHksbCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxlLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhuKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxlKTpzfSxlLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhuKCEhdCksZSk6Zn0sZS5oYW5kbGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LGUpOmh9LGUub249ZnVuY3Rpb24oKXt2YXIgdD1sLm9uLmFwcGx5KGwsYXJndW1lbnRzKTtyZXR1cm4gdD09PWw/ZTp0fSxlfWZ1bmN0aW9uIHRlKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBuZSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIGVlKCl7cmV0dXJuIG5ldyBuZX1mdW5jdGlvbiByZSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gaWUodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIG9lKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIGFlKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIHNlKHQsbil7dmFyIGU9bmV3IGNlO2lmKHQgaW5zdGFuY2VvZiBjZSl0LmVhY2goZnVuY3Rpb24odCxuKXtlLnNldChuLHQpfSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgcixpPS0xLG89dC5sZW5ndGg7aWYobnVsbD09bilmb3IoOysraTxvOyllLnNldChpLHRbaV0pO2Vsc2UgZm9yKDsrK2k8bzspZS5zZXQobihyPXRbaV0saSx0KSxyKX1lbHNlIGlmKHQpZm9yKHZhciB1IGluIHQpZS5zZXQodSx0W3VdKTtyZXR1cm4gZX1mdW5jdGlvbiBmZSgpe3JldHVybnt9fWZ1bmN0aW9uIGxlKHQsbixlKXt0W25dPWV9ZnVuY3Rpb24gaGUoKXtyZXR1cm4gc2UoKX1mdW5jdGlvbiBwZSh0LG4sZSl7dC5zZXQobixlKX1mdW5jdGlvbiBkZSgpe31mdW5jdGlvbiB2ZSh0LG4pe3ZhciBlPW5ldyBkZTtpZih0IGluc3RhbmNlb2YgZGUpdC5lYWNoKGZ1bmN0aW9uKHQpe2UuYWRkKHQpfSk7ZWxzZSBpZih0KXt2YXIgcj0tMSxpPXQubGVuZ3RoO2lmKG51bGw9PW4pZm9yKDsrK3I8aTspZS5hZGQodFtyXSk7ZWxzZSBmb3IoOysrcjxpOyllLmFkZChuKHRbcl0scix0KSl9cmV0dXJuIGV9ZnVuY3Rpb24gZ2UodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBfZSh0KXtmdW5jdGlvbiBuKHQsbil7ZnVuY3Rpb24gZSgpe2lmKHMpcmV0dXJuIE1oO2lmKGYpcmV0dXJuIGY9ITEsd2g7dmFyIG4sZSxyPWE7aWYodC5jaGFyQ29kZUF0KHIpPT09VGgpe2Zvcig7YSsrPHUmJnQuY2hhckNvZGVBdChhKSE9PVRofHx0LmNoYXJDb2RlQXQoKythKT09PVRoOyk7cmV0dXJuKG49YSk+PXU/cz0hMDooZT10LmNoYXJDb2RlQXQoYSsrKSk9PT1OaD9mPSEwOmU9PT1raCYmKGY9ITAsdC5jaGFyQ29kZUF0KGEpPT09TmgmJisrYSksdC5zbGljZShyKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPHU7KXtpZigoZT10LmNoYXJDb2RlQXQobj1hKyspKT09PU5oKWY9ITA7ZWxzZSBpZihlPT09a2gpZj0hMCx0LmNoYXJDb2RlQXQoYSk9PT1OaCYmKythO2Vsc2UgaWYoZSE9PW8pY29udGludWU7cmV0dXJuIHQuc2xpY2UocixuKX1yZXR1cm4gcz0hMCx0LnNsaWNlKHIsdSl9dmFyIHIsaT1bXSx1PXQubGVuZ3RoLGE9MCxjPTAscz11PD0wLGY9ITE7Zm9yKHQuY2hhckNvZGVBdCh1LTEpPT09TmgmJi0tdSx0LmNoYXJDb2RlQXQodS0xKT09PWtoJiYtLXU7KHI9ZSgpKSE9PU1oOyl7Zm9yKHZhciBsPVtdO3IhPT13aCYmciE9PU1oOylsLnB1c2gocikscj1lKCk7biYmbnVsbD09KGw9bihsLGMrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAocikuam9pbih0KX1mdW5jdGlvbiByKHQpe3JldHVybiBudWxsPT10PyIiOmkudGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXZhciBpPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLG89dC5jaGFyQ29kZUF0KDApO3JldHVybntwYXJzZTpmdW5jdGlvbih0LGUpe3ZhciByLGksbz1uKHQsZnVuY3Rpb24odCxuKXtpZihyKXJldHVybiByKHQsbi0xKTtpPXQscj1lP2Z1bmN0aW9uKHQsbil7dmFyIGU9Z2UodCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxlKTpnZSh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOm4sZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKHIpLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHIoblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGUpLmpvaW4oIlxuIil9fX1mdW5jdGlvbiB5ZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbWUoKXtyZXR1cm4gMWUtNiooTWF0aC5yYW5kb20oKS0uNSl9ZnVuY3Rpb24geGUodCxuLGUscil7aWYoaXNOYU4obil8fGlzTmFOKGUpKXJldHVybiB0O3ZhciBpLG8sdSxhLGMscyxmLGwsaCxwPXQuX3Jvb3QsZD17ZGF0YTpyfSx2PXQuX3gwLGc9dC5feTAsXz10Ll94MSx5PXQuX3kxO2lmKCFwKXJldHVybiB0Ll9yb290PWQsdDtmb3IoO3AubGVuZ3RoOylpZigocz1uPj0obz0oditfKS8yKSk/dj1vOl89bywoZj1lPj0odT0oZyt5KS8yKSk/Zz11Onk9dSxpPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gaVtsXT1kLHQ7aWYoYT0rdC5feC5jYWxsKG51bGwscC5kYXRhKSxjPSt0Ll95LmNhbGwobnVsbCxwLmRhdGEpLG49PT1hJiZlPT09YylyZXR1cm4gZC5uZXh0PXAsaT9pW2xdPWQ6dC5fcm9vdD1kLHQ7ZG97aT1pP2lbbF09bmV3IEFycmF5KDQpOnQuX3Jvb3Q9bmV3IEFycmF5KDQpLChzPW4+PShvPSh2K18pLzIpKT92PW86Xz1vLChmPWU+PSh1PShnK3kpLzIpKT9nPXU6eT11fXdoaWxlKChsPWY8PDF8cyk9PShoPShjPj11KTw8MXxhPj1vKSk7cmV0dXJuIGlbaF09cCxpW2xdPWQsdH1mdW5jdGlvbiBiZSh0LG4sZSxyLGkpe3RoaXMubm9kZT10LHRoaXMueDA9bix0aGlzLnkwPWUsdGhpcy54MT1yLHRoaXMueTE9aX1mdW5jdGlvbiB3ZSh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBNZSh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBUZSh0LG4sZSl7dmFyIHI9bmV3IE5lKG51bGw9PW4/d2U6bixudWxsPT1lP01lOmUsTmFOLE5hTixOYU4sTmFOKTtyZXR1cm4gbnVsbD09dD9yOnIuYWRkQWxsKHQpfWZ1bmN0aW9uIE5lKHQsbixlLHIsaSxvKXt0aGlzLl94PXQsdGhpcy5feT1uLHRoaXMuX3gwPWUsdGhpcy5feTA9cix0aGlzLl94MT1pLHRoaXMuX3kxPW8sdGhpcy5fcm9vdD12b2lkIDB9ZnVuY3Rpb24ga2UodCl7Zm9yKHZhciBuPXtkYXRhOnQuZGF0YX0sZT1uO3Q9dC5uZXh0OyllPWUubmV4dD17ZGF0YTp0LmRhdGF9O3JldHVybiBufWZ1bmN0aW9uIFNlKHQpe3JldHVybiB0LngrdC52eH1mdW5jdGlvbiBFZSh0KXtyZXR1cm4gdC55K3Qudnl9ZnVuY3Rpb24gQWUodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gQ2UodCxuKXt2YXIgZT10LmdldChuKTtpZighZSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbik7cmV0dXJuIGV9ZnVuY3Rpb24gemUodCl7cmV0dXJuIHQueH1mdW5jdGlvbiBQZSh0KXtyZXR1cm4gdC55fWZ1bmN0aW9uIFJlKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIExlKHQpe3JldHVybih0PVJlKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59ZnVuY3Rpb24gcWUodCxuKXt2YXIgZT1SZSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWZ1bmN0aW9uIERlKHQpe3JldHVybiBuZXcgVWUodCl9ZnVuY3Rpb24gVWUodCl7aWYoIShuPUJoLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG4sZT1uWzFdfHwiICIscj1uWzJdfHwiPiIsaT1uWzNdfHwiLSIsbz1uWzRdfHwiIix1PSEhbls1XSxhPW5bNl0mJituWzZdLGM9ISFuWzddLHM9bls4XSYmK25bOF0uc2xpY2UoMSksZj1uWzldfHwiIjsibiI9PT1mPyhjPSEwLGY9ImciKTpZaFtmXXx8KGY9IiIpLCh1fHwiMCI9PT1lJiYiPSI9PT1yKSYmKHU9ITAsZT0iMCIscj0iPSIpLHRoaXMuZmlsbD1lLHRoaXMuYWxpZ249cix0aGlzLnNpZ249aSx0aGlzLnN5bWJvbD1vLHRoaXMuemVybz11LHRoaXMud2lkdGg9YSx0aGlzLmNvbW1hPWMsdGhpcy5wcmVjaXNpb249cyx0aGlzLnR5cGU9Zn1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gdH1mdW5jdGlvbiBGZSh0KXtmdW5jdGlvbiBuKHQpe2Z1bmN0aW9uIG4odCl7dmFyIG4scix1LGY9Zyx4PV87aWYoImMiPT09dil4PXkodCkreCx0PSIiO2Vsc2V7dmFyIGI9KHQ9K3QpPDA7aWYodD15KE1hdGguYWJzKHQpLGQpLGImJjA9PSt0JiYoYj0hMSksZj0oYj8iKCI9PT1zP3M6Ii0iOiItIj09PXN8fCIoIj09PXM/IiI6cykrZix4PSgicyI9PT12P2poWzgrT2gvM106IiIpK3grKGImJiIoIj09PXM/IikiOiIiKSxtKWZvcihuPS0xLHI9dC5sZW5ndGg7KytuPHI7KWlmKDQ4Pih1PXQuY2hhckNvZGVBdChuKSl8fHU+NTcpe3g9KDQ2PT09dT9pK3Quc2xpY2UobisxKTp0LnNsaWNlKG4pKSt4LHQ9dC5zbGljZSgwLG4pO2JyZWFrfX1wJiYhbCYmKHQ9ZSh0LDEvMCkpO3ZhciB3PWYubGVuZ3RoK3QubGVuZ3RoK3gubGVuZ3RoLE09dzxoP25ldyBBcnJheShoLXcrMSkuam9pbihhKToiIjtzd2l0Y2gocCYmbCYmKHQ9ZShNK3QsTS5sZW5ndGg/aC14Lmxlbmd0aDoxLzApLE09IiIpLGMpe2Nhc2UiPCI6dD1mK3QreCtNO2JyZWFrO2Nhc2UiPSI6dD1mK00rdCt4O2JyZWFrO2Nhc2UiXiI6dD1NLnNsaWNlKDAsdz1NLmxlbmd0aD4+MSkrZit0K3grTS5zbGljZSh3KTticmVhaztkZWZhdWx0OnQ9TStmK3QreH1yZXR1cm4gbyh0KX12YXIgYT0odD1EZSh0KSkuZmlsbCxjPXQuYWxpZ24scz10LnNpZ24sZj10LnN5bWJvbCxsPXQuemVybyxoPXQud2lkdGgscD10LmNvbW1hLGQ9dC5wcmVjaXNpb24sdj10LnR5cGUsZz0iJCI9PT1mP3JbMF06IiMiPT09ZiYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLF89IiQiPT09Zj9yWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIseT1ZaFt2XSxtPSF2fHwvW2RlZmdwcnMlXS8udGVzdCh2KTtyZXR1cm4gZD1udWxsPT1kP3Y/NjoxMjovW2dwcnNdLy50ZXN0KHYpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZCkpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZCkpLG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sbn12YXIgZT10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlLHIpe2Zvcih2YXIgaT1lLmxlbmd0aCxvPVtdLHU9MCxhPXRbMF0sYz0wO2k+MCYmYT4wJiYoYythKzE+ciYmKGE9TWF0aC5tYXgoMSxyLWMpKSxvLnB1c2goZS5zdWJzdHJpbmcoaS09YSxpK2EpKSwhKChjKz1hKzEpPnIpKTspYT10W3U9KHUrMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKG4pfX0odC5ncm91cGluZyx0LnRob3VzYW5kcyk6T2Uscj10LmN1cnJlbmN5LGk9dC5kZWNpbWFsLG89dC5udW1lcmFscz9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZSgvWzAtOV0vZyxmdW5jdGlvbihuKXtyZXR1cm4gdFsrbl19KX19KHQubnVtZXJhbHMpOk9lLHU9dC5wZXJjZW50fHwiJSI7cmV0dXJue2Zvcm1hdDpuLGZvcm1hdFByZWZpeDpmdW5jdGlvbih0LGUpe3ZhciByPW4oKHQ9RGUodCksdC50eXBlPSJmIix0KSksaT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihMZShlKS8zKSkpLG89TWF0aC5wb3coMTAsLWkpLHU9amhbOCtpLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gcihvKnQpK3V9fX19ZnVuY3Rpb24gSWUobil7cmV0dXJuIEhoPUZlKG4pLHQuZm9ybWF0PUhoLmZvcm1hdCx0LmZvcm1hdFByZWZpeD1IaC5mb3JtYXRQcmVmaXgsSGh9ZnVuY3Rpb24gWWUodCl7cmV0dXJuIE1hdGgubWF4KDAsLUxlKE1hdGguYWJzKHQpKSl9ZnVuY3Rpb24gQmUodCxuKXtyZXR1cm4gTWF0aC5tYXgoMCwzKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihMZShuKS8zKSkpLUxlKE1hdGguYWJzKHQpKSl9ZnVuY3Rpb24gSGUodCxuKXtyZXR1cm4gdD1NYXRoLmFicyh0KSxuPU1hdGguYWJzKG4pLXQsTWF0aC5tYXgoMCxMZShuKS1MZSh0KSkrMX1mdW5jdGlvbiBqZSgpe3JldHVybiBuZXcgWGV9ZnVuY3Rpb24gWGUoKXt0aGlzLnJlc2V0KCl9ZnVuY3Rpb24gVmUodCxuLGUpe3ZhciByPXQucz1uK2UsaT1yLW4sbz1yLWk7dC50PW4tbysoZS1pKX1mdW5jdGlvbiAkZSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9OcDpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIHQ+MT9rcDp0PC0xPy1rcDpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gWmUodCl7cmV0dXJuKHQ9RnAodC8yKSkqdH1mdW5jdGlvbiBHZSgpe31mdW5jdGlvbiBRZSh0LG4pe3QmJmpwLmhhc093blByb3BlcnR5KHQudHlwZSkmJmpwW3QudHlwZV0odCxuKX1mdW5jdGlvbiBKZSh0LG4sZSl7dmFyIHIsaT0tMSxvPXQubGVuZ3RoLWU7Zm9yKG4ubGluZVN0YXJ0KCk7KytpPG87KXI9dFtpXSxuLnBvaW50KHJbMF0sclsxXSxyWzJdKTtuLmxpbmVFbmQoKX1mdW5jdGlvbiBLZSh0LG4pe3ZhciBlPS0xLHI9dC5sZW5ndGg7Zm9yKG4ucG9seWdvblN0YXJ0KCk7KytlPHI7KUplKHRbZV0sbiwxKTtuLnBvbHlnb25FbmQoKX1mdW5jdGlvbiB0cih0LG4pe3QmJkhwLmhhc093blByb3BlcnR5KHQudHlwZSk/SHBbdC50eXBlXSh0LG4pOlFlKHQsbil9ZnVuY3Rpb24gbnIoKXskcC5wb2ludD1ycn1mdW5jdGlvbiBlcigpe2lyKFhoLFZoKX1mdW5jdGlvbiBycih0LG4peyRwLnBvaW50PWlyLFhoPXQsVmg9biwkaD10Kj1DcCxXaD1McChuPShuKj1DcCkvMitTcCksWmg9RnAobil9ZnVuY3Rpb24gaXIodCxuKXtuPShuKj1DcCkvMitTcDt2YXIgZT0odCo9Q3ApLSRoLHI9ZT49MD8xOi0xLGk9ciplLG89THAobiksdT1GcChuKSxhPVpoKnUsYz1XaCpvK2EqTHAoaSkscz1hKnIqRnAoaSk7WHAuYWRkKFJwKHMsYykpLCRoPXQsV2g9byxaaD11fWZ1bmN0aW9uIG9yKHQpe3JldHVybltScCh0WzFdLHRbMF0pLFdlKHRbMl0pXX1mdW5jdGlvbiB1cih0KXt2YXIgbj10WzBdLGU9dFsxXSxyPUxwKGUpO3JldHVybltyKkxwKG4pLHIqRnAobiksRnAoZSldfWZ1bmN0aW9uIGFyKHQsbil7cmV0dXJuIHRbMF0qblswXSt0WzFdKm5bMV0rdFsyXSpuWzJdfWZ1bmN0aW9uIGNyKHQsbil7cmV0dXJuW3RbMV0qblsyXS10WzJdKm5bMV0sdFsyXSpuWzBdLXRbMF0qblsyXSx0WzBdKm5bMV0tdFsxXSpuWzBdXX1mdW5jdGlvbiBzcih0LG4pe3RbMF0rPW5bMF0sdFsxXSs9blsxXSx0WzJdKz1uWzJdfWZ1bmN0aW9uIGZyKHQsbil7cmV0dXJuW3RbMF0qbix0WzFdKm4sdFsyXSpuXX1mdW5jdGlvbiBscih0KXt2YXIgbj1ZcCh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89bix0WzFdLz1uLHRbMl0vPW59ZnVuY3Rpb24gaHIodCxuKXtpcC5wdXNoKG9wPVtHaD10LEpoPXRdKSxuPFFoJiYoUWg9biksbj5LaCYmKEtoPW4pfWZ1bmN0aW9uIHByKHQsbil7dmFyIGU9dXIoW3QqQ3AsbipDcF0pO2lmKHJwKXt2YXIgcj1jcihycCxlKSxpPWNyKFtyWzFdLC1yWzBdLDBdLHIpO2xyKGkpLGk9b3IoaSk7dmFyIG8sdT10LXRwLGE9dT4wPzE6LTEsYz1pWzBdKkFwKmEscz16cCh1KT4xODA7c14oYSp0cDxjJiZjPGEqdCk/KG89aVsxXSpBcCk+S2gmJihLaD1vKTooYz0oYyszNjApJTM2MC0xODAsc14oYSp0cDxjJiZjPGEqdCk/KG89LWlbMV0qQXApPFFoJiYoUWg9byk6KG48UWgmJihRaD1uKSxuPktoJiYoS2g9bikpKSxzP3Q8dHA/bXIoR2gsdCk+bXIoR2gsSmgpJiYoSmg9dCk6bXIodCxKaCk+bXIoR2gsSmgpJiYoR2g9dCk6Smg+PUdoPyh0PEdoJiYoR2g9dCksdD5KaCYmKEpoPXQpKTp0PnRwP21yKEdoLHQpPm1yKEdoLEpoKSYmKEpoPXQpOm1yKHQsSmgpPm1yKEdoLEpoKSYmKEdoPXQpfWVsc2UgaXAucHVzaChvcD1bR2g9dCxKaD10XSk7bjxRaCYmKFFoPW4pLG4+S2gmJihLaD1uKSxycD1lLHRwPXR9ZnVuY3Rpb24gZHIoKXtacC5wb2ludD1wcn1mdW5jdGlvbiB2cigpe29wWzBdPUdoLG9wWzFdPUpoLFpwLnBvaW50PWhyLHJwPW51bGx9ZnVuY3Rpb24gZ3IodCxuKXtpZihycCl7dmFyIGU9dC10cDtXcC5hZGQoenAoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBucD10LGVwPW47JHAucG9pbnQodCxuKSxwcih0LG4pfWZ1bmN0aW9uIF9yKCl7JHAubGluZVN0YXJ0KCl9ZnVuY3Rpb24geXIoKXtncihucCxlcCksJHAubGluZUVuZCgpLHpwKFdwKT5NcCYmKEdoPS0oSmg9MTgwKSksb3BbMF09R2gsb3BbMV09SmgscnA9bnVsbH1mdW5jdGlvbiBtcih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24geHIodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIGJyKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn1mdW5jdGlvbiB3cih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKTtNcihlKkxwKHQpLGUqRnAodCksRnAobikpfWZ1bmN0aW9uIE1yKHQsbixlKXtjcCs9KHQtY3ApLysrdXAsc3ArPShuLXNwKS91cCxmcCs9KGUtZnApL3VwfWZ1bmN0aW9uIFRyKCl7R3AucG9pbnQ9TnJ9ZnVuY3Rpb24gTnIodCxuKXt0Kj1DcDt2YXIgZT1McChuKj1DcCk7bXA9ZSpMcCh0KSx4cD1lKkZwKHQpLGJwPUZwKG4pLEdwLnBvaW50PWtyLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiBrcih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKSxyPWUqTHAodCksaT1lKkZwKHQpLG89RnAobiksdT1ScChZcCgodT14cCpvLWJwKmkpKnUrKHU9YnAqci1tcCpvKSp1Kyh1PW1wKmkteHAqcikqdSksbXAqcit4cCppK2JwKm8pO2FwKz11LGxwKz11KihtcCsobXA9cikpLGhwKz11Kih4cCsoeHA9aSkpLHBwKz11KihicCsoYnA9bykpLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiBTcigpe0dwLnBvaW50PXdyfWZ1bmN0aW9uIEVyKCl7R3AucG9pbnQ9Q3J9ZnVuY3Rpb24gQXIoKXt6cihfcCx5cCksR3AucG9pbnQ9d3J9ZnVuY3Rpb24gQ3IodCxuKXtfcD10LHlwPW4sdCo9Q3Asbio9Q3AsR3AucG9pbnQ9enI7dmFyIGU9THAobik7bXA9ZSpMcCh0KSx4cD1lKkZwKHQpLGJwPUZwKG4pLE1yKG1wLHhwLGJwKX1mdW5jdGlvbiB6cih0LG4pe3QqPUNwO3ZhciBlPUxwKG4qPUNwKSxyPWUqTHAodCksaT1lKkZwKHQpLG89RnAobiksdT14cCpvLWJwKmksYT1icCpyLW1wKm8sYz1tcCppLXhwKnIscz1ZcCh1KnUrYSphK2MqYyksZj1XZShzKSxsPXMmJi1mL3M7ZHArPWwqdSx2cCs9bCphLGdwKz1sKmMsYXArPWYsbHArPWYqKG1wKyhtcD1yKSksaHArPWYqKHhwKyh4cD1pKSkscHArPWYqKGJwKyhicD1vKSksTXIobXAseHAsYnApfWZ1bmN0aW9uIFByKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBScih0LG4pe2Z1bmN0aW9uIGUoZSxyKXtyZXR1cm4gZT10KGUsciksbihlWzBdLGVbMV0pfXJldHVybiB0LmludmVydCYmbi5pbnZlcnQmJihlLmludmVydD1mdW5jdGlvbihlLHIpe3JldHVybihlPW4uaW52ZXJ0KGUscikpJiZ0LmludmVydChlWzBdLGVbMV0pfSksZX1mdW5jdGlvbiBMcih0LG4pe3JldHVyblt0Pk5wP3QtRXA6dDwtTnA/dCtFcDp0LG5dfWZ1bmN0aW9uIHFyKHQsbixlKXtyZXR1cm4odCU9RXApP258fGU/UnIoVXIodCksT3IobixlKSk6VXIodCk6bnx8ZT9PcihuLGUpOkxyfWZ1bmN0aW9uIERyKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiBuKz10LFtuPk5wP24tRXA6bjwtTnA/bitFcDpuLGVdfX1mdW5jdGlvbiBVcih0KXt2YXIgbj1Ecih0KTtyZXR1cm4gbi5pbnZlcnQ9RHIoLXQpLG59ZnVuY3Rpb24gT3IodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9THAobiksYT1McCh0KSplLGM9RnAodCkqZSxzPUZwKG4pLGY9cypyK2EqaTtyZXR1cm5bUnAoYypvLWYqdSxhKnItcyppKSxXZShmKm8rYyp1KV19dmFyIHI9THAodCksaT1GcCh0KSxvPUxwKG4pLHU9RnAobik7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9THAobiksYT1McCh0KSplLGM9RnAodCkqZSxzPUZwKG4pLGY9cypvLWMqdTtyZXR1cm5bUnAoYypvK3MqdSxhKnIrZippKSxXZShmKnItYSppKV19LGV9ZnVuY3Rpb24gRnIodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbj10KG5bMF0qQ3AsblsxXSpDcCksblswXSo9QXAsblsxXSo9QXAsbn1yZXR1cm4gdD1xcih0WzBdKkNwLHRbMV0qQ3AsdC5sZW5ndGg+Mj90WzJdKkNwOjApLG4uaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiBuPXQuaW52ZXJ0KG5bMF0qQ3AsblsxXSpDcCksblswXSo9QXAsblsxXSo9QXAsbn0sbn1mdW5jdGlvbiBJcih0LG4sZSxyLGksbyl7aWYoZSl7dmFyIHU9THAobiksYT1GcChuKSxjPXIqZTtudWxsPT1pPyhpPW4rcipFcCxvPW4tYy8yKTooaT1Zcih1LGkpLG89WXIodSxvKSwocj4wP2k8bzppPm8pJiYoaSs9cipFcCkpO2Zvcih2YXIgcyxmPWk7cj4wP2Y+bzpmPG87Zi09YylzPW9yKFt1LC1hKkxwKGYpLC1hKkZwKGYpXSksdC5wb2ludChzWzBdLHNbMV0pfX1mdW5jdGlvbiBZcih0LG4peyhuPXVyKG4pKVswXS09dCxscihuKTt2YXIgZT0kZSgtblsxXSk7cmV0dXJuKCgtblsyXTwwPy1lOmUpK0VwLU1wKSVFcH1mdW5jdGlvbiBCcigpe3ZhciB0LG49W107cmV0dXJue3BvaW50OmZ1bmN0aW9uKG4sZSl7dC5wdXNoKFtuLGVdKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5wdXNoKHQ9W10pfSxsaW5lRW5kOkdlLHJlam9pbjpmdW5jdGlvbigpe24ubGVuZ3RoPjEmJm4ucHVzaChuLnBvcCgpLmNvbmNhdChuLnNoaWZ0KCkpKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIGU9bjtyZXR1cm4gbj1bXSx0PW51bGwsZX19fWZ1bmN0aW9uIEhyKHQsbil7cmV0dXJuIHpwKHRbMF0tblswXSk8TXAmJnpwKHRbMV0tblsxXSk8TXB9ZnVuY3Rpb24ganIodCxuLGUscil7dGhpcy54PXQsdGhpcy56PW4sdGhpcy5vPWUsdGhpcy5lPXIsdGhpcy52PSExLHRoaXMubj10aGlzLnA9bnVsbH1mdW5jdGlvbiBYcih0LG4sZSxyLGkpe3ZhciBvLHUsYT1bXSxjPVtdO2lmKHQuZm9yRWFjaChmdW5jdGlvbih0KXtpZighKChuPXQubGVuZ3RoLTEpPD0wKSl7dmFyIG4sZSxyPXRbMF0sdT10W25dO2lmKEhyKHIsdSkpe2ZvcihpLmxpbmVTdGFydCgpLG89MDtvPG47KytvKWkucG9pbnQoKHI9dFtvXSlbMF0sclsxXSk7aS5saW5lRW5kKCl9ZWxzZSBhLnB1c2goZT1uZXcganIocix0LG51bGwsITApKSxjLnB1c2goZS5vPW5ldyBqcihyLG51bGwsZSwhMSkpLGEucHVzaChlPW5ldyBqcih1LHQsbnVsbCwhMSkpLGMucHVzaChlLm89bmV3IGpyKHUsbnVsbCxlLCEwKSl9fSksYS5sZW5ndGgpe2ZvcihjLnNvcnQobiksVnIoYSksVnIoYyksbz0wLHU9Yy5sZW5ndGg7bzx1OysrbyljW29dLmU9ZT0hZTtmb3IodmFyIHMsZixsPWFbMF07Oyl7Zm9yKHZhciBoPWwscD0hMDtoLnY7KWlmKChoPWgubik9PT1sKXJldHVybjtzPWgueixpLmxpbmVTdGFydCgpO2Rve2lmKGgudj1oLm8udj0hMCxoLmUpe2lmKHApZm9yKG89MCx1PXMubGVuZ3RoO288dTsrK28paS5wb2ludCgoZj1zW29dKVswXSxmWzFdKTtlbHNlIHIoaC54LGgubi54LDEsaSk7aD1oLm59ZWxzZXtpZihwKWZvcihzPWgucC56LG89cy5sZW5ndGgtMTtvPj0wOy0tbylpLnBvaW50KChmPXNbb10pWzBdLGZbMV0pO2Vsc2UgcihoLngsaC5wLngsLTEsaSk7aD1oLnB9cz0oaD1oLm8pLnoscD0hcH13aGlsZSghaC52KTtpLmxpbmVFbmQoKX19fWZ1bmN0aW9uIFZyKHQpe2lmKG49dC5sZW5ndGgpe2Zvcih2YXIgbixlLHI9MCxpPXRbMF07KytyPG47KWkubj1lPXRbcl0sZS5wPWksaT1lO2kubj1lPXRbMF0sZS5wPWl9fWZ1bmN0aW9uICRyKHQsbil7dmFyIGU9blswXSxyPW5bMV0saT1bRnAoZSksLUxwKGUpLDBdLG89MCx1PTA7Y2QucmVzZXQoKTtmb3IodmFyIGE9MCxjPXQubGVuZ3RoO2E8YzsrK2EpaWYoZj0ocz10W2FdKS5sZW5ndGgpZm9yKHZhciBzLGYsbD1zW2YtMV0saD1sWzBdLHA9bFsxXS8yK1NwLGQ9RnAocCksdj1McChwKSxnPTA7ZzxmOysrZyxoPXksZD14LHY9YixsPV8pe3ZhciBfPXNbZ10seT1fWzBdLG09X1sxXS8yK1NwLHg9RnAobSksYj1McChtKSx3PXktaCxNPXc+PTA/MTotMSxUPU0qdyxOPVQ+TnAsaz1kKng7aWYoY2QuYWRkKFJwKGsqTSpGcChUKSx2KmIraypMcChUKSkpLG8rPU4/dytNKkVwOncsTl5oPj1lXnk+PWUpe3ZhciBTPWNyKHVyKGwpLHVyKF8pKTtscihTKTt2YXIgRT1jcihpLFMpO2xyKEUpO3ZhciBBPShOXnc+PTA/LTE6MSkqV2UoRVsyXSk7KHI+QXx8cj09PUEmJihTWzBdfHxTWzFdKSkmJih1Kz1OXnc+PTA/MTotMSl9fXJldHVybihvPC1NcHx8bzxNcCYmY2Q8LU1wKV4xJnV9ZnVuY3Rpb24gV3IodCxuLGUscil7cmV0dXJuIGZ1bmN0aW9uKGkpe2Z1bmN0aW9uIG8obixlKXt0KG4sZSkmJmkucG9pbnQobixlKX1mdW5jdGlvbiB1KHQsbil7di5wb2ludCh0LG4pfWZ1bmN0aW9uIGEoKXt4LnBvaW50PXUsdi5saW5lU3RhcnQoKX1mdW5jdGlvbiBjKCl7eC5wb2ludD1vLHYubGluZUVuZCgpfWZ1bmN0aW9uIHModCxuKXtkLnB1c2goW3Qsbl0pLHkucG9pbnQodCxuKX1mdW5jdGlvbiBmKCl7eS5saW5lU3RhcnQoKSxkPVtdfWZ1bmN0aW9uIGwoKXtzKGRbMF1bMF0sZFswXVsxXSkseS5saW5lRW5kKCk7dmFyIHQsbixlLHIsbz15LmNsZWFuKCksdT1fLnJlc3VsdCgpLGE9dS5sZW5ndGg7aWYoZC5wb3AoKSxoLnB1c2goZCksZD1udWxsLGEpaWYoMSZvKXtpZihlPXVbMF0sKG49ZS5sZW5ndGgtMSk+MCl7Zm9yKG18fChpLnBvbHlnb25TdGFydCgpLG09ITApLGkubGluZVN0YXJ0KCksdD0wO3Q8bjsrK3QpaS5wb2ludCgocj1lW3RdKVswXSxyWzFdKTtpLmxpbmVFbmQoKX19ZWxzZSBhPjEmJjImbyYmdS5wdXNoKHUucG9wKCkuY29uY2F0KHUuc2hpZnQoKSkpLHAucHVzaCh1LmZpbHRlcihacikpfXZhciBoLHAsZCx2PW4oaSksXz1CcigpLHk9bihfKSxtPSExLHg9e3BvaW50Om8sbGluZVN0YXJ0OmEsbGluZUVuZDpjLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9cyx4LmxpbmVTdGFydD1mLHgubGluZUVuZD1sLHA9W10saD1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3gucG9pbnQ9byx4LmxpbmVTdGFydD1hLHgubGluZUVuZD1jLHA9ZyhwKTt2YXIgdD0kcihoLHIpO3AubGVuZ3RoPyhtfHwoaS5wb2x5Z29uU3RhcnQoKSxtPSEwKSxYcihwLEdyLHQsZSxpKSk6dCYmKG18fChpLnBvbHlnb25TdGFydCgpLG09ITApLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSksbSYmKGkucG9seWdvbkVuZCgpLG09ITEpLHA9aD1udWxsfSxzcGhlcmU6ZnVuY3Rpb24oKXtpLnBvbHlnb25TdGFydCgpLGkubGluZVN0YXJ0KCksZShudWxsLG51bGwsMSxpKSxpLmxpbmVFbmQoKSxpLnBvbHlnb25FbmQoKX19O3JldHVybiB4fX1mdW5jdGlvbiBacih0KXtyZXR1cm4gdC5sZW5ndGg+MX1mdW5jdGlvbiBHcih0LG4pe3JldHVybigodD10LngpWzBdPDA/dFsxXS1rcC1NcDprcC10WzFdKS0oKG49bi54KVswXTwwP25bMV0ta3AtTXA6a3AtblsxXSl9ZnVuY3Rpb24gUXIodCl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiBMcCh0KSpMcChuKT5pfWZ1bmN0aW9uIGUodCxuLGUpe3ZhciByPVsxLDAsMF0sbz1jcih1cih0KSx1cihuKSksdT1hcihvLG8pLGE9b1swXSxjPXUtYSphO2lmKCFjKXJldHVybiFlJiZ0O3ZhciBzPWkqdS9jLGY9LWkqYS9jLGw9Y3IocixvKSxoPWZyKHIscyk7c3IoaCxmcihvLGYpKTt2YXIgcD1sLGQ9YXIoaCxwKSx2PWFyKHAscCksZz1kKmQtdiooYXIoaCxoKS0xKTtpZighKGc8MCkpe3ZhciBfPVlwKGcpLHk9ZnIocCwoLWQtXykvdik7aWYoc3IoeSxoKSx5PW9yKHkpLCFlKXJldHVybiB5O3ZhciBtLHg9dFswXSxiPW5bMF0sdz10WzFdLE09blsxXTtiPHgmJihtPXgseD1iLGI9bSk7dmFyIFQ9Yi14LE49enAoVC1OcCk8TXA7aWYoIU4mJk08dyYmKG09dyx3PU0sTT1tKSxOfHxUPE1wP04/dytNPjBeeVsxXTwoenAoeVswXS14KTxNcD93Ok0pOnc8PXlbMV0mJnlbMV08PU06VD5OcF4oeDw9eVswXSYmeVswXTw9Yikpe3ZhciBrPWZyKHAsKC1kK18pL3YpO3JldHVybiBzcihrLGgpLFt5LG9yKGspXX19fWZ1bmN0aW9uIHIobixlKXt2YXIgcj11P3Q6TnAtdCxpPTA7cmV0dXJuIG48LXI/aXw9MTpuPnImJihpfD0yKSxlPC1yP2l8PTQ6ZT5yJiYoaXw9OCksaX12YXIgaT1McCh0KSxvPTYqQ3AsdT1pPjAsYT16cChpKT5NcDtyZXR1cm4gV3IobixmdW5jdGlvbih0KXt2YXIgaSxvLGMscyxmO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtzPWM9ITEsZj0xfSxwb2ludDpmdW5jdGlvbihsLGgpe3ZhciBwLGQ9W2wsaF0sdj1uKGwsaCksZz11P3Y/MDpyKGwsaCk6dj9yKGwrKGw8MD9OcDotTnApLGgpOjA7aWYoIWkmJihzPWM9dikmJnQubGluZVN0YXJ0KCksdiE9PWMmJighKHA9ZShpLGQpKXx8SHIoaSxwKXx8SHIoZCxwKSkmJihkWzBdKz1NcCxkWzFdKz1NcCx2PW4oZFswXSxkWzFdKSksdiE9PWMpZj0wLHY/KHQubGluZVN0YXJ0KCkscD1lKGQsaSksdC5wb2ludChwWzBdLHBbMV0pKToocD1lKGksZCksdC5wb2ludChwWzBdLHBbMV0pLHQubGluZUVuZCgpKSxpPXA7ZWxzZSBpZihhJiZpJiZ1XnYpe3ZhciBfO2cmb3x8IShfPWUoZCxpLCEwKSl8fChmPTAsdT8odC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSksdC5wb2ludChfWzFdWzBdLF9bMV1bMV0pLHQubGluZUVuZCgpKToodC5wb2ludChfWzFdWzBdLF9bMV1bMV0pLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChfWzBdWzBdLF9bMF1bMV0pKSl9IXZ8fGkmJkhyKGksZCl8fHQucG9pbnQoZFswXSxkWzFdKSxpPWQsYz12LG89Z30sbGluZUVuZDpmdW5jdGlvbigpe2MmJnQubGluZUVuZCgpLGk9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gZnwocyYmYyk8PDF9fX0sZnVuY3Rpb24obixlLHIsaSl7SXIoaSx0LG8scixuLGUpfSx1P1swLC10XTpbLU5wLHQtTnBdKX1mdW5jdGlvbiBKcih0LG4sZSxyKXtmdW5jdGlvbiBpKGksbyl7cmV0dXJuIHQ8PWkmJmk8PWUmJm48PW8mJm88PXJ9ZnVuY3Rpb24gbyhpLG8sYSxzKXt2YXIgZj0wLGw9MDtpZihudWxsPT1pfHwoZj11KGksYSkpIT09KGw9dShvLGEpKXx8YyhpLG8pPDBeYT4wKWRve3MucG9pbnQoMD09PWZ8fDM9PT1mP3Q6ZSxmPjE/cjpuKX13aGlsZSgoZj0oZithKzQpJTQpIT09bCk7ZWxzZSBzLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gdShyLGkpe3JldHVybiB6cChyWzBdLXQpPE1wP2k+MD8wOjM6enAoclswXS1lKTxNcD9pPjA/MjoxOnpwKHJbMV0tbik8TXA/aT4wPzE6MDppPjA/MzoyfWZ1bmN0aW9uIGEodCxuKXtyZXR1cm4gYyh0Lngsbi54KX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9dSh0LDEpLHI9dShuLDEpO3JldHVybiBlIT09cj9lLXI6MD09PWU/blsxXS10WzFdOjE9PT1lP3RbMF0tblswXToyPT09ZT90WzFdLW5bMV06blswXS10WzBdfXJldHVybiBmdW5jdGlvbih1KXtmdW5jdGlvbiBjKHQsbil7aSh0LG4pJiZ3LnBvaW50KHQsbil9ZnVuY3Rpb24gcyhvLHUpe3ZhciBhPWkobyx1KTtpZihsJiZoLnB1c2goW28sdV0pLHgpcD1vLGQ9dSx2PWEseD0hMSxhJiYody5saW5lU3RhcnQoKSx3LnBvaW50KG8sdSkpO2Vsc2UgaWYoYSYmbSl3LnBvaW50KG8sdSk7ZWxzZXt2YXIgYz1bXz1NYXRoLm1heChsZCxNYXRoLm1pbihmZCxfKSkseT1NYXRoLm1heChsZCxNYXRoLm1pbihmZCx5KSldLHM9W289TWF0aC5tYXgobGQsTWF0aC5taW4oZmQsbykpLHU9TWF0aC5tYXgobGQsTWF0aC5taW4oZmQsdSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciB1LGE9dFswXSxjPXRbMV0scz0wLGY9MSxsPW5bMF0tYSxoPW5bMV0tYztpZih1PWUtYSxsfHwhKHU+MCkpe2lmKHUvPWwsbDwwKXtpZih1PHMpcmV0dXJuO3U8ZiYmKGY9dSl9ZWxzZSBpZihsPjApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1pZih1PWktYSxsfHwhKHU8MCkpe2lmKHUvPWwsbDwwKXtpZih1PmYpcmV0dXJuO3U+cyYmKHM9dSl9ZWxzZSBpZihsPjApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1pZih1PXItYyxofHwhKHU+MCkpe2lmKHUvPWgsaDwwKXtpZih1PHMpcmV0dXJuO3U8ZiYmKGY9dSl9ZWxzZSBpZihoPjApe2lmKHU+ZilyZXR1cm47dT5zJiYocz11KX1pZih1PW8tYyxofHwhKHU8MCkpe2lmKHUvPWgsaDwwKXtpZih1PmYpcmV0dXJuO3U+cyYmKHM9dSl9ZWxzZSBpZihoPjApe2lmKHU8cylyZXR1cm47dTxmJiYoZj11KX1yZXR1cm4gcz4wJiYodFswXT1hK3MqbCx0WzFdPWMrcypoKSxmPDEmJihuWzBdPWErZipsLG5bMV09YytmKmgpLCEwfX19fX0oYyxzLHQsbixlLHIpP2EmJih3LmxpbmVTdGFydCgpLHcucG9pbnQobyx1KSxiPSExKToobXx8KHcubGluZVN0YXJ0KCksdy5wb2ludChjWzBdLGNbMV0pKSx3LnBvaW50KHNbMF0sc1sxXSksYXx8dy5saW5lRW5kKCksYj0hMSl9Xz1vLHk9dSxtPWF9dmFyIGYsbCxoLHAsZCx2LF8seSxtLHgsYix3PXUsTT1CcigpLFQ9e3BvaW50OmMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7VC5wb2ludD1zLGwmJmwucHVzaChoPVtdKSx4PSEwLG09ITEsXz15PU5hTn0sbGluZUVuZDpmdW5jdGlvbigpe2YmJihzKHAsZCksdiYmbSYmTS5yZWpvaW4oKSxmLnB1c2goTS5yZXN1bHQoKSkpLFQucG9pbnQ9YyxtJiZ3LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dz1NLGY9W10sbD1bXSxiPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIG49ZnVuY3Rpb24oKXtmb3IodmFyIG49MCxlPTAsaT1sLmxlbmd0aDtlPGk7KytlKWZvcih2YXIgbyx1LGE9bFtlXSxjPTEscz1hLmxlbmd0aCxmPWFbMF0saD1mWzBdLHA9ZlsxXTtjPHM7KytjKW89aCx1PXAsaD0oZj1hW2NdKVswXSxwPWZbMV0sdTw9cj9wPnImJihoLW8pKihyLXUpPihwLXUpKih0LW8pJiYrK246cDw9ciYmKGgtbykqKHItdSk8KHAtdSkqKHQtbykmJi0tbjtyZXR1cm4gbn0oKSxlPWImJm4saT0oZj1nKGYpKS5sZW5ndGg7KGV8fGkpJiYodS5wb2x5Z29uU3RhcnQoKSxlJiYodS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLHUpLHUubGluZUVuZCgpKSxpJiZYcihmLGEsbixvLHUpLHUucG9seWdvbkVuZCgpKSx3PXUsZj1sPWg9bnVsbH19O3JldHVybiBUfX1mdW5jdGlvbiBLcigpe3BkLnBvaW50PXBkLmxpbmVFbmQ9R2V9ZnVuY3Rpb24gdGkodCxuKXtRcD10Kj1DcCxKcD1GcChuKj1DcCksS3A9THAobikscGQucG9pbnQ9bml9ZnVuY3Rpb24gbmkodCxuKXt0Kj1DcDt2YXIgZT1GcChuKj1DcCkscj1McChuKSxpPXpwKHQtUXApLG89THAoaSksdT1yKkZwKGkpLGE9S3AqZS1KcCpyKm8sYz1KcCplK0twKnIqbztoZC5hZGQoUnAoWXAodSp1K2EqYSksYykpLFFwPXQsSnA9ZSxLcD1yfWZ1bmN0aW9uIGVpKHQpe3JldHVybiBoZC5yZXNldCgpLHRyKHQscGQpLCtoZH1mdW5jdGlvbiByaSh0LG4pe3JldHVybiBkZFswXT10LGRkWzFdPW4sZWkodmQpfWZ1bmN0aW9uIGlpKHQsbil7cmV0dXJuISghdHx8IV9kLmhhc093blByb3BlcnR5KHQudHlwZSkpJiZfZFt0LnR5cGVdKHQsbil9ZnVuY3Rpb24gb2kodCxuKXtyZXR1cm4gMD09PXJpKHQsbil9ZnVuY3Rpb24gdWkodCxuKXt2YXIgZT1yaSh0WzBdLHRbMV0pO3JldHVybiByaSh0WzBdLG4pK3JpKG4sdFsxXSk8PWUrTXB9ZnVuY3Rpb24gYWkodCxuKXtyZXR1cm4hISRyKHQubWFwKGNpKSxzaShuKSl9ZnVuY3Rpb24gY2kodCl7cmV0dXJuKHQ9dC5tYXAoc2kpKS5wb3AoKSx0fWZ1bmN0aW9uIHNpKHQpe3JldHVyblt0WzBdKkNwLHRbMV0qQ3BdfWZ1bmN0aW9uIGZpKHQsbixlKXt2YXIgcj1mKHQsbi1NcCxlKS5jb25jYXQobik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiByLm1hcChmdW5jdGlvbihuKXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBsaSh0LG4sZSl7dmFyIHI9Zih0LG4tTXAsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gaGkoKXtmdW5jdGlvbiB0KCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bigpfX1mdW5jdGlvbiBuKCl7cmV0dXJuIGYocXAoby9fKSpfLGksXykubWFwKHApLmNvbmNhdChmKHFwKHMveSkqeSxjLHkpLm1hcChkKSkuY29uY2F0KGYocXAoci92KSp2LGUsdikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB6cCh0JV8pPk1wfSkubWFwKGwpKS5jb25jYXQoZihxcChhL2cpKmcsdSxnKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHpwKHQleSk+TXB9KS5tYXAoaCkpfXZhciBlLHIsaSxvLHUsYSxjLHMsbCxoLHAsZCx2PTEwLGc9dixfPTkwLHk9MzYwLG09Mi41O3JldHVybiB0LmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIG4oKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSl9LHQub3V0bGluZT1mdW5jdGlvbigpe3JldHVybnt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbcChvKS5jb25jYXQoZChjKS5zbGljZSgxKSxwKGkpLnJldmVyc2UoKS5zbGljZSgxKSxkKHMpLnJldmVyc2UoKS5zbGljZSgxKSldfX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5leHRlbnRNYWpvcihuKS5leHRlbnRNaW5vcihuKTp0LmV4dGVudE1pbm9yKCl9LHQuZXh0ZW50TWFqb3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMF0saT0rblsxXVswXSxzPStuWzBdWzFdLGM9K25bMV1bMV0sbz5pJiYobj1vLG89aSxpPW4pLHM+YyYmKG49cyxzPWMsYz1uKSx0LnByZWNpc2lvbihtKSk6W1tvLHNdLFtpLGNdXX0sdC5leHRlbnRNaW5vcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rblswXVswXSxlPStuWzFdWzBdLGE9K25bMF1bMV0sdT0rblsxXVsxXSxyPmUmJihuPXIscj1lLGU9biksYT51JiYobj1hLGE9dSx1PW4pLHQucHJlY2lzaW9uKG0pKTpbW3IsYV0sW2UsdV1dfSx0LnN0ZXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5zdGVwTWFqb3Iobikuc3RlcE1pbm9yKG4pOnQuc3RlcE1pbm9yKCl9LHQuc3RlcE1ham9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhfPStuWzBdLHk9K25bMV0sdCk6W18seV19LHQuc3RlcE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh2PStuWzBdLGc9K25bMV0sdCk6W3YsZ119LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPStuLGw9ZmkoYSx1LDkwKSxoPWxpKHIsZSxtKSxwPWZpKHMsYyw5MCksZD1saShvLGksbSksdCk6bX0sdC5leHRlbnRNYWpvcihbWy0xODAsLTkwK01wXSxbMTgwLDkwLU1wXV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAtTXBdLFsxODAsODArTXBdXSl9ZnVuY3Rpb24gcGkodCl7cmV0dXJuIHR9ZnVuY3Rpb24gZGkoKXt4ZC5wb2ludD12aX1mdW5jdGlvbiB2aSh0LG4pe3hkLnBvaW50PWdpLHRkPWVkPXQsbmQ9cmQ9bn1mdW5jdGlvbiBnaSh0LG4pe21kLmFkZChyZCp0LWVkKm4pLGVkPXQscmQ9bn1mdW5jdGlvbiBfaSgpe2dpKHRkLG5kKX1mdW5jdGlvbiB5aSh0LG4pe2tkKz10LFNkKz1uLCsrRWR9ZnVuY3Rpb24gbWkoKXtxZC5wb2ludD14aX1mdW5jdGlvbiB4aSh0LG4pe3FkLnBvaW50PWJpLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gYmkodCxuKXt2YXIgZT10LXVkLHI9bi1hZCxpPVlwKGUqZStyKnIpO0FkKz1pKih1ZCt0KS8yLENkKz1pKihhZCtuKS8yLHpkKz1pLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gd2koKXtxZC5wb2ludD15aX1mdW5jdGlvbiBNaSgpe3FkLnBvaW50PU5pfWZ1bmN0aW9uIFRpKCl7a2koaWQsb2QpfWZ1bmN0aW9uIE5pKHQsbil7cWQucG9pbnQ9a2kseWkoaWQ9dWQ9dCxvZD1hZD1uKX1mdW5jdGlvbiBraSh0LG4pe3ZhciBlPXQtdWQscj1uLWFkLGk9WXAoZSplK3Iqcik7QWQrPWkqKHVkK3QpLzIsQ2QrPWkqKGFkK24pLzIsemQrPWksUGQrPShpPWFkKnQtdWQqbikqKHVkK3QpLFJkKz1pKihhZCtuKSxMZCs9MyppLHlpKHVkPXQsYWQ9bil9ZnVuY3Rpb24gU2kodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVpKHQsbil7QmQucG9pbnQ9QWksVWQ9RmQ9dCxPZD1JZD1ufWZ1bmN0aW9uIEFpKHQsbil7RmQtPXQsSWQtPW4sWWQuYWRkKFlwKEZkKkZkK0lkKklkKSksRmQ9dCxJZD1ufWZ1bmN0aW9uIENpKCl7dGhpcy5fc3RyaW5nPVtdfWZ1bmN0aW9uIHppKHQpe3JldHVybiJtMCwiK3QrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLTIqdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIisyKnQrInoifWZ1bmN0aW9uIFBpKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uZXcgUmk7Zm9yKHZhciByIGluIHQpZVtyXT10W3JdO3JldHVybiBlLnN0cmVhbT1uLGV9fWZ1bmN0aW9uIFJpKCl7fWZ1bmN0aW9uIExpKHQsbixlKXt2YXIgcj10LmNsaXBFeHRlbnQmJnQuY2xpcEV4dGVudCgpO3JldHVybiB0LnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLDBdKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQobnVsbCksdHIoZSx0LnN0cmVhbShOZCkpLG4oTmQucmVzdWx0KCkpLG51bGwhPXImJnQuY2xpcEV4dGVudChyKSx0fWZ1bmN0aW9uIHFpKHQsbixlKXtyZXR1cm4gTGkodCxmdW5jdGlvbihlKXt2YXIgcj1uWzFdWzBdLW5bMF1bMF0saT1uWzFdWzFdLW5bMF1bMV0sbz1NYXRoLm1pbihyLyhlWzFdWzBdLWVbMF1bMF0pLGkvKGVbMV1bMV0tZVswXVsxXSkpLHU9K25bMF1bMF0rKHItbyooZVsxXVswXStlWzBdWzBdKSkvMixhPStuWzBdWzFdKyhpLW8qKGVbMV1bMV0rZVswXVsxXSkpLzI7dC5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFt1LGFdKX0sZSl9ZnVuY3Rpb24gRGkodCxuLGUpe3JldHVybiBxaSh0LFtbMCwwXSxuXSxlKX1mdW5jdGlvbiBVaSh0LG4sZSl7cmV0dXJuIExpKHQsZnVuY3Rpb24oZSl7dmFyIHI9K24saT1yLyhlWzFdWzBdLWVbMF1bMF0pLG89KHItaSooZVsxXVswXStlWzBdWzBdKSkvMix1PS1pKmVbMF1bMV07dC5zY2FsZSgxNTAqaSkudHJhbnNsYXRlKFtvLHVdKX0sZSl9ZnVuY3Rpb24gT2kodCxuLGUpe3JldHVybiBMaSh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVsxXS1lWzBdWzFdKSxvPS1pKmVbMF1bMF0sdT0oci1pKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyx1XSl9LGUpfWZ1bmN0aW9uIEZpKHQsbil7cmV0dXJuK24/ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHIsaSxvLHUsYSxjLHMsZixsLGgscCxkLHYsZyl7dmFyIF89cy1yLHk9Zi1pLG09XypfK3kqeTtpZihtPjQqbiYmdi0tKXt2YXIgeD11K2gsYj1hK3Asdz1jK2QsTT1ZcCh4KngrYipiK3cqdyksVD1XZSh3Lz1NKSxOPXpwKHpwKHcpLTEpPE1wfHx6cChvLWwpPE1wPyhvK2wpLzI6UnAoYix4KSxrPXQoTixUKSxTPWtbMF0sRT1rWzFdLEE9Uy1yLEM9RS1pLHo9eSpBLV8qQzsoeip6L20+bnx8enAoKF8qQSt5KkMpL20tLjUpPi4zfHx1KmgrYSpwK2MqZDxqZCkmJihlKHIsaSxvLHUsYSxjLFMsRSxOLHgvPU0sYi89TSx3LHYsZyksZy5wb2ludChTLEUpLGUoUyxFLE4seCxiLHcscyxmLGwsaCxwLGQsdixnKSl9fXJldHVybiBmdW5jdGlvbihuKXtmdW5jdGlvbiByKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGkoKXtfPU5hTix3LnBvaW50PW8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKHIsaSl7dmFyIG89dXIoW3IsaV0pLHU9dChyLGkpO2UoXyx5LGcsbSx4LGIsXz11WzBdLHk9dVsxXSxnPXIsbT1vWzBdLHg9b1sxXSxiPW9bMl0sSGQsbiksbi5wb2ludChfLHkpfWZ1bmN0aW9uIHUoKXt3LnBvaW50PXIsbi5saW5lRW5kKCl9ZnVuY3Rpb24gYSgpe2koKSx3LnBvaW50PWMsdy5saW5lRW5kPXN9ZnVuY3Rpb24gYyh0LG4pe28oZj10LG4pLGw9XyxoPXkscD1tLGQ9eCx2PWIsdy5wb2ludD1vfWZ1bmN0aW9uIHMoKXtlKF8seSxnLG0seCxiLGwsaCxmLHAsZCx2LEhkLG4pLHcubGluZUVuZD11LHUoKX12YXIgZixsLGgscCxkLHYsZyxfLHksbSx4LGIsdz17cG9pbnQ6cixsaW5lU3RhcnQ6aSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7bi5wb2x5Z29uU3RhcnQoKSx3LmxpbmVTdGFydD1hfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCksdy5saW5lU3RhcnQ9aX19O3JldHVybiB3fX0odCxuKTpmdW5jdGlvbih0KXtyZXR1cm4gUGkoe3BvaW50OmZ1bmN0aW9uKG4sZSl7bj10KG4sZSksdGhpcy5zdHJlYW0ucG9pbnQoblswXSxuWzFdKX19KX0odCl9ZnVuY3Rpb24gSWkodCl7cmV0dXJuIFlpKGZ1bmN0aW9uKCl7cmV0dXJuIHR9KSgpfWZ1bmN0aW9uIFlpKHQpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIHQ9cyh0WzBdKkNwLHRbMV0qQ3ApLFt0WzBdKnYrdSxhLXRbMV0qdl19ZnVuY3Rpb24gZSh0LG4pe3JldHVybiB0PW8odCxuKSxbdFswXSp2K3UsYS10WzFdKnZdfWZ1bmN0aW9uIHIoKXtzPVJyKGM9cXIoeCxiLHcpLG8pO3ZhciB0PW8oeSxtKTtyZXR1cm4gdT1nLXRbMF0qdixhPV8rdFsxXSp2LGkoKX1mdW5jdGlvbiBpKCl7cmV0dXJuIHA9ZD1udWxsLG59dmFyIG8sdSxhLGMscyxmLGwsaCxwLGQsdj0xNTAsZz00ODAsXz0yNTAseT0wLG09MCx4PTAsYj0wLHc9MCxNPW51bGwsVD1zZCxOPW51bGwsaz1waSxTPS41LEU9RmkoZSxTKTtyZXR1cm4gbi5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIHAmJmQ9PT10P3A6cD1YZChmdW5jdGlvbih0KXtyZXR1cm4gUGkoe3BvaW50OmZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuLGUpO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChyWzBdLHJbMV0pfX0pfShjKShUKEUoayhkPXQpKSkpKX0sbi5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhUPXQsTT12b2lkIDAsaSgpKTpUfSxuLnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXQsTj1mPWw9aD1udWxsLGkoKSk6a30sbi5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFQ9K3Q/UXIoTT10KkNwKTooTT1udWxsLHNkKSxpKCkpOk0qQXB9LG4uY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz1udWxsPT10PyhOPWY9bD1oPW51bGwscGkpOkpyKE49K3RbMF1bMF0sZj0rdFswXVsxXSxsPSt0WzFdWzBdLGg9K3RbMV1bMV0pLGkoKSk6bnVsbD09Tj9udWxsOltbTixmXSxbbCxoXV19LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9K3QscigpKTp2fSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rdFswXSxfPSt0WzFdLHIoKSk6W2csX119LG4uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PXRbMF0lMzYwKkNwLG09dFsxXSUzNjAqQ3AscigpKTpbeSpBcCxtKkFwXX0sbi5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dFswXSUzNjAqQ3AsYj10WzFdJTM2MCpDcCx3PXQubGVuZ3RoPjI/dFsyXSUzNjAqQ3A6MCxyKCkpOlt4KkFwLGIqQXAsdypBcF19LG4ucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPUZpKGUsUz10KnQpLGkoKSk6WXAoUyl9LG4uZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHFpKG4sdCxlKX0sbi5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIERpKG4sdCxlKX0sbi5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBVaShuLHQsZSl9LG4uZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE9pKG4sdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gbz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuLmludmVydD1vLmludmVydCYmZnVuY3Rpb24odCl7cmV0dXJuKHQ9cy5pbnZlcnQoKHRbMF0tdSkvdiwoYS10WzFdKS92KSkmJlt0WzBdKkFwLHRbMV0qQXBdfSxyKCl9fWZ1bmN0aW9uIEJpKHQpe3ZhciBuPTAsZT1OcC8zLHI9WWkodCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKkNwLGU9dFsxXSpDcCk6W24qQXAsZSpBcF19LGl9ZnVuY3Rpb24gSGkodCxuKXtmdW5jdGlvbiBlKHQsbil7dmFyIGU9WXAoby0yKmkqRnAobikpL2k7cmV0dXJuW2UqRnAodCo9aSksdS1lKkxwKHQpXX12YXIgcj1GcCh0KSxpPShyK0ZwKG4pKS8yO2lmKHpwKGkpPE1wKXJldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxGcChuKS9lXX12YXIgZT1McCh0KTtyZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLFdlKG4qZSldfSxufSh0KTt2YXIgbz0xK3IqKDIqaS1yKSx1PVlwKG8pL2k7cmV0dXJuIGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9dS1uO3JldHVybltScCh0LHpwKGUpKS9pKklwKGUpLFdlKChvLSh0KnQrZSplKSppKmkpLygyKmkpKV19LGV9ZnVuY3Rpb24gamkoKXtyZXR1cm4gQmkoSGkpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gWGkoKXtyZXR1cm4gamkoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1McChuKSxpPUxwKGUpLG89dChyKmkpO3JldHVybltvKmkqRnAobiksbypGcChlKV19fWZ1bmN0aW9uICRpKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPVlwKG4qbitlKmUpLGk9dChyKSxvPUZwKGkpLHU9THAoaSk7cmV0dXJuW1JwKG4qbyxyKnUpLFdlKHImJmUqby9yKV19fWZ1bmN0aW9uIFdpKHQsbil7cmV0dXJuW3QsVXAoQnAoKGtwK24pLzIpKV19ZnVuY3Rpb24gWmkodCl7ZnVuY3Rpb24gbigpe3ZhciBuPU5wKmEoKSx1PW8oRnIoby5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIHMobnVsbD09Zj9bW3VbMF0tbix1WzFdLW5dLFt1WzBdK24sdVsxXStuXV06dD09PVdpP1tbTWF0aC5tYXgodVswXS1uLGYpLGVdLFtNYXRoLm1pbih1WzBdK24sciksaV1dOltbZixNYXRoLm1heCh1WzFdLW4sZSldLFtyLE1hdGgubWluKHVbMV0rbixpKV1dKX12YXIgZSxyLGksbz1JaSh0KSx1PW8uY2VudGVyLGE9by5zY2FsZSxjPW8udHJhbnNsYXRlLHM9by5jbGlwRXh0ZW50LGY9bnVsbDtyZXR1cm4gby5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYSh0KSxuKCkpOmEoKX0sby50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGModCksbigpKTpjKCl9LG8uY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLG4oKSk6dSgpfSxvLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/Zj1lPXI9aT1udWxsOihmPSt0WzBdWzBdLGU9K3RbMF1bMV0scj0rdFsxXVswXSxpPSt0WzFdWzFdKSxuKCkpOm51bGw9PWY/bnVsbDpbW2YsZV0sW3IsaV1dfSxuKCl9ZnVuY3Rpb24gR2kodCl7cmV0dXJuIEJwKChrcCt0KS8yKX1mdW5jdGlvbiBRaSh0LG4pe2Z1bmN0aW9uIGUodCxuKXtvPjA/bjwta3ArTXAmJihuPS1rcCtNcCk6bj5rcC1NcCYmKG49a3AtTXApO3ZhciBlPW8vT3AoR2kobiksaSk7cmV0dXJuW2UqRnAoaSp0KSxvLWUqTHAoaSp0KV19dmFyIHI9THAodCksaT10PT09bj9GcCh0KTpVcChyL0xwKG4pKS9VcChHaShuKS9HaSh0KSksbz1yKk9wKEdpKHQpLGkpL2k7cmV0dXJuIGk/KGUuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uLHI9SXAoaSkqWXAodCp0K2UqZSk7cmV0dXJuW1JwKHQsenAoZSkpL2kqSXAoZSksMipQcChPcChvL3IsMS9pKSkta3BdfSxlKTpXaX1mdW5jdGlvbiBKaSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIEtpKHQsbil7ZnVuY3Rpb24gZSh0LG4pe3ZhciBlPW8tbixyPWkqdDtyZXR1cm5bZSpGcChyKSxvLWUqTHAocildfXZhciByPUxwKHQpLGk9dD09PW4/RnAodCk6KHItTHAobikpLyhuLXQpLG89ci9pK3Q7cmV0dXJuIHpwKGkpPE1wP0ppOihlLmludmVydD1mdW5jdGlvbih0LG4pe3ZhciBlPW8tbjtyZXR1cm5bUnAodCx6cChlKSkvaSpJcChlKSxvLUlwKGkpKllwKHQqdCtlKmUpXX0sZSl9ZnVuY3Rpb24gdG8odCxuKXt2YXIgZT1McChuKSxyPUxwKHQpKmU7cmV0dXJuW2UqRnAodCkvcixGcChuKS9yXX1mdW5jdGlvbiBubyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/cGk6UGkoe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIGVvKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBybyh0LG4pe3JldHVybltMcChuKSpGcCh0KSxGcChuKV19ZnVuY3Rpb24gaW8odCxuKXt2YXIgZT1McChuKSxyPTErTHAodCkqZTtyZXR1cm5bZSpGcCh0KS9yLEZwKG4pL3JdfWZ1bmN0aW9uIG9vKHQsbil7cmV0dXJuW1VwKEJwKChrcCtuKS8yKSksLXRdfWZ1bmN0aW9uIHVvKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIGFvKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGNvKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiBzbyh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZvKHQsbil7dmFyIGUscixpLG8sdSxhPW5ldyB2byh0KSxjPSt0LnZhbHVlJiYoYS52YWx1ZT10LnZhbHVlKSxzPVthXTtmb3IobnVsbD09biYmKG49bG8pO2U9cy5wb3AoKTspaWYoYyYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKHU9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheSh1KSxvPXUtMTtvPj0wOy0tbylzLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyB2byhpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gYS5lYWNoQmVmb3JlKHBvKX1mdW5jdGlvbiBsbyh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBobyh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gcG8odCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiB2byh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1mdW5jdGlvbiBnbyh0KXtmb3IodmFyIG4sZSxyPTAsaT0odD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPXQubGVuZ3RoO3I7KWU9TWF0aC5yYW5kb20oKSpyLS18MCxuPXRbcl0sdFtyXT10W2VdLHRbZV09bjtyZXR1cm4gdH0oV2QuY2FsbCh0KSkpLmxlbmd0aCxvPVtdO3I8aTspbj10W3JdLGUmJnlvKGUsbik/KytyOihlPWZ1bmN0aW9uKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybiBmdW5jdGlvbih0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fSh0WzBdKTtjYXNlIDI6cmV0dXJuIHhvKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiBibyh0WzBdLHRbMV0sdFsyXSl9fShvPWZ1bmN0aW9uKHQsbil7dmFyIGUscjtpZihtbyhuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKF9vKG4sdFtlXSkmJm1vKHhvKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihfbyh4byh0W2VdLHRbcl0pLG4pJiZfbyh4byh0W2VdLG4pLHRbcl0pJiZfbyh4byh0W3JdLG4pLHRbZV0pJiZtbyhibyh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9KG8sbikpLHI9MCk7cmV0dXJuIGV9ZnVuY3Rpb24gX28odCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geW8odCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBtbyh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5byh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHhvKHQsbil7dmFyIGU9dC54LHI9dC55LGk9dC5yLG89bi54LHU9bi55LGE9bi5yLGM9by1lLHM9dS1yLGY9YS1pLGw9TWF0aC5zcXJ0KGMqYytzKnMpO3JldHVybnt4OihlK28rYy9sKmYpLzIseToocit1K3MvbCpmKS8yLHI6KGwraSthKS8yfX1mdW5jdGlvbiBibyh0LG4sZSl7dmFyIHI9dC54LGk9dC55LG89dC5yLHU9bi54LGE9bi55LGM9bi5yLHM9ZS54LGY9ZS55LGw9ZS5yLGg9ci11LHA9ci1zLGQ9aS1hLHY9aS1mLGc9Yy1vLF89bC1vLHk9cipyK2kqaS1vKm8sbT15LXUqdS1hKmErYypjLHg9eS1zKnMtZipmK2wqbCxiPXAqZC1oKnYsdz0oZCp4LXYqbSkvKDIqYiktcixNPSh2KmctZCpfKS9iLFQ9KHAqbS1oKngpLygyKmIpLWksTj0oaCpfLXAqZykvYixrPU0qTStOKk4tMSxTPTIqKG8rdypNK1QqTiksRT13KncrVCpULW8qbyxBPS0oaz8oUytNYXRoLnNxcnQoUypTLTQqaypFKSkvKDIqayk6RS9TKTtyZXR1cm57eDpyK3crTSpBLHk6aStUK04qQSxyOkF9fWZ1bmN0aW9uIHdvKHQsbixlKXt2YXIgcj10LngsaT10Lnksbz1uLnIrZS5yLHU9dC5yK2UucixhPW4ueC1yLGM9bi55LWkscz1hKmErYypjO2lmKHMpe3ZhciBmPS41KygodSo9dSktKG8qPW8pKS8oMipzKSxsPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyoodStzKS0odS09cykqdS1vKm8pKS8oMipzKTtlLng9citmKmErbCpjLGUueT1pK2YqYy1sKmF9ZWxzZSBlLng9cit1LGUueT1pfWZ1bmN0aW9uIE1vKHQsbil7dmFyIGU9bi54LXQueCxyPW4ueS10LnksaT10LnIrbi5yO3JldHVybiBpKmktMWUtNj5lKmUrcipyfWZ1bmN0aW9uIFRvKHQpe3ZhciBuPXQuXyxlPXQubmV4dC5fLHI9bi5yK2UucixpPShuLngqZS5yK2UueCpuLnIpL3Isbz0obi55KmUucitlLnkqbi5yKS9yO3JldHVybiBpKmkrbypvfWZ1bmN0aW9uIE5vKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBrbyh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBuLGUscixpLG8sdSxhLGMscyxmLGw7aWYobj10WzBdLG4ueD0wLG4ueT0wLCEoaT4xKSlyZXR1cm4gbi5yO2lmKGU9dFsxXSxuLng9LWUucixlLng9bi5yLGUueT0wLCEoaT4yKSlyZXR1cm4gbi5yK2Uucjt3byhlLG4scj10WzJdKSxuPW5ldyBObyhuKSxlPW5ldyBObyhlKSxyPW5ldyBObyhyKSxuLm5leHQ9ci5wcmV2aW91cz1lLGUubmV4dD1uLnByZXZpb3VzPXIsci5uZXh0PWUucHJldmlvdXM9bjt0OmZvcihhPTM7YTxpOysrYSl7d28obi5fLGUuXyxyPXRbYV0pLHI9bmV3IE5vKHIpLGM9ZS5uZXh0LHM9bi5wcmV2aW91cyxmPWUuXy5yLGw9bi5fLnI7ZG97aWYoZjw9bCl7aWYoTW8oYy5fLHIuXykpe2U9YyxuLm5leHQ9ZSxlLnByZXZpb3VzPW4sLS1hO2NvbnRpbnVlIHR9Zis9Yy5fLnIsYz1jLm5leHR9ZWxzZXtpZihNbyhzLl8sci5fKSl7KG49cykubmV4dD1lLGUucHJldmlvdXM9biwtLWE7Y29udGludWUgdH1sKz1zLl8ucixzPXMucHJldmlvdXN9fXdoaWxlKGMhPT1zLm5leHQpO2ZvcihyLnByZXZpb3VzPW4sci5uZXh0PWUsbi5uZXh0PWUucHJldmlvdXM9ZT1yLG89VG8obik7KHI9ci5uZXh0KSE9PWU7KSh1PVRvKHIpKTxvJiYobj1yLG89dSk7ZT1uLm5leHR9Zm9yKG49W2UuX10scj1lOyhyPXIubmV4dCkhPT1lOyluLnB1c2goci5fKTtmb3Iocj1nbyhuKSxhPTA7YTxpOysrYSluPXRbYV0sbi54LT1yLngsbi55LT1yLnk7cmV0dXJuIHIucn1mdW5jdGlvbiBTbyh0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24gRW8oKXtyZXR1cm4gMH1mdW5jdGlvbiBBbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQ28odCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiB6byh0KXtyZXR1cm4gZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8KG4ucj1NYXRoLm1heCgwLCt0KG4pfHwwKSl9fWZ1bmN0aW9uIFBvKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe2lmKHI9ZS5jaGlsZHJlbil7dmFyIHIsaSxvLHU9ci5sZW5ndGgsYT10KGUpKm58fDA7aWYoYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yKz1hO2lmKG89a28ociksYSlmb3IoaT0wO2k8dTsrK2kpcltpXS5yLT1hO2Uucj1vK2F9fX1mdW5jdGlvbiBSbyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bi5wYXJlbnQ7bi5yKj10LGUmJihuLng9ZS54K3Qqbi54LG4ueT1lLnkrdCpuLnkpfX1mdW5jdGlvbiBMbyh0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gcW8odCxuLGUscixpKXtmb3IodmFyIG8sdT10LmNoaWxkcmVuLGE9LTEsYz11Lmxlbmd0aCxzPXQudmFsdWUmJihyLW4pL3QudmFsdWU7KythPGM7KShvPXVbYV0pLnkwPWUsby55MT1pLG8ueDA9bixvLngxPW4rPW8udmFsdWUqc31mdW5jdGlvbiBEbyh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBVbyh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBPbyh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBGbyh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIElvKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gWW8odCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gQm8odCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gSG8odCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBqbyh0LG4sZSxyLGkpe2Zvcih2YXIgbyx1PXQuY2hpbGRyZW4sYT0tMSxjPXUubGVuZ3RoLHM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK2E8YzspKG89dVthXSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpzfWZ1bmN0aW9uIFhvKHQsbixlLHIsaSxvKXtmb3IodmFyIHUsYSxjLHMsZixsLGgscCxkLHYsZyxfPVtdLHk9bi5jaGlsZHJlbixtPTAseD0wLGI9eS5sZW5ndGgsdz1uLnZhbHVlO208Yjspe2M9aS1lLHM9by1yO2Rve2Y9eVt4KytdLnZhbHVlfXdoaWxlKCFmJiZ4PGIpO2ZvcihsPWg9ZixnPWYqZioodj1NYXRoLm1heChzL2MsYy9zKS8odyp0KSksZD1NYXRoLm1heChoL2csZy9sKTt4PGI7Kyt4KXtpZihmKz1hPXlbeF0udmFsdWUsYTxsJiYobD1hKSxhPmgmJihoPWEpLGc9ZipmKnYsKHA9TWF0aC5tYXgoaC9nLGcvbCkpPmQpe2YtPWE7YnJlYWt9ZD1wfV8ucHVzaCh1PXt2YWx1ZTpmLGRpY2U6YzxzLGNoaWxkcmVuOnkuc2xpY2UobSx4KX0pLHUuZGljZT9xbyh1LGUscixpLHc/cis9cypmL3c6byk6am8odSxlLHIsdz9lKz1jKmYvdzppLG8pLHctPWYsbT14fXJldHVybiBffWZ1bmN0aW9uIFZvKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKS0oblsxXS10WzFdKSooZVswXS10WzBdKX1mdW5jdGlvbiAkbyh0LG4pe3JldHVybiB0WzBdLW5bMF18fHRbMV0tblsxXX1mdW5jdGlvbiBXbyh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1bMCwxXSxyPTIsaT0yO2k8bjsrK2kpe2Zvcig7cj4xJiZWbyh0W2Vbci0yXV0sdFtlW3ItMV1dLHRbaV0pPD0wOyktLXI7ZVtyKytdPWl9cmV0dXJuIGUuc2xpY2UoMCxyKX1mdW5jdGlvbiBabyh0KXt0aGlzLl9zaXplPXQsdGhpcy5fY2FsbD10aGlzLl9lcnJvcj1udWxsLHRoaXMuX3Rhc2tzPVtdLHRoaXMuX2RhdGE9W10sdGhpcy5fd2FpdGluZz10aGlzLl9hY3RpdmU9dGhpcy5fZW5kZWQ9dGhpcy5fc3RhcnQ9MH1mdW5jdGlvbiBHbyh0KXtpZighdC5fc3RhcnQpdHJ5eyhmdW5jdGlvbih0KXtmb3IoO3QuX3N0YXJ0PXQuX3dhaXRpbmcmJnQuX2FjdGl2ZTx0Ll9zaXplOyl7dmFyIG49dC5fZW5kZWQrdC5fYWN0aXZlLGU9dC5fdGFza3Nbbl0scj1lLmxlbmd0aC0xLGk9ZVtyXTtlW3JdPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dC5fdGFza3Nbbl0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW25dPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1lP1FvKHQsZSk6KHQuX2RhdGFbbl09cix0Ll93YWl0aW5nP0dvKHQpOkpvKHQpKSkpfX0odCxuKSwtLXQuX3dhaXRpbmcsKyt0Ll9hY3RpdmUsZT1pLmFwcGx5KG51bGwsZSksdC5fdGFza3Nbbl0mJih0Ll90YXNrc1tuXT1lfHxldil9fSkodCl9Y2F0Y2gobil7aWYodC5fdGFza3NbdC5fZW5kZWQrdC5fYWN0aXZlLTFdKVFvKHQsbik7ZWxzZSBpZighdC5fZGF0YSl0aHJvdyBufX1mdW5jdGlvbiBRbyh0LG4pe3ZhciBlLHI9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1uLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0tcj49MDspaWYoKGU9dC5fdGFza3Nbcl0pJiYodC5fdGFza3Nbcl09bnVsbCxlLmFib3J0KSl0cnl7ZS5hYm9ydCgpfWNhdGNoKG4pe310Ll9hY3RpdmU9TmFOLEpvKHQpfWZ1bmN0aW9uIEpvKHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBuPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixuKX19ZnVuY3Rpb24gS28odCl7aWYobnVsbD09dCl0PTEvMDtlbHNlIGlmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY29uY3VycmVuY3kiKTtyZXR1cm4gbmV3IFpvKHQpfWZ1bmN0aW9uIHR1KCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9ZnVuY3Rpb24gbnUodCxuKXtmdW5jdGlvbiBlKHQpe3ZhciBuLGU9cy5zdGF0dXM7aWYoIWUmJmZ1bmN0aW9uKHQpe3ZhciBuPXQucmVzcG9uc2VUeXBlO3JldHVybiBuJiYidGV4dCIhPT1uP3QucmVzcG9uc2U6dC5yZXNwb25zZVRleHR9KHMpfHxlPj0yMDAmJmU8MzAwfHwzMDQ9PT1lKXtpZihvKXRyeXtuPW8uY2FsbChyLHMpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLHIsdCl9ZWxzZSBuPXM7YS5jYWxsKCJsb2FkIixyLG4pfWVsc2UgYS5jYWxsKCJlcnJvciIscix0KX12YXIgcixpLG8sdSxhPU4oImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGM9c2UoKSxzPW5ldyBYTUxIdHRwUmVxdWVzdCxmPW51bGwsbD1udWxsLGg9MDtpZigidW5kZWZpbmVkIj09dHlwZW9mIFhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIHN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3QodCl8fChzPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBzP3Mub25sb2FkPXMub25lcnJvcj1zLm9udGltZW91dD1lOnMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKHQpe3MucmVhZHlTdGF0ZT4zJiZlKHQpfSxzLm9ucHJvZ3Jlc3M9ZnVuY3Rpb24odCl7YS5jYWxsKCJwcm9ncmVzcyIscix0KX0scj17aGVhZGVyOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQ9KHQrIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2MuZ2V0KHQpOihudWxsPT1uP2MucmVtb3ZlKHQpOmMuc2V0KHQsbisiIikscil9LG1pbWVUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDp0KyIiLHIpOml9LHJlc3BvbnNlVHlwZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LHIpOnV9LHRpbWVvdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3Qscik6aH0sdXNlcjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP2Y6KGY9bnVsbD09dD9udWxsOnQrIiIscil9LHBhc3N3b3JkOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/bDoobD1udWxsPT10P251bGw6dCsiIixyKX0scmVzcG9uc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG89dCxyfSxnZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJHRVQiLHQsbil9LHBvc3Q6ZnVuY3Rpb24odCxuKXtyZXR1cm4gci5zZW5kKCJQT1NUIix0LG4pfSxzZW5kOmZ1bmN0aW9uKG4sZSxvKXtyZXR1cm4gcy5vcGVuKG4sdCwhMCxmLGwpLG51bGw9PWl8fGMuaGFzKCJhY2NlcHQiKXx8Yy5zZXQoImFjY2VwdCIsaSsiLCovKiIpLHMuc2V0UmVxdWVzdEhlYWRlciYmYy5lYWNoKGZ1bmN0aW9uKHQsbil7cy5zZXRSZXF1ZXN0SGVhZGVyKG4sdCl9KSxudWxsIT1pJiZzLm92ZXJyaWRlTWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZShpKSxudWxsIT11JiYocy5yZXNwb25zZVR5cGU9dSksaD4wJiYocy50aW1lb3V0PWgpLG51bGw9PW8mJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYobz1lLGU9bnVsbCksbnVsbCE9byYmMT09PW8ubGVuZ3RoJiYobz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt0KG51bGw9PW4/ZTpudWxsKX19KG8pKSxudWxsIT1vJiZyLm9uKCJlcnJvciIsbykub24oImxvYWQiLGZ1bmN0aW9uKHQpe28obnVsbCx0KX0pLGEuY2FsbCgiYmVmb3Jlc2VuZCIscixzKSxzLnNlbmQobnVsbD09ZT9udWxsOmUpLHJ9LGFib3J0OmZ1bmN0aW9uKCl7cmV0dXJuIHMuYWJvcnQoKSxyfSxvbjpmdW5jdGlvbigpe3ZhciB0PWEub24uYXBwbHkoYSxhcmd1bWVudHMpO3JldHVybiB0PT09YT9yOnR9fSxudWxsIT1uKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7cmV0dXJuIHIuZ2V0KG4pfXJldHVybiByfWZ1bmN0aW9uIGV1KHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUscil7dmFyIGk9bnUoZSkubWltZVR5cGUodCkucmVzcG9uc2Uobik7aWYobnVsbCE9cil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHIpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK3IpO3JldHVybiBpLmdldChyKX1yZXR1cm4gaX19ZnVuY3Rpb24gcnUodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSxyLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9cixyPW51bGwpO3ZhciBvPW51KGUpLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUucmVzcG9uc2VUZXh0LG4pfX0obixyPXQpKTpyfSxvLnJvdyhyKSxpP28uZ2V0KGkpOm99fWZ1bmN0aW9uIGl1KHQpe2Z1bmN0aW9uIG4obil7dmFyIG89bisiIix1PWUuZ2V0KG8pO2lmKCF1KXtpZihpIT09eXYpcmV0dXJuIGk7ZS5zZXQobyx1PXIucHVzaChuKSl9cmV0dXJuIHRbKHUtMSkldC5sZW5ndGhdfXZhciBlPXNlKCkscj1bXSxpPXl2O3JldHVybiB0PW51bGw9PXQ/W106X3YuY2FsbCh0KSxuLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gci5zbGljZSgpO3I9W10sZT1zZSgpO2Zvcih2YXIgaSxvLHU9LTEsYT10Lmxlbmd0aDsrK3U8YTspZS5oYXMobz0oaT10W3VdKSsiIil8fGUuc2V0KG8sci5wdXNoKGkpKTtyZXR1cm4gbn0sbi5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1fdi5jYWxsKGUpLG4pOnQuc2xpY2UoKX0sbi51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbik6aX0sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGl1KCkuZG9tYWluKHIpLnJhbmdlKHQpLnVua25vd24oaSl9LG59ZnVuY3Rpb24gb3UoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9aSgpLmxlbmd0aCxyPXVbMV08dVswXSxoPXVbci0wXSxwPXVbMS1yXTtuPShwLWgpL01hdGgubWF4KDEsdC1jKzIqcyksYSYmKG49TWF0aC5mbG9vcihuKSksaCs9KHAtaC1uKih0LWMpKSpsLGU9biooMS1jKSxhJiYoaD1NYXRoLnJvdW5kKGgpLGU9TWF0aC5yb3VuZChlKSk7dmFyIGQ9Zih0KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGgrbip0fSk7cmV0dXJuIG8ocj9kLnJldmVyc2UoKTpkKX12YXIgbixlLHI9aXUoKS51bmtub3duKHZvaWQgMCksaT1yLmRvbWFpbixvPXIucmFuZ2UsdT1bMCwxXSxhPSExLGM9MCxzPTAsbD0uNTtyZXR1cm4gZGVsZXRlIHIudW5rbm93bixyLmRvbWFpbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaShuKSx0KCkpOmkoKX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1bK25bMF0sK25bMV1dLHQoKSk6dS5zbGljZSgpfSxyLnJhbmdlUm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIHU9WytuWzBdLCtuWzFdXSxhPSEwLHQoKX0sci5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gZX0sci5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHIucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISFuLHQoKSk6YX0sci5wYWRkaW5nPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPXM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLG4pKSx0KCkpOmN9LHIucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSxuKSksdCgpKTpjfSxyLnBhZGRpbmdPdXRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6c30sci5hbGlnbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1NYXRoLm1heCgwLE1hdGgubWluKDEsbikpLHQoKSk6bH0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIG91KCkuZG9tYWluKGkoKSkucmFuZ2UodSkucm91bmQoYSkucGFkZGluZ0lubmVyKGMpLnBhZGRpbmdPdXRlcihzKS5hbGlnbihsKX0sdCgpfWZ1bmN0aW9uIHV1KHQpe3ZhciBuPXQuY29weTtyZXR1cm4gdC5wYWRkaW5nPXQucGFkZGluZ091dGVyLGRlbGV0ZSB0LnBhZGRpbmdJbm5lcixkZWxldGUgdC5wYWRkaW5nT3V0ZXIsdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KG4oKSl9LHR9ZnVuY3Rpb24gYXUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGN1KHQpe3JldHVybit0fWZ1bmN0aW9uIHN1KHQsbil7cmV0dXJuKG4tPXQ9K3QpP2Z1bmN0aW9uKGUpe3JldHVybihlLXQpL259OmF1KG4pfWZ1bmN0aW9uIGZ1KHQsbixlLHIpe3ZhciBpPXRbMF0sbz10WzFdLHU9blswXSxhPW5bMV07cmV0dXJuIG88aT8oaT1lKG8saSksdT1yKGEsdSkpOihpPWUoaSxvKSx1PXIodSxhKSksZnVuY3Rpb24odCl7cmV0dXJuIHUoaSh0KSl9fWZ1bmN0aW9uIGx1KHQsbixlLHIpe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLG4ubGVuZ3RoKS0xLG89bmV3IEFycmF5KGkpLHU9bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxuPW4uc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylvW2FdPWUodFthXSx0W2ErMV0pLHVbYV09cihuW2FdLG5bYSsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlPU9zKHQsbiwxLGkpLTE7cmV0dXJuIHVbZV0ob1tlXShuKSl9fWZ1bmN0aW9uIGh1KHQsbil7cmV0dXJuIG4uZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIHB1KHQsbil7ZnVuY3Rpb24gZSgpe3JldHVybiBpPU1hdGgubWluKGEubGVuZ3RoLGMubGVuZ3RoKT4yP2x1OmZ1LG89dT1udWxsLHJ9ZnVuY3Rpb24gcihuKXtyZXR1cm4ob3x8KG89aShhLGMsZj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KG49K24sZT0rZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1uPzA6dD49ZT8xOnIodCl9fX0odCk6dCxzKSkpKCtuKX12YXIgaSxvLHUsYT1tdixjPW12LHM9Zm4sZj0hMTtyZXR1cm4gci5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuKHV8fCh1PWkoYyxhLHN1LGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9MD9uOnQ+PTE/ZTpyKHQpfX19KG4pOm4pKSkoK3QpfSxyLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1ndi5jYWxsKHQsY3UpLGUoKSk6YS5zbGljZSgpfSxyLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPV92LmNhbGwodCksZSgpKTpjLnNsaWNlKCl9LHIucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYz1fdi5jYWxsKHQpLHM9bG4sZSgpfSxyLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSEhdCxlKCkpOmZ9LHIuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9dCxlKCkpOnN9LGUoKX1mdW5jdGlvbiBkdShuKXt2YXIgZT1uLmRvbWFpbjtyZXR1cm4gbi50aWNrcz1mdW5jdGlvbih0KXt2YXIgbj1lKCk7cmV0dXJuIGwoblswXSxuW24ubGVuZ3RoLTFdLG51bGw9PXQ/MTA6dCl9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihuLHIpe3JldHVybiBmdW5jdGlvbihuLGUscil7dmFyIGksbz1uWzBdLHU9bltuLmxlbmd0aC0xXSxhPXAobyx1LG51bGw9PWU/MTA6ZSk7c3dpdGNoKChyPURlKG51bGw9PXI/IixmIjpyKSkudHlwZSl7Y2FzZSJzIjp2YXIgYz1NYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyh1KSk7cmV0dXJuIG51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPUJlKGEsYykpfHwoci5wcmVjaXNpb249aSksdC5mb3JtYXRQcmVmaXgocixjKTtjYXNlIiI6Y2FzZSJlIjpjYXNlImciOmNhc2UicCI6Y2FzZSJyIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1IZShhLE1hdGgubWF4KE1hdGguYWJzKG8pLE1hdGguYWJzKHUpKSkpfHwoci5wcmVjaXNpb249aS0oImUiPT09ci50eXBlKSk7YnJlYWs7Y2FzZSJmIjpjYXNlIiUiOm51bGwhPXIucHJlY2lzaW9ufHxpc05hTihpPVllKGEpKXx8KHIucHJlY2lzaW9uPWktMiooIiUiPT09ci50eXBlKSl9cmV0dXJuIHQuZm9ybWF0KHIpfShlKCksbixyKX0sbi5uaWNlPWZ1bmN0aW9uKHQpe251bGw9PXQmJih0PTEwKTt2YXIgcixpPWUoKSxvPTAsdT1pLmxlbmd0aC0xLGE9aVtvXSxjPWlbdV07cmV0dXJuIGM8YSYmKHI9YSxhPWMsYz1yLHI9byxvPXUsdT1yKSwocj1oKGEsYyx0KSk+MD9yPWgoYT1NYXRoLmZsb29yKGEvcikqcixjPU1hdGguY2VpbChjL3IpKnIsdCk6cjwwJiYocj1oKGE9TWF0aC5jZWlsKGEqcikvcixjPU1hdGguZmxvb3IoYypyKS9yLHQpKSxyPjA/KGlbb109TWF0aC5mbG9vcihhL3IpKnIsaVt1XT1NYXRoLmNlaWwoYy9yKSpyLGUoaSkpOnI8MCYmKGlbb109TWF0aC5jZWlsKGEqcikvcixpW3VdPU1hdGguZmxvb3IoYypyKS9yLGUoaSkpLG59LG59ZnVuY3Rpb24gdnUoKXt2YXIgdD1wdShzdSxhbik7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBodSh0LHZ1KCkpfSxkdSh0KX1mdW5jdGlvbiBndSgpe2Z1bmN0aW9uIHQodCl7cmV0dXJuK3R9dmFyIG49WzAsMV07cmV0dXJuIHQuaW52ZXJ0PXQsdC5kb21haW49dC5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1ndi5jYWxsKGUsY3UpLHQpOm4uc2xpY2UoKX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGd1KCkuZG9tYWluKG4pfSxkdSh0KX1mdW5jdGlvbiBfdSh0LG4pe3ZhciBlLHI9MCxpPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W3JdLHU9dFtpXTtyZXR1cm4gdTxvJiYoZT1yLHI9aSxpPWUsZT1vLG89dSx1PWUpLHRbcl09bi5mbG9vcihvKSx0W2ldPW4uY2VpbCh1KSx0fWZ1bmN0aW9uIHl1KHQsbil7cmV0dXJuKG49TWF0aC5sb2cobi90KSk/ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUvdCkvbn06YXUobil9ZnVuY3Rpb24gbXUodCxuKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKGUpe3JldHVybi1NYXRoLnBvdygtbixlKSpNYXRoLnBvdygtdCwxLWUpfTpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3cobixlKSpNYXRoLnBvdyh0LDEtZSl9fWZ1bmN0aW9uIHh1KHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBidSh0KXtyZXR1cm4gMTA9PT10P3h1OnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgucG93KHQsbil9fWZ1bmN0aW9uIHd1KHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4pL3R9KX1mdW5jdGlvbiBNdSh0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuLXQoLW4pfX1mdW5jdGlvbiBUdSgpe2Z1bmN0aW9uIG4oKXtyZXR1cm4gbz13dShpKSx1PWJ1KGkpLHIoKVswXTwwJiYobz1NdShvKSx1PU11KHUpKSxlfXZhciBlPXB1KHl1LG11KS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz13dSgxMCksdT1idSgxMCk7cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxuKCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLG4oKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLGE9ZVswXSxjPWVbZS5sZW5ndGgtMV07KG49YzxhKSYmKHA9YSxhPWMsYz1wKTt2YXIgcyxmLGgscD1vKGEpLGQ9byhjKSx2PW51bGw9PXQ/MTA6K3QsZz1bXTtpZighKGklMSkmJmQtcDx2KXtpZihwPU1hdGgucm91bmQocCktMSxkPU1hdGgucm91bmQoZCkrMSxhPjApe2Zvcig7cDxkOysrcClmb3IoZj0xLHM9dShwKTtmPGk7KytmKWlmKCEoKGg9cypmKTxhKSl7aWYoaD5jKWJyZWFrO2cucHVzaChoKX19ZWxzZSBmb3IoO3A8ZDsrK3ApZm9yKGY9aS0xLHM9dShwKTtmPj0xOy0tZilpZighKChoPXMqZik8YSkpe2lmKGg+YylicmVhaztnLnB1c2goaCl9fWVsc2UgZz1sKHAsZCxNYXRoLm1pbihkLXAsdikpLm1hcCh1KTtyZXR1cm4gbj9nLnJldmVyc2UoKTpnfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciBhPU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L3UoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9YT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIoX3UocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gdShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KGUsVHUoKS5iYXNlKGkpKX0sZX1mdW5jdGlvbiBOdSh0LG4pe3JldHVybiB0PDA/LU1hdGgucG93KC10LG4pOk1hdGgucG93KHQsbil9ZnVuY3Rpb24ga3UoKXt2YXIgdD0xLG49cHUoZnVuY3Rpb24obixlKXtyZXR1cm4oZT1OdShlLHQpLShuPU51KG4sdCkpKT9mdW5jdGlvbihyKXtyZXR1cm4oTnUocix0KS1uKS9lfTphdShlKX0sZnVuY3Rpb24obixlKXtyZXR1cm4gZT1OdShlLHQpLShuPU51KG4sdCkpLGZ1bmN0aW9uKHIpe3JldHVybiBOdShuK2UqciwxL3QpfX0pLGU9bi5kb21haW47cmV0dXJuIG4uZXhwb25lbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K24sZShlKCkpKTp0fSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gaHUobixrdSgpLmV4cG9uZW50KHQpKX0sZHUobil9ZnVuY3Rpb24gU3UoKXtmdW5jdGlvbiB0KCl7dmFyIHQ9MCxuPU1hdGgubWF4KDEsaS5sZW5ndGgpO2ZvcihvPW5ldyBBcnJheShuLTEpOysrdDxuOylvW3QtMV09dihyLHQvbik7cmV0dXJuIGV9ZnVuY3Rpb24gZSh0KXtpZighaXNOYU4odD0rdCkpcmV0dXJuIGlbT3Mobyx0KV19dmFyIHI9W10saT1bXSxvPVtdO3JldHVybiBlLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgbj1pLmluZGV4T2YodCk7cmV0dXJuIG48MD9bTmFOLE5hTl06W24+MD9vW24tMV06clswXSxuPG8ubGVuZ3RoP29bbl06cltyLmxlbmd0aC0xXV19LGUuZG9tYWluPWZ1bmN0aW9uKGUpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByLnNsaWNlKCk7cj1bXTtmb3IodmFyIGksbz0wLHU9ZS5sZW5ndGg7bzx1OysrbyludWxsPT0oaT1lW29dKXx8aXNOYU4oaT0raSl8fHIucHVzaChpKTtyZXR1cm4gci5zb3J0KG4pLHQoKX0sZS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1fdi5jYWxsKG4pLHQoKSk6aS5zbGljZSgpfSxlLnF1YW50aWxlcz1mdW5jdGlvbigpe3JldHVybiBvLnNsaWNlKCl9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiBTdSgpLmRvbWFpbihyKS5yYW5nZShpKX0sZX1mdW5jdGlvbiBFdSgpe2Z1bmN0aW9uIHQodCl7aWYodDw9dClyZXR1cm4gdVtPcyhvLHQsMCxpKV19ZnVuY3Rpb24gbigpe3ZhciBuPS0xO2ZvcihvPW5ldyBBcnJheShpKTsrK248aTspb1tuXT0oKG4rMSkqci0obi1pKSplKS8oaSsxKTtyZXR1cm4gdH12YXIgZT0wLHI9MSxpPTEsbz1bLjVdLHU9WzAsMV07cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0sbigpKTpbZSxyXX0sdC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0odT1fdi5jYWxsKHQpKS5sZW5ndGgtMSxuKCkpOnUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIG49dS5pbmRleE9mKHQpO3JldHVybiBuPDA/W05hTixOYU5dOm48MT9bZSxvWzBdXTpuPj1pP1tvW2ktMV0scl06W29bbi0xXSxvW25dXX0sdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEV1KCkuZG9tYWluKFtlLHJdKS5yYW5nZSh1KX0sZHUodCl9ZnVuY3Rpb24gQXUoKXtmdW5jdGlvbiB0KHQpe2lmKHQ8PXQpcmV0dXJuIGVbT3Mobix0LDAscildfXZhciBuPVsuNV0sZT1bMCwxXSxyPTE7cmV0dXJuIHQuZG9tYWluPWZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPV92LmNhbGwoaSkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSx0KTpuLnNsaWNlKCl9LHQucmFuZ2U9ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9X3YuY2FsbChpKSxyPU1hdGgubWluKG4ubGVuZ3RoLGUubGVuZ3RoLTEpLHQpOmUuc2xpY2UoKX0sdC5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9ZS5pbmRleE9mKHQpO3JldHVybltuW3ItMV0sbltyXV19LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBBdSgpLmRvbWFpbihuKS5yYW5nZShlKX0sdH1mdW5jdGlvbiBDdSh0LG4sZSxyKXtmdW5jdGlvbiBpKG4pe3JldHVybiB0KG49bmV3IERhdGUoK24pKSxufXJldHVybiBpLmZsb29yPWksaS5jZWlsPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoZS0xKSksbihlLDEpLHQoZSksZX0saS5yb3VuZD1mdW5jdGlvbih0KXt2YXIgbj1pKHQpLGU9aS5jZWlsKHQpO3JldHVybiB0LW48ZS10P246ZX0saS5vZmZzZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbih0PW5ldyBEYXRlKCt0KSxudWxsPT1lPzE6TWF0aC5mbG9vcihlKSksdH0saS5yYW5nZT1mdW5jdGlvbihlLHIsbyl7dmFyIHUsYT1bXTtpZihlPWkuY2VpbChlKSxvPW51bGw9PW8/MTpNYXRoLmZsb29yKG8pLCEoZTxyJiZvPjApKXJldHVybiBhO2Rve2EucHVzaCh1PW5ldyBEYXRlKCtlKSksbihlLG8pLHQoZSl9d2hpbGUodTxlJiZlPHIpO3JldHVybiBhfSxpLmZpbHRlcj1mdW5jdGlvbihlKXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7aWYobj49bilmb3IoO3QobiksIWUobik7KW4uc2V0VGltZShuLTEpfSxmdW5jdGlvbih0LHIpe2lmKHQ+PXQpaWYocjwwKWZvcig7KytyPD0wOylmb3IoO24odCwtMSksIWUodCk7KTtlbHNlIGZvcig7LS1yPj0wOylmb3IoO24odCwxKSwhZSh0KTspO30pfSxlJiYoaS5jb3VudD1mdW5jdGlvbihuLHIpe3JldHVybiB4di5zZXRUaW1lKCtuKSxidi5zZXRUaW1lKCtyKSx0KHh2KSx0KGJ2KSxNYXRoLmZsb29yKGUoeHYsYnYpKX0saS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2kuZmlsdGVyKHI/ZnVuY3Rpb24obil7cmV0dXJuIHIobikldD09MH06ZnVuY3Rpb24obil7cmV0dXJuIGkuY291bnQoMCxuKSV0PT0wfSk6aTpudWxsfSksaX1mdW5jdGlvbiB6dSh0KXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpUdikvTnZ9KX1mdW5jdGlvbiBQdSh0KXtyZXR1cm4gQ3UoZnVuY3Rpb24obil7bi5zZXRVVENEYXRlKG4uZ2V0VVRDRGF0ZSgpLShuLmdldFVUQ0RheSgpKzctdCklNyksbi5zZXRVVENIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9Odn0pfWZ1bmN0aW9uIFJ1KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBuLnNldEZ1bGxZZWFyKHQueSksbn1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBMdSh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBuPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIG4uc2V0VVRDRnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBxdSh0KXtyZXR1cm57eTp0LG06MCxkOjEsSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBEdSh0KXtmdW5jdGlvbiBuKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByLGksbyx1PVtdLGE9LTEsYz0wLHM9dC5sZW5ndGg7Zm9yKGUgaW5zdGFuY2VvZiBEYXRlfHwoZT1uZXcgRGF0ZSgrZSkpOysrYTxzOykzNz09PXQuY2hhckNvZGVBdChhKSYmKHUucHVzaCh0LnNsaWNlKGMsYSkpLG51bGwhPShpPU1nW3I9dC5jaGFyQXQoKythKV0pP3I9dC5jaGFyQXQoKythKTppPSJlIj09PXI/IiAiOiIwIiwobz1uW3JdKSYmKHI9byhlLGkpKSx1LnB1c2gociksYz1hKzEpO3JldHVybiB1LnB1c2godC5zbGljZShjLGEpKSx1LmpvaW4oIiIpfX1mdW5jdGlvbiBlKHQsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpLG8sdT1xdSgxOTAwKTtpZihyKHUsdCxlKz0iIiwwKSE9ZS5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gdSlyZXR1cm4gbmV3IERhdGUodS5RKTtpZigicCJpbiB1JiYodS5IPXUuSCUxMisxMip1LnApLCJWImluIHUpe2lmKHUuVjwxfHx1LlY+NTMpcmV0dXJuIG51bGw7InciaW4gdXx8KHUudz0xKSwiWiJpbiB1PyhpPShvPShpPUx1KHF1KHUueSkpKS5nZXRVVENEYXkoKSk+NHx8MD09PW8/b2cuY2VpbChpKTpvZyhpKSxpPWVnLm9mZnNldChpLDcqKHUuVi0xKSksdS55PWkuZ2V0VVRDRnVsbFllYXIoKSx1Lm09aS5nZXRVVENNb250aCgpLHUuZD1pLmdldFVUQ0RhdGUoKSsodS53KzYpJTcpOihpPShvPShpPW4ocXUodS55KSkpLmdldERheSgpKT40fHwwPT09bz9xdi5jZWlsKGkpOnF2KGkpLGk9UHYub2Zmc2V0KGksNyoodS5WLTEpKSx1Lnk9aS5nZXRGdWxsWWVhcigpLHUubT1pLmdldE1vbnRoKCksdS5kPWkuZ2V0RGF0ZSgpKyh1LncrNiklNyl9ZWxzZSgiVyJpbiB1fHwiVSJpbiB1KSYmKCJ3ImluIHV8fCh1Lnc9InUiaW4gdT91LnUlNzoiVyJpbiB1PzE6MCksbz0iWiJpbiB1P0x1KHF1KHUueSkpLmdldFVUQ0RheSgpOm4ocXUodS55KSkuZ2V0RGF5KCksdS5tPTAsdS5kPSJXImluIHU/KHUudys2KSU3KzcqdS5XLShvKzUpJTc6dS53KzcqdS5VLShvKzYpJTcpO3JldHVybiJaImluIHU/KHUuSCs9dS5aLzEwMHwwLHUuTSs9dS5aJTEwMCxMdSh1KSk6bih1KX19ZnVuY3Rpb24gcih0LG4sZSxyKXtmb3IodmFyIGksbyx1PTAsYT1uLmxlbmd0aCxjPWUubGVuZ3RoO3U8YTspe2lmKHI+PWMpcmV0dXJuLTE7aWYoMzc9PT0oaT1uLmNoYXJDb2RlQXQodSsrKSkpe2lmKGk9bi5jaGFyQXQodSsrKSwhKG89VFtpIGluIE1nP24uY2hhckF0KHUrKyk6aV0pfHwocj1vKHQsZSxyKSk8MClyZXR1cm4tMX1lbHNlIGlmKGkhPWUuY2hhckNvZGVBdChyKyspKXJldHVybi0xfXJldHVybiByfXZhciBpPXQuZGF0ZVRpbWUsbz10LmRhdGUsdT10LnRpbWUsYT10LnBlcmlvZHMsYz10LmRheXMscz10LnNob3J0RGF5cyxmPXQubW9udGhzLGw9dC5zaG9ydE1vbnRocyxoPUZ1KGEpLHA9SXUoYSksZD1GdShjKSx2PUl1KGMpLGc9RnUocyksXz1JdShzKSx5PUZ1KGYpLG09SXUoZikseD1GdShsKSxiPUl1KGwpLHc9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIHNbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIGNbdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGxbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gZlt0LmdldE1vbnRoKCldfSxjOm51bGwsZDp1YSxlOnVhLGY6bGEsSDphYSxJOmNhLGo6c2EsTDpmYSxtOmhhLE06cGEscDpmdW5jdGlvbih0KXtyZXR1cm4gYVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpZYSxzOkJhLFM6ZGEsdTp2YSxVOmdhLFY6X2Esdzp5YSxXOm1hLHg6bnVsbCxYOm51bGwseTp4YSxZOmJhLFo6d2EsIiUiOklhfSxNPXthOmZ1bmN0aW9uKHQpe3JldHVybiBzW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBjW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6TWEsZTpNYSxmOkVhLEg6VGEsSTpOYSxqOmthLEw6U2EsbTpBYSxNOkNhLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGFbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6WWEsczpCYSxTOnphLHU6UGEsVTpSYSxWOkxhLHc6cWEsVzpEYSx4Om51bGwsWDpudWxsLHk6VWEsWTpPYSxaOkZhLCIlIjpJYX0sVD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Zy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9X1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1kLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz12W3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXguZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPWJbclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9eS5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09bVtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gcih0LGksbixlKX0sZDpHdSxlOkd1LGY6ZWEsSDpKdSxJOkp1LGo6UXUsTDpuYSxtOlp1LE06S3UscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9aC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmlhLHM6b2EsUzp0YSx1OkJ1LFU6SHUsVjpqdSx3Oll1LFc6WHUseDpmdW5jdGlvbih0LG4sZSl7cmV0dXJuIHIodCxvLG4sZSl9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiByKHQsdSxuLGUpfSx5OiR1LFk6VnUsWjpXdSwiJSI6cmF9O3JldHVybiB3Lng9bihvLHcpLHcuWD1uKHUsdyksdy5jPW4oaSx3KSxNLng9bihvLE0pLE0uWD1uKHUsTSksTS5jPW4oaSxNKSx7Zm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsdyk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0scGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0Kz0iIixSdSk7cmV0dXJuIG4udG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbn0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPW4odCs9IiIsTSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIG49ZSh0LEx1KTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufX19ZnVuY3Rpb24gVXUodCxuLGUpe3ZhciByPXQ8MD8iLSI6IiIsaT0ocj8tdDp0KSsiIixvPWkubGVuZ3RoO3JldHVybiByKyhvPGU/bmV3IEFycmF5KGUtbysxKS5qb2luKG4pK2k6aSl9ZnVuY3Rpb24gT3UodCl7cmV0dXJuIHQucmVwbGFjZShrZywiXFwkJiIpfWZ1bmN0aW9uIEZ1KHQpe3JldHVybiBuZXcgUmVnRXhwKCJeKD86Iit0Lm1hcChPdSkuam9pbigifCIpKyIpIiwiaSIpfWZ1bmN0aW9uIEl1KHQpe2Zvcih2YXIgbj17fSxlPS0xLHI9dC5sZW5ndGg7KytlPHI7KW5bdFtlXS50b0xvd2VyQ2FzZSgpXT1lO3JldHVybiBufWZ1bmN0aW9uIFl1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC53PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj8odC51PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEh1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5VPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGp1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5WPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFh1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFZ1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8odC55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uICR1KHQsbixlKXt2YXIgcj1UZy5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC55PStyWzBdKygrclswXT42OD8xOTAwOjJlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gV3UodCxuLGUpe3ZhciByPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5aPXJbMV0/MDotKHJbMl0rKHJbM118fCIwMCIpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBadSh0LG4sZSl7dmFyIHI9VGcuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQubT1yWzBdLTEsZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gR3UodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUXUodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lm09MCx0LmQ9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSnUodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lkg9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gS3UodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lk09K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdGEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0LlM9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbmEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrMykpO3JldHVybiByPyh0Lkw9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZWEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlLGUrNikpO3JldHVybiByPyh0Lkw9TWF0aC5mbG9vcihyWzBdLzFlMyksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcmEodCxuLGUpe3ZhciByPU5nLmV4ZWMobi5zbGljZShlLGUrMSkpO3JldHVybiByP2UrclswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gaWEodCxuLGUpe3ZhciByPVRnLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBvYSh0LG4sZSl7dmFyIHI9VGcuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5RPTFlMyorclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB1YSh0LG4pe3JldHVybiBVdSh0LmdldERhdGUoKSxuLDIpfWZ1bmN0aW9uIGFhKHQsbil7cmV0dXJuIFV1KHQuZ2V0SG91cnMoKSxuLDIpfWZ1bmN0aW9uIGNhKHQsbil7cmV0dXJuIFV1KHQuZ2V0SG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBzYSh0LG4pe3JldHVybiBVdSgxK1B2LmNvdW50KEd2KHQpLHQpLG4sMyl9ZnVuY3Rpb24gZmEodCxuKXtyZXR1cm4gVXUodC5nZXRNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIGxhKHQsbil7cmV0dXJuIGZhKHQsbikrIjAwMCJ9ZnVuY3Rpb24gaGEodCxuKXtyZXR1cm4gVXUodC5nZXRNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBwYSh0LG4pe3JldHVybiBVdSh0LmdldE1pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIGRhKHQsbil7cmV0dXJuIFV1KHQuZ2V0U2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gdmEodCl7dmFyIG49dC5nZXREYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIGdhKHQsbil7cmV0dXJuIFV1KEx2LmNvdW50KEd2KHQpLHQpLG4sMil9ZnVuY3Rpb24gX2EodCxuKXt2YXIgZT10LmdldERheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP092KHQpOk92LmNlaWwodCksVXUoT3YuY291bnQoR3YodCksdCkrKDQ9PT1Hdih0KS5nZXREYXkoKSksbiwyKX1mdW5jdGlvbiB5YSh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBtYSh0LG4pe3JldHVybiBVdShxdi5jb3VudChHdih0KSx0KSxuLDIpfWZ1bmN0aW9uIHhhKHQsbil7cmV0dXJuIFV1KHQuZ2V0RnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBiYSh0LG4pe3JldHVybiBVdSh0LmdldEZ1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gd2EodCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihuPjA/Ii0iOihuKj0tMSwiKyIpKStVdShuLzYwfDAsIjAiLDIpK1V1KG4lNjAsIjAiLDIpfWZ1bmN0aW9uIE1hKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDRGF0ZSgpLG4sMil9ZnVuY3Rpb24gVGEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENIb3VycygpLG4sMil9ZnVuY3Rpb24gTmEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENIb3VycygpJTEyfHwxMixuLDIpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIFV1KDErZWcuY291bnQoeGcodCksdCksbiwzKX1mdW5jdGlvbiBTYSh0LG4pe3JldHVybiBVdSh0LmdldFVUQ01pbGxpc2Vjb25kcygpLG4sMyl9ZnVuY3Rpb24gRWEodCxuKXtyZXR1cm4gU2EodCxuKSsiMDAwIn1mdW5jdGlvbiBBYSh0LG4pe3JldHVybiBVdSh0LmdldFVUQ01vbnRoKCkrMSxuLDIpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDTWludXRlcygpLG4sMil9ZnVuY3Rpb24gemEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENTZWNvbmRzKCksbiwyKX1mdW5jdGlvbiBQYSh0KXt2YXIgbj10LmdldFVUQ0RheSgpO3JldHVybiAwPT09bj83Om59ZnVuY3Rpb24gUmEodCxuKXtyZXR1cm4gVXUoaWcuY291bnQoeGcodCksdCksbiwyKX1mdW5jdGlvbiBMYSh0LG4pe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIHQ9ZT49NHx8MD09PWU/Y2codCk6Y2cuY2VpbCh0KSxVdShjZy5jb3VudCh4Zyh0KSx0KSsoND09PXhnKHQpLmdldFVUQ0RheSgpKSxuLDIpfWZ1bmN0aW9uIHFhKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIERhKHQsbil7cmV0dXJuIFV1KG9nLmNvdW50KHhnKHQpLHQpLG4sMil9ZnVuY3Rpb24gVWEodCxuKXtyZXR1cm4gVXUodC5nZXRVVENGdWxsWWVhcigpJTEwMCxuLDIpfWZ1bmN0aW9uIE9hKHQsbil7cmV0dXJuIFV1KHQuZ2V0VVRDRnVsbFllYXIoKSUxZTQsbiw0KX1mdW5jdGlvbiBGYSgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24gSWEoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gWWEodCl7cmV0dXJuK3R9ZnVuY3Rpb24gQmEodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiBIYShuKXtyZXR1cm4gYmc9RHUobiksdC50aW1lRm9ybWF0PWJnLmZvcm1hdCx0LnRpbWVQYXJzZT1iZy5wYXJzZSx0LnV0Y0Zvcm1hdD1iZy51dGNGb3JtYXQsdC51dGNQYXJzZT1iZy51dGNQYXJzZSxiZ31mdW5jdGlvbiBqYSh0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gWGEodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gVmEodCxuLHIsaSxvLHUsYSxjLHMpe2Z1bmN0aW9uIGYoZSl7cmV0dXJuKGEoZSk8ZT9nOnUoZSk8ZT9fOm8oZSk8ZT95OmkoZSk8ZT9tOm4oZSk8ZT9yKGUpPGU/eDpiOnQoZSk8ZT93Ok0pKGUpfWZ1bmN0aW9uIGwobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIHU9TWF0aC5hYnMoaS1yKS9uLGE9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KFQsdSk7YT09PVQubGVuZ3RoPyhvPXAoci9EZyxpL0RnLG4pLG49dCk6YT8obz0oYT1UW3UvVFthLTFdWzJdPFRbYV1bMl0vdT9hLTE6YV0pWzFdLG49YVswXSk6KG89TWF0aC5tYXgocChyLGksbiksMSksbj1jKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9dmFyIGg9cHUoc3UsYW4pLGQ9aC5pbnZlcnQsdj1oLmRvbWFpbixnPXMoIi4lTCIpLF89cygiOiVTIikseT1zKCIlSTolTSIpLG09cygiJUkgJXAiKSx4PXMoIiVhICVkIiksYj1zKCIlYiAlZCIpLHc9cygiJUIiKSxNPXMoIiVZIiksVD1bW2EsMSxDZ10sW2EsNSw1KkNnXSxbYSwxNSwxNSpDZ10sW2EsMzAsMzAqQ2ddLFt1LDEsemddLFt1LDUsNSp6Z10sW3UsMTUsMTUqemddLFt1LDMwLDMwKnpnXSxbbywxLFBnXSxbbywzLDMqUGddLFtvLDYsNipQZ10sW28sMTIsMTIqUGddLFtpLDEsUmddLFtpLDIsMipSZ10sW3IsMSxMZ10sW24sMSxxZ10sW24sMywzKnFnXSxbdCwxLERnXV07cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShkKHQpKX0saC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dihndi5jYWxsKHQsWGEpKTp2KCkubWFwKGphKX0saC50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9digpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sdT1vPGk7cmV0dXJuIHUmJihlPWksaT1vLG89ZSksZT1sKHQsaSxvLG4pLGU9ZT9lLnJhbmdlKGksbysxKTpbXSx1P2UucmV2ZXJzZSgpOmV9LGgudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP2Y6cyhuKX0saC5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9digpO3JldHVybih0PWwodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP3YoX3UoZSx0KSk6aH0saC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGh1KGgsVmEodCxuLHIsaSxvLHUsYSxjLHMpKX0saH1mdW5jdGlvbiAkYSh0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIiMiK3R9KX1mdW5jdGlvbiBXYSh0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihuLTEsTWF0aC5mbG9vcihlKm4pKSldfX1mdW5jdGlvbiBaYSh0KXtmdW5jdGlvbiBuKG4pe3ZhciBvPShuLWUpLyhyLWUpO3JldHVybiB0KGk/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTpvKX12YXIgZT0wLHI9MSxpPSExO3JldHVybiBuLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLG4pOltlLHJdfSxuLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEhdCxuKTppfSxuLmludGVycG9sYXRvcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBaYSh0KS5kb21haW4oW2Uscl0pLmNsYW1wKGkpfSxkdShuKX1mdW5jdGlvbiBHYSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUWEodCl7cmV0dXJuIHQ+PTE/aV86dDw9LTE/LWlfOk1hdGguYXNpbih0KX1mdW5jdGlvbiBKYSh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBLYSh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiB0Yyh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIG5jKHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGVjKHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIHJjKHQsbixlLHIsaSxvLHUpe3ZhciBhPXQtZSxjPW4tcixzPSh1P286LW8pL25fKGEqYStjKmMpLGY9cypjLGw9LXMqYSxoPXQrZixwPW4rbCxkPWUrZix2PXIrbCxnPShoK2QpLzIsXz0ocCt2KS8yLHk9ZC1oLG09di1wLHg9eSp5K20qbSxiPWktbyx3PWgqdi1kKnAsTT0obTwwPy0xOjEpKm5fKEpnKDAsYipiKngtdyp3KSksVD0odyptLXkqTSkveCxOPSgtdyp5LW0qTSkveCxrPSh3Km0reSpNKS94LFM9KC13KnkrbSpNKS94LEU9VC1nLEE9Ti1fLEM9ay1nLHo9Uy1fO3JldHVybiBFKkUrQSpBPkMqQyt6KnomJihUPWssTj1TKSx7Y3g6VCxjeTpOLHgwMTotZix5MDE6LWwseDExOlQqKGkvYi0xKSx5MTE6TiooaS9iLTEpfX1mdW5jdGlvbiBpYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb2ModCl7cmV0dXJuIG5ldyBpYyh0KX1mdW5jdGlvbiB1Yyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBhYyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBjYygpe2Z1bmN0aW9uIHQodCl7dmFyIGEsYyxzLGY9dC5sZW5ndGgsbD0hMTtmb3IobnVsbD09aSYmKHU9byhzPWVlKCkpKSxhPTA7YTw9ZjsrK2EpIShhPGYmJnIoYz10W2FdLGEsdCkpPT09bCYmKChsPSFsKT91LmxpbmVTdGFydCgpOnUubGluZUVuZCgpKSxsJiZ1LnBvaW50KCtuKGMsYSx0KSwrZShjLGEsdCkpO2lmKHMpcmV0dXJuIHU9bnVsbCxzKyIifHxudWxsfXZhciBuPXVjLGU9YWMscj1HYSghMCksaT1udWxsLG89b2MsdT1udWxsO3JldHVybiB0Lng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpHYSgrZSksdCk6bn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOmV9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCEhbiksdCk6cn0sdC5jdXJ2ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLG51bGwhPWkmJih1PW8oaSkpLHQpOm99LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj9pPXU9bnVsbDp1PW8oaT1uKSx0KTppfSx0fWZ1bmN0aW9uIHNjKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixmLGwsaCxwLGQ9dC5sZW5ndGgsdj0hMSxnPW5ldyBBcnJheShkKSxfPW5ldyBBcnJheShkKTtmb3IobnVsbD09YSYmKHM9YyhwPWVlKCkpKSxuPTA7bjw9ZDsrK24pe2lmKCEobjxkJiZ1KGg9dFtuXSxuLHQpKT09PXYpaWYodj0hdilmPW4scy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksbD1uLTE7bD49ZjstLWwpcy5wb2ludChnW2xdLF9bbF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfXYmJihnW25dPStlKGgsbix0KSxfW25dPStpKGgsbix0KSxzLnBvaW50KHI/K3IoaCxuLHQpOmdbbl0sbz8rbyhoLG4sdCk6X1tuXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIG4oKXtyZXR1cm4gY2MoKS5kZWZpbmVkKHUpLmN1cnZlKGMpLmNvbnRleHQoYSl9dmFyIGU9dWMscj1udWxsLGk9R2EoMCksbz1hYyx1PUdhKCEwKSxhPW51bGwsYz1vYyxzPW51bGw7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSxyPW51bGwsdCk6ZX0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTplfSx0LngxPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PW4/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksbz1udWxsLHQpOml9LHQueTA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6aX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT1uP251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6b30sdC5saW5lWDA9dC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShpKX0sdC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngoZSkueShvKX0sdC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gbigpLngocikueShpKX0sdC5kZWZpbmVkPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoISFuKSx0KTp1fSx0LmN1cnZlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sbnVsbCE9YSYmKHM9YyhhKSksdCk6Y30sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT1uP2E9cz1udWxsOnM9YyhhPW4pLHQpOmF9LHR9ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59ZnVuY3Rpb24gbGModCl7cmV0dXJuIHR9ZnVuY3Rpb24gaGModCl7dGhpcy5fY3VydmU9dH1mdW5jdGlvbiBwYyh0KXtmdW5jdGlvbiBuKG4pe3JldHVybiBuZXcgaGModChuKSl9cmV0dXJuIG4uX2N1cnZlPXQsbn1mdW5jdGlvbiBkYyh0KXt2YXIgbj10LmN1cnZlO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihwYyh0KSk6bigpLl9jdXJ2ZX0sdH1mdW5jdGlvbiB2Yygpe3JldHVybiBkYyhjYygpLmN1cnZlKHVfKSl9ZnVuY3Rpb24gZ2MoKXt2YXIgdD1zYygpLmN1cnZlKHVfKSxuPXQuY3VydmUsZT10LmxpbmVYMCxyPXQubGluZVgxLGk9dC5saW5lWTAsbz10LmxpbmVZMTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnN0YXJ0QW5nbGU9dC54MCxkZWxldGUgdC54MCx0LmVuZEFuZ2xlPXQueDEsZGVsZXRlIHQueDEsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5pbm5lclJhZGl1cz10LnkwLGRlbGV0ZSB0LnkwLHQub3V0ZXJSYWRpdXM9dC55MSxkZWxldGUgdC55MSx0LmxpbmVTdGFydEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGRjKGUoKSl9LGRlbGV0ZSB0LmxpbmVYMCx0LmxpbmVFbmRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBkYyhyKCkpfSxkZWxldGUgdC5saW5lWDEsdC5saW5lSW5uZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gZGMoaSgpKX0sZGVsZXRlIHQubGluZVkwLHQubGluZU91dGVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGRjKG8oKSl9LGRlbGV0ZSB0LmxpbmVZMSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24ocGModCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gX2ModCxuKXtyZXR1cm5bKG49K24pKk1hdGguY29zKHQtPU1hdGguUEkvMiksbipNYXRoLnNpbih0KV19ZnVuY3Rpb24geWModCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiB4Yyh0KXtmdW5jdGlvbiBuKCl7dmFyIG4sYT1hXy5jYWxsKGFyZ3VtZW50cyksYz1lLmFwcGx5KHRoaXMsYSkscz1yLmFwcGx5KHRoaXMsYSk7aWYodXx8KHU9bj1lZSgpKSx0KHUsK2kuYXBwbHkodGhpcywoYVswXT1jLGEpKSwrby5hcHBseSh0aGlzLGEpLCtpLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksK28uYXBwbHkodGhpcyxhKSksbilyZXR1cm4gdT1udWxsLG4rIiJ8fG51bGx9dmFyIGU9eWMscj1tYyxpPXVjLG89YWMsdT1udWxsO3JldHVybiBuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6R2EoK3QpLG4pOml9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkdhKCt0KSxuKTpvfSxuLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09dD9udWxsOnQsbik6dX0sbn1mdW5jdGlvbiBiYyh0LG4sZSxyLGkpe3QubW92ZVRvKG4sZSksdC5iZXppZXJDdXJ2ZVRvKG49KG4rcikvMixlLG4saSxyLGkpfWZ1bmN0aW9uIHdjKHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obixlPShlK2kpLzIscixlLHIsaSl9ZnVuY3Rpb24gTWModCxuLGUscixpKXt2YXIgbz1fYyhuLGUpLHU9X2MobixlPShlK2kpLzIpLGE9X2MocixlKSxjPV9jKHIsaSk7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8odVswXSx1WzFdLGFbMF0sYVsxXSxjWzBdLGNbMV0pfWZ1bmN0aW9uIFRjKCl7fWZ1bmN0aW9uIE5jKHQsbixlKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErbikvNiwodC5feTArNCp0Ll95MStlKS82KX1mdW5jdGlvbiBrYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gU2ModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEVjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBBYyh0LG4pe3RoaXMuX2Jhc2lzPW5ldyBrYyh0KSx0aGlzLl9iZXRhPW59ZnVuY3Rpb24gQ2ModCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh0Ll94MSt0Ll9rKih0Ll94Mi10Ll94MCksdC5feTErdC5fayoodC5feTItdC5feTApLHQuX3gyK3QuX2sqKHQuX3gxLW4pLHQuX3kyK3QuX2sqKHQuX3kxLWUpLHQuX3gyLHQuX3kyKX1mdW5jdGlvbiB6Yyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLW4pLzZ9ZnVuY3Rpb24gUGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fWZ1bmN0aW9uIFJjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1mdW5jdGlvbiBMYyh0LG4sZSl7dmFyIHI9dC5feDEsaT10Ll95MSxvPXQuX3gyLHU9dC5feTI7aWYodC5fbDAxX2E+ZV8pe3ZhciBhPTIqdC5fbDAxXzJhKzMqdC5fbDAxX2EqdC5fbDEyX2ErdC5fbDEyXzJhLGM9Myp0Ll9sMDFfYSoodC5fbDAxX2ErdC5fbDEyX2EpO3I9KHIqYS10Ll94MCp0Ll9sMTJfMmErdC5feDIqdC5fbDAxXzJhKS9jLGk9KGkqYS10Ll95MCp0Ll9sMTJfMmErdC5feTIqdC5fbDAxXzJhKS9jfWlmKHQuX2wyM19hPmVfKXt2YXIgcz0yKnQuX2wyM18yYSszKnQuX2wyM19hKnQuX2wxMl9hK3QuX2wxMl8yYSxmPTMqdC5fbDIzX2EqKHQuX2wyM19hK3QuX2wxMl9hKTtvPShvKnMrdC5feDEqdC5fbDIzXzJhLW4qdC5fbDEyXzJhKS9mLHU9KHUqcyt0Ll95MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL2Z9dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIsaSxvLHUsdC5feDIsdC5feTIpfWZ1bmN0aW9uIHFjKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZnVuY3Rpb24gRGModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1mdW5jdGlvbiBVYyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufWZ1bmN0aW9uIE9jKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBGYyh0KXtyZXR1cm4gdDwwPy0xOjF9ZnVuY3Rpb24gSWModCxuLGUpe3ZhciByPXQuX3gxLXQuX3gwLGk9bi10Ll94MSxvPSh0Ll95MS10Ll95MCkvKHJ8fGk8MCYmLTApLHU9KGUtdC5feTEpLyhpfHxyPDAmJi0wKSxhPShvKmkrdSpyKS8ocitpKTtyZXR1cm4oRmMobykrRmModSkpKk1hdGgubWluKE1hdGguYWJzKG8pLE1hdGguYWJzKHUpLC41Kk1hdGguYWJzKGEpKXx8MH1mdW5jdGlvbiBZYyh0LG4pe3ZhciBlPXQuX3gxLXQuX3gwO3JldHVybiBlPygzKih0Ll95MS10Ll95MCkvZS1uKS8yOm59ZnVuY3Rpb24gQmModCxuLGUpe3ZhciByPXQuX3gwLGk9dC5feTAsbz10Ll94MSx1PXQuX3kxLGE9KG8tcikvMzt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocithLGkrYSpuLG8tYSx1LWEqZSxvLHUpfWZ1bmN0aW9uIEhjKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBqYyh0KXt0aGlzLl9jb250ZXh0PW5ldyBYYyh0KX1mdW5jdGlvbiBYYyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gVmModCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uICRjKHQpe3ZhciBuLGUscj10Lmxlbmd0aC0xLGk9bmV3IEFycmF5KHIpLG89bmV3IEFycmF5KHIpLHU9bmV3IEFycmF5KHIpO2ZvcihpWzBdPTAsb1swXT0yLHVbMF09dFswXSsyKnRbMV0sbj0xO248ci0xOysrbilpW25dPTEsb1tuXT00LHVbbl09NCp0W25dKzIqdFtuKzFdO2ZvcihpW3ItMV09MixvW3ItMV09Nyx1W3ItMV09OCp0W3ItMV0rdFtyXSxuPTE7bjxyOysrbillPWlbbl0vb1tuLTFdLG9bbl0tPWUsdVtuXS09ZSp1W24tMV07Zm9yKGlbci0xXT11W3ItMV0vb1tyLTFdLG49ci0yO24+PTA7LS1uKWlbbl09KHVbbl0taVtuKzFdKS9vW25dO2ZvcihvW3ItMV09KHRbcl0raVtyLTFdKS8yLG49MDtuPHItMTsrK24pb1tuXT0yKnRbbisxXS1pW24rMV07cmV0dXJuW2ksb119ZnVuY3Rpb24gV2ModCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fdD1ufWZ1bmN0aW9uIFpjKHQsbil7aWYoKGk9dC5sZW5ndGgpPjEpZm9yKHZhciBlLHIsaSxvPTEsdT10W25bMF1dLGE9dS5sZW5ndGg7bzxpOysrbylmb3Iocj11LHU9dFtuW29dXSxlPTA7ZTxhOysrZSl1W2VdWzFdKz11W2VdWzBdPWlzTmFOKHJbZV1bMV0pP3JbZV1bMF06cltlXVsxXX1mdW5jdGlvbiBHYyh0KXtmb3IodmFyIG49dC5sZW5ndGgsZT1uZXcgQXJyYXkobik7LS1uPj0wOyllW25dPW47cmV0dXJuIGV9ZnVuY3Rpb24gUWModCxuKXtyZXR1cm4gdFtuXX1mdW5jdGlvbiBKYyh0KXt2YXIgbj10Lm1hcChLYyk7cmV0dXJuIEdjKHQpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gblt0XS1uW2VdfSl9ZnVuY3Rpb24gS2ModCl7Zm9yKHZhciBuLGU9MCxyPS0xLGk9dC5sZW5ndGg7KytyPGk7KShuPSt0W3JdWzFdKSYmKGUrPW4pO3JldHVybiBlfWZ1bmN0aW9uIHRzKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBucyh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiBlcyh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBycygpe3RoaXMuXz1udWxsfWZ1bmN0aW9uIGlzKHQpe3QuVT10LkM9dC5MPXQuUj10LlA9dC5OPW51bGx9ZnVuY3Rpb24gb3ModCxuKXt2YXIgZT1uLHI9bi5SLGk9ZS5VO2k/aS5MPT09ZT9pLkw9cjppLlI9cjp0Ll89cixyLlU9aSxlLlU9cixlLlI9ci5MLGUuUiYmKGUuUi5VPWUpLHIuTD1lfWZ1bmN0aW9uIHVzKHQsbil7dmFyIGU9bixyPW4uTCxpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5MPXIuUixlLkwmJihlLkwuVT1lKSxyLlI9ZX1mdW5jdGlvbiBhcyh0KXtmb3IoO3QuTDspdD10Lkw7cmV0dXJuIHR9ZnVuY3Rpb24gY3ModCxuLGUscil7dmFyIGk9W251bGwsbnVsbF0sbz1EXy5wdXNoKGkpLTE7cmV0dXJuIGkubGVmdD10LGkucmlnaHQ9bixlJiZmcyhpLHQsbixlKSxyJiZmcyhpLG4sdCxyKSxMX1t0LmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxMX1tuLmluZGV4XS5oYWxmZWRnZXMucHVzaChvKSxpfWZ1bmN0aW9uIHNzKHQsbixlKXt2YXIgcj1bbixlXTtyZXR1cm4gci5sZWZ0PXQscn1mdW5jdGlvbiBmcyh0LG4sZSxyKXt0WzBdfHx0WzFdP3QubGVmdD09PWU/dFsxXT1yOnRbMF09cjoodFswXT1yLHQubGVmdD1uLHQucmlnaHQ9ZSl9ZnVuY3Rpb24gbHModCxuLGUscixpKXt2YXIgbyx1PXRbMF0sYT10WzFdLGM9dVswXSxzPXVbMV0sZj0wLGw9MSxoPWFbMF0tYyxwPWFbMV0tcztpZihvPW4tYyxofHwhKG8+MCkpe2lmKG8vPWgsaDwwKXtpZihvPGYpcmV0dXJuO288bCYmKGw9byl9ZWxzZSBpZihoPjApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1pZihvPXItYyxofHwhKG88MCkpe2lmKG8vPWgsaDwwKXtpZihvPmwpcmV0dXJuO28+ZiYmKGY9byl9ZWxzZSBpZihoPjApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1pZihvPWUtcyxwfHwhKG8+MCkpe2lmKG8vPXAscDwwKXtpZihvPGYpcmV0dXJuO288bCYmKGw9byl9ZWxzZSBpZihwPjApe2lmKG8+bClyZXR1cm47bz5mJiYoZj1vKX1pZihvPWktcyxwfHwhKG88MCkpe2lmKG8vPXAscDwwKXtpZihvPmwpcmV0dXJuO28+ZiYmKGY9byl9ZWxzZSBpZihwPjApe2lmKG88ZilyZXR1cm47bzxsJiYobD1vKX1yZXR1cm4hKGY+MHx8bDwxKXx8KGY+MCYmKHRbMF09W2MrZipoLHMrZipwXSksbDwxJiYodFsxXT1bYytsKmgscytsKnBdKSwhMCl9fX19fWZ1bmN0aW9uIGhzKHQsbixlLHIsaSl7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciB1LGEsYz10WzBdLHM9dC5sZWZ0LGY9dC5yaWdodCxsPXNbMF0saD1zWzFdLHA9ZlswXSxkPWZbMV0sdj0obCtwKS8yLGc9KGgrZCkvMjtpZihkPT09aCl7aWYodjxufHx2Pj1yKXJldHVybjtpZihsPnApe2lmKGMpe2lmKGNbMV0+PWkpcmV0dXJufWVsc2UgYz1bdixlXTtvPVt2LGldfWVsc2V7aWYoYyl7aWYoY1sxXTxlKXJldHVybn1lbHNlIGM9W3YsaV07bz1bdixlXX19ZWxzZSBpZih1PShsLXApLyhkLWgpLGE9Zy11KnYsdTwtMXx8dT4xKWlmKGw+cCl7aWYoYyl7aWYoY1sxXT49aSlyZXR1cm59ZWxzZSBjPVsoZS1hKS91LGVdO289WyhpLWEpL3UsaV19ZWxzZXtpZihjKXtpZihjWzFdPGUpcmV0dXJufWVsc2UgYz1bKGktYSkvdSxpXTtvPVsoZS1hKS91LGVdfWVsc2UgaWYoaDxkKXtpZihjKXtpZihjWzBdPj1yKXJldHVybn1lbHNlIGM9W24sdSpuK2FdO289W3IsdSpyK2FdfWVsc2V7aWYoYyl7aWYoY1swXTxuKXJldHVybn1lbHNlIGM9W3IsdSpyK2FdO289W24sdSpuK2FdfXJldHVybiB0WzBdPWMsdFsxXT1vLCEwfWZ1bmN0aW9uIHBzKHQsbil7dmFyIGU9dC5zaXRlLHI9bi5sZWZ0LGk9bi5yaWdodDtyZXR1cm4gZT09PWkmJihpPXIscj1lKSxpP01hdGguYXRhbjIoaVsxXS1yWzFdLGlbMF0tclswXSk6KGU9PT1yPyhyPW5bMV0saT1uWzBdKToocj1uWzBdLGk9blsxXSksTWF0aC5hdGFuMihyWzBdLWlbMF0saVsxXS1yWzFdKSl9ZnVuY3Rpb24gZHModCxuKXtyZXR1cm4gblsrKG4ubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIHZzKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQ9PT10LnNpdGUpXX1mdW5jdGlvbiBncyh0KXt2YXIgbj10LlAsZT10Lk47aWYobiYmZSl7dmFyIHI9bi5zaXRlLGk9dC5zaXRlLG89ZS5zaXRlO2lmKHIhPT1vKXt2YXIgdT1pWzBdLGE9aVsxXSxjPXJbMF0tdSxzPXJbMV0tYSxmPW9bMF0tdSxsPW9bMV0tYSxoPTIqKGMqbC1zKmYpO2lmKCEoaD49LUlfKSl7dmFyIHA9YypjK3MqcyxkPWYqZitsKmwsdj0obCpwLXMqZCkvaCxnPShjKmQtZipwKS9oLF89VV8ucG9wKCl8fG5ldyBmdW5jdGlvbigpe2lzKHRoaXMpLHRoaXMueD10aGlzLnk9dGhpcy5hcmM9dGhpcy5zaXRlPXRoaXMuY3k9bnVsbH07Xy5hcmM9dCxfLnNpdGU9aSxfLng9dit1LF8ueT0oXy5jeT1nK2EpK01hdGguc3FydCh2KnYrZypnKSx0LmNpcmNsZT1fO2Zvcih2YXIgeT1udWxsLG09cV8uXzttOylpZihfLnk8bS55fHxfLnk9PT1tLnkmJl8ueDw9bS54KXtpZighbS5MKXt5PW0uUDticmVha31tPW0uTH1lbHNle2lmKCFtLlIpe3k9bTticmVha31tPW0uUn1xXy5pbnNlcnQoeSxfKSx5fHwoUF89Xyl9fX19ZnVuY3Rpb24gX3ModCl7dmFyIG49dC5jaXJjbGU7biYmKG4uUHx8KFBfPW4uTikscV8ucmVtb3ZlKG4pLFVfLnB1c2gobiksaXMobiksdC5jaXJjbGU9bnVsbCl9ZnVuY3Rpb24geXModCl7dmFyIG49T18ucG9wKCl8fG5ldyBmdW5jdGlvbigpe2lzKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH07cmV0dXJuIG4uc2l0ZT10LG59ZnVuY3Rpb24gbXModCl7X3ModCksUl8ucmVtb3ZlKHQpLE9fLnB1c2godCksaXModCl9ZnVuY3Rpb24geHModCl7dmFyIG49dC5jaXJjbGUsZT1uLngscj1uLmN5LGk9W2Uscl0sbz10LlAsdT10Lk4sYT1bdF07bXModCk7Zm9yKHZhciBjPW87Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8Rl8mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEZfOylvPWMuUCxhLnVuc2hpZnQoYyksbXMoYyksYz1vO2EudW5zaGlmdChjKSxfcyhjKTtmb3IodmFyIHM9dTtzLmNpcmNsZSYmTWF0aC5hYnMoZS1zLmNpcmNsZS54KTxGXyYmTWF0aC5hYnMoci1zLmNpcmNsZS5jeSk8Rl87KXU9cy5OLGEucHVzaChzKSxtcyhzKSxzPXU7YS5wdXNoKHMpLF9zKHMpO3ZhciBmLGw9YS5sZW5ndGg7Zm9yKGY9MTtmPGw7KytmKXM9YVtmXSxjPWFbZi0xXSxmcyhzLmVkZ2UsYy5zaXRlLHMuc2l0ZSxpKTtjPWFbMF0sKHM9YVtsLTFdKS5lZGdlPWNzKGMuc2l0ZSxzLnNpdGUsbnVsbCxpKSxncyhjKSxncyhzKX1mdW5jdGlvbiBicyh0KXtmb3IodmFyIG4sZSxyLGksbz10WzBdLHU9dFsxXSxhPVJfLl87YTspaWYoKHI9d3MoYSx1KS1vKT5GXylhPWEuTDtlbHNle2lmKCEoKGk9by1mdW5jdGlvbih0LG4pe3ZhciBlPXQuTjtpZihlKXJldHVybiB3cyhlLG4pO3ZhciByPXQuc2l0ZTtyZXR1cm4gclsxXT09PW4/clswXToxLzB9KGEsdSkpPkZfKSl7cj4tRl8/KG49YS5QLGU9YSk6aT4tRl8/KG49YSxlPWEuTik6bj1lPWE7YnJlYWt9aWYoIWEuUil7bj1hO2JyZWFrfWE9YS5SfShmdW5jdGlvbih0KXtMX1t0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KSh0KTt2YXIgYz15cyh0KTtpZihSXy5pbnNlcnQobixjKSxufHxlKXtpZihuPT09ZSlyZXR1cm4gX3MobiksZT15cyhuLnNpdGUpLFJfLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9Y3Mobi5zaXRlLGMuc2l0ZSksZ3Mobiksdm9pZCBncyhlKTtpZihlKXtfcyhuKSxfcyhlKTt2YXIgcz1uLnNpdGUsZj1zWzBdLGw9c1sxXSxoPXRbMF0tZixwPXRbMV0tbCxkPWUuc2l0ZSx2PWRbMF0tZixnPWRbMV0tbCxfPTIqKGgqZy1wKnYpLHk9aCpoK3AqcCxtPXYqditnKmcseD1bKGcqeS1wKm0pL18rZiwoaCptLXYqeSkvXytsXTtmcyhlLmVkZ2UscyxkLHgpLGMuZWRnZT1jcyhzLHQsbnVsbCx4KSxlLmVkZ2U9Y3ModCxkLG51bGwseCksZ3MobiksZ3MoZSl9ZWxzZSBjLmVkZ2U9Y3Mobi5zaXRlLGMuc2l0ZSl9fWZ1bmN0aW9uIHdzKHQsbil7dmFyIGU9dC5zaXRlLHI9ZVswXSxpPWVbMV0sbz1pLW47aWYoIW8pcmV0dXJuIHI7dmFyIHU9dC5QO2lmKCF1KXJldHVybi0xLzA7dmFyIGE9KGU9dS5zaXRlKVswXSxjPWVbMV0scz1jLW47aWYoIXMpcmV0dXJuIGE7dmFyIGY9YS1yLGw9MS9vLTEvcyxoPWYvcztyZXR1cm4gbD8oLWgrTWF0aC5zcXJ0KGgqaC0yKmwqKGYqZi8oLTIqcyktYytzLzIraS1vLzIpKSkvbCtyOihyK2EpLzJ9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybih0WzBdLWVbMF0pKihuWzFdLXRbMV0pLSh0WzBdLW5bMF0pKihlWzFdLXRbMV0pfWZ1bmN0aW9uIFRzKHQsbil7cmV0dXJuIG5bMV0tdFsxXXx8blswXS10WzBdfWZ1bmN0aW9uIE5zKHQsbil7dmFyIGUscixpLG89dC5zb3J0KFRzKS5wb3AoKTtmb3IoRF89W10sTF89bmV3IEFycmF5KHQubGVuZ3RoKSxSXz1uZXcgcnMscV89bmV3IHJzOzspaWYoaT1QXyxvJiYoIWl8fG9bMV08aS55fHxvWzFdPT09aS55JiZvWzBdPGkueCkpb1swXT09PWUmJm9bMV09PT1yfHwoYnMobyksZT1vWzBdLHI9b1sxXSksbz10LnBvcCgpO2Vsc2V7aWYoIWkpYnJlYWs7eHMoaS5hcmMpfWlmKGZ1bmN0aW9uKCl7Zm9yKHZhciB0LG4sZSxyLGk9MCxvPUxfLmxlbmd0aDtpPG87KytpKWlmKCh0PUxfW2ldKSYmKHI9KG49dC5oYWxmZWRnZXMpLmxlbmd0aCkpe3ZhciB1PW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoZT0wO2U8cjsrK2UpdVtlXT1lLGFbZV09cHModCxEX1tuW2VdXSk7Zm9yKHUuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBhW25dLWFbdF19KSxlPTA7ZTxyOysrZSlhW2VdPW5bdVtlXV07Zm9yKGU9MDtlPHI7KytlKW5bZV09YVtlXX19KCksbil7dmFyIHU9K25bMF1bMF0sYT0rblswXVsxXSxjPStuWzFdWzBdLHM9K25bMV1bMV07KGZ1bmN0aW9uKHQsbixlLHIpe2Zvcih2YXIgaSxvPURfLmxlbmd0aDtvLS07KWhzKGk9RF9bb10sdCxuLGUscikmJmxzKGksdCxuLGUscikmJihNYXRoLmFicyhpWzBdWzBdLWlbMV1bMF0pPkZffHxNYXRoLmFicyhpWzBdWzFdLWlbMV1bMV0pPkZfKXx8ZGVsZXRlIERfW29dfSkodSxhLGMscyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyx1LGEsYyxzLGYsbCxoLHAsZCx2LGc9TF8ubGVuZ3RoLF89ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89TF9baV0pe2Zvcih1PW8uc2l0ZSxhPShjPW8uaGFsZmVkZ2VzKS5sZW5ndGg7YS0tOylEX1tjW2FdXXx8Yy5zcGxpY2UoYSwxKTtmb3IoYT0wLHM9Yy5sZW5ndGg7YTxzOylkPShwPXZzKG8sRF9bY1thXV0pKVswXSx2PXBbMV0sbD0oZj1kcyhvLERfW2NbKythJXNdXSkpWzBdLGg9ZlsxXSwoTWF0aC5hYnMoZC1sKT5GX3x8TWF0aC5hYnModi1oKT5GXykmJihjLnNwbGljZShhLDAsRF8ucHVzaChzcyh1LHAsTWF0aC5hYnMoZC10KTxGXyYmci12PkZfP1t0LE1hdGguYWJzKGwtdCk8Rl8/aDpyXTpNYXRoLmFicyh2LXIpPEZfJiZlLWQ+Rl8/W01hdGguYWJzKGgtcik8Rl8/bDplLHJdOk1hdGguYWJzKGQtZSk8Rl8mJnYtbj5GXz9bZSxNYXRoLmFicyhsLWUpPEZfP2g6bl06TWF0aC5hYnModi1uKTxGXyYmZC10PkZfP1tNYXRoLmFicyhoLW4pPEZfP2w6dCxuXTpudWxsKSktMSksKytzKTtzJiYoXz0hMSl9aWYoXyl7dmFyIHksbSx4LGI9MS8wO2ZvcihpPTAsXz1udWxsO2k8ZzsrK2kpKG89TF9baV0pJiYoeD0oeT0odT1vLnNpdGUpWzBdLXQpKnkrKG09dVsxXS1uKSptKTxiJiYoYj14LF89byk7aWYoXyl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxUPVtlLHJdLE49W2Usbl07Xy5oYWxmZWRnZXMucHVzaChEXy5wdXNoKHNzKHU9Xy5zaXRlLHcsTSkpLTEsRF8ucHVzaChzcyh1LE0sVCkpLTEsRF8ucHVzaChzcyh1LFQsTikpLTEsRF8ucHVzaChzcyh1LE4sdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89TF9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgTF9baV0pfSh1LGEsYyxzKX10aGlzLmVkZ2VzPURfLHRoaXMuY2VsbHM9TF8sUl89cV89RF89TF89bnVsbH1mdW5jdGlvbiBrcyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU3ModCxuLGUpe3RoaXMuaz10LHRoaXMueD1uLHRoaXMueT1lfWZ1bmN0aW9uIEVzKHQpe3JldHVybiB0Ll9fem9vbXx8WV99ZnVuY3Rpb24gQXMoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIENzKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24genMoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gUHMoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gUnMoKXtyZXR1cm4gdGhpcy5fX3pvb218fFlffWZ1bmN0aW9uIExzKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHFzKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIERzKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sdT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSx1Pm8/KG8rdSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLHUpKX12YXIgVXM9ZShuKSxPcz1Vcy5yaWdodCxGcz1Vcy5sZWZ0LElzPUFycmF5LnByb3RvdHlwZSxZcz1Jcy5zbGljZSxCcz1Jcy5tYXAsSHM9TWF0aC5zcXJ0KDUwKSxqcz1NYXRoLnNxcnQoMTApLFhzPU1hdGguc3FydCgyKSxWcz1BcnJheS5wcm90b3R5cGUuc2xpY2UsJHM9MSxXcz0yLFpzPTMsR3M9NCxRcz0xZS02LEpzPXt2YWx1ZTpmdW5jdGlvbigpe319O2sucHJvdG90eXBlPU4ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjprLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscj10aGlzLl8saT1mdW5jdGlvbih0LG4pe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIGU9IiIscj10LmluZGV4T2YoIi4iKTtpZihyPj0wJiYoZT10LnNsaWNlKHIrMSksdD10LnNsaWNlKDAscikpLHQmJiFuLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTplfX0pfSh0KyIiLHIpLG89LTEsdT1pLmxlbmd0aDt7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK288dTspaWYoZT0odD1pW29dKS50eXBlKXJbZV09UyhyW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gcilyW2VdPVMocltlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288dTspaWYoKGU9KHQ9aVtvXSkudHlwZSkmJihlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlLHI9MCxpPXQubGVuZ3RoO3I8aTsrK3IpaWYoKGU9dFtyXSkubmFtZT09PW4pcmV0dXJuIGUudmFsdWV9KHJbZV0sdC5uYW1lKSkpcmV0dXJuIGV9fSxjb3B5OmZ1bmN0aW9uKCl7dmFyIHQ9e30sbj10aGlzLl87Zm9yKHZhciBlIGluIG4pdFtlXT1uW2VdLnNsaWNlKCk7cmV0dXJuIG5ldyBrKHQpfSxjYWxsOmZ1bmN0aW9uKHQsbil7aWYoKGU9YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgZSxyLGk9bmV3IEFycmF5KGUpLG89MDtvPGU7KytvKWlbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLGU9KHI9dGhpcy5fW3RdKS5sZW5ndGg7bzxlOysrbylyW29dLnZhbHVlLmFwcGx5KG4saSl9LGFwcGx5OmZ1bmN0aW9uKHQsbixlKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgcj10aGlzLl9bdF0saT0wLG89ci5sZW5ndGg7aTxvOysraSlyW2ldLnZhbHVlLmFwcGx5KG4sZSl9fTt2YXIgS3M9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLHRmPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpLcyx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9LG5mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fTtpZigidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KXt2YXIgZWY9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2lmKCFlZi5tYXRjaGVzKXt2YXIgcmY9ZWYud2Via2l0TWF0Y2hlc1NlbGVjdG9yfHxlZi5tc01hdGNoZXNTZWxlY3Rvcnx8ZWYubW96TWF0Y2hlc1NlbGVjdG9yfHxlZi5vTWF0Y2hlc1NlbGVjdG9yO25mPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiByZi5jYWxsKHRoaXMsdCl9fX19dmFyIG9mPW5mO3EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpxLGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsbil9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O3ZhciB1Zj0iJCI7SC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lcy5pbmRleE9mKHQpO24+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UobiwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBhZj17fTtpZih0LmV2ZW50PW51bGwsInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7Im9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChhZj17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KX12YXIgY2Y9W251bGxdO3V0LnByb3RvdHlwZT1hdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnV0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1LGE9bltpXSxjPWEubGVuZ3RoLHM9cltpXT1uZXcgQXJyYXkoYyksZj0wO2Y8YzsrK2YpKG89YVtmXSkmJih1PXQuY2FsbChvLG8uX19kYXRhX18sZixhKSkmJigiX19kYXRhX18iaW4gbyYmKHUuX19kYXRhX189by5fX2RhdGFfXyksc1tmXT11KTtyZXR1cm4gbmV3IHV0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Uih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIHUsYT1uW29dLGM9YS5sZW5ndGgscz0wO3M8YzsrK3MpKHU9YVtzXSkmJihyLnB1c2godC5jYWxsKHUsdS5fX2RhdGFfXyxzLGEpKSxpLnB1c2godSkpO3JldHVybiBuZXcgdXQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1vZih0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyx1PW5baV0sYT11Lmxlbmd0aCxjPXJbaV09W10scz0wO3M8YTsrK3MpKG89dVtzXSkmJnQuY2FsbChvLG8uX19kYXRhX18scyx1KSYmYy5wdXNoKG8pO3JldHVybiBuZXcgdXQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlPW4/VTpELHI9dGhpcy5fcGFyZW50cyxpPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSh0KSk7Zm9yKHZhciBvPWkubGVuZ3RoLHU9bmV3IEFycmF5KG8pLGE9bmV3IEFycmF5KG8pLGM9bmV3IEFycmF5KG8pLHM9MDtzPG87KytzKXt2YXIgZj1yW3NdLGw9aVtzXSxoPWwubGVuZ3RoLHA9dC5jYWxsKGYsZiYmZi5fX2RhdGFfXyxzLHIpLGQ9cC5sZW5ndGgsdj1hW3NdPW5ldyBBcnJheShkKSxnPXVbc109bmV3IEFycmF5KGQpO2UoZixsLHYsZyxjW3NdPW5ldyBBcnJheShoKSxwLG4pO2Zvcih2YXIgXyx5LG09MCx4PTA7bTxkOysrbSlpZihfPXZbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoeT1nW3hdKSYmKyt4PGQ7KTtfLl9uZXh0PXl8fG51bGx9fXJldHVybiB1PW5ldyB1dCh1LHIpLHUuX2VudGVyPWEsdS5fZXhpdD1jLHV9LGVudGVyOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1dCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChMKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgdXQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChMKSx0aGlzLl9wYXJlbnRzKX0sbWVyZ2U6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IHV0KHUsdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPS0xLGU9dC5sZW5ndGg7KytuPGU7KWZvcih2YXIgcixpPXRbbl0sbz1pLmxlbmd0aC0xLHU9aVtvXTstLW8+PTA7KShyPWlbb10pJiYodSYmdSE9PXIubmV4dFNpYmxpbmcmJnUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUocix1KSx1PXIpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4obixlKXtyZXR1cm4gbiYmZT90KG4uX19kYXRhX18sZS5fX2RhdGFfXyk6IW4tIWV9dHx8KHQ9Tyk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxyPWUubGVuZ3RoLGk9bmV3IEFycmF5KHIpLG89MDtvPHI7KytvKXtmb3IodmFyIHUsYT1lW29dLGM9YS5sZW5ndGgscz1pW29dPW5ldyBBcnJheShjKSxmPTA7ZjxjOysrZikodT1hW2ZdKSYmKHNbZl09dSk7cy5zb3J0KG4pfXJldHVybiBuZXcgdXQoaSx0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksbj0tMTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dFsrK25dPXRoaXN9KSx0fSxub2RlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxuPTAsZT10Lmxlbmd0aDtuPGU7KytuKWZvcih2YXIgcj10W25dLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpe3ZhciB1PXJbaV07aWYodSlyZXR1cm4gdX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpeysrdH0pLHR9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlmb3IodmFyIGksbz1uW2VdLHU9MCxhPW8ubGVuZ3RoO3U8YTsrK3UpKGk9b1t1XSkmJnQuY2FsbChpLGkuX19kYXRhX18sdSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPUUodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgcj10aGlzLm5vZGUoKTtyZXR1cm4gZS5sb2NhbD9yLmdldEF0dHJpYnV0ZU5TKGUuc3BhY2UsZS5sb2NhbCk6ci5nZXRBdHRyaWJ1dGUoZSl9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9lLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZS5sb2NhbD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsZSl9fTplLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsbil9fSkoZSxuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX06ImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciByPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQscixlKX19OmZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsbixlKX19KSh0LG4sbnVsbD09ZT8iIjplKSk6SSh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPVkodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIHI9Qih0aGlzLm5vZGUoKSksaT0tMSxvPWUubGVuZ3RoOysraTxvOylpZighci5jb250YWlucyhlW2ldKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpeyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKT9qOlgpKHRoaXMsdCl9fTpuP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe2oodGhpcyx0KX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe1godGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9WOigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PW4/IiI6bn19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/JDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5pbm5lckhUTUw9bnVsbD09bj8iIjpufX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goVyl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChaKX0sYXBwZW5kOmZ1bmN0aW9uKHQpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QSh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KX0saW5zZXJ0OmZ1bmN0aW9uKHQsbil7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBKHQpLHI9bnVsbD09bj9HOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246eihuKTtyZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksci5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSl9LHJlbW92ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVhY2goUSl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0s6Sil9LGRhdHVtOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJihuPXQuc2xpY2UoZSsxKSx0PXQuc2xpY2UoMCxlKSkse3R5cGU6dCxuYW1lOm59fSl9KHQrIiIpLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3IoYT1uP3J0OmV0LG51bGw9PWUmJihlPSExKSxyPTA7cjx1Oysrcil0aGlzLmVhY2goYShvW3JdLG4sZSkpO3JldHVybiB0aGlzfXZhciBhPXRoaXMubm9kZSgpLl9fb247aWYoYSlmb3IodmFyIGMscz0wLGY9YS5sZW5ndGg7czxmOysrcylmb3Iocj0wLGM9YVtzXTtyPHU7KytyKWlmKChpPW9bcl0pLnR5cGU9PT1jLnR5cGUmJmkubmFtZT09PWMubmFtZSlyZXR1cm4gYy52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBvdCh0aGlzLHQsbi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gb3QodGhpcyx0LG4pfX0pKHQsbikpfX07dmFyIHNmPTA7ZnQucHJvdG90eXBlPXN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZnQsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl87IShuIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbbl19LHNldDpmdW5jdGlvbih0LG4pe3JldHVybiB0W3RoaXMuX109bn0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0seHQucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIGZmPSJcXHMqKFsrLV0/XFxkKylcXHMqIixsZj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixoZj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIscGY9L14jKFswLTlhLWZdezN9KSQvLGRmPS9eIyhbMC05YS1mXXs2fSkkLyx2Zj1uZXcgUmVnRXhwKCJecmdiXFwoIitbZmYsZmYsZmZdKyJcXCkkIiksZ2Y9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2hmLGhmLGhmXSsiXFwpJCIpLF9mPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZmYsZmYsZmYsbGZdKyJcXCkkIikseWY9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1toZixoZixoZixsZl0rIlxcKSQiKSxtZj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbbGYsaGYsaGZdKyJcXCkkIikseGY9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tsZixoZixoZixsZl0rIlxcKSQiKSxiZj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtOdChTdCxFdCx7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpKyIifX0pLE50KFJ0LFB0LGt0KFN0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgUnQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Ljc6TWF0aC5wb3coLjcsdCksbmV3IFJ0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksTnQoRHQscXQsa3QoU3Qse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBEdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBEdCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IFJ0KFV0KHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFV0KHQsaSxyKSxVdCh0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgd2Y9TWF0aC5QSS8xODAsTWY9MTgwL01hdGguUEksVGY9Ljk1MDQ3LE5mPTEsa2Y9MS4wODg4MyxTZj00LzI5LEVmPTYvMjksQWY9MypFZipFZixDZj1FZipFZipFZjtOdChJdCxGdCxrdChTdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBJdCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEl0KHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIHQ9TmYqQnQodCksbj1UZipCdChuKSxlPWtmKkJ0KGUpLG5ldyBSdChIdCgzLjI0MDQ1NDIqbi0xLjUzNzEzODUqdC0uNDk4NTMxNCplKSxIdCgtLjk2OTI2NipuKzEuODc2MDEwOCp0Ky4wNDE1NTYqZSksSHQoLjA1NTY0MzQqbi0uMjA0MDI1OSp0KzEuMDU3MjI1MiplKSx0aGlzLm9wYWNpdHkpfX0pKSxOdChWdCxYdCxrdChTdCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBWdCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFZ0KHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIE90KHRoaXMpLnJnYigpfX0pKTt2YXIgemY9LS4yOTIyNyxQZj0tLjkwNjQ5LFJmPTEuOTcyOTQsTGY9UmYqUGYscWY9MS43ODI3NypSZixEZj0xLjc4Mjc3KnpmLSAtLjE0ODYxKlBmO050KFd0LCR0LGt0KFN0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgV3QodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgV3QodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKndmLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBSdCgyNTUqKG4rZSooLS4xNDg2MSpyKzEuNzgyNzcqaSkpLDI1NSoobitlKih6ZipyK1BmKmkpKSwyNTUqKG4rZSooUmYqcikpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBVZixPZixGZixJZixZZixCZixIZj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxuKXt2YXIgZT1yKCh0PVB0KHQpKS5yLChuPVB0KG4pKS5yKSxpPXIodC5nLG4uZyksbz1yKHQuYixuLmIpLHU9ZW4odC5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0LnI9ZShuKSx0Lmc9aShuKSx0LmI9byhuKSx0Lm9wYWNpdHk9dShuKSx0KyIifX12YXIgcj1ubihuKTtyZXR1cm4gZS5nYW1tYT10LGV9KDEpLGpmPXJuKEd0KSxYZj1ybihRdCksVmY9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLCRmPW5ldyBSZWdFeHAoVmYuc291cmNlLCJnIiksV2Y9MTgwL01hdGguUEksWmY9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX0sR2Y9cG4oZnVuY3Rpb24odCl7cmV0dXJuIm5vbmUiPT09dD9aZjooVWZ8fChVZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxPZj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsRmY9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLFVmLnN0eWxlLnRyYW5zZm9ybT10LHQ9RmYuZ2V0Q29tcHV0ZWRTdHlsZShPZi5hcHBlbmRDaGlsZChVZiksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksT2YucmVtb3ZlQ2hpbGQoVWYpLHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpLGhuKCt0WzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9LCJweCwgIiwicHgpIiwiZGVnKSIpLFFmPXBuKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P1pmOihJZnx8KElmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLElmLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1JZi50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKT8odD10Lm1hdHJpeCxobih0LmEsdC5iLHQuYyx0LmQsdC5lLHQuZikpOlpmKX0sIiwgIiwiKSIsIikiKSxKZj1NYXRoLlNRUlQyLEtmPTIsdGw9NCxubD0xZS0xMixlbD1nbih0bikscmw9Z24oZW4pLGlsPV9uKHRuKSxvbD1fbihlbiksdWw9eW4odG4pLGFsPXluKGVuKSxjbD0wLHNsPTAsZmw9MCxsbD0xZTMsaGw9MCxwbD0wLGRsPTAsdmw9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsZ2w9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07Ym4ucHJvdG90eXBlPXduLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Ym4scmVzdGFydDpmdW5jdGlvbih0LG4sZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtlPShudWxsPT1lP21uKCk6K2UpKyhudWxsPT1uPzA6K24pLHRoaXMuX25leHR8fEJmPT09dGhpc3x8KEJmP0JmLl9uZXh0PXRoaXM6WWY9dGhpcyxCZj10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1lLGtuKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLGtuKCkpfX07dmFyIF9sPU4oInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikseWw9W10sbWw9MCx4bD0xLGJsPTIsd2w9MyxNbD00LFRsPTUsTmw9NixrbD1hdC5wcm90b3R5cGUuY29uc3RydWN0b3IsU2w9MCxFbD1hdC5wcm90b3R5cGU7cW4ucHJvdG90eXBlPURuLnByb3RvdHlwZT17Y29uc3RydWN0b3I6cW4sc2VsZWN0OmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eih0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89bmV3IEFycmF5KGkpLHU9MDt1PGk7Kyt1KWZvcih2YXIgYSxjLHM9clt1XSxmPXMubGVuZ3RoLGw9b1t1XT1uZXcgQXJyYXkoZiksaD0wO2g8ZjsrK2gpKGE9c1toXSkmJihjPXQuY2FsbChhLGEuX19kYXRhX18saCxzKSkmJigiX19kYXRhX18iaW4gYSYmKGMuX19kYXRhX189YS5fX2RhdGFfXyksbFtoXT1jLEVuKGxbaF0sbixlLGgsbCx6bihhLGUpKSk7cmV0dXJuIG5ldyBxbihvLHRoaXMuX3BhcmVudHMsbixlKX0sc2VsZWN0QWxsOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX25hbWUsZT10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Uih0KSk7Zm9yKHZhciByPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89W10sdT1bXSxhPTA7YTxpOysrYSlmb3IodmFyIGMscz1yW2FdLGY9cy5sZW5ndGgsbD0wO2w8ZjsrK2wpaWYoYz1zW2xdKXtmb3IodmFyIGgscD10LmNhbGwoYyxjLl9fZGF0YV9fLGwscyksZD16bihjLGUpLHY9MCxnPXAubGVuZ3RoO3Y8ZzsrK3YpKGg9cFt2XSkmJkVuKGgsbixlLHYscCxkKTtvLnB1c2gocCksdS5wdXNoKGMpfXJldHVybiBuZXcgcW4obyx1LG4sZSl9LGZpbHRlcjpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9b2YodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSlmb3IodmFyIG8sdT1uW2ldLGE9dS5sZW5ndGgsYz1yW2ldPVtdLHM9MDtzPGE7KytzKShvPXVbc10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLHMsdSkmJmMucHVzaChvKTtyZXR1cm4gbmV3IHFuKHIsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24odCl7aWYodC5faWQhPT10aGlzLl9pZCl0aHJvdyBuZXcgRXJyb3I7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPXQuX2dyb3VwcyxyPW4ubGVuZ3RoLGk9ZS5sZW5ndGgsbz1NYXRoLm1pbihyLGkpLHU9bmV3IEFycmF5KHIpLGE9MDthPG87KythKWZvcih2YXIgYyxzPW5bYV0sZj1lW2FdLGw9cy5sZW5ndGgsaD11W2FdPW5ldyBBcnJheShsKSxwPTA7cDxsOysrcCkoYz1zW3BdfHxmW3BdKSYmKGhbcF09Yyk7Zm9yKDthPHI7KythKXVbYV09blthXTtyZXR1cm4gbmV3IHFuKHUsdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBrbCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxuPXRoaXMuX2lkLGU9VW4oKSxyPXRoaXMuX2dyb3VwcyxpPXIubGVuZ3RoLG89MDtvPGk7KytvKWZvcih2YXIgdSxhPXJbb10sYz1hLmxlbmd0aCxzPTA7czxjOysrcylpZih1PWFbc10pe3ZhciBmPXpuKHUsbik7RW4odSx0LGUscyxhLHt0aW1lOmYudGltZStmLmRlbGF5K2YuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjpmLmR1cmF0aW9uLGVhc2U6Zi5lYXNlfSl9cmV0dXJuIG5ldyBxbihyLHRoaXMuX3BhcmVudHMsdCxlKX0sY2FsbDpFbC5jYWxsLG5vZGVzOkVsLm5vZGVzLG5vZGU6RWwubm9kZSxzaXplOkVsLnNpemUsZW1wdHk6RWwuZW1wdHksZWFjaDpFbC5lYWNoLG9uOmZ1bmN0aW9uKHQsbil7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj96bih0aGlzLm5vZGUoKSxlKS5vbi5vbih0KTp0aGlzLmVhY2goZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbz1mdW5jdGlvbih0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpe3ZhciBuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYodD10LnNsaWNlKDAsbikpLCF0fHwic3RhcnQiPT09dH0pfShuKT9BbjpDbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1vKHRoaXMsdCksYT11Lm9uO2EhPT1yJiYoaT0ocj1hKS5jb3B5KCkpLm9uKG4sZSksdS5vbj1pfX0oZSx0LG4pKX0sYXR0cjpmdW5jdGlvbih0LG4pe3ZhciBlPUUodCkscj0idHJhbnNmb3JtIj09PWU/UWY6TG47cmV0dXJuIHRoaXMuYXR0clR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/KGUubG9jYWw/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdSxhPWUodGhpcyk7aWYobnVsbCE9YSlyZXR1cm4odT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09YT9udWxsOnU9PT1yJiZhPT09aT9vOm89bihyPXUsaT1hKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvO3JldHVybiBmdW5jdGlvbigpe3ZhciB1LGE9ZSh0aGlzKTtpZihudWxsIT1hKXJldHVybih1PXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fSkoZSxyLFJuKHRoaXMsImF0dHIuIit0LG4pKTpudWxsPT1uPyhlLmxvY2FsP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUpOihlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PWU/bnVsbDpvPT09cj9pOmk9bihyPW8sZSl9fSkoZSxyLG4rIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uKHQsbil7dmFyIGU9ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4oZT10aGlzLnR3ZWVuKGUpKSYmZS5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihlLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjt2YXIgcj1FKHQpO3JldHVybiB0aGlzLnR3ZWVuKGUsKHIubG9jYWw/ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX06ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKCl7dmFyIGU9dGhpcyxyPW4uYXBwbHkoZSxhcmd1bWVudHMpO3JldHVybiByJiZmdW5jdGlvbihuKXtlLnNldEF0dHJpYnV0ZSh0LHIobikpfX1yZXR1cm4gZS5fdmFsdWU9bixlfSkocixuKSl9LHN0eWxlOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0idHJhbnNmb3JtIj09KHQrPSIiKT9HZjpMbjtyZXR1cm4gbnVsbD09bj90aGlzLnN0eWxlVHdlZW4odCxmdW5jdGlvbih0LG4pe3ZhciBlLHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1JKHRoaXMsdCksdT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxJKHRoaXMsdCkpO3JldHVybiBvPT09dT9udWxsOm89PT1lJiZ1PT09cj9pOmk9bihlPW8scj11KX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdT1JKHRoaXMsdCksYT1lKHRoaXMpO3JldHVybiBudWxsPT1hJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxhPUkodGhpcyx0KSksdT09PWE/bnVsbDp1PT09ciYmYT09PWk/bzpvPW4ocj11LGk9YSl9fSh0LHIsUm4odGhpcywic3R5bGUuIit0LG4pKTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1JKHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oUm4odGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgZSBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrZSE9PXQpcmV0dXJuO24mJm4ucmVtb3ZlQ2hpbGQodGhpcyl9fSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByLGk9em4odGhpcy5ub2RlKCksZSkudHdlZW4sbz0wLHU9aS5sZW5ndGg7bzx1OysrbylpZigocj1pW29dKS5uYW1lPT09dClyZXR1cm4gci52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQsbil7dmFyIGUscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1Dbih0aGlzLHQpLG89aS50d2VlbjtpZihvIT09ZSlmb3IodmFyIHU9MCxhPShyPWU9bykubGVuZ3RoO3U8YTsrK3UpaWYoclt1XS5uYW1lPT09bil7KHI9ci5zbGljZSgpKS5zcGxpY2UodSwxKTticmVha31pLnR3ZWVuPXJ9fTpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89Q24odGhpcyx0KSx1PW8udHdlZW47aWYodSE9PXIpe2k9KHI9dSkuc2xpY2UoKTtmb3IodmFyIGE9e25hbWU6bix2YWx1ZTplfSxjPTAscz1pLmxlbmd0aDtjPHM7KytjKWlmKGlbY10ubmFtZT09PW4pe2lbY109YTticmVha31jPT09cyYmaS5wdXNoKGEpfW8udHdlZW49aX19KShlLHQsbikpfSxkZWxheTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7QW4odGhpcyx0KS5kZWxheT0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7QW4odGhpcyx0KS5kZWxheT1ufX0pKG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7Q24odGhpcyx0KS5kdXJhdGlvbj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBuPStuLGZ1bmN0aW9uKCl7Q24odGhpcyx0KS5kdXJhdGlvbj1ufX0pKG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChmdW5jdGlvbih0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtDbih0aGlzLHQpLmVhc2U9bn19KG4sdCkpOnpuKHRoaXMubm9kZSgpLG4pLmVhc2V9fTt2YXIgQWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxDbD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDEtTWF0aC5wb3coMS10LG4pfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSx6bD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LG4pOjItTWF0aC5wb3coMi10LG4pKS8yfXJldHVybiBuPStuLGUuZXhwb25lbnQ9dCxlfSgzKSxQbD1NYXRoLlBJLFJsPVBsLzIsTGw9NC8xMSxxbD02LzExLERsPTgvMTEsVWw9Ljc1LE9sPTkvMTEsRmw9MTAvMTEsSWw9LjkzNzUsWWw9MjEvMjIsQmw9NjMvNjQsSGw9MS9MbC9MbCxqbD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIHQqdCooKG4rMSkqdC1uKX1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLFhsPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4tLXQqdCooKG4rMSkqdCtuKSsxfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksVmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8MT90KnQqKChuKzEpKnQtbik6KHQtPTIpKnQqKChuKzEpKnQrbikrMikvMn1yZXR1cm4gbj0rbixlLm92ZXJzaG9vdD10LGV9KDEuNzAxNTgpLCRsPTIqTWF0aC5QSSxXbD1mdW5jdGlvbiB0KG4sZSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0tdCkqTWF0aC5zaW4oKGktdCkvZSl9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz0kbCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSokbCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KDEsLjMpLFpsPWZ1bmN0aW9uIHQobixlKXtmdW5jdGlvbiByKHQpe3JldHVybiAxLW4qTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtpKS9lKX12YXIgaT1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPSRsKTtyZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKiRsKX0sci5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0scn0oMSwuMyksR2w9ZnVuY3Rpb24gdChuLGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuKCh0PTIqdC0xKTwwP24qTWF0aC5wb3coMiwxMCp0KSpNYXRoLnNpbigoaS10KS9lKToyLW4qTWF0aC5wb3coMiwtMTAqdCkqTWF0aC5zaW4oKGkrdCkvZSkpLzJ9dmFyIGk9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz0kbCk7cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4sZSokbCl9LHIucGVyaW9kPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4sZSl9LHJ9KDEsLjMpLFFsPXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpGbn07YXQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7UG4odGhpcyx0KX0pfSxhdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBxbj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVVuKCksKGU9UWwpLnRpbWU9bW4oKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciB1LGE9cltvXSxjPWEubGVuZ3RoLHM9MDtzPGM7KytzKSh1PWFbc10pJiZFbih1LHQsbixzLGEsZXx8am4odSxuKSk7cmV0dXJuIG5ldyBxbihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIEpsPVtudWxsXSxLbD17bmFtZToiZHJhZyJ9LHRoPXtuYW1lOiJzcGFjZSJ9LG5oPXtuYW1lOiJoYW5kbGUifSxlaD17bmFtZToiY2VudGVyIn0scmg9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChXbiksaW5wdXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdCYmW1t0WzBdLG5bMF1bMV1dLFt0WzFdLG5bMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LGloPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoV24pLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbblswXVswXSx0WzBdXSxbblsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxvaD17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoV24pLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSx1aD17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sYWg9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LGNoPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSxzaD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSxmaD17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfSxsaD1NYXRoLmNvcyxoaD1NYXRoLnNpbixwaD1NYXRoLlBJLGRoPXBoLzIsdmg9MipwaCxnaD1NYXRoLm1heCxfaD1BcnJheS5wcm90b3R5cGUuc2xpY2UseWg9TWF0aC5QSSxtaD0yKnloLHhoPW1oLTFlLTY7bmUucHJvdG90eXBlPWVlLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bmUsbW92ZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K24pfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIpe3RoaXMuXys9IlEiKyArdCsiLCIrICtuKyIsIisodGhpcy5feDE9K2UpKyIsIisodGhpcy5feTE9K3IpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArbisiLCIrICtlKyIsIisgK3IrIiwiKyh0aGlzLl94MT0raSkrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsbixlLHIsaSl7dD0rdCxuPStuLGU9K2Uscj0rcixpPStpO3ZhciBvPXRoaXMuX3gxLHU9dGhpcy5feTEsYT1lLXQsYz1yLW4scz1vLXQsZj11LW4sbD1zKnMrZipmO2lmKGk8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitpKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZSBpZihsPjFlLTYpaWYoTWF0aC5hYnMoZiphLWMqcyk+MWUtNiYmaSl7dmFyIGg9ZS1vLHA9ci11LGQ9YSphK2MqYyx2PWgqaCtwKnAsZz1NYXRoLnNxcnQoZCksXz1NYXRoLnNxcnQobCkseT1pKk1hdGgudGFuKCh5aC1NYXRoLmFjb3MoKGQrbC12KS8oMipnKl8pKSkvMiksbT15L18seD15L2c7TWF0aC5hYnMobS0xKT4xZS02JiYodGhpcy5fKz0iTCIrKHQrbSpzKSsiLCIrKG4rbSpmKSksdGhpcy5fKz0iQSIraSsiLCIraSsiLDAsMCwiKyArKGYqaD5zKnApKyIsIisodGhpcy5feDE9dCt4KmEpKyIsIisodGhpcy5feTE9bit4KmMpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9bik7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dD0rdCxuPStuO3ZhciB1PShlPStlKSpNYXRoLmNvcyhyKSxhPWUqTWF0aC5zaW4ociksYz10K3Uscz1uK2EsZj0xXm8sbD1vP3ItaTppLXI7aWYoZTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK2UpO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitjKyIsIitzOihNYXRoLmFicyh0aGlzLl94MS1jKT4xZS02fHxNYXRoLmFicyh0aGlzLl95MS1zKT4xZS02KSYmKHRoaXMuXys9IkwiK2MrIiwiK3MpLGUmJihsPDAmJihsPWwlbWgrbWgpLGw+eGg/dGhpcy5fKz0iQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0LXUpKyIsIisobi1hKSsiQSIrZSsiLCIrZSsiLDAsMSwiK2YrIiwiKyh0aGlzLl94MT1jKSsiLCIrKHRoaXMuX3kxPXMpOmw+MWUtNiYmKHRoaXMuXys9IkEiK2UrIiwiK2UrIiwwLCIrICsobD49eWgpKyIsIitmKyIsIisodGhpcy5feDE9dCtlKk1hdGguY29zKGkpKSsiLCIrKHRoaXMuX3kxPW4rZSpNYXRoLnNpbihpKSkpKX0scmVjdDpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K24pKyJoIisgK2UrInYiKyArcisiaCIrLWUrIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTtjZS5wcm90b3R5cGU9c2UucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjZSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIiQiK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIit0XX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXNbIiQiK3RdPW4sdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBuPSIkIit0O3JldHVybiBuIGluIHRoaXMmJmRlbGV0ZSB0aGlzW25dfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKSIkIj09PXRbMF0mJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdC5wdXNoKG4uc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2godGhpc1tuXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2goe2tleTpuLnNsaWNlKDEpLHZhbHVlOnRoaXNbbl19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKCIkIj09PXRbMF0pcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuIGluIHRoaXMpIiQiPT09blswXSYmdCh0aGlzW25dLG4uc2xpY2UoMSksdGhpcyl9fTt2YXIgYmg9c2UucHJvdG90eXBlO2RlLnByb3RvdHlwZT12ZS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmRlLGhhczpiaC5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0Kz0iIix0aGlzWyIkIit0XT10LHRoaXN9LHJlbW92ZTpiaC5yZW1vdmUsY2xlYXI6YmguY2xlYXIsdmFsdWVzOmJoLmtleXMsc2l6ZTpiaC5zaXplLGVtcHR5OmJoLmVtcHR5LGVhY2g6YmguZWFjaH07dmFyIHdoPXt9LE1oPXt9LFRoPTM0LE5oPTEwLGtoPTEzLFNoPV9lKCIsIiksRWg9U2gucGFyc2UsQWg9U2gucGFyc2VSb3dzLENoPVNoLmZvcm1hdCx6aD1TaC5mb3JtYXRSb3dzLFBoPV9lKCJcdCIpLFJoPVBoLnBhcnNlLExoPVBoLnBhcnNlUm93cyxxaD1QaC5mb3JtYXQsRGg9UGguZm9ybWF0Um93cyxVaD1UZS5wcm90b3R5cGU9TmUucHJvdG90eXBlO1VoLmNvcHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGU9bmV3IE5lKHRoaXMuX3gsdGhpcy5feSx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkscj10aGlzLl9yb290O2lmKCFyKXJldHVybiBlO2lmKCFyLmxlbmd0aClyZXR1cm4gZS5fcm9vdD1rZShyKSxlO2Zvcih0PVt7c291cmNlOnIsdGFyZ2V0OmUuX3Jvb3Q9bmV3IEFycmF5KDQpfV07cj10LnBvcCgpOylmb3IodmFyIGk9MDtpPDQ7KytpKShuPXIuc291cmNlW2ldKSYmKG4ubGVuZ3RoP3QucHVzaCh7c291cmNlOm4sdGFyZ2V0OnIudGFyZ2V0W2ldPW5ldyBBcnJheSg0KX0pOnIudGFyZ2V0W2ldPWtlKG4pKTtyZXR1cm4gZX0sVWguYWRkPWZ1bmN0aW9uKHQpe3ZhciBuPSt0aGlzLl94LmNhbGwobnVsbCx0KSxlPSt0aGlzLl95LmNhbGwobnVsbCx0KTtyZXR1cm4geGUodGhpcy5jb3ZlcihuLGUpLG4sZSx0KX0sVWguYWRkQWxsPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG89dC5sZW5ndGgsdT1uZXcgQXJyYXkobyksYT1uZXcgQXJyYXkobyksYz0xLzAscz0xLzAsZj0tMS8wLGw9LTEvMDtmb3IoZT0wO2U8bzsrK2UpaXNOYU4ocj0rdGhpcy5feC5jYWxsKG51bGwsbj10W2VdKSl8fGlzTmFOKGk9K3RoaXMuX3kuY2FsbChudWxsLG4pKXx8KHVbZV09cixhW2VdPWkscjxjJiYoYz1yKSxyPmYmJihmPXIpLGk8cyYmKHM9aSksaT5sJiYobD1pKSk7Zm9yKGY8YyYmKGM9dGhpcy5feDAsZj10aGlzLl94MSksbDxzJiYocz10aGlzLl95MCxsPXRoaXMuX3kxKSx0aGlzLmNvdmVyKGMscykuY292ZXIoZixsKSxlPTA7ZTxvOysrZSl4ZSh0aGlzLHVbZV0sYVtlXSx0W2VdKTtyZXR1cm4gdGhpc30sVWguY292ZXI9ZnVuY3Rpb24odCxuKXtpZihpc05hTih0PSt0KXx8aXNOYU4obj0rbikpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5feDAscj10aGlzLl95MCxpPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4oZSkpaT0oZT1NYXRoLmZsb29yKHQpKSsxLG89KHI9TWF0aC5mbG9vcihuKSkrMTtlbHNle2lmKCEoZT50fHx0Pml8fHI+bnx8bj5vKSlyZXR1cm4gdGhpczt2YXIgdSxhLGM9aS1lLHM9dGhpcy5fcm9vdDtzd2l0Y2goYT0objwocitvKS8yKTw8MXx0PChlK2kpLzIpe2Nhc2UgMDpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Msbz1yK2MsdD5pfHxuPm8pO2JyZWFrO2Nhc2UgMTpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMsbz1yK2MsZT50fHxuPm8pO2JyZWFrO2Nhc2UgMjpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsaT1lK2Mscj1vLWMsdD5pfHxyPm4pO2JyZWFrO2Nhc2UgMzpkb3t1PW5ldyBBcnJheSg0KSx1W2FdPXMscz11fXdoaWxlKGMqPTIsZT1pLWMscj1vLWMsZT50fHxyPm4pfXRoaXMuX3Jvb3QmJnRoaXMuX3Jvb3QubGVuZ3RoJiYodGhpcy5fcm9vdD1zKX1yZXR1cm4gdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzfSxVaC5kYXRhPWZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMudmlzaXQoZnVuY3Rpb24obil7aWYoIW4ubGVuZ3RoKWRve3QucHVzaChuLmRhdGEpfXdoaWxlKG49bi5uZXh0KX0pLHR9LFVoLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0sVWguZmluZD1mdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvLHUsYSxjLHMsZj10aGlzLl94MCxsPXRoaXMuX3kwLGg9dGhpcy5feDEscD10aGlzLl95MSxkPVtdLHY9dGhpcy5fcm9vdDtmb3IodiYmZC5wdXNoKG5ldyBiZSh2LGYsbCxoLHApKSxudWxsPT1lP2U9MS8wOihmPXQtZSxsPW4tZSxoPXQrZSxwPW4rZSxlKj1lKTtjPWQucG9wKCk7KWlmKCEoISh2PWMubm9kZSl8fChpPWMueDApPmh8fChvPWMueTApPnB8fCh1PWMueDEpPGZ8fChhPWMueTEpPGwpKWlmKHYubGVuZ3RoKXt2YXIgZz0oaSt1KS8yLF89KG8rYSkvMjtkLnB1c2gobmV3IGJlKHZbM10sZyxfLHUsYSksbmV3IGJlKHZbMl0saSxfLGcsYSksbmV3IGJlKHZbMV0sZyxvLHUsXyksbmV3IGJlKHZbMF0saSxvLGcsXykpLChzPShuPj1fKTw8MXx0Pj1nKSYmKGM9ZFtkLmxlbmd0aC0xXSxkW2QubGVuZ3RoLTFdPWRbZC5sZW5ndGgtMS1zXSxkW2QubGVuZ3RoLTEtc109Yyl9ZWxzZXt2YXIgeT10LSt0aGlzLl94LmNhbGwobnVsbCx2LmRhdGEpLG09bi0rdGhpcy5feS5jYWxsKG51bGwsdi5kYXRhKSx4PXkqeSttKm07aWYoeDxlKXt2YXIgYj1NYXRoLnNxcnQoZT14KTtmPXQtYixsPW4tYixoPXQrYixwPW4rYixyPXYuZGF0YX19cmV0dXJuIHJ9LFVoLnJlbW92ZT1mdW5jdGlvbih0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKHU9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgbixlLHIsaSxvLHUsYSxjLHMsZixsLGgscD10aGlzLl9yb290LGQ9dGhpcy5feDAsdj10aGlzLl95MCxnPXRoaXMuX3gxLF89dGhpcy5feTE7aWYoIXApcmV0dXJuIHRoaXM7aWYocC5sZW5ndGgpZm9yKDs7KXtpZigocz1vPj0oYT0oZCtnKS8yKSk/ZD1hOmc9YSwoZj11Pj0oYz0oditfKS8yKSk/dj1jOl89YyxuPXAsIShwPXBbbD1mPDwxfHNdKSlyZXR1cm4gdGhpcztpZighcC5sZW5ndGgpYnJlYWs7KG5bbCsxJjNdfHxuW2wrMiYzXXx8bltsKzMmM10pJiYoZT1uLGg9bCl9Zm9yKDtwLmRhdGEhPT10OylpZihyPXAsIShwPXAubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKGk9cC5uZXh0KSYmZGVsZXRlIHAubmV4dCxyPyhpP3IubmV4dD1pOmRlbGV0ZSByLm5leHQsdGhpcyk6bj8oaT9uW2xdPWk6ZGVsZXRlIG5bbF0sKHA9blswXXx8blsxXXx8blsyXXx8blszXSkmJnA9PT0oblszXXx8blsyXXx8blsxXXx8blswXSkmJiFwLmxlbmd0aCYmKGU/ZVtoXT1wOnRoaXMuX3Jvb3Q9cCksdGhpcyk6KHRoaXMuX3Jvb3Q9aSx0aGlzKX0sVWgucmVtb3ZlQWxsPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil0aGlzLnJlbW92ZSh0W25dKTtyZXR1cm4gdGhpc30sVWgucm9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSxVaC5zaXplPWZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97Kyt0fXdoaWxlKG49bi5uZXh0KX0pLHR9LFVoLnZpc2l0PWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhPVtdLGM9dGhpcy5fcm9vdDtmb3IoYyYmYS5wdXNoKG5ldyBiZShjLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7bj1hLnBvcCgpOylpZighdChjPW4ubm9kZSxyPW4ueDAsaT1uLnkwLG89bi54MSx1PW4ueTEpJiZjLmxlbmd0aCl7dmFyIHM9KHIrbykvMixmPShpK3UpLzI7KGU9Y1szXSkmJmEucHVzaChuZXcgYmUoZSxzLGYsbyx1KSksKGU9Y1syXSkmJmEucHVzaChuZXcgYmUoZSxyLGYscyx1KSksKGU9Y1sxXSkmJmEucHVzaChuZXcgYmUoZSxzLGksbyxmKSksKGU9Y1swXSkmJmEucHVzaChuZXcgYmUoZSxyLGkscyxmKSl9cmV0dXJuIHRoaXN9LFVoLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24odCl7dmFyIG4sZT1bXSxyPVtdO2Zvcih0aGlzLl9yb290JiZlLnB1c2gobmV3IGJlKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPWUucG9wKCk7KXt2YXIgaT1uLm5vZGU7aWYoaS5sZW5ndGgpe3ZhciBvLHU9bi54MCxhPW4ueTAsYz1uLngxLHM9bi55MSxmPSh1K2MpLzIsbD0oYStzKS8yOyhvPWlbMF0pJiZlLnB1c2gobmV3IGJlKG8sdSxhLGYsbCkpLChvPWlbMV0pJiZlLnB1c2gobmV3IGJlKG8sZixhLGMsbCkpLChvPWlbMl0pJiZlLnB1c2gobmV3IGJlKG8sdSxsLGYscykpLChvPWlbM10pJiZlLnB1c2gobmV3IGJlKG8sZixsLGMscykpfXIucHVzaChuKX1mb3IoO249ci5wb3AoKTspdChuLm5vZGUsbi54MCxuLnkwLG4ueDEsbi55MSk7cmV0dXJuIHRoaXN9LFVoLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxVaC55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIE9oLEZoPTEwLEloPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKSxZaD17IiI6ZnVuY3Rpb24odCxuKXt0OmZvcih2YXIgZSxyPSh0PXQudG9QcmVjaXNpb24obikpLmxlbmd0aCxpPTEsbz0tMTtpPHI7KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOm89ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PW8mJihvPWkpLGU9aTticmVhaztjYXNlImUiOmJyZWFrIHQ7ZGVmYXVsdDpvPjAmJihvPTApfXJldHVybiBvPjA/dC5zbGljZSgwLG8pK3Quc2xpY2UoZSsxKTp0fSwiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiBxZSgxMDAqdCxuKX0scjpxZSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9UmUodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKE9oPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSx1PXIubGVuZ3RoO3JldHVybiBvPT09dT9yOm8+dT9yK25ldyBBcnJheShvLXUrMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrUmUodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX0sQmg9L14oPzooLik/KFs8Pj1eXSkpPyhbK1wtXCggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8oW2EteiVdKT8kL2k7RGUucHJvdG90eXBlPVVlLnByb3RvdHlwZSxVZS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxsK3RoaXMuYWxpZ24rdGhpcy5zaWduK3RoaXMuc3ltYm9sKyh0aGlzLnplcm8/IjAiOiIiKSsobnVsbD09dGhpcy53aWR0aD8iIjpNYXRoLm1heCgxLDB8dGhpcy53aWR0aCkpKyh0aGlzLmNvbW1hPyIsIjoiIikrKG51bGw9PXRoaXMucHJlY2lzaW9uPyIiOiIuIitNYXRoLm1heCgwLDB8dGhpcy5wcmVjaXNpb24pKSt0aGlzLnR5cGV9O3ZhciBIaCxqaD1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07SWUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdfSksWGUucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpYZSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpe1ZlKHdwLHQsdGhpcy50KSxWZSh0aGlzLHdwLnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz13cC50OnRoaXMucz13cC50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBYaCxWaCwkaCxXaCxaaCxHaCxRaCxKaCxLaCx0cCxucCxlcCxycCxpcCxvcCx1cCxhcCxjcCxzcCxmcCxscCxocCxwcCxkcCx2cCxncCxfcCx5cCxtcCx4cCxicCx3cD1uZXcgWGUsTXA9MWUtNixUcD0xZS0xMixOcD1NYXRoLlBJLGtwPU5wLzIsU3A9TnAvNCxFcD0yKk5wLEFwPTE4MC9OcCxDcD1OcC8xODAsenA9TWF0aC5hYnMsUHA9TWF0aC5hdGFuLFJwPU1hdGguYXRhbjIsTHA9TWF0aC5jb3MscXA9TWF0aC5jZWlsLERwPU1hdGguZXhwLFVwPU1hdGgubG9nLE9wPU1hdGgucG93LEZwPU1hdGguc2luLElwPU1hdGguc2lnbnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ+MD8xOnQ8MD8tMTowfSxZcD1NYXRoLnNxcnQsQnA9TWF0aC50YW4sSHA9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtRZSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspUWUoZVtyXS5nZW9tZXRyeSxuKX19LGpwPXtTcGhlcmU6ZnVuY3Rpb24odCxuKXtuLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LG4pe3Q9dC5jb29yZGluYXRlcyxuLnBvaW50KHRbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspdD1lW3JdLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7SmUodC5jb29yZGluYXRlcyxuLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KUplKGVbcl0sbiwwKX0sUG9seWdvbjpmdW5jdGlvbih0LG4pe0tlKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspS2UoZVtyXSxuKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KVFlKGVbcl0sbil9fSxYcD1qZSgpLFZwPWplKCksJHA9e3BvaW50OkdlLGxpbmVTdGFydDpHZSxsaW5lRW5kOkdlLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1hwLnJlc2V0KCksJHAubGluZVN0YXJ0PW5yLCRwLmxpbmVFbmQ9ZXJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgdD0rWHA7VnAuYWRkKHQ8MD9FcCt0OnQpLHRoaXMubGluZVN0YXJ0PXRoaXMubGluZUVuZD10aGlzLnBvaW50PUdlfSxzcGhlcmU6ZnVuY3Rpb24oKXtWcC5hZGQoRXApfX0sV3A9amUoKSxacD17cG9pbnQ6aHIsbGluZVN0YXJ0OmRyLGxpbmVFbmQ6dnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WnAucG9pbnQ9Z3IsWnAubGluZVN0YXJ0PV9yLFpwLmxpbmVFbmQ9eXIsV3AucmVzZXQoKSwkcC5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpeyRwLnBvbHlnb25FbmQoKSxacC5wb2ludD1ocixacC5saW5lU3RhcnQ9ZHIsWnAubGluZUVuZD12cixYcDwwPyhHaD0tKEpoPTE4MCksUWg9LShLaD05MCkpOldwPk1wP0toPTkwOldwPC1NcCYmKFFoPS05MCksb3BbMF09R2gsb3BbMV09Smh9fSxHcD17c3BoZXJlOkdlLHBvaW50OndyLGxpbmVTdGFydDpUcixsaW5lRW5kOlNyLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe0dwLmxpbmVTdGFydD1FcixHcC5saW5lRW5kPUFyfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7R3AubGluZVN0YXJ0PVRyLEdwLmxpbmVFbmQ9U3J9fTtMci5pbnZlcnQ9THI7dmFyIFFwLEpwLEtwLHRkLG5kLGVkLHJkLGlkLG9kLHVkLGFkLGNkPWplKCksc2Q9V3IoZnVuY3Rpb24oKXtyZXR1cm4hMH0sZnVuY3Rpb24odCl7dmFyIG4sZT1OYU4scj1OYU4saT1OYU47cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksbj0xfSxwb2ludDpmdW5jdGlvbihvLHUpe3ZhciBhPW8+MD9OcDotTnAsYz16cChvLWUpO3pwKGMtTnApPE1wPyh0LnBvaW50KGUscj0ocit1KS8yPjA/a3A6LWtwKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KGEsciksdC5wb2ludChvLHIpLG49MCk6aSE9PWEmJmM+PU5wJiYoenAoZS1pKTxNcCYmKGUtPWkqTXApLHpwKG8tYSk8TXAmJihvLT1hKk1wKSxyPWZ1bmN0aW9uKHQsbixlLHIpe3ZhciBpLG8sdT1GcCh0LWUpO3JldHVybiB6cCh1KT5NcD9QcCgoRnAobikqKG89THAocikpKkZwKGUpLUZwKHIpKihpPUxwKG4pKSpGcCh0KSkvKGkqbyp1KSk6KG4rcikvMn0oZSxyLG8sdSksdC5wb2ludChpLHIpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChhLHIpLG49MCksdC5wb2ludChlPW8scj11KSxpPWF9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxlPXI9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLW59fX0sZnVuY3Rpb24odCxuLGUscil7dmFyIGk7aWYobnVsbD09dClpPWUqa3Asci5wb2ludCgtTnAsaSksci5wb2ludCgwLGkpLHIucG9pbnQoTnAsaSksci5wb2ludChOcCwwKSxyLnBvaW50KE5wLC1pKSxyLnBvaW50KDAsLWkpLHIucG9pbnQoLU5wLC1pKSxyLnBvaW50KC1OcCwwKSxyLnBvaW50KC1OcCxpKTtlbHNlIGlmKHpwKHRbMF0tblswXSk+TXApe3ZhciBvPXRbMF08blswXT9OcDotTnA7aT1lKm8vMixyLnBvaW50KC1vLGkpLHIucG9pbnQoMCxpKSxyLnBvaW50KG8saSl9ZWxzZSByLnBvaW50KG5bMF0sblsxXSl9LFstTnAsLWtwXSksZmQ9MWU5LGxkPS1mZCxoZD1qZSgpLHBkPXtzcGhlcmU6R2UscG9pbnQ6R2UsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7cGQucG9pbnQ9dGkscGQubGluZUVuZD1Lcn0sbGluZUVuZDpHZSxwb2x5Z29uU3RhcnQ6R2UscG9seWdvbkVuZDpHZX0sZGQ9W251bGwsbnVsbF0sdmQ9e3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmRkfSxnZD17RmVhdHVyZTpmdW5jdGlvbih0LG4pe3JldHVybiBpaSh0Lmdlb21ldHJ5LG4pfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmZlYXR1cmVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoaWkoZVtyXS5nZW9tZXRyeSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LF9kPXtTcGhlcmU6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sUG9pbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gb2kodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYob2koZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe3JldHVybiB1aSh0LmNvb3JkaW5hdGVzLG4pfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKHVpKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LFBvbHlnb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYWkodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihhaShlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYoaWkoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX19LHlkPWplKCksbWQ9amUoKSx4ZD17cG9pbnQ6R2UsbGluZVN0YXJ0OkdlLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eGQubGluZVN0YXJ0PWRpLHhkLmxpbmVFbmQ9X2l9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt4ZC5saW5lU3RhcnQ9eGQubGluZUVuZD14ZC5wb2ludD1HZSx5ZC5hZGQoenAobWQpKSxtZC5yZXNldCgpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD15ZC8yO3JldHVybiB5ZC5yZXNldCgpLHR9fSxiZD0xLzAsd2Q9YmQsTWQ9LWJkLFRkPU1kLE5kPXtwb2ludDpmdW5jdGlvbih0LG4pe3Q8YmQmJihiZD10KSx0Pk1kJiYoTWQ9dCksbjx3ZCYmKHdkPW4pLG4+VGQmJihUZD1uKX0sbGluZVN0YXJ0OkdlLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OkdlLHBvbHlnb25FbmQ6R2UscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9W1tiZCx3ZF0sW01kLFRkXV07cmV0dXJuIE1kPVRkPS0od2Q9YmQ9MS8wKSx0fX0sa2Q9MCxTZD0wLEVkPTAsQWQ9MCxDZD0wLHpkPTAsUGQ9MCxSZD0wLExkPTAscWQ9e3BvaW50OnlpLGxpbmVTdGFydDptaSxsaW5lRW5kOndpLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FkLmxpbmVTdGFydD1NaSxxZC5saW5lRW5kPVRpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cWQucG9pbnQ9eWkscWQubGluZVN0YXJ0PW1pLHFkLmxpbmVFbmQ9d2l9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PUxkP1tQZC9MZCxSZC9MZF06emQ/W0FkL3pkLENkL3pkXTpFZD9ba2QvRWQsU2QvRWRdOltOYU4sTmFOXTtyZXR1cm4ga2Q9U2Q9RWQ9QWQ9Q2Q9emQ9UGQ9UmQ9TGQ9MCx0fX07U2kucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsbiksdGhpcy5fY29udGV4dC5hcmModCxuLHRoaXMuX3JhZGl1cywwLEVwKX19LHJlc3VsdDpHZX07dmFyIERkLFVkLE9kLEZkLElkLFlkPWplKCksQmQ9e3BvaW50OkdlLGxpbmVTdGFydDpmdW5jdGlvbigpe0JkLnBvaW50PUVpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7RGQmJkFpKFVkLE9kKSxCZC5wb2ludD1HZX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGQ9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtEZD1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rWWQ7cmV0dXJuIFlkLnJlc2V0KCksdH19O0NpLnByb3RvdHlwZT17X3JhZGl1czo0LjUsX2NpcmNsZTp6aSg0LjUpLHBvaW50UmFkaXVzOmZ1bmN0aW9uKHQpe3JldHVybih0PSt0KSE9PXRoaXMuX3JhZGl1cyYmKHRoaXMuX3JhZGl1cz10LHRoaXMuX2NpcmNsZT1udWxsKSx0aGlzfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpezA9PT10aGlzLl9saW5lJiZ0aGlzLl9zdHJpbmcucHVzaCgiWiIpLHRoaXMuX3BvaW50PU5hTn0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fc3RyaW5nLnB1c2goIkwiLHQsIiwiLG4pO2JyZWFrO2RlZmF1bHQ6bnVsbD09dGhpcy5fY2lyY2xlJiYodGhpcy5fY2lyY2xlPXppKHRoaXMuX3JhZGl1cykpLHRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixuLHRoaXMuX2NpcmNsZSl9fSxyZXN1bHQ6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdHJpbmcubGVuZ3RoKXt2YXIgdD10aGlzLl9zdHJpbmcuam9pbigiIik7cmV0dXJuIHRoaXMuX3N0cmluZz1bXSx0fXJldHVybiBudWxsfX0sUmkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpSaSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fTt2YXIgSGQ9MTYsamQ9THAoMzAqQ3ApLFhkPVBpKHtwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuc3RyZWFtLnBvaW50KHQqQ3AsbipDcCl9fSksVmQ9VmkoZnVuY3Rpb24odCl7cmV0dXJuIFlwKDIvKDErdCkpfSk7VmQuaW52ZXJ0PSRpKGZ1bmN0aW9uKHQpe3JldHVybiAyKldlKHQvMil9KTt2YXIgJGQ9VmkoZnVuY3Rpb24odCl7cmV0dXJuKHQ9JGUodCkpJiZ0L0ZwKHQpfSk7JGQuaW52ZXJ0PSRpKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksV2kuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipQcChEcChuKSkta3BdfSxKaS5pbnZlcnQ9SmksdG8uaW52ZXJ0PSRpKFBwKSxlby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsdT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSt1KiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KnUpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrdSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSp1KSkpfXdoaWxlKHpwKGUpPk1wJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxyby5pbnZlcnQ9JGkoV2UpLGlvLmludmVydD0kaShmdW5jdGlvbih0KXtyZXR1cm4gMipQcCh0KX0pLG9vLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKlBwKERwKHQpKS1rcF19LHZvLnByb3RvdHlwZT1mby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnZvLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHNvKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsdT1bb107ZG97Zm9yKG49dS5yZXZlcnNlKCksdT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKXUucHVzaChlW3JdKX13aGlsZSh1Lmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSx1PVtdO2k9by5wb3AoKTspaWYodS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPXUucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZm8odGhpcykuZWFjaEJlZm9yZShobyl9fTt2YXIgV2Q9QXJyYXkucHJvdG90eXBlLnNsaWNlLFpkPSIkIixHZD17ZGVwdGg6LTF9LFFkPXt9O0hvLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZvLnByb3RvdHlwZSk7dmFyIEpkPSgxK01hdGguc3FydCg1KSkvMixLZD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCxlLHIsaSxvKXtYbyhuLHQsZSxyLGksbyl9cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oSmQpLHR2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUscixpLG8pe2lmKCh1PXQuX3NxdWFyaWZ5KSYmdS5yYXRpbz09PW4pZm9yKHZhciB1LGEsYyxzLGYsbD0tMSxoPXUubGVuZ3RoLHA9dC52YWx1ZTsrK2w8aDspe2ZvcihjPShhPXVbbF0pLmNoaWxkcmVuLHM9YS52YWx1ZT0wLGY9Yy5sZW5ndGg7czxmOysrcylhLnZhbHVlKz1jW3NdLnZhbHVlO2EuZGljZT9xbyhhLGUscixpLHIrPShvLXIpKmEudmFsdWUvcCk6am8oYSxlLHIsZSs9KGktZSkqYS52YWx1ZS9wLG8pLHAtPWEudmFsdWV9ZWxzZSB0Ll9zcXVhcmlmeT11PVhvKG4sdCxlLHIsaSxvKSx1LnJhdGlvPW59cmV0dXJuIGUucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIHQoKG49K24pPjE/bjoxKX0sZX0oSmQpLG52PVtdLnNsaWNlLGV2PXt9O1pvLnByb3RvdHlwZT1Lby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlpvLGRlZmVyOmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJkZWZlciBhZnRlciBhd2FpdCIpO2lmKG51bGwhPXRoaXMuX2Vycm9yKXJldHVybiB0aGlzO3ZhciBuPW52LmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiBuLnB1c2godCksKyt0aGlzLl93YWl0aW5nLHRoaXMuX3Rhc2tzLnB1c2gobiksR28odGhpcyksdGhpc30sYWJvcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbD09dGhpcy5fZXJyb3ImJlFvKHRoaXMsbmV3IEVycm9yKCJhYm9ydCIpKSx0aGlzfSxhd2FpdDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD1mdW5jdGlvbihuLGUpe3QuYXBwbHkobnVsbCxbbl0uY29uY2F0KGUpKX0sSm8odGhpcyksdGhpc30sYXdhaXRBbGw6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7cmV0dXJuIHRoaXMuX2NhbGw9dCxKbyh0aGlzKSx0aGlzfX07dmFyIHJ2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0dSksaXY9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0dSksb3Y9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9aXYuc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odHUpLHV2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHR1KSxhdj1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9dXYuc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odHUpLGN2PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHR1KSxzdj1ldSgidGV4dC9odG1sIixmdW5jdGlvbih0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQodC5yZXNwb25zZVRleHQpfSksZnY9ZXUoImFwcGxpY2F0aW9uL2pzb24iLGZ1bmN0aW9uKHQpe3JldHVybiBKU09OLnBhcnNlKHQucmVzcG9uc2VUZXh0KX0pLGx2PWV1KCJ0ZXh0L3BsYWluIixmdW5jdGlvbih0KXtyZXR1cm4gdC5yZXNwb25zZVRleHR9KSxodj1ldSgiYXBwbGljYXRpb24veG1sIixmdW5jdGlvbih0KXt2YXIgbj10LnJlc3BvbnNlWE1MO2lmKCFuKXRocm93IG5ldyBFcnJvcigicGFyc2UgZXJyb3IiKTtyZXR1cm4gbn0pLHB2PXJ1KCJ0ZXh0L2NzdiIsRWgpLGR2PXJ1KCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIixSaCksdnY9QXJyYXkucHJvdG90eXBlLGd2PXZ2Lm1hcCxfdj12di5zbGljZSx5dj17bmFtZToiaW1wbGljaXQifSxtdj1bMCwxXSx4dj1uZXcgRGF0ZSxidj1uZXcgRGF0ZSx3dj1DdShmdW5jdGlvbigpe30sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3Qrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4tdH0pO3d2LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksaXNGaW5pdGUodCkmJnQ+MD90PjE/Q3UoZnVuY3Rpb24obil7bi5zZXRUaW1lKE1hdGguZmxvb3Iobi90KSp0KX0sZnVuY3Rpb24obixlKXtuLnNldFRpbWUoK24rZSp0KX0sZnVuY3Rpb24obixlKXtyZXR1cm4oZS1uKS90fSk6d3Y6bnVsbH07dmFyIE12PXd2LnJhbmdlLFR2PTZlNCxOdj02MDQ4ZTUsa3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXRUaW1lKDFlMypNYXRoLmZsb29yKHQvMWUzKSl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzFlMypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS8xZTN9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pLFN2PWt2LnJhbmdlLEV2PUN1KGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvVHYpKlR2KX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipUdil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVHZ9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1pbnV0ZXMoKX0pLEF2PUV2LnJhbmdlLEN2PUN1KGZ1bmN0aW9uKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKSpUdiUzNmU1O248MCYmKG4rPTM2ZTUpLHQuc2V0VGltZSgzNmU1Kk1hdGguZmxvb3IoKCt0LW4pLzM2ZTUpK24pfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCszNmU1Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzM2ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSx6dj1Ddi5yYW5nZSxQdj1DdShmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0RGF0ZSh0LmdldERhdGUoKStuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpUdikvODY0ZTV9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSksUnY9UHYucmFuZ2UsTHY9enUoMCkscXY9enUoMSksRHY9enUoMiksVXY9enUoMyksT3Y9enUoNCksRnY9enUoNSksSXY9enUoNiksWXY9THYucmFuZ2UsQnY9cXYucmFuZ2UsSHY9RHYucmFuZ2UsanY9VXYucmFuZ2UsWHY9T3YucmFuZ2UsVnY9RnYucmFuZ2UsJHY9SXYucmFuZ2UsV3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksWnY9V3YucmFuZ2UsR3Y9Q3UoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtHdi5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0N1KGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBRdj1Hdi5yYW5nZSxKdj1DdShmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipUdil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVHZ9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLEt2PUp2LnJhbmdlLHRnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLG5nPXRnLnJhbmdlLGVnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLHJnPWVnLnJhbmdlLGlnPVB1KDApLG9nPVB1KDEpLHVnPVB1KDIpLGFnPVB1KDMpLGNnPVB1KDQpLHNnPVB1KDUpLGZnPVB1KDYpLGxnPWlnLnJhbmdlLGhnPW9nLnJhbmdlLHBnPXVnLnJhbmdlLGRnPWFnLnJhbmdlLHZnPWNnLnJhbmdlLGdnPXNnLnJhbmdlLF9nPWZnLnJhbmdlLHlnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLG1nPXlnLnJhbmdlLHhnPUN1KGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7eGcuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9DdShmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgYmcsd2c9eGcucmFuZ2UsTWc9eyItIjoiIixfOiIgIiwwOiIwIn0sVGc9L15ccypcZCsvLE5nPS9eJS8sa2c9L1tcXF4kKis/fFtcXSgpLnt9XS9nO0hhKHtkYXRlVGltZToiJXgsICVYIixkYXRlOiIlLW0vJS1kLyVZIix0aW1lOiIlLUk6JU06JVMgJXAiLHBlcmlvZHM6WyJBTSIsIlBNIl0sZGF5czpbIlN1bmRheSIsIk1vbmRheSIsIlR1ZXNkYXkiLCJXZWRuZXNkYXkiLCJUaHVyc2RheSIsIkZyaWRheSIsIlNhdHVyZGF5Il0sc2hvcnREYXlzOlsiU3VuIiwiTW9uIiwiVHVlIiwiV2VkIiwiVGh1IiwiRnJpIiwiU2F0Il0sbW9udGhzOlsiSmFudWFyeSIsIkZlYnJ1YXJ5IiwiTWFyY2giLCJBcHJpbCIsIk1heSIsIkp1bmUiLCJKdWx5IiwiQXVndXN0IiwiU2VwdGVtYmVyIiwiT2N0b2JlciIsIk5vdmVtYmVyIiwiRGVjZW1iZXIiXSxzaG9ydE1vbnRoczpbIkphbiIsIkZlYiIsIk1hciIsIkFwciIsIk1heSIsIkp1biIsIkp1bCIsIkF1ZyIsIlNlcCIsIk9jdCIsIk5vdiIsIkRlYyJdfSk7dmFyIFNnPSIlWS0lbS0lZFQlSDolTTolUy4lTFoiLEVnPURhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nP2Z1bmN0aW9uKHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OnQudXRjRm9ybWF0KFNnKSxBZz0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoU2cpLENnPTFlMyx6Zz02MCpDZyxQZz02MCp6ZyxSZz0yNCpQZyxMZz03KlJnLHFnPTMwKlJnLERnPTM2NSpSZyxVZz0kYSgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksT2c9JGEoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLEZnPSRhKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxJZz0kYSgiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IiksWWc9YWwoJHQoMzAwLC41LDApLCR0KC0yNDAsLjUsMSkpLEJnPWFsKCR0KC0xMDAsLjc1LC4zNSksJHQoODAsMS41LC44KSksSGc9YWwoJHQoMjYwLC43NSwuMzUpLCR0KDgwLDEuNSwuOCkpLGpnPSR0KCksWGc9V2EoJGEoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxWZz1XYSgkYSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLCRnPVdhKCRhKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksV2c9V2EoJGEoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKSxaZz1NYXRoLmFicyxHZz1NYXRoLmF0YW4yLFFnPU1hdGguY29zLEpnPU1hdGgubWF4LEtnPU1hdGgubWluLHRfPU1hdGguc2luLG5fPU1hdGguc3FydCxlXz0xZS0xMixyXz1NYXRoLlBJLGlfPXJfLzIsb189MipyXztpYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgdV89cGMob2MpO2hjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGFfPUFycmF5LnByb3RvdHlwZS5zbGljZSxjXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3JfKTt0Lm1vdmVUbyhlLDApLHQuYXJjKDAsMCxlLDAsb18pfX0sc189e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobi81KS8yO3QubW92ZVRvKC0zKmUsLWUpLHQubGluZVRvKC1lLC1lKSx0LmxpbmVUbygtZSwtMyplKSx0LmxpbmVUbyhlLC0zKmUpLHQubGluZVRvKGUsLWUpLHQubGluZVRvKDMqZSwtZSksdC5saW5lVG8oMyplLGUpLHQubGluZVRvKGUsZSksdC5saW5lVG8oZSwzKmUpLHQubGluZVRvKC1lLDMqZSksdC5saW5lVG8oLWUsZSksdC5saW5lVG8oLTMqZSxlKSx0LmNsb3NlUGF0aCgpfX0sZl89TWF0aC5zcXJ0KDEvMyksbF89MipmXyxoXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL2xfKSxyPWUqZl87dC5tb3ZlVG8oMCwtZSksdC5saW5lVG8ociwwKSx0LmxpbmVUbygwLGUpLHQubGluZVRvKC1yLDApLHQuY2xvc2VQYXRoKCl9fSxwXz1NYXRoLnNpbihyXy8xMCkvTWF0aC5zaW4oNypyXy8xMCksZF89TWF0aC5zaW4ob18vMTApKnBfLHZfPS1NYXRoLmNvcyhvXy8xMCkqcF8sZ189e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqbikscj1kXyplLGk9dl8qZTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLGkpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciB1PW9fKm8vNSxhPU1hdGguY29zKHUpLGM9TWF0aC5zaW4odSk7dC5saW5lVG8oYyplLC1hKmUpLHQubGluZVRvKGEqci1jKmksYypyK2EqaSl9dC5jbG9zZVBhdGgoKX19LF9fPXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4pLHI9LWUvMjt0LnJlY3QocixyLGUsZSl9fSx5Xz1NYXRoLnNxcnQoMyksbV89e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT0tTWF0aC5zcXJ0KG4vKDMqeV8pKTt0Lm1vdmVUbygwLDIqZSksdC5saW5lVG8oLXlfKmUsLWUpLHQubGluZVRvKHlfKmUsLWUpLHQuY2xvc2VQYXRoKCl9fSx4Xz1NYXRoLnNxcnQoMykvMixiXz0xL01hdGguc3FydCgxMiksd189MyooYl8vMisxKSxNXz17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuL3dfKSxyPWUvMixpPWUqYl8sbz1yLHU9ZSpiXytlLGE9LW8sYz11O3QubW92ZVRvKHIsaSksdC5saW5lVG8obyx1KSx0LmxpbmVUbyhhLGMpLHQubGluZVRvKC0uNSpyLXhfKmkseF8qcistLjUqaSksdC5saW5lVG8oLS41Km8teF8qdSx4XypvKy0uNSp1KSx0LmxpbmVUbygtLjUqYS14XypjLHhfKmErLS41KmMpLHQubGluZVRvKC0uNSpyK3hfKmksLS41KmkteF8qciksdC5saW5lVG8oLS41Km8reF8qdSwtLjUqdS14XypvKSx0LmxpbmVUbygtLjUqYSt4XypjLC0uNSpjLXhfKmEpLHQuY2xvc2VQYXRoKCl9fSxUXz1bY18sc18saF8sX18sZ18sbV8sTV9dO2tjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDM6TmModGhpcyx0aGlzLl94MSx0aGlzLl95MSk7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fY29udGV4dC5saW5lVG8oKDUqdGhpcy5feDArdGhpcy5feDEpLzYsKDUqdGhpcy5feTArdGhpcy5feTEpLzYpO2RlZmF1bHQ6TmModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bn19LFNjLnByb3RvdHlwZT17YXJlYVN0YXJ0OlRjLGFyZWFFbmQ6VGMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gyKzIqdGhpcy5feDMpLzMsKHRoaXMuX3kyKzIqdGhpcy5feTMpLzMpLHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MysyKnRoaXMuX3gyKS8zLCh0aGlzLl95MysyKnRoaXMuX3kyKS8zKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDI9dCx0aGlzLl95Mj1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gzPXQsdGhpcy5feTM9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94ND10LHRoaXMuX3k0PW4sdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNiwodGhpcy5feTArNCp0aGlzLl95MStuKS82KTticmVhaztkZWZhdWx0Ok5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxFYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Mzt2YXIgZT0odGhpcy5feDArNCp0aGlzLl94MSt0KS82LHI9KHRoaXMuX3kwKzQqdGhpcy5feTErbikvNjt0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKGUscik6dGhpcy5fY29udGV4dC5tb3ZlVG8oZSxyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0Ok5jKHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxBYy5wcm90b3R5cGU9e2xpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3g9W10sdGhpcy5feT1bXSx0aGlzLl9iYXNpcy5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3gsbj10aGlzLl95LGU9dC5sZW5ndGgtMTtpZihlPjApZm9yKHZhciByLGk9dFswXSxvPW5bMF0sdT10W2VdLWksYT1uW2VdLW8sYz0tMTsrK2M8PWU7KXI9Yy9lLHRoaXMuX2Jhc2lzLnBvaW50KHRoaXMuX2JldGEqdFtjXSsoMS10aGlzLl9iZXRhKSooaStyKnUpLHRoaXMuX2JldGEqbltjXSsoMS10aGlzLl9iZXRhKSoobytyKmEpKTt0aGlzLl94PXRoaXMuX3k9bnVsbCx0aGlzLl9iYXNpcy5saW5lRW5kKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX07dmFyIE5fPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gMT09PW4/bmV3IGtjKHQpOm5ldyBBYyh0LG4pfXJldHVybiBlLmJldGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguODUpO3pjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzpDYyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDE9dCx0aGlzLl95MT1uO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6Q2ModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBrXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyB6Yyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtQYy5wcm90b3R5cGU9e2FyZWFTdGFydDpUYyxhcmVhRW5kOlRjLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6Q2ModGhpcyx0LG4pfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciBTXz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG5ldyBQYyh0LG4pfXJldHVybiBlLnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSgwKTtSYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpDYyh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEVfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFJjKHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO3FjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6TGModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgQV89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBxYyh0LG4pOm5ldyB6Yyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO0RjLnByb3RvdHlwZT17YXJlYVN0YXJ0OlRjLGFyZWFFbmQ6VGMsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6TGModGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgQ189ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyBEYyh0LG4pOm5ldyBQYyh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO1VjLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpMYyh0aGlzLHQsbil9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9bn19O3ZhciB6Xz1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIG4/bmV3IFVjKHQsbik6bmV3IFJjKHQsMCl9cmV0dXJuIGUuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIHQoK24pfSxlfSguNSk7T2MucHJvdG90eXBlPXthcmVhU3RhcnQ6VGMsYXJlYUVuZDpUYyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxIYy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6QmModGhpcyx0aGlzLl90MCxZYyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZih0PSt0LG49K24sdCE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsQmModGhpcyxZYyh0aGlzLGU9SWModGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OkJjKHRoaXMsdGhpcy5fdDAsZT1JYyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChqYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIYy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe0hjLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sWGMucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0sVmMucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9JGModCksaT0kYyhuKSxvPTAsdT0xO3U8ZTsrK28sKyt1KXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbdV0sblt1XSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0sV2MucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0scnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpycyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PWFzKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYob3ModGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsdXModGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYodXModGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsb3ModGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCx1PXQuUjtpZihlPW8/dT9hcyh1KTpvOnUsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJnU/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PXU/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPXUsdS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsb3ModGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCx1cyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxvcyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsdXModGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxvcyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSx1cyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFBfLFJfLExfLHFfLERfLFVfPVtdLE9fPVtdLEZfPTFlLTYsSV89MWUtMTI7TnMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpOcyxwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZHMobix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyx1LGE9ZS5zaXRlLGM9LTEscz1uW2lbby0xXV0sZj1zLmxlZnQ9PT1hP3MucmlnaHQ6cy5sZWZ0OysrYzxvOyl1PWYsZj0ocz1uW2lbY11dKS5sZWZ0PT09YT9zLnJpZ2h0OnMubGVmdCx1JiZmJiZyPHUuaW5kZXgmJnI8Zi5pbmRleCYmTXMoYSx1LGYpPDAmJnQucHVzaChbYS5kYXRhLHUuZGF0YSxmLmRhdGFdKX0pLHR9LGxpbmtzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkubWFwKGZ1bmN0aW9uKHQpe3JldHVybntzb3VyY2U6dC5sZWZ0LmRhdGEsdGFyZ2V0OnQucmlnaHQuZGF0YX19KX0sZmluZDpmdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz10aGlzLHU9by5fZm91bmR8fDAsYT1vLmNlbGxzLmxlbmd0aDshKGk9by5jZWxsc1t1XSk7KWlmKCsrdT49YSlyZXR1cm4gbnVsbDt2YXIgYz10LWkuc2l0ZVswXSxzPW4taS5zaXRlWzFdLGY9YypjK3Mqcztkb3tpPW8uY2VsbHNbcj11XSx1PW51bGwsaS5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgcj1vLmVkZ2VzW2VdLGE9ci5sZWZ0O2lmKGEhPT1pLnNpdGUmJmF8fChhPXIucmlnaHQpKXt2YXIgYz10LWFbMF0scz1uLWFbMV0sbD1jKmMrcypzO2w8ZiYmKGY9bCx1PWEuaW5kZXgpfX0pfXdoaWxlKG51bGwhPT11KTtyZXR1cm4gby5fZm91bmQ9cixudWxsPT1lfHxmPD1lKmU/aS5zaXRlOm51bGx9fSxTcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlNzLHNjYWxlOmZ1bmN0aW9uKHQpe3JldHVybiAxPT09dD90aGlzOm5ldyBTcyh0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIDA9PT10JjA9PT1uP3RoaXM6bmV3IFNzKHRoaXMuayx0aGlzLngrdGhpcy5rKnQsdGhpcy55K3RoaXMuaypuKX0sYXBwbHk6ZnVuY3Rpb24odCl7cmV0dXJuW3RbMF0qdGhpcy5rK3RoaXMueCx0WzFdKnRoaXMuayt0aGlzLnldfSxhcHBseVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueH0sYXBwbHlZOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnl9LGludmVydDpmdW5jdGlvbih0KXtyZXR1cm5bKHRbMF0tdGhpcy54KS90aGlzLmssKHRbMV0tdGhpcy55KS90aGlzLmtdfSxpbnZlcnRYOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueCkvdGhpcy5rfSxpbnZlcnRZOmZ1bmN0aW9uKHQpe3JldHVybih0LXRoaXMueSkvdGhpcy5rfSxyZXNjYWxlWDpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHJlc2NhbGVZOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFksdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy54KyIsIit0aGlzLnkrIikgc2NhbGUoIit0aGlzLmsrIikifX07dmFyIFlfPW5ldyBTcygxLDAsMCk7RXMucHJvdG90eXBlPVNzLnByb3RvdHlwZSx0LnZlcnNpb249IjQuMTMuMCIsdC5iaXNlY3Q9T3MsdC5iaXNlY3RSaWdodD1Pcyx0LmJpc2VjdExlZnQ9RnMsdC5hc2NlbmRpbmc9bix0LmJpc2VjdG9yPWUsdC5jcm9zcz1mdW5jdGlvbih0LG4sZSl7dmFyIGksbyx1LGEsYz10Lmxlbmd0aCxzPW4ubGVuZ3RoLGY9bmV3IEFycmF5KGMqcyk7Zm9yKG51bGw9PWUmJihlPXIpLGk9dT0wO2k8YzsrK2kpZm9yKGE9dFtpXSxvPTA7bzxzOysrbywrK3UpZlt1XT1lKGEsbltvXSk7cmV0dXJuIGZ9LHQuZGVzY2VuZGluZz1mdW5jdGlvbih0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn0sdC5kZXZpYXRpb249dSx0LmV4dGVudD1hLHQuaGlzdG9ncmFtPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgaSxvLHU9dC5sZW5ndGgsYT1uZXcgQXJyYXkodSk7Zm9yKGk9MDtpPHU7KytpKWFbaV09bih0W2ldLGksdCk7dmFyIGM9ZShhKSxzPWNbMF0sbD1jWzFdLGg9cihhLHMsbCk7QXJyYXkuaXNBcnJheShoKXx8KGg9cChzLGwsaCksaD1mKE1hdGguY2VpbChzL2gpKmgsTWF0aC5mbG9vcihsL2gpKmgsaCkpO2Zvcih2YXIgZD1oLmxlbmd0aDtoWzBdPD1zOyloLnNoaWZ0KCksLS1kO2Zvcig7aFtkLTFdPmw7KWgucG9wKCksLS1kO3ZhciB2LGc9bmV3IEFycmF5KGQrMSk7Zm9yKGk9MDtpPD1kOysraSkodj1nW2ldPVtdKS54MD1pPjA/aFtpLTFdOnMsdi54MT1pPGQ/aFtpXTpsO2ZvcihpPTA7aTx1OysraSlzPD0obz1hW2ldKSYmbzw9bCYmZ1tPcyhoLG8sMCxkKV0ucHVzaCh0W2ldKTtyZXR1cm4gZ312YXIgbj1zLGU9YSxyPWQ7cmV0dXJuIHQudmFsdWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpjKGUpLHQpOm59LHQuZG9tYWluPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246YyhbblswXSxuWzFdXSksdCk6ZX0sdC50aHJlc2hvbGRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QXJyYXkuaXNBcnJheShuKT9jKFlzLmNhbGwobikpOmMobiksdCk6cn0sdH0sdC50aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzPWZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gdD1Ccy5jYWxsKHQsaSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKHYodCwuNzUpLXYodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqdSh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9ZCx0Lm1heD1mdW5jdGlvbih0LG4pe3ZhciBlLHIsaT10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PW4pe2Zvcig7KytvPGk7KWlmKG51bGwhPShlPXRbb10pJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPXRbb10pJiZlPnImJihyPWUpfWVsc2UgZm9yKDsrK288aTspaWYobnVsbCE9KGU9bih0W29dLG8sdCkpJiZlPj1lKWZvcihyPWU7KytvPGk7KW51bGwhPShlPW4odFtvXSxvLHQpKSYmZT5yJiYocj1lKTtyZXR1cm4gcn0sdC5tZWFuPWZ1bmN0aW9uKHQsbil7dmFyIGUscj10Lmxlbmd0aCxvPXIsdT0tMSxhPTA7aWYobnVsbD09bilmb3IoOysrdTxyOylpc05hTihlPWkodFt1XSkpPy0tbzphKz1lO2Vsc2UgZm9yKDsrK3U8cjspaXNOYU4oZT1pKG4odFt1XSx1LHQpKSk/LS1vOmErPWU7aWYobylyZXR1cm4gYS9vfSx0Lm1lZGlhbj1mdW5jdGlvbih0LGUpe3ZhciByLG89dC5sZW5ndGgsdT0tMSxhPVtdO2lmKG51bGw9PWUpZm9yKDsrK3U8bzspaXNOYU4ocj1pKHRbdV0pKXx8YS5wdXNoKHIpO2Vsc2UgZm9yKDsrK3U8bzspaXNOYU4ocj1pKGUodFt1XSx1LHQpKSl8fGEucHVzaChyKTtyZXR1cm4gdihhLnNvcnQobiksLjUpfSx0Lm1lcmdlPWcsdC5taW49Xyx0LnBhaXJzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49cik7Zm9yKHZhciBlPTAsaT10Lmxlbmd0aC0xLG89dFswXSx1PW5ldyBBcnJheShpPDA/MDppKTtlPGk7KXVbZV09bihvLG89dFsrK2VdKTtyZXR1cm4gdX0sdC5wZXJtdXRlPWZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT10W25bZV1dO3JldHVybiByfSx0LnF1YW50aWxlPXYsdC5yYW5nZT1mLHQuc2Nhbj1mdW5jdGlvbih0LGUpe2lmKHI9dC5sZW5ndGgpe3ZhciByLGksbz0wLHU9MCxhPXRbdV07Zm9yKG51bGw9PWUmJihlPW4pOysrbzxyOykoZShpPXRbb10sYSk8MHx8MCE9PWUoYSxhKSkmJihhPWksdT1vKTtyZXR1cm4gMD09PWUoYSxhKT91OnZvaWQgMH19LHQuc2h1ZmZsZT1mdW5jdGlvbih0LG4sZSl7Zm9yKHZhciByLGksbz0obnVsbD09ZT90Lmxlbmd0aDplKS0obj1udWxsPT1uPzA6K24pO287KWk9TWF0aC5yYW5kb20oKSpvLS18MCxyPXRbbytuXSx0W28rbl09dFtpK25dLHRbaStuXT1yO3JldHVybiB0fSx0LnN1bT1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT0tMSxvPTA7aWYobnVsbD09bilmb3IoOysraTxyOykoZT0rdFtpXSkmJihvKz1lKTtlbHNlIGZvcig7KytpPHI7KShlPStuKHRbaV0saSx0KSkmJihvKz1lKTtyZXR1cm4gb30sdC50aWNrcz1sLHQudGlja0luY3JlbWVudD1oLHQudGlja1N0ZXA9cCx0LnRyYW5zcG9zZT15LHQudmFyaWFuY2U9byx0LnppcD1mdW5jdGlvbigpe3JldHVybiB5KGFyZ3VtZW50cyl9LHQuYXhpc1RvcD1mdW5jdGlvbih0KXtyZXR1cm4gVCgkcyx0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIFQoV3MsdCl9LHQuYXhpc0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gVChacyx0KX0sdC5heGlzTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gVChHcyx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBLbihvaCl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIEtuKHJoKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gS24oaWgpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYSxjLHMsbCxoPXQubGVuZ3RoLHA9W10sZD1mKGgpLHY9W10sZz1bXSxfPWcuZ3JvdXBzPW5ldyBBcnJheShoKSx5PW5ldyBBcnJheShoKmgpO2ZvcihvPTAscz0tMTsrK3M8aDspe2Zvcih1PTAsbD0tMTsrK2w8aDspdSs9dFtzXVtsXTtwLnB1c2godSksdi5wdXNoKGYoaCkpLG8rPXV9Zm9yKGUmJmQuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKHBbdF0scFtuXSl9KSxyJiZ2LmZvckVhY2goZnVuY3Rpb24obixlKXtuLnNvcnQoZnVuY3Rpb24obixpKXtyZXR1cm4gcih0W2VdW25dLHRbZV1baV0pfSl9KSxjPShvPWdoKDAsdmgtbipoKS9vKT9uOnZoL2gsdT0wLHM9LTE7KytzPGg7KXtmb3IoYT11LGw9LTE7KytsPGg7KXt2YXIgbT1kW3NdLHg9dlttXVtsXSxiPXRbbV1beF0sdz11LE09dSs9YipvO3lbeCpoK21dPXtpbmRleDptLHN1YmluZGV4Ongsc3RhcnRBbmdsZTp3LGVuZEFuZ2xlOk0sdmFsdWU6Yn19X1ttXT17aW5kZXg6bSxzdGFydEFuZ2xlOmEsZW5kQW5nbGU6dSx2YWx1ZTpwW21dfSx1Kz1jfWZvcihzPS0xOysrczxoOylmb3IobD1zLTE7KytsPGg7KXt2YXIgVD15W2wqaCtzXSxOPXlbcypoK2xdOyhULnZhbHVlfHxOLnZhbHVlKSYmZy5wdXNoKFQudmFsdWU8Ti52YWx1ZT97c291cmNlOk4sdGFyZ2V0OlR9Ontzb3VyY2U6VCx0YXJnZXQ6Tn0pfXJldHVybiBpP2cuc29ydChpKTpnfXZhciBuPTAsZT1udWxsLHI9bnVsbCxpPW51bGw7cmV0dXJuIHQucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49Z2goMCxlKSx0KTpufSx0LnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0LnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0LnNvcnRDaG9yZHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/aT1udWxsOihpPWZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3JldHVybiB0KG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX19KG4pKS5fPW4sdCk6aSYmaS5ffSx0fSx0LnJpYmJvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdCxhPV9oLmNhbGwoYXJndW1lbnRzKSxjPW4uYXBwbHkodGhpcyxhKSxzPWUuYXBwbHkodGhpcyxhKSxmPStyLmFwcGx5KHRoaXMsKGFbMF09YyxhKSksbD1pLmFwcGx5KHRoaXMsYSktZGgsaD1vLmFwcGx5KHRoaXMsYSktZGgscD1mKmxoKGwpLGQ9ZipoaChsKSx2PStyLmFwcGx5KHRoaXMsKGFbMF09cyxhKSksZz1pLmFwcGx5KHRoaXMsYSktZGgsXz1vLmFwcGx5KHRoaXMsYSktZGg7aWYodXx8KHU9dD1lZSgpKSx1Lm1vdmVUbyhwLGQpLHUuYXJjKDAsMCxmLGwsaCksbD09PWcmJmg9PT1ffHwodS5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCx2KmxoKGcpLHYqaGgoZykpLHUuYXJjKDAsMCx2LGcsXykpLHUucXVhZHJhdGljQ3VydmVUbygwLDAscCxkKSx1LmNsb3NlUGF0aCgpLHQpcmV0dXJuIHU9bnVsbCx0KyIifHxudWxsfXZhciBuPXJlLGU9aWUscj1vZSxpPXVlLG89YWUsdT1udWxsO3JldHVybiB0LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnRlKCtuKSx0KTpyfSx0LnN0YXJ0QW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0ZSgrbiksdCk6aX0sdC5lbmRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnRlKCtuKSx0KTpvfSx0LnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1lLHQpOm59LHQudGFyZ2V0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW4sdCk6ZX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PW4/bnVsbDpuLHQpOnV9LHR9LHQubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobixpLHUsYSl7aWYoaT49by5sZW5ndGgpcmV0dXJuIG51bGwhPWUmJm4uc29ydChlKSxudWxsIT1yP3Iobik6bjtmb3IodmFyIGMscyxmLGw9LTEsaD1uLmxlbmd0aCxwPW9baSsrXSxkPXNlKCksdj11KCk7KytsPGg7KShmPWQuZ2V0KGM9cChzPW5bbF0pKyIiKSk/Zi5wdXNoKHMpOmQuc2V0KGMsW3NdKTtyZXR1cm4gZC5lYWNoKGZ1bmN0aW9uKG4sZSl7YSh2LGUsdChuLGksdSxhKSl9KSx2fWZ1bmN0aW9uIG4odCxlKXtpZigrK2U+by5sZW5ndGgpcmV0dXJuIHQ7dmFyIGksYT11W2UtMV07cmV0dXJuIG51bGwhPXImJmU+PW8ubGVuZ3RoP2k9dC5lbnRyaWVzKCk6KGk9W10sdC5lYWNoKGZ1bmN0aW9uKHQscil7aS5wdXNoKHtrZXk6cix2YWx1ZXM6bih0LGUpfSl9KSksbnVsbCE9YT9pLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gYSh0LmtleSxuLmtleSl9KTppfXZhciBlLHIsaSxvPVtdLHU9W107cmV0dXJuIGk9e29iamVjdDpmdW5jdGlvbihuKXtyZXR1cm4gdChuLDAsZmUsbGUpfSxtYXA6ZnVuY3Rpb24obil7cmV0dXJuIHQobiwwLGhlLHBlKX0sZW50cmllczpmdW5jdGlvbihlKXtyZXR1cm4gbih0KGUsMCxoZSxwZSksMCl9LGtleTpmdW5jdGlvbih0KXtyZXR1cm4gby5wdXNoKHQpLGl9LHNvcnRLZXlzOmZ1bmN0aW9uKHQpe3JldHVybiB1W28ubGVuZ3RoLTFdPXQsaX0sc29ydFZhbHVlczpmdW5jdGlvbih0KXtyZXR1cm4gZT10LGl9LHJvbGx1cDpmdW5jdGlvbih0KXtyZXR1cm4gcj10LGl9fX0sdC5zZXQ9dmUsdC5tYXA9c2UsdC5rZXlzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaChlKTtyZXR1cm4gbn0sdC52YWx1ZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHRbZV0pO3JldHVybiBufSx0LmVudHJpZXM9ZnVuY3Rpb24odCl7dmFyIG49W107Zm9yKHZhciBlIGluIHQpbi5wdXNoKHtrZXk6ZSx2YWx1ZTp0W2VdfSk7cmV0dXJuIG59LHQuY29sb3I9RXQsdC5yZ2I9UHQsdC5oc2w9cXQsdC5sYWI9RnQsdC5oY2w9WHQsdC5jdWJlaGVsaXg9JHQsdC5kaXNwYXRjaD1OLHQuZHJhZz1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5vbigibW91c2Vkb3duLmRyYWciLGUpLmZpbHRlcihnKS5vbigidG91Y2hzdGFydC5kcmFnIixvKS5vbigidG91Y2htb3ZlLmRyYWciLHUpLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGEpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBlKCl7aWYoIWgmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj1jKCJtb3VzZSIsZC5hcHBseSh0aGlzLGFyZ3VtZW50cykscHQsdGhpcyxhcmd1bWVudHMpO24mJihjdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsciwhMCkub24oIm1vdXNldXAuZHJhZyIsaSwhMCksX3QodC5ldmVudC52aWV3KSx2dCgpLGw9ITEscz10LmV2ZW50LmNsaWVudFgsZj10LmV2ZW50LmNsaWVudFksbigic3RhcnQiKSl9fWZ1bmN0aW9uIHIoKXtpZihndCgpLCFsKXt2YXIgbj10LmV2ZW50LmNsaWVudFgtcyxlPXQuZXZlbnQuY2xpZW50WS1mO2w9bipuK2UqZT54fV8ubW91c2UoImRyYWciKX1mdW5jdGlvbiBpKCl7Y3QodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSx5dCh0LmV2ZW50LnZpZXcsbCksZ3QoKSxfLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBvKCl7aWYocC5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ZC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz1yLmxlbmd0aDtmb3Iobj0wO248bzsrK24pKGU9YyhyW25dLmlkZW50aWZpZXIsaSxkdCx0aGlzLGFyZ3VtZW50cykpJiYodnQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gdSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPV9bcltuXS5pZGVudGlmaWVyXSkmJihndCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYSgpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKGgmJmNsZWFyVGltZW91dChoKSxoPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtoPW51bGx9LDUwMCksbj0wO248aTsrK24pKGU9X1tyW25dLmlkZW50aWZpZXJdKSYmKHZ0KCksZSgiZW5kIikpfWZ1bmN0aW9uIGMoZSxyLGksbyx1KXt2YXIgYSxjLHMsZj1pKHIsZSksbD15LmNvcHkoKTtpZihpdChuZXcgeHQobiwiYmVmb3Jlc3RhcnQiLGEsZSxtLGZbMF0sZlsxXSwwLDAsbCksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXYuYXBwbHkobyx1KSkmJihjPWEueC1mWzBdfHwwLHM9YS55LWZbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQoaCl7dmFyIHAsZD1mO3N3aXRjaChoKXtjYXNlInN0YXJ0IjpfW2VdPXQscD1tKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBfW2VdLC0tbTtjYXNlImRyYWciOmY9aShyLGUpLHA9bX1pdChuZXcgeHQobixoLGEsZSxwLGZbMF0rYyxmWzFdK3MsZlswXS1kWzBdLGZbMV0tZFsxXSxsKSxsLmFwcGx5LGwsW2gsbyx1XSl9fXZhciBzLGYsbCxoLHA9YnQsZD13dCx2PU10LGc9VHQsXz17fSx5PU4oInN0YXJ0IiwiZHJhZyIsImVuZCIpLG09MCx4PTA7cmV0dXJuIG4uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXQoISF0KSxuKTpwfSxuLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om10KHQpLG4pOmR9LG4uc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om10KHQpLG4pOnZ9LG4udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6bXQoISF0KSxuKTpnfSxuLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9eS5vbi5hcHBseSh5LGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT15P246dH0sbi5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSh0PSt0KSp0LG4pOk1hdGguc3FydCh4KX0sbn0sdC5kcmFnRGlzYWJsZT1fdCx0LmRyYWdFbmFibGU9eXQsdC5kc3ZGb3JtYXQ9X2UsdC5jc3ZQYXJzZT1FaCx0LmNzdlBhcnNlUm93cz1BaCx0LmNzdkZvcm1hdD1DaCx0LmNzdkZvcm1hdFJvd3M9emgsdC50c3ZQYXJzZT1SaCx0LnRzdlBhcnNlUm93cz1MaCx0LnRzdkZvcm1hdD1xaCx0LnRzdkZvcm1hdFJvd3M9RGgsdC5lYXNlTGluZWFyPWZ1bmN0aW9uKHQpe3JldHVybit0fSx0LmVhc2VRdWFkPU9uLHQuZWFzZVF1YWRJbj1mdW5jdGlvbih0KXtyZXR1cm4gdCp0fSx0LmVhc2VRdWFkT3V0PWZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSx0LmVhc2VRdWFkSW5PdXQ9T24sdC5lYXNlQ3ViaWM9Rm4sdC5lYXNlQ3ViaWNJbj1mdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LHQuZWFzZUN1YmljT3V0PWZ1bmN0aW9uKHQpe3JldHVybi0tdCp0KnQrMX0sdC5lYXNlQ3ViaWNJbk91dD1Gbix0LmVhc2VQb2x5PXpsLHQuZWFzZVBvbHlJbj1BbCx0LmVhc2VQb2x5T3V0PUNsLHQuZWFzZVBvbHlJbk91dD16bCx0LmVhc2VTaW49SW4sdC5lYXNlU2luSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5jb3ModCpSbCl9LHQuZWFzZVNpbk91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zaW4odCpSbCl9LHQuZWFzZVNpbkluT3V0PUluLHQuZWFzZUV4cD1Zbix0LmVhc2VFeHBJbj1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5wb3coMiwxMCp0LTEwKX0sdC5lYXNlRXhwT3V0PWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGgucG93KDIsLTEwKnQpfSx0LmVhc2VFeHBJbk91dD1Zbix0LmVhc2VDaXJjbGU9Qm4sdC5lYXNlQ2lyY2xlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtdCp0KX0sdC5lYXNlQ2lyY2xlT3V0PWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfSx0LmVhc2VDaXJjbGVJbk91dD1Cbix0LmVhc2VCb3VuY2U9SG4sdC5lYXNlQm91bmNlSW49ZnVuY3Rpb24odCl7cmV0dXJuIDEtSG4oMS10KX0sdC5lYXNlQm91bmNlT3V0PUhuLHQuZWFzZUJvdW5jZUluT3V0PWZ1bmN0aW9uKHQpe3JldHVybigodCo9Mik8PTE/MS1IbigxLXQpOkhuKHQtMSkrMSkvMn0sdC5lYXNlQmFjaz1WbCx0LmVhc2VCYWNrSW49amwsdC5lYXNlQmFja091dD1YbCx0LmVhc2VCYWNrSW5PdXQ9VmwsdC5lYXNlRWxhc3RpYz1abCx0LmVhc2VFbGFzdGljSW49V2wsdC5lYXNlRWxhc3RpY091dD1abCx0LmVhc2VFbGFzdGljSW5PdXQ9R2wsdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe2Z1bmN0aW9uIGUoKXt2YXIgZSxpLG89ci5sZW5ndGgsdT0wLGE9MDtmb3IoZT0wO2U8bzsrK2UpdSs9KGk9cltlXSkueCxhKz1pLnk7Zm9yKHU9dS9vLXQsYT1hL28tbixlPTA7ZTxvOysrZSkoaT1yW2VdKS54LT11LGkueS09YX12YXIgcjtyZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksZS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dH0sZS54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLGUpOnR9LGUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxlKTpufSxlfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKCl7Zm9yKHZhciB0LG4scixjLHMsZixsLGg9aS5sZW5ndGgscD0wO3A8YTsrK3ApZm9yKG49VGUoaSxTZSxFZSkudmlzaXRBZnRlcihlKSx0PTA7dDxoOysrdClyPWlbdF0sZj1vW3IuaW5kZXhdLGw9ZipmLGM9ci54K3Iudngscz1yLnkrci52eSxuLnZpc2l0KGZ1bmN0aW9uKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLHA9ZitoO2lmKCFhKXJldHVybiBuPmMrcHx8aTxjLXB8fGU+cytwfHxvPHMtcDtpZihhLmluZGV4PnIuaW5kZXgpe3ZhciBkPWMtYS54LWEudngsdj1zLWEueS1hLnZ5LGc9ZCpkK3YqdjtnPHAqcCYmKDA9PT1kJiYoZD1tZSgpLGcrPWQqZCksMD09PXYmJih2PW1lKCksZys9dip2KSxnPShwLShnPU1hdGguc3FydChnKSkpL2cqdSxyLnZ4Kz0oZCo9ZykqKHA9KGgqPWgpLyhsK2gpKSxyLnZ5Kz0odio9ZykqcCxhLnZ4LT1kKihwPTEtcCksYS52eS09dipwKX19KX1mdW5jdGlvbiBlKHQpe2lmKHQuZGF0YSlyZXR1cm4gdC5yPW9bdC5kYXRhLmluZGV4XTtmb3IodmFyIG49dC5yPTA7bjw0Oysrbil0W25dJiZ0W25dLnI+dC5yJiYodC5yPXRbbl0ucil9ZnVuY3Rpb24gcigpe2lmKGkpe3ZhciBuLGUscj1pLmxlbmd0aDtmb3Iobz1uZXcgQXJyYXkociksbj0wO248cjsrK24pZT1pW25dLG9bZS5pbmRleF09K3QoZSxuLGkpfX12YXIgaSxvLHU9MSxhPTE7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKG51bGw9PXQ/MTordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQscigpfSxuLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3Qsbik6YX0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0rdCxuKTp1fSxuLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnllKCtlKSxyKCksbik6dH0sbn0sdC5mb3JjZUxpbms9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuKXtmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cDsrK2UpZm9yKHZhciBpLGEsYyxmLGwsaCxkLHY9MDt2PHI7Kyt2KWE9KGk9dFt2XSkuc291cmNlLGY9KGM9aS50YXJnZXQpLngrYy52eC1hLngtYS52eHx8bWUoKSxsPWMueStjLnZ5LWEueS1hLnZ5fHxtZSgpLGYqPWg9KChoPU1hdGguc3FydChmKmYrbCpsKSktdVt2XSkvaCpuKm9bdl0sbCo9aCxjLnZ4LT1mKihkPXNbdl0pLGMudnktPWwqZCxhLnZ4Kz1mKihkPTEtZCksYS52eSs9bCpkfWZ1bmN0aW9uIGUoKXtpZihhKXt2YXIgbixlLGw9YS5sZW5ndGgsaD10Lmxlbmd0aCxwPXNlKGEsZik7Zm9yKG49MCxjPW5ldyBBcnJheShsKTtuPGg7KytuKShlPXRbbl0pLmluZGV4PW4sIm9iamVjdCIhPXR5cGVvZiBlLnNvdXJjZSYmKGUuc291cmNlPUNlKHAsZS5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGUudGFyZ2V0JiYoZS50YXJnZXQ9Q2UocCxlLnRhcmdldCkpLGNbZS5zb3VyY2UuaW5kZXhdPShjW2Uuc291cmNlLmluZGV4XXx8MCkrMSxjW2UudGFyZ2V0LmluZGV4XT0oY1tlLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKG49MCxzPW5ldyBBcnJheShoKTtuPGg7KytuKWU9dFtuXSxzW25dPWNbZS5zb3VyY2UuaW5kZXhdLyhjW2Uuc291cmNlLmluZGV4XStjW2UudGFyZ2V0LmluZGV4XSk7bz1uZXcgQXJyYXkoaCkscigpLHU9bmV3IEFycmF5KGgpLGkoKX19ZnVuY3Rpb24gcigpe2lmKGEpZm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKW9bbl09K2wodFtuXSxuLHQpfWZ1bmN0aW9uIGkoKXtpZihhKWZvcih2YXIgbj0wLGU9dC5sZW5ndGg7bjxlOysrbil1W25dPStoKHRbbl0sbix0KX12YXIgbyx1LGEsYyxzLGY9QWUsbD1mdW5jdGlvbih0KXtyZXR1cm4gMS9NYXRoLm1pbihjW3Quc291cmNlLmluZGV4XSxjW3QudGFyZ2V0LmluZGV4XSl9LGg9eWUoMzApLHA9MTtyZXR1cm4gbnVsbD09dCYmKHQ9W10pLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXthPXQsZSgpfSxuLmxpbmtzPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PXIsZSgpLG4pOnR9LG4uaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9dCxuKTpmfSxuLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3Qsbik6cH0sbi5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnllKCt0KSxyKCksbik6bH0sbi5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnllKCt0KSxpKCksbik6aH0sbn0sdC5mb3JjZU1hbnlCb2R5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbixhPWkubGVuZ3RoLGM9VGUoaSx6ZSxQZSkudmlzaXRBZnRlcihlKTtmb3IodT10LG49MDtuPGE7KytuKW89aVtuXSxjLnZpc2l0KHIpfWZ1bmN0aW9uIG4oKXtpZihpKXt2YXIgdCxuLGU9aS5sZW5ndGg7Zm9yKGE9bmV3IEFycmF5KGUpLHQ9MDt0PGU7Kyt0KW49aVt0XSxhW24uaW5kZXhdPStjKG4sdCxpKX19ZnVuY3Rpb24gZSh0KXt2YXIgbixlLHIsaSxvLHU9MCxjPTA7aWYodC5sZW5ndGgpe2ZvcihyPWk9bz0wO288NDsrK28pKG49dFtvXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsYys9ZSxyKz1lKm4ueCxpKz1lKm4ueSk7dC54PXIvYyx0Lnk9aS9jfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9YVtuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gcih0LG4sZSxyKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgaT10Lngtby54LGM9dC55LW8ueSxoPXItbixwPWkqaStjKmM7aWYoaCpoL2w8cClyZXR1cm4gcDxmJiYoMD09PWkmJihpPW1lKCkscCs9aSppKSwwPT09YyYmKGM9bWUoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpLG8udngrPWkqdC52YWx1ZSp1L3Asby52eSs9Yyp0LnZhbHVlKnUvcCksITA7aWYoISh0Lmxlbmd0aHx8cD49Zikpeyh0LmRhdGEhPT1vfHx0Lm5leHQpJiYoMD09PWkmJihpPW1lKCkscCs9aSppKSwwPT09YyYmKGM9bWUoKSxwKz1jKmMpLHA8cyYmKHA9TWF0aC5zcXJ0KHMqcCkpKTtkb3t0LmRhdGEhPT1vJiYoaD1hW3QuZGF0YS5pbmRleF0qdS9wLG8udngrPWkqaCxvLnZ5Kz1jKmgpfXdoaWxlKHQ9dC5uZXh0KX19dmFyIGksbyx1LGEsYz15ZSgtMzApLHM9MSxmPTEvMCxsPS44MTtyZXR1cm4gdC5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2k9dCxuKCl9LHQuc3RyZW5ndGg9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTp5ZSgrZSksbigpLHQpOmN9LHQuZGlzdGFuY2VNaW49ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bipuLHQpOk1hdGguc3FydChzKX0sdC5kaXN0YW5jZU1heD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1uKm4sdCk6TWF0aC5zcXJ0KGYpfSx0LnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4qbix0KTpNYXRoLnNxcnQobCl9LHR9LHQuZm9yY2VSYWRpYWw9ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIodCl7Zm9yKHZhciByPTAsaT1vLmxlbmd0aDtyPGk7KytyKXt2YXIgYz1vW3JdLHM9Yy54LW58fDFlLTYsZj1jLnktZXx8MWUtNixsPU1hdGguc3FydChzKnMrZipmKSxoPShhW3JdLWwpKnVbcl0qdC9sO2MudngrPXMqaCxjLnZ5Kz1mKmh9fWZ1bmN0aW9uIGkoKXtpZihvKXt2YXIgbixlPW8ubGVuZ3RoO2Zvcih1PW5ldyBBcnJheShlKSxhPW5ldyBBcnJheShlKSxuPTA7bjxlOysrbilhW25dPSt0KG9bbl0sbixvKSx1W25dPWlzTmFOKGFbbl0pPzA6K2Mob1tuXSxuLG8pfX12YXIgbyx1LGEsYz15ZSguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKCt0KSksbnVsbD09biYmKG49MCksbnVsbD09ZSYmKGU9MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe289dCxpKCl9LHIuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5ZSgrdCksaSgpLHIpOmN9LHIucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246eWUoK24pLGkoKSxyKTp0fSxyLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0sci55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0LHIpOmV9LHJ9LHQuZm9yY2VTaW11bGF0aW9uPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIG4oKXtlKCkscC5jYWxsKCJ0aWNrIixvKSx1PGEmJihoLnN0b3AoKSxwLmNhbGwoImVuZCIsbykpfWZ1bmN0aW9uIGUoKXt2YXIgbixlLHI9dC5sZW5ndGg7Zm9yKHUrPShzLXUpKmMsbC5lYWNoKGZ1bmN0aW9uKHQpe3QodSl9KSxuPTA7bjxyOysrbiludWxsPT0oZT10W25dKS5meD9lLngrPWUudngqPWY6KGUueD1lLmZ4LGUudng9MCksbnVsbD09ZS5meT9lLnkrPWUudnkqPWY6KGUueT1lLmZ5LGUudnk9MCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgbixlPTAscj10Lmxlbmd0aDtlPHI7KytlKXtpZihuPXRbZV0sbi5pbmRleD1lLGlzTmFOKG4ueCl8fGlzTmFOKG4ueSkpe3ZhciBpPUZoKk1hdGguc3FydChlKSxvPWUqSWg7bi54PWkqTWF0aC5jb3Mobyksbi55PWkqTWF0aC5zaW4obyl9KGlzTmFOKG4udngpfHxpc05hTihuLnZ5KSkmJihuLnZ4PW4udnk9MCl9fWZ1bmN0aW9uIGkobil7cmV0dXJuIG4uaW5pdGlhbGl6ZSYmbi5pbml0aWFsaXplKHQpLG59dmFyIG8sdT0xLGE9LjAwMSxjPTEtTWF0aC5wb3coYSwxLzMwMCkscz0wLGY9LjYsbD1zZSgpLGg9d24obikscD1OKCJ0aWNrIiwiZW5kIik7cmV0dXJuIG51bGw9PXQmJih0PVtdKSxyKCksbz17dGljazplLHJlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gaC5yZXN0YXJ0KG4pLG99LHN0b3A6ZnVuY3Rpb24oKXtyZXR1cm4gaC5zdG9wKCksb30sbm9kZXM6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixyKCksbC5lYWNoKGkpLG8pOnR9LGFscGhhOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LG8pOnV9LGFscGhhTWluOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LG8pOmF9LGFscGhhRGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3Qsbyk6K2N9LGFscGhhVGFyZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LG8pOnN9LHZlbG9jaXR5RGVjYXk6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9MS10LG8pOjEtZn0sZm9yY2U6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhudWxsPT1uP2wucmVtb3ZlKHQpOmwuc2V0KHQsaShuKSksbyk6bC5nZXQodCl9LGZpbmQ6ZnVuY3Rpb24obixlLHIpe3ZhciBpLG8sdSxhLGMscz0wLGY9dC5sZW5ndGg7Zm9yKG51bGw9PXI/cj0xLzA6cio9cixzPTA7czxmOysrcykodT0oaT1uLShhPXRbc10pLngpKmkrKG89ZS1hLnkpKm8pPHImJihjPWEscj11KTtyZXR1cm4gY30sb246ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xPyhwLm9uKHQsbiksbyk6cC5vbih0KX19fSx0LmZvcmNlWD1mdW5jdGlvbih0KXtmdW5jdGlvbiBuKHQpe2Zvcih2YXIgbixlPTAsdT1yLmxlbmd0aDtlPHU7KytlKShuPXJbZV0pLnZ4Kz0ob1tlXS1uLngpKmlbZV0qdH1mdW5jdGlvbiBlKCl7aWYocil7dmFyIG4sZT1yLmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkoZSksbz1uZXcgQXJyYXkoZSksbj0wO248ZTsrK24paVtuXT1pc05hTihvW25dPSt0KHJbbl0sbixyKSk/MDordShyW25dLG4scil9fXZhciByLGksbyx1PXllKC4xKTtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9eWUobnVsbD09dD8wOit0KSksbi5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe3I9dCxlKCl9LG4uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp5ZSgrdCksZSgpLG4pOnV9LG4ueD1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOnllKCtyKSxlKCksbik6dH0sbn0sdC5mb3JjZVk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbih0KXtmb3IodmFyIG4sZT0wLHU9ci5sZW5ndGg7ZTx1OysrZSkobj1yW2VdKS52eSs9KG9bZV0tbi55KSppW2VdKnR9ZnVuY3Rpb24gZSgpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKWlbbl09aXNOYU4ob1tuXT0rdChyW25dLG4scikpPzA6K3UocltuXSxuLHIpfX12YXIgcixpLG8sdT15ZSguMSk7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXllKG51bGw9PXQ/MDordCkpLG4uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZSgpfSxuLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6eWUoK3QpLGUoKSxuKTp1fSxuLnk9ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIHI/cjp5ZSgrciksZSgpLG4pOnR9LG59LHQuZm9ybWF0RGVmYXVsdExvY2FsZT1JZSx0LmZvcm1hdExvY2FsZT1GZSx0LmZvcm1hdFNwZWNpZmllcj1EZSx0LnByZWNpc2lvbkZpeGVkPVllLHQucHJlY2lzaW9uUHJlZml4PUJlLHQucHJlY2lzaW9uUm91bmQ9SGUsdC5nZW9BcmVhPWZ1bmN0aW9uKHQpe3JldHVybiBWcC5yZXNldCgpLHRyKHQsJHApLDIqVnB9LHQuZ2VvQm91bmRzPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sdSxhO2lmKEtoPUpoPS0oR2g9UWg9MS8wKSxpcD1bXSx0cih0LFpwKSxlPWlwLmxlbmd0aCl7Zm9yKGlwLnNvcnQoeHIpLG49MSxvPVtyPWlwWzBdXTtuPGU7KytuKWJyKHIsKGk9aXBbbl0pWzBdKXx8YnIocixpWzFdKT8obXIoclswXSxpWzFdKT5tcihyWzBdLHJbMV0pJiYoclsxXT1pWzFdKSxtcihpWzBdLHJbMV0pPm1yKHJbMF0sclsxXSkmJihyWzBdPWlbMF0pKTpvLnB1c2gocj1pKTtmb3IodT0tMS8wLG49MCxyPW9bZT1vLmxlbmd0aC0xXTtuPD1lO3I9aSwrK24paT1vW25dLChhPW1yKHJbMV0saVswXSkpPnUmJih1PWEsR2g9aVswXSxKaD1yWzFdKX1yZXR1cm4gaXA9b3A9bnVsbCxHaD09PTEvMHx8UWg9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbR2gsUWhdLFtKaCxLaF1dfSx0Lmdlb0NlbnRyb2lkPWZ1bmN0aW9uKHQpe3VwPWFwPWNwPXNwPWZwPWxwPWhwPXBwPWRwPXZwPWdwPTAsdHIodCxHcCk7dmFyIG49ZHAsZT12cCxyPWdwLGk9bipuK2UqZStyKnI7cmV0dXJuIGk8VHAmJihuPWxwLGU9aHAscj1wcCxhcDxNcCYmKG49Y3AsZT1zcCxyPWZwKSwoaT1uKm4rZSplK3Iqcik8VHApP1tOYU4sTmFOXTpbUnAoZSxuKSpBcCxXZShyL1lwKGkpKSpBcF19LHQuZ2VvQ2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykqQ3AsYz1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpDcDtyZXR1cm4gbj1bXSxlPXFyKC10WzBdKkNwLC10WzFdKkNwLDApLmludmVydCxJcih1LGEsYywxKSx0PXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbbl19LG49ZT1udWxsLHR9dmFyIG4sZSxyPVByKFswLDBdKSxpPVByKDkwKSxvPVByKDYpLHU9e3BvaW50OmZ1bmN0aW9uKHQscil7bi5wdXNoKHQ9ZSh0LHIpKSx0WzBdKj1BcCx0WzFdKj1BcH19O3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlByKFsrblswXSwrblsxXV0pLHQpOnJ9LHQucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UHIoK24pLHQpOml9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UHIoK24pLHQpOm99LHR9LHQuZ2VvQ2xpcEFudGltZXJpZGlhbj1zZCx0Lmdlb0NsaXBDaXJjbGU9UXIsdC5nZW9DbGlwRXh0ZW50PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9MCxpPTAsbz05NjAsdT01MDA7cmV0dXJuIGU9e3N0cmVhbTpmdW5jdGlvbihlKXtyZXR1cm4gdCYmbj09PWU/dDp0PUpyKHIsaSxvLHUpKG49ZSl9LGV4dGVudDpmdW5jdGlvbihhKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rYVswXVswXSxpPSthWzBdWzFdLG89K2FbMV1bMF0sdT0rYVsxXVsxXSx0PW49bnVsbCxlKTpbW3IsaV0sW28sdV1dfX19LHQuZ2VvQ2xpcFJlY3RhbmdsZT1Kcix0Lmdlb0NvbnRhaW5zPWZ1bmN0aW9uKHQsbil7cmV0dXJuKHQmJmdkLmhhc093blByb3BlcnR5KHQudHlwZSk/Z2RbdC50eXBlXTppaSkodCxuKX0sdC5nZW9EaXN0YW5jZT1yaSx0Lmdlb0dyYXRpY3VsZT1oaSx0Lmdlb0dyYXRpY3VsZTEwPWZ1bmN0aW9uKCl7cmV0dXJuIGhpKCkoKX0sdC5nZW9JbnRlcnBvbGF0ZT1mdW5jdGlvbih0LG4pe3ZhciBlPXRbMF0qQ3Ascj10WzFdKkNwLGk9blswXSpDcCxvPW5bMV0qQ3AsdT1McChyKSxhPUZwKHIpLGM9THAobykscz1GcChvKSxmPXUqTHAoZSksbD11KkZwKGUpLGg9YypMcChpKSxwPWMqRnAoaSksZD0yKldlKFlwKFplKG8tcikrdSpjKlplKGktZSkpKSx2PUZwKGQpLGc9ZD9mdW5jdGlvbih0KXt2YXIgbj1GcCh0Kj1kKS92LGU9RnAoZC10KS92LHI9ZSpmK24qaCxpPWUqbCtuKnAsbz1lKmErbipzO3JldHVybltScChpLHIpKkFwLFJwKG8sWXAocipyK2kqaSkpKkFwXX06ZnVuY3Rpb24oKXtyZXR1cm5bZSpBcCxyKkFwXX07cmV0dXJuIGcuZGlzdGFuY2U9ZCxnfSx0Lmdlb0xlbmd0aD1laSx0Lmdlb1BhdGg9ZnVuY3Rpb24odCxuKXtmdW5jdGlvbiBlKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMoK28uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx0cih0LHIoaSkpKSxpLnJlc3VsdCgpfXZhciByLGksbz00LjU7cmV0dXJuIGUuYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKHhkKSkseGQucmVzdWx0KCl9LGUubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKEJkKSksQmQucmVzdWx0KCl9LGUuYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0cih0LHIoTmQpKSxOZC5yZXN1bHQoKX0sZS5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gdHIodCxyKHFkKSkscWQucmVzdWx0KCl9LGUucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uPyh0PW51bGwscGkpOih0PW4pLnN0cmVhbSxlKTp0fSxlLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8obj1udWxsLG5ldyBDaSk6bmV3IFNpKG49dCksImZ1bmN0aW9uIiE9dHlwZW9mIG8mJmkucG9pbnRSYWRpdXMobyksZSk6bn0sZS5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksZSk6b30sZS5wcm9qZWN0aW9uKHQpLmNvbnRleHQobil9LHQuZ2VvQWxiZXJzPVhpLHQuZ2VvQWxiZXJzVXNhPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgbj10WzBdLGU9dFsxXTtyZXR1cm4gYT1udWxsLGkucG9pbnQobixlKSxhfHwoby5wb2ludChuLGUpLGEpfHwodS5wb2ludChuLGUpLGEpfWZ1bmN0aW9uIG4oKXtyZXR1cm4gZT1yPW51bGwsdH12YXIgZSxyLGksbyx1LGEsYz1YaSgpLHM9amkoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGY9amkoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksbD17cG9pbnQ6ZnVuY3Rpb24odCxuKXthPVt0LG5dfX07cmV0dXJuIHQuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBuPWMuc2NhbGUoKSxlPWMudHJhbnNsYXRlKCkscj0odFswXS1lWzBdKS9uLGk9KHRbMV0tZVsxXSkvbjtyZXR1cm4oaT49LjEyJiZpPC4yMzQmJnI+PS0uNDI1JiZyPC0uMjE0P3M6aT49LjE2NiYmaTwuMjM0JiZyPj0tLjIxNCYmcjwtLjExNT9mOmMpLmludmVydCh0KX0sdC5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGUmJnI9PT10P2U6ZT1mdW5jdGlvbih0KXt2YXIgbj10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24oZSxyKXtmb3IodmFyIGk9LTE7KytpPG47KXRbaV0ucG9pbnQoZSxyKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBlPS0xOysrZTxuOyl0W2VdLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGU9LTE7KytlPG47KXRbZV0ucG9seWdvbkVuZCgpfX19KFtjLnN0cmVhbShyPXQpLHMuc3RyZWFtKHQpLGYuc3RyZWFtKHQpXSl9LHQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjLnByZWNpc2lvbih0KSxzLnByZWNpc2lvbih0KSxmLnByZWNpc2lvbih0KSxuKCkpOmMucHJlY2lzaW9uKCl9LHQuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGMuc2NhbGUobikscy5zY2FsZSguMzUqbiksZi5zY2FsZShuKSx0LnRyYW5zbGF0ZShjLnRyYW5zbGF0ZSgpKSk6Yy5zY2FsZSgpfSx0LnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYy50cmFuc2xhdGUoKTt2YXIgZT1jLnNjYWxlKCkscj0rdFswXSxhPSt0WzFdO3JldHVybiBpPWMudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tyLS40NTUqZSxhLS4yMzgqZV0sW3IrLjQ1NSplLGErLjIzOCplXV0pLnN0cmVhbShsKSxvPXMudHJhbnNsYXRlKFtyLS4zMDcqZSxhKy4yMDEqZV0pLmNsaXBFeHRlbnQoW1tyLS40MjUqZStNcCxhKy4xMiplK01wXSxbci0uMjE0KmUtTXAsYSsuMjM0KmUtTXBdXSkuc3RyZWFtKGwpLHU9Zi50cmFuc2xhdGUoW3ItLjIwNSplLGErLjIxMiplXSkuY2xpcEV4dGVudChbW3ItLjIxNCplK01wLGErLjE2NiplK01wXSxbci0uMTE1KmUtTXAsYSsuMjM0KmUtTXBdXSkuc3RyZWFtKGwpLG4oKX0sdC5maXRFeHRlbnQ9ZnVuY3Rpb24obixlKXtyZXR1cm4gcWkodCxuLGUpfSx0LmZpdFNpemU9ZnVuY3Rpb24obixlKXtyZXR1cm4gRGkodCxuLGUpfSx0LmZpdFdpZHRoPWZ1bmN0aW9uKG4sZSl7cmV0dXJuIFVpKHQsbixlKX0sdC5maXRIZWlnaHQ9ZnVuY3Rpb24obixlKXtyZXR1cm4gT2kodCxuLGUpfSx0LnNjYWxlKDEwNzApfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBJaShWZCkuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3PVZkLHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gSWkoJGQpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sdC5nZW9BemltdXRoYWxFcXVpZGlzdGFudFJhdz0kZCx0Lmdlb0NvbmljQ29uZm9ybWFsPWZ1bmN0aW9uKCl7cmV0dXJuIEJpKFFpKS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfSx0Lmdlb0NvbmljQ29uZm9ybWFsUmF3PVFpLHQuZ2VvQ29uaWNFcXVhbEFyZWE9amksdC5nZW9Db25pY0VxdWFsQXJlYVJhdz1IaSx0Lmdlb0NvbmljRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gQmkoS2kpLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9LHQuZ2VvQ29uaWNFcXVpZGlzdGFudFJhdz1LaSx0Lmdlb0VxdWlyZWN0YW5ndWxhcj1mdW5jdGlvbigpe3JldHVybiBJaShKaSkuc2NhbGUoMTUyLjYzKX0sdC5nZW9FcXVpcmVjdGFuZ3VsYXJSYXc9SmksdC5nZW9Hbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiBJaSh0bykuc2NhbGUoMTQ0LjA0OSkuY2xpcEFuZ2xlKDYwKX0sdC5nZW9Hbm9tb25pY1Jhdz10byx0Lmdlb0lkZW50aXR5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3JldHVybiBpPW89bnVsbCx1fXZhciBuLGUscixpLG8sdSxhPTEsYz0wLHM9MCxmPTEsbD0xLGg9cGkscD1udWxsLGQ9cGk7cmV0dXJuIHU9e3N0cmVhbTpmdW5jdGlvbih0KXtyZXR1cm4gaSYmbz09PXQ/aTppPWgoZChvPXQpKX0scG9zdGNsaXA6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9aSxwPW49ZT1yPW51bGwsdCgpKTpkfSxjbGlwRXh0ZW50OmZ1bmN0aW9uKGkpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW51bGw9PWk/KHA9bj1lPXI9bnVsbCxwaSk6SnIocD0raVswXVswXSxuPStpWzBdWzFdLGU9K2lbMV1bMF0scj0raVsxXVsxXSksdCgpKTpudWxsPT1wP251bGw6W1twLG5dLFtlLHJdXX0sc2NhbGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oKGE9K24pKmYsYSpsLGMscyksdCgpKTphfSx0cmFuc2xhdGU6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oYSpmLGEqbCxjPStuWzBdLHM9K25bMV0pLHQoKSk6W2Msc119LHJlZmxlY3RYOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW5vKGEqKGY9bj8tMToxKSxhKmwsYyxzKSx0KCkpOmY8MH0scmVmbGVjdFk6ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9bm8oYSpmLGEqKGw9bj8tMToxKSxjLHMpLHQoKSk6bDwwfSxmaXRFeHRlbnQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gcWkodSx0LG4pfSxmaXRTaXplOmZ1bmN0aW9uKHQsbil7cmV0dXJuIERpKHUsdCxuKX0sZml0V2lkdGg6ZnVuY3Rpb24odCxuKXtyZXR1cm4gVWkodSx0LG4pfSxmaXRIZWlnaHQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gT2kodSx0LG4pfX19LHQuZ2VvUHJvamVjdGlvbj1JaSx0Lmdlb1Byb2plY3Rpb25NdXRhdG9yPVlpLHQuZ2VvTWVyY2F0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gWmkoV2kpLnNjYWxlKDk2MS9FcCl9LHQuZ2VvTWVyY2F0b3JSYXc9V2ksdC5nZW9OYXR1cmFsRWFydGgxPWZ1bmN0aW9uKCl7cmV0dXJuIElpKGVvKS5zY2FsZSgxNzUuMjk1KX0sdC5nZW9OYXR1cmFsRWFydGgxUmF3PWVvLHQuZ2VvT3J0aG9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIElpKHJvKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwK01wKX0sdC5nZW9PcnRob2dyYXBoaWNSYXc9cm8sdC5nZW9TdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIElpKGlvKS5zY2FsZSgyNTApLmNsaXBBbmdsZSgxNDIpfSx0Lmdlb1N0ZXJlb2dyYXBoaWNSYXc9aW8sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgdD1aaShvbyksbj10LmNlbnRlcixlPXQucm90YXRlO3JldHVybiB0LmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKFstdFsxXSx0WzBdXSk6KHQ9bigpLFt0WzFdLC10WzBdXSl9LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKToodD1lKCksW3RbMF0sdFsxXSx0WzJdLTkwXSl9LGUoWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvclJhdz1vbyx0Lmdlb1JvdGF0aW9uPUZyLHQuZ2VvU3RyZWFtPXRyLHQuZ2VvVHJhbnNmb3JtPWZ1bmN0aW9uKHQpe3JldHVybntzdHJlYW06UGkodCl9fSx0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHU9MDt0LmVhY2hBZnRlcihmdW5jdGlvbih0KXt2YXIgZT10LmNoaWxkcmVuO2U/KHQueD1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZWR1Y2UoYW8sMCkvdC5sZW5ndGh9KGUpLHQueT1mdW5jdGlvbih0KXtyZXR1cm4gMSt0LnJlZHVjZShjbywwKX0oZSkpOih0Lng9bz91Kz1uKHQsbyk6MCx0Lnk9MCxvPXQpfSk7dmFyIGE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uWzBdO3JldHVybiB0fSh0KSxjPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbjtuPXQuY2hpbGRyZW47KXQ9bltuLmxlbmd0aC0xXTtyZXR1cm4gdH0odCkscz1hLngtbihhLGMpLzIsZj1jLngrbihjLGEpLzI7cmV0dXJuIHQuZWFjaEFmdGVyKGk/ZnVuY3Rpb24obil7bi54PShuLngtdC54KSplLG4ueT0odC55LW4ueSkqcn06ZnVuY3Rpb24obil7bi54PShuLngtcykvKGYtcykqZSxuLnk9KDEtKHQueT9uLnkvdC55OjEpKSpyfSl9dmFyIG49dW8sZT0xLHI9MSxpPSExO3JldHVybiB0LnNlcGFyYXRpb249ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZSx0KTpufSx0LnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITEsZT0rblswXSxyPStuWzFdLHQpOmk/bnVsbDpbZSxyXX0sdC5ub2RlU2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMCxlPStuWzBdLHI9K25bMV0sdCk6aT9bZSxyXTpudWxsfSx0fSx0LmhpZXJhcmNoeT1mbyx0LnBhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiB0Lng9ZS8yLHQueT1yLzIsbj90LmVhY2hCZWZvcmUoem8obikpLmVhY2hBZnRlcihQbyhpLC41KSkuZWFjaEJlZm9yZShSbygxKSk6dC5lYWNoQmVmb3JlKHpvKENvKSkuZWFjaEFmdGVyKFBvKEVvLDEpKS5lYWNoQWZ0ZXIoUG8oaSx0LnIvTWF0aC5taW4oZSxyKSkpLmVhY2hCZWZvcmUoUm8oTWF0aC5taW4oZSxyKS8oMip0LnIpKSksdH12YXIgbj1udWxsLGU9MSxyPTEsaT1FbztyZXR1cm4gdC5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpTbyh0KX0oZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPStuWzBdLHI9K25bMV0sdCk6W2Uscl19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFvKCtuKSx0KTppfSx0fSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4ga28odCksdH0sdC5wYWNrRW5jbG9zZT1nbyx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dmFyIG89dC5oZWlnaHQrMTtyZXR1cm4gdC54MD10LnkwPXIsdC54MT1uLHQueTE9ZS9vLHQuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVuJiZxbyhlLGUueDAsdCooZS5kZXB0aCsxKS9uLGUueDEsdCooZS5kZXB0aCsyKS9uKTt2YXIgaT1lLngwLG89ZS55MCx1PWUueDEtcixhPWUueTEtcjt1PGkmJihpPXU9KGkrdSkvMiksYTxvJiYobz1hPShvK2EpLzIpLGUueDA9aSxlLnkwPW8sZS54MT11LGUueTE9YX19KGUsbykpLGkmJnQuZWFjaEJlZm9yZShMbyksdH12YXIgbj0xLGU9MSxyPTAsaT0hMTtyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hIW4sdCk6aX0sdC5zaXplPWZ1bmN0aW9uKHIpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStyWzBdLGU9K3JbMV0sdCk6W24sZV19LHQucGFkZGluZz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rbix0KTpyfSx0fSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgcixpLG8sdSxhLGMscyxmPXQubGVuZ3RoLGw9bmV3IEFycmF5KGYpLGg9e307Zm9yKGk9MDtpPGY7KytpKXI9dFtpXSxhPWxbaV09bmV3IHZvKHIpLG51bGwhPShjPW4ocixpLHQpKSYmKGMrPSIiKSYmKGhbcz1aZCsoYS5pZD1jKV09cyBpbiBoP1FkOmEpO2ZvcihpPTA7aTxmOysraSlpZihhPWxbaV0sbnVsbCE9KGM9ZSh0W2ldLGksdCkpJiYoYys9IiIpKXtpZighKHU9aFtaZCtjXSkpdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2MpO2lmKHU9PT1RZCl0aHJvdyBuZXcgRXJyb3IoImFtYmlndW91czogIitjKTt1LmNoaWxkcmVuP3UuY2hpbGRyZW4ucHVzaChhKTp1LmNoaWxkcmVuPVthXSxhLnBhcmVudD11fWVsc2V7aWYobyl0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7bz1hfWlmKCFvKXRocm93IG5ldyBFcnJvcigibm8gcm9vdCIpO2lmKG8ucGFyZW50PUdkLG8uZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS1mfSkuZWFjaEJlZm9yZShwbyksby5wYXJlbnQ9bnVsbCxmPjApdGhyb3cgbmV3IEVycm9yKCJjeWNsZSIpO3JldHVybiBvfXZhciBuPURvLGU9VW87cmV0dXJuIHQuaWQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49U28oZSksdCk6bn0sdC5wYXJlbnRJZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TbyhuKSx0KTplfSx0fSx0LnRyZWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBjPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLHU9bmV3IEhvKHQsMCksYT1bdV07bj1hLnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpYS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgSG8ocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4odS5wYXJlbnQ9bmV3IEhvKG51bGwsMCkpLmNoaWxkcmVuPVt1XSx1fSh0KTtpZihjLmVhY2hBZnRlcihuKSxjLnBhcmVudC5tPS1jLnosYy5lYWNoQmVmb3JlKGUpLGEpdC5lYWNoQmVmb3JlKHIpO2Vsc2V7dmFyIHM9dCxmPXQsbD10O3QuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8cy54JiYocz10KSx0Lng+Zi54JiYoZj10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9cz09PWY/MTppKHMsZikvMixwPWgtcy54LGQ9by8oZi54K2grcCksdj11LyhsLmRlcHRofHwxKTt0LmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrcCkqZCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIHR9ZnVuY3Rpb24gbih0KXt2YXIgbj10LmNoaWxkcmVuLGU9dC5wYXJlbnQuY2hpbGRyZW4scj10Lmk/ZVt0LmktMV06bnVsbDtpZihuKXsoZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KSh0KTt2YXIgbz0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtyPyh0Lno9ci56K2kodC5fLHIuXyksdC5tPXQuei1vKTp0Lno9b31lbHNlIHImJih0Lno9ci56K2kodC5fLHIuXykpO3QucGFyZW50LkE9ZnVuY3Rpb24odCxuLGUpe2lmKG4pe2Zvcih2YXIgcixvPXQsdT10LGE9bixjPW8ucGFyZW50LmNoaWxkcmVuWzBdLHM9by5tLGY9dS5tLGw9YS5tLGg9Yy5tO2E9SW8oYSksbz1GbyhvKSxhJiZvOyljPUZvKGMpLCh1PUlvKHUpKS5hPXQsKHI9YS56K2wtby56LXMraShhLl8sby5fKSk+MCYmKFlvKEJvKGEsdCxlKSx0LHIpLHMrPXIsZis9ciksbCs9YS5tLHMrPW8ubSxoKz1jLm0sZis9dS5tO2EmJiFJbyh1KSYmKHUudD1hLHUubSs9bC1mKSxvJiYhRm8oYykmJihjLnQ9byxjLm0rPXMtaCxlPXQpfXJldHVybiBlfSh0LHIsdC5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gZSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcih0KXt0LngqPW8sdC55PXQuZGVwdGgqdX12YXIgaT1PbyxvPTEsdT0xLGE9bnVsbDtyZXR1cm4gdC5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sdCk6aX0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSExLG89K25bMF0sdT0rblsxXSx0KTphP251bGw6W28sdV19LHQubm9kZVNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ITAsbz0rblswXSx1PStuWzFdLHQpOmE/W28sdV06bnVsbH0sdH0sdC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1pLHQueTE9byx0LmVhY2hCZWZvcmUobiksdT1bMF0sciYmdC5lYWNoQmVmb3JlKExvKSx0fWZ1bmN0aW9uIG4odCl7dmFyIG49dVt0LmRlcHRoXSxyPXQueDArbixpPXQueTArbixvPXQueDEtbixoPXQueTEtbjtvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLHQueDA9cix0LnkwPWksdC54MT1vLHQueTE9aCx0LmNoaWxkcmVuJiYobj11W3QuZGVwdGgrMV09YSh0KS8yLHIrPWwodCktbixpKz1jKHQpLW4sby09cyh0KS1uLGgtPWYodCktbixvPHImJihyPW89KHIrbykvMiksaDxpJiYoaT1oPShpK2gpLzIpLGUodCxyLGksbyxoKSl9dmFyIGU9S2Qscj0hMSxpPTEsbz0xLHU9WzBdLGE9RW8sYz1FbyxzPUVvLGY9RW8sbD1FbztyZXR1cm4gdC5yb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIW4sdCk6cn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPStuWzBdLG89K25bMV0sdCk6W2ksb119LHQudGlsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1TbyhuKSx0KTplfSx0LnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dC5wYWRkaW5nSW5uZXIobikucGFkZGluZ091dGVyKG4pOnQucGFkZGluZ0lubmVyKCl9LHQucGFkZGluZ0lubmVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmF9LHQucGFkZGluZ091dGVyPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3QucGFkZGluZ1RvcChuKS5wYWRkaW5nUmlnaHQobikucGFkZGluZ0JvdHRvbShuKS5wYWRkaW5nTGVmdChuKTp0LnBhZGRpbmdUb3AoKX0sdC5wYWRkaW5nVG9wPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmN9LHQucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOnN9LHQucGFkZGluZ0JvdHRvbT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkFvKCtuKSx0KTpmfSx0LnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246QW8oK24pLHQpOmx9LHR9LHQudHJlZW1hcEJpbmFyeT1mdW5jdGlvbih0LG4sZSxyLGkpe2Z1bmN0aW9uIG8odCxuLGUscixpLHUsYSl7aWYodD49bi0xKXt2YXIgcz1jW3RdO3JldHVybiBzLngwPXIscy55MD1pLHMueDE9dSx2b2lkKHMueTE9YSl9Zm9yKHZhciBsPWZbdF0saD1lLzIrbCxwPXQrMSxkPW4tMTtwPGQ7KXt2YXIgdj1wK2Q+Pj4xO2Zbdl08aD9wPXYrMTpkPXZ9aC1mW3AtMV08ZltwXS1oJiZ0KzE8cCYmLS1wO3ZhciBnPWZbcF0tbCxfPWUtZztpZih1LXI+YS1pKXt2YXIgeT0ocipfK3UqZykvZTtvKHQscCxnLHIsaSx5LGEpLG8ocCxuLF8seSxpLHUsYSl9ZWxzZXt2YXIgbT0oaSpfK2EqZykvZTtvKHQscCxnLHIsaSx1LG0pLG8ocCxuLF8scixtLHUsYSl9fXZhciB1LGEsYz10LmNoaWxkcmVuLHM9Yy5sZW5ndGgsZj1uZXcgQXJyYXkocysxKTtmb3IoZlswXT1hPXU9MDt1PHM7Kyt1KWZbdSsxXT1hKz1jW3VdLnZhbHVlO28oMCxzLHQudmFsdWUsbixlLHIsaSl9LHQudHJlZW1hcERpY2U9cW8sdC50cmVlbWFwU2xpY2U9am8sdC50cmVlbWFwU2xpY2VEaWNlPWZ1bmN0aW9uKHQsbixlLHIsaSl7KDEmdC5kZXB0aD9qbzpxbykodCxuLGUscixpKX0sdC50cmVlbWFwU3F1YXJpZnk9S2QsdC50cmVlbWFwUmVzcXVhcmlmeT10dix0LmludGVycG9sYXRlPWZuLHQuaW50ZXJwb2xhdGVBcnJheT1vbix0LmludGVycG9sYXRlQmFzaXM9R3QsdC5pbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkPVF0LHQuaW50ZXJwb2xhdGVEYXRlPXVuLHQuaW50ZXJwb2xhdGVOdW1iZXI9YW4sdC5pbnRlcnBvbGF0ZU9iamVjdD1jbix0LmludGVycG9sYXRlUm91bmQ9bG4sdC5pbnRlcnBvbGF0ZVN0cmluZz1zbix0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUdmLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UWYsdC5pbnRlcnBvbGF0ZVpvb209dm4sdC5pbnRlcnBvbGF0ZVJnYj1IZix0LmludGVycG9sYXRlUmdiQmFzaXM9amYsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPVhmLHQuaW50ZXJwb2xhdGVIc2w9ZWwsdC5pbnRlcnBvbGF0ZUhzbExvbmc9cmwsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWVuKCh0PUZ0KHQpKS5sLChuPUZ0KG4pKS5sKSxyPWVuKHQuYSxuLmEpLGk9ZW4odC5iLG4uYiksbz1lbih0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPWlsLHQuaW50ZXJwb2xhdGVIY2xMb25nPW9sLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9dWwsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9YWwsdC5xdWFudGl6ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZVtyXT10KHIvKG4tMSkpO3JldHVybiBlfSx0LnBhdGg9ZWUsdC5wb2x5Z29uQXJlYT1mdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPXQubGVuZ3RoLGk9dFtyLTFdLG89MDsrK2U8cjspbj1pLGk9dFtlXSxvKz1uWzFdKmlbMF0tblswXSppWzFdO3JldHVybiBvLzJ9LHQucG9seWdvbkNlbnRyb2lkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9LTEsaT10Lmxlbmd0aCxvPTAsdT0wLGE9dFtpLTFdLGM9MDsrK3I8aTspbj1hLGE9dFtyXSxjKz1lPW5bMF0qYVsxXS1hWzBdKm5bMV0sbys9KG5bMF0rYVswXSkqZSx1Kz0oblsxXSthWzFdKSplO3JldHVybiBjKj0zLFtvL2MsdS9jXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KCRvKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1XbyhyKSx1PVdvKGkpLGE9dVswXT09PW9bMF0sYz11W3UubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxzPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pcy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSthO248dS5sZW5ndGgtYzsrK24pcy5wdXNoKHRbclt1W25dXVsyXV0pO3JldHVybiBzfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1uWzBdLGE9blsxXSxjPW9bMF0scz1vWzFdLGY9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT5hIT1zPmEmJnU8KGMtZSkqKGEtcikvKHMtcikrZSYmKGY9IWYpLGM9ZSxzPXI7cmV0dXJuIGZ9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sdT1vWzBdLGE9b1sxXSxjPTA7KytyPGk7KW49dSxlPWEsbi09dT0obz10W3JdKVswXSxlLT1hPW9bMV0sYys9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBjfSx0LnF1YWR0cmVlPVRlLHQucXVldWU9S28sdC5yYW5kb21Vbmlmb3JtPXJ2LHQucmFuZG9tTm9ybWFsPWl2LHQucmFuZG9tTG9nTm9ybWFsPW92LHQucmFuZG9tQmF0ZXM9YXYsdC5yYW5kb21JcndpbkhhbGw9dXYsdC5yYW5kb21FeHBvbmVudGlhbD1jdix0LnJlcXVlc3Q9bnUsdC5odG1sPXN2LHQuanNvbj1mdix0LnRleHQ9bHYsdC54bWw9aHYsdC5jc3Y9cHYsdC50c3Y9ZHYsdC5zY2FsZUJhbmQ9b3UsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIHV1KG91KCkucGFkZGluZ0lubmVyKDEpKX0sdC5zY2FsZUlkZW50aXR5PWd1LHQuc2NhbGVMaW5lYXI9dnUsdC5zY2FsZUxvZz1UdSx0LnNjYWxlT3JkaW5hbD1pdSx0LnNjYWxlSW1wbGljaXQ9eXYsdC5zY2FsZVBvdz1rdSx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBrdSgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPVN1LHQuc2NhbGVRdWFudGl6ZT1FdSx0LnNjYWxlVGhyZXNob2xkPUF1LHQuc2NhbGVUaW1lPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKEd2LFd2LEx2LFB2LEN2LEV2LGt2LHd2LHQudGltZUZvcm1hdCkuZG9tYWluKFtuZXcgRGF0ZSgyZTMsMCwxKSxuZXcgRGF0ZSgyZTMsMCwyKV0pfSx0LnNjYWxlVXRjPWZ1bmN0aW9uKCl7cmV0dXJuIFZhKHhnLHlnLGlnLGVnLHRnLEp2LGt2LHd2LHQudXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHQuc2NoZW1lQ2F0ZWdvcnkxMD1VZyx0LnNjaGVtZUNhdGVnb3J5MjBiPU9nLHQuc2NoZW1lQ2F0ZWdvcnkyMGM9RmcsdC5zY2hlbWVDYXRlZ29yeTIwPUlnLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0PVlnLHQuaW50ZXJwb2xhdGVSYWluYm93PWZ1bmN0aW9uKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgbj1NYXRoLmFicyh0LS41KTtyZXR1cm4gamcuaD0zNjAqdC0xMDAsamcucz0xLjUtMS41Km4samcubD0uOC0uOSpuLGpnKyIifSx0LmludGVycG9sYXRlV2FybT1CZyx0LmludGVycG9sYXRlQ29vbD1IZyx0LmludGVycG9sYXRlVmlyaWRpcz1YZyx0LmludGVycG9sYXRlTWFnbWE9VmcsdC5pbnRlcnBvbGF0ZUluZmVybm89JGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT1XZyx0LnNjYWxlU2VxdWVudGlhbD1aYSx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gY3QoQSh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9QSx0LmxvY2FsPXN0LHQubWF0Y2hlcj1vZix0Lm1vdXNlPXB0LHQubmFtZXNwYWNlPUUsdC5uYW1lc3BhY2VzPXRmLHQuY2xpZW50UG9pbnQ9aHQsdC5zZWxlY3Q9Y3QsdC5zZWxlY3RBbGw9ZnVuY3Rpb24odCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyB1dChbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0KV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyB1dChbbnVsbD09dD9bXTp0XSxjZil9LHQuc2VsZWN0aW9uPWF0LHQuc2VsZWN0b3I9eix0LnNlbGVjdG9yQWxsPVIsdC5zdHlsZT1JLHQudG91Y2g9ZHQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49bHQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09aHQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9Rix0LmN1c3RvbUV2ZW50PWl0LHQuYXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0LHMsZj0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1pXyxwPXUuYXBwbHkodGhpcyxhcmd1bWVudHMpLWlfLGQ9WmcocC1oKSx2PXA+aDtpZihjfHwoYz10PWVlKCkpLGw8ZiYmKHM9bCxsPWYsZj1zKSxsPmVfKWlmKGQ+b18tZV8pYy5tb3ZlVG8obCpRZyhoKSxsKnRfKGgpKSxjLmFyYygwLDAsbCxoLHAsIXYpLGY+ZV8mJihjLm1vdmVUbyhmKlFnKHApLGYqdF8ocCkpLGMuYXJjKDAsMCxmLHAsaCx2KSk7ZWxzZXt2YXIgZyxfLHk9aCxtPXAseD1oLGI9cCx3PWQsTT1kLFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+ZV8mJihpPytpLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuXyhmKmYrbCpsKSksaz1LZyhaZyhsLWYpLzIsK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxTPWssRT1rO2lmKE4+ZV8pe3ZhciBBPVFhKE4vZip0XyhUKSksQz1RYShOL2wqdF8oVCkpOyh3LT0yKkEpPmVfPyhBKj12PzE6LTEseCs9QSxiLT1BKToodz0wLHg9Yj0oaCtwKS8yKSwoTS09MipDKT5lXz8oQyo9dj8xOi0xLHkrPUMsbS09Qyk6KE09MCx5PW09KGgrcCkvMil9dmFyIHo9bCpRZyh5KSxQPWwqdF8oeSksUj1mKlFnKGIpLEw9Zip0XyhiKTtpZihrPmVfKXt2YXIgcT1sKlFnKG0pLEQ9bCp0XyhtKSxVPWYqUWcoeCksTz1mKnRfKHgpO2lmKGQ8cl8pe3ZhciBGPXc+ZV8/ZnVuY3Rpb24odCxuLGUscixpLG8sdSxhKXt2YXIgYz1lLXQscz1yLW4sZj11LWksbD1hLW8saD0oZioobi1vKS1sKih0LWkpKS8obCpjLWYqcyk7cmV0dXJuW3QraCpjLG4raCpzXX0oeixQLFUsTyxxLEQsUixMKTpbUixMXSxJPXotRlswXSxZPVAtRlsxXSxCPXEtRlswXSxIPUQtRlsxXSxqPTEvdF8oZnVuY3Rpb24odCl7cmV0dXJuIHQ+MT8wOnQ8LTE/cl86TWF0aC5hY29zKHQpfSgoSSpCK1kqSCkvKG5fKEkqSStZKlkpKm5fKEIqQitIKkgpKSkvMiksWD1uXyhGWzBdKkZbMF0rRlsxXSpGWzFdKTtTPUtnKGssKGYtWCkvKGotMSkpLEU9S2coaywobC1YKS8oaisxKSl9fU0+ZV8/RT5lXz8oZz1yYyhVLE8seixQLGwsRSx2KSxfPXJjKHEsRCxSLEwsbCxFLHYpLGMubW92ZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksRTxrP2MuYXJjKGcuY3gsZy5jeSxFLEdnKGcueTAxLGcueDAxKSxHZyhfLnkwMSxfLngwMSksIXYpOihjLmFyYyhnLmN4LGcuY3ksRSxHZyhnLnkwMSxnLngwMSksR2coZy55MTEsZy54MTEpLCF2KSxjLmFyYygwLDAsbCxHZyhnLmN5K2cueTExLGcuY3grZy54MTEpLEdnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIXYpLGMuYXJjKF8uY3gsXy5jeSxFLEdnKF8ueTExLF8ueDExKSxHZyhfLnkwMSxfLngwMSksIXYpKSk6KGMubW92ZVRvKHosUCksYy5hcmMoMCwwLGwseSxtLCF2KSk6Yy5tb3ZlVG8oeixQKSxmPmVfJiZ3PmVfP1M+ZV8/KGc9cmMoUixMLHEsRCxmLC1TLHYpLF89cmMoeixQLFUsTyxmLC1TLHYpLGMubGluZVRvKGcuY3grZy54MDEsZy5jeStnLnkwMSksUzxrP2MuYXJjKGcuY3gsZy5jeSxTLEdnKGcueTAxLGcueDAxKSxHZyhfLnkwMSxfLngwMSksIXYpOihjLmFyYyhnLmN4LGcuY3ksUyxHZyhnLnkwMSxnLngwMSksR2coZy55MTEsZy54MTEpLCF2KSxjLmFyYygwLDAsZixHZyhnLmN5K2cueTExLGcuY3grZy54MTEpLEdnKF8uY3krXy55MTEsXy5jeCtfLngxMSksdiksYy5hcmMoXy5jeCxfLmN5LFMsR2coXy55MTEsXy54MTEpLEdnKF8ueTAxLF8ueDAxKSwhdikpKTpjLmFyYygwLDAsZixiLHgsdik6Yy5saW5lVG8oUixMKX1lbHNlIGMubW92ZVRvKDAsMCk7aWYoYy5jbG9zZVBhdGgoKSx0KXJldHVybiBjPW51bGwsdCsiInx8bnVsbH12YXIgbj1KYSxlPUthLHI9R2EoMCksaT1udWxsLG89dGMsdT1uYyxhPWVjLGM9bnVsbDtyZXR1cm4gdC5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciB0PSgrbi5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICt1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1yXy8yO3JldHVybltRZyhyKSp0LHRfKHIpKnRdfSx0LmlubmVyUmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6R2EoK2UpLHQpOm59LHQub3V0ZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6ZX0sdC5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6cn0sdC5wYWRSYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09bj9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOml9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTpvfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOnV9LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6YX0sdC5jb250ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW51bGw9PW4/bnVsbDpuLHQpOmN9LHR9LHQuYXJlYT1zYyx0LmxpbmU9Y2MsdC5waWU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBhLGMscyxmLGwsaD10Lmxlbmd0aCxwPTAsZD1uZXcgQXJyYXkoaCksdj1uZXcgQXJyYXkoaCksZz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cyksXz1NYXRoLm1pbihvXyxNYXRoLm1heCgtb18sby5hcHBseSh0aGlzLGFyZ3VtZW50cyktZykpLHk9TWF0aC5taW4oTWF0aC5hYnMoXykvaCx1LmFwcGx5KHRoaXMsYXJndW1lbnRzKSksbT15KihfPDA/LTE6MSk7Zm9yKGE9MDthPGg7KythKShsPXZbZFthXT1hXT0rbih0W2FdLGEsdCkpPjAmJihwKz1sKTtmb3IobnVsbCE9ZT9kLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh2W3RdLHZbbl0pfSk6bnVsbCE9ciYmZC5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIHIodFtuXSx0W2VdKX0pLGE9MCxzPXA/KF8taCptKS9wOjA7YTxoOysrYSxnPWYpYz1kW2FdLGY9ZysoKGw9dltjXSk+MD9sKnM6MCkrbSx2W2NdPXtkYXRhOnRbY10saW5kZXg6YSx2YWx1ZTpsLHN0YXJ0QW5nbGU6ZyxlbmRBbmdsZTpmLHBhZEFuZ2xlOnl9O3JldHVybiB2fXZhciBuPWxjLGU9ZmMscj1udWxsLGk9R2EoMCksbz1HYShvXyksdT1HYSgwKTtyZXR1cm4gdC52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkdhKCtlKSx0KTpufSx0LnNvcnRWYWx1ZXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bixyPW51bGwsdCk6ZX0sdC5zb3J0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW4sZT1udWxsLHQpOnJ9LHQuc3RhcnRBbmdsZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOkdhKCtuKSx0KTppfSx0LmVuZEFuZ2xlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOm99LHQucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6dX0sdH0sdC5hcmVhUmFkaWFsPWdjLHQucmFkaWFsQXJlYT1nYyx0LmxpbmVSYWRpYWw9dmMsdC5yYWRpYWxMaW5lPXZjLHQucG9pbnRSYWRpYWw9X2MsdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiB4YyhiYyl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHhjKHdjKX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9eGMoTWMpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0O2lmKHJ8fChyPXQ9ZWUoKSksbi5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhyLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdClyZXR1cm4gcj1udWxsLHQrIiJ8fG51bGx9dmFyIG49R2EoY18pLGU9R2EoNjQpLHI9bnVsbDtyZXR1cm4gdC50eXBlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6R2EoZSksdCk6bn0sdC5zaXplPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoK24pLHQpOmV9LHQuY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6bix0KTpyfSx0fSx0LnN5bWJvbHM9VF8sdC5zeW1ib2xDaXJjbGU9Y18sdC5zeW1ib2xDcm9zcz1zXyx0LnN5bWJvbERpYW1vbmQ9aF8sdC5zeW1ib2xTcXVhcmU9X18sdC5zeW1ib2xTdGFyPWdfLHQuc3ltYm9sVHJpYW5nbGU9bV8sdC5zeW1ib2xXeWU9TV8sdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgU2ModCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBFYyh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcga2ModCl9LHQuY3VydmVCdW5kbGU9Tl8sdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPVNfLHQuY3VydmVDYXJkaW5hbE9wZW49RV8sdC5jdXJ2ZUNhcmRpbmFsPWtfLHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPUNfLHQuY3VydmVDYXRtdWxsUm9tT3Blbj16Xyx0LmN1cnZlQ2F0bXVsbFJvbT1BXyx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgT2ModCl9LHQuY3VydmVMaW5lYXI9b2MsdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IEhjKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgamModCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVmModCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgV2ModCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBXYyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFdjKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3ZhciBvLHUsYT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjPXQubGVuZ3RoLHM9YS5sZW5ndGgsZj1uZXcgQXJyYXkocyk7Zm9yKG89MDtvPHM7KytvKXtmb3IodmFyIGwsaD1hW29dLHA9ZltvXT1uZXcgQXJyYXkoYyksZD0wO2Q8YzsrK2QpcFtkXT1sPVswLCtpKHRbZF0saCxkLHQpXSxsLmRhdGE9dFtkXTtwLmtleT1ofWZvcihvPTAsdT1lKGYpO288czsrK28pZlt1W29dXS5pbmRleD1vO3JldHVybiByKGYsdSksZn12YXIgbj1HYShbXSksZT1HYyxyPVpjLGk9UWM7cmV0dXJuIHQua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkdhKGFfLmNhbGwoZSkpLHQpOm59LHQudmFsdWU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpHYSgrbiksdCk6aX0sdC5vcmRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT1uP0djOiJmdW5jdGlvbiI9PXR5cGVvZiBuP246R2EoYV8uY2FsbChuKSksdCk6ZX0sdC5vZmZzZXQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9aYzpuLHQpOnJ9LHR9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsdT10WzBdLmxlbmd0aDtvPHU7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9WmModCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigoYT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sdSxhLGM9MCxzPXRbblswXV0ubGVuZ3RoO2M8czsrK2MpZm9yKG89dT0wLGU9MDtlPGE7KytlKShpPShyPXRbbltlXV1bY10pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09dSxyWzBdPXUrPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9WmMsdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIHU9MCxhPTA7dTxlOysrdSlhKz10W3VdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LWEvMn1aYyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLHU9MTt1PHI7Kyt1KXtmb3IodmFyIGE9MCxjPTAscz0wO2E8aTsrK2Epe2Zvcih2YXIgZj10W25bYV1dLGw9Zlt1XVsxXXx8MCxoPShsLShmW3UtMV1bMV18fDApKS8yLHA9MDtwPGE7KytwKXt2YXIgZD10W25bcF1dO2grPShkW3VdWzFdfHwwKS0oZFt1LTFdWzFdfHwwKX1jKz1sLHMrPWgqbH1lW3UtMV1bMV0rPWVbdS0xXVswXT1vLGMmJihvLT1zL2MpfWVbdS0xXVsxXSs9ZVt1LTFdWzBdPW8sWmModCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1KYyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBKYyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChLYyksbz1HYyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLHU9MCxhPTAsYz1bXSxzPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sdTxhPyh1Kz1pW2VdLGMucHVzaChlKSk6KGErPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGMpfSx0LnN0YWNrT3JkZXJOb25lPUdjLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIEdjKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9Q3UsdC50aW1lTWlsbGlzZWNvbmQ9d3YsdC50aW1lTWlsbGlzZWNvbmRzPU12LHQudXRjTWlsbGlzZWNvbmQ9d3YsdC51dGNNaWxsaXNlY29uZHM9TXYsdC50aW1lU2Vjb25kPWt2LHQudGltZVNlY29uZHM9U3YsdC51dGNTZWNvbmQ9a3YsdC51dGNTZWNvbmRzPVN2LHQudGltZU1pbnV0ZT1Fdix0LnRpbWVNaW51dGVzPUF2LHQudGltZUhvdXI9Q3YsdC50aW1lSG91cnM9enYsdC50aW1lRGF5PVB2LHQudGltZURheXM9UnYsdC50aW1lV2Vlaz1Mdix0LnRpbWVXZWVrcz1Zdix0LnRpbWVTdW5kYXk9THYsdC50aW1lU3VuZGF5cz1Zdix0LnRpbWVNb25kYXk9cXYsdC50aW1lTW9uZGF5cz1Cdix0LnRpbWVUdWVzZGF5PUR2LHQudGltZVR1ZXNkYXlzPUh2LHQudGltZVdlZG5lc2RheT1Vdix0LnRpbWVXZWRuZXNkYXlzPWp2LHQudGltZVRodXJzZGF5PU92LHQudGltZVRodXJzZGF5cz1Ydix0LnRpbWVGcmlkYXk9RnYsdC50aW1lRnJpZGF5cz1Wdix0LnRpbWVTYXR1cmRheT1Jdix0LnRpbWVTYXR1cmRheXM9JHYsdC50aW1lTW9udGg9V3YsdC50aW1lTW9udGhzPVp2LHQudGltZVllYXI9R3YsdC50aW1lWWVhcnM9UXYsdC51dGNNaW51dGU9SnYsdC51dGNNaW51dGVzPUt2LHQudXRjSG91cj10Zyx0LnV0Y0hvdXJzPW5nLHQudXRjRGF5PWVnLHQudXRjRGF5cz1yZyx0LnV0Y1dlZWs9aWcsdC51dGNXZWVrcz1sZyx0LnV0Y1N1bmRheT1pZyx0LnV0Y1N1bmRheXM9bGcsdC51dGNNb25kYXk9b2csdC51dGNNb25kYXlzPWhnLHQudXRjVHVlc2RheT11Zyx0LnV0Y1R1ZXNkYXlzPXBnLHQudXRjV2VkbmVzZGF5PWFnLHQudXRjV2VkbmVzZGF5cz1kZyx0LnV0Y1RodXJzZGF5PWNnLHQudXRjVGh1cnNkYXlzPXZnLHQudXRjRnJpZGF5PXNnLHQudXRjRnJpZGF5cz1nZyx0LnV0Y1NhdHVyZGF5PWZnLHQudXRjU2F0dXJkYXlzPV9nLHQudXRjTW9udGg9eWcsdC51dGNNb250aHM9bWcsdC51dGNZZWFyPXhnLHQudXRjWWVhcnM9d2csdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1IYSx0LnRpbWVGb3JtYXRMb2NhbGU9RHUsdC5pc29Gb3JtYXQ9RWcsdC5pc29QYXJzZT1BZyx0Lm5vdz1tbix0LnRpbWVyPXduLHQudGltZXJGbHVzaD1Nbix0LnRpbWVvdXQ9U24sdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGJuLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/bW4oKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyh1KXt1Kz1pLHIucmVzdGFydChvLGkrPW4sZSksdCh1KX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPURuLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpe249bnVsbD09bj9udWxsOm4rIiI7Zm9yKHIgaW4gaSlpZigoZT1pW3JdKS5zdGF0ZT54bCYmZS5uYW1lPT09bilyZXR1cm4gbmV3IHFuKFtbdF1dLEpsLG4sK3IpfXJldHVybiBudWxsfSx0LmludGVycnVwdD1Qbix0LnZvcm9ub2k9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3JldHVybiBuZXcgTnModC5tYXAoZnVuY3Rpb24ocixpKXt2YXIgbz1bTWF0aC5yb3VuZChuKHIsaSx0KS9GXykqRl8sTWF0aC5yb3VuZChlKHIsaSx0KS9GXykqRl9dO3JldHVybiBvLmluZGV4PWksby5kYXRhPXIsb30pLHIpfXZhciBuPW5zLGU9ZXMscj1udWxsO3JldHVybiB0LnBvbHlnb25zPWZ1bmN0aW9uKG4pe3JldHVybiB0KG4pLnBvbHlnb25zKCl9LHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIHQobikubGlua3MoKX0sdC50cmlhbmdsZXM9ZnVuY3Rpb24obil7cmV0dXJuIHQobikudHJpYW5nbGVzKCl9LHQueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnRzKCtlKSx0KTpufSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0cygrbiksdCk6ZX0sdC5leHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09bj9udWxsOltbK25bMF1bMF0sK25bMF1bMV1dLFsrblsxXVswXSwrblsxXVsxXV1dLHQpOnImJltbclswXVswXSxyWzBdWzFdXSxbclsxXVswXSxyWzFdWzFdXV19LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1udWxsPT1uP251bGw6W1swLDBdLFsrblswXSwrblsxXV1dLHQpOnImJltyWzFdWzBdLXJbMF1bMF0sclsxXVsxXS1yWzBdWzFdXX0sdH0sdC56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih0KXt0LnByb3BlcnR5KCJfX3pvb20iLFJzKS5vbigid2hlZWwuem9vbSIsYykub24oIm1vdXNlZG93bi56b29tIixzKS5vbigiZGJsY2xpY2suem9vbSIsZikuZmlsdGVyKHgpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLGwpLm9uKCJ0b3VjaG1vdmUuem9vbSIsaCkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIscCkuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIGUodCxuKXtyZXR1cm4obj1NYXRoLm1heChiWzBdLE1hdGgubWluKGJbMV0sbikpKT09PXQuaz90Om5ldyBTcyhuLHQueCx0LnkpfWZ1bmN0aW9uIHIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IFNzKHQuayxyLGkpfWZ1bmN0aW9uIGkodCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24gbyh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt1KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3UodGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dSh0aGlzLHQpLG89Xy5hcHBseSh0aGlzLHQpLGE9ZXx8aShvKSxjPU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLHM9dGhpcy5fX3pvb20sZj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixsPVQocy5pbnZlcnQoYSkuY29uY2F0KGMvcy5rKSxmLmludmVydChhKS5jb25jYXQoYy9mLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1mO2Vsc2V7dmFyIG49bCh0KSxlPWMvblsyXTt0PW5ldyBTcyhlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB1KHQsbil7Zm9yKHZhciBlLHI9MCxpPWsubGVuZ3RoO3I8aTsrK3IpaWYoKGU9a1tyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBhKHQsbil9ZnVuY3Rpb24gYSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1fLmFwcGx5KHQsbil9ZnVuY3Rpb24gYygpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD11KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGk9TWF0aC5tYXgoYlswXSxNYXRoLm1pbihiWzFdLG4uaypNYXRoLnBvdygyLG0uYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLG89cHQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09b1swXSYmdC5tb3VzZVswXVsxXT09PW9bMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09bykpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWkpcmV0dXJuO3QubW91c2U9W28sbi5pbnZlcnQobyldLFBuKHRoaXMpLHQuc3RhcnQoKX1DcygpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSxBKSx0Lnpvb20oIm1vdXNlIix5KHIoZShuLGkpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsdykpfX1mdW5jdGlvbiBzKCl7aWYoIXYmJmcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj11KHRoaXMsYXJndW1lbnRzKSxlPWN0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKENzKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC1vLGk9dC5ldmVudC5jbGllbnRZLWE7bi5tb3ZlZD1lKmUraSppPkN9bi56b29tKCJtb3VzZSIseShyKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1wdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LHcpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7ZS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSx5dCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksQ3MoKSxuLmVuZCgpfSwhMCksaT1wdCh0aGlzKSxvPXQuZXZlbnQuY2xpZW50WCxhPXQuZXZlbnQuY2xpZW50WTtfdCh0LmV2ZW50LnZpZXcpLEFzKCksbi5tb3VzZT1baSx0aGlzLl9fem9vbS5pbnZlcnQoaSldLFBuKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gZigpe2lmKGcuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgaT10aGlzLl9fem9vbSx1PXB0KHRoaXMpLGE9aS5pbnZlcnQodSksYz1pLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6Mikscz15KHIoZShpLGMpLHUsYSksXy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdyk7Q3MoKSxNPjA/Y3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKE0pLmNhbGwobyxzLHUpOmN0KHRoaXMpLmNhbGwobi50cmFuc2Zvcm0scyl9fWZ1bmN0aW9uIGwoKXtpZihnLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4sZSxyLGksbz11KHRoaXMsYXJndW1lbnRzKSxhPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1hLmxlbmd0aDtmb3IoQXMoKSxlPTA7ZTxjOysrZSlpPVtpPWR0KHRoaXMsYSwocj1hW2VdKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoaSksci5pZGVudGlmaWVyXSxvLnRvdWNoMD9vLnRvdWNoMXx8KG8udG91Y2gxPWkpOihvLnRvdWNoMD1pLG49ITApO2lmKGQmJihkPWNsZWFyVGltZW91dChkKSwhby50b3VjaDEpKXJldHVybiBvLmVuZCgpLHZvaWQoKGk9Y3QodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmkuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtuJiYoZD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZD1udWxsfSxFKSxQbih0aGlzKSxvLnN0YXJ0KCkpfX1mdW5jdGlvbiBoKCl7dmFyIG4saSxvLGEsYz11KHRoaXMsYXJndW1lbnRzKSxzPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsZj1zLmxlbmd0aDtmb3IoQ3MoKSxkJiYoZD1jbGVhclRpbWVvdXQoZCkpLG49MDtuPGY7KytuKW89ZHQodGhpcyxzLChpPXNbbl0pLmlkZW50aWZpZXIpLGMudG91Y2gwJiZjLnRvdWNoMFsyXT09PWkuaWRlbnRpZmllcj9jLnRvdWNoMFswXT1vOmMudG91Y2gxJiZjLnRvdWNoMVsyXT09PWkuaWRlbnRpZmllciYmKGMudG91Y2gxWzBdPW8pO2lmKGk9Yy50aGF0Ll9fem9vbSxjLnRvdWNoMSl7dmFyIGw9Yy50b3VjaDBbMF0saD1jLnRvdWNoMFsxXSxwPWMudG91Y2gxWzBdLHY9Yy50b3VjaDFbMV0sZz0oZz1wWzBdLWxbMF0pKmcrKGc9cFsxXS1sWzFdKSpnLF89KF89dlswXS1oWzBdKSpfKyhfPXZbMV0taFsxXSkqXztpPWUoaSxNYXRoLnNxcnQoZy9fKSksbz1bKGxbMF0rcFswXSkvMiwobFsxXStwWzFdKS8yXSxhPVsoaFswXSt2WzBdKS8yLChoWzFdK3ZbMV0pLzJdfWVsc2V7aWYoIWMudG91Y2gwKXJldHVybjtvPWMudG91Y2gwWzBdLGE9Yy50b3VjaDBbMV19Yy56b29tKCJ0b3VjaCIseShyKGksbyxhKSxjLmV4dGVudCx3KSl9ZnVuY3Rpb24gcCgpe3ZhciBuLGUscj11KHRoaXMsYXJndW1lbnRzKSxpPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsbz1pLmxlbmd0aDtmb3IoQXMoKSx2JiZjbGVhclRpbWVvdXQodiksdj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dj1udWxsfSxFKSxuPTA7bjxvOysrbillPWlbbl0sci50b3VjaDAmJnIudG91Y2gwWzJdPT09ZS5pZGVudGlmaWVyP2RlbGV0ZSByLnRvdWNoMDpyLnRvdWNoMSYmci50b3VjaDFbMl09PT1lLmlkZW50aWZpZXImJmRlbGV0ZSByLnRvdWNoMTtyLnRvdWNoMSYmIXIudG91Y2gwJiYoci50b3VjaDA9ci50b3VjaDEsZGVsZXRlIHIudG91Y2gxKSxyLnRvdWNoMD9yLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoci50b3VjaDBbMF0pOnIuZW5kKCl9dmFyIGQsdixnPXpzLF89UHMseT1EcyxtPUxzLHg9cXMsYj1bMCwxLzBdLHc9W1stMS8wLC0xLzBdLFsxLzAsMS8wXV0sTT0yNTAsVD12bixrPVtdLFM9Tigic3RhcnQiLCJ6b29tIiwiZW5kIiksRT01MDAsQT0xNTAsQz0wO3JldHVybiBuLnRyYW5zZm9ybT1mdW5jdGlvbih0LG4pe3ZhciBlPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtlLnByb3BlcnR5KCJfX3pvb20iLFJzKSx0IT09ZT9vKHQsbik6ZS5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCl7dSh0aGlzLGFyZ3VtZW50cykuc3RhcnQoKS56b29tKG51bGwsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bikuZW5kKCl9KX0sbi5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bi5zY2FsZVRvKHQsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX3pvb20uayooImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSl9KX0sbi5zY2FsZVRvPWZ1bmN0aW9uKHQsbyl7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PV8uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sdT1pKHQpLGE9bi5pbnZlcnQodSksYz0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpvO3JldHVybiB5KHIoZShuLGMpLHUsYSksdCx3KX0pfSxuLnRyYW5zbGF0ZUJ5PWZ1bmN0aW9uKHQsZSxyKXtuLnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7cmV0dXJuIHkodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIHI/ci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ciksXy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdyl9KX0sbi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUscil7bi50cmFuc2Zvcm0odCxmdW5jdGlvbigpe3ZhciB0PV8uYXBwbHkodGhpcyxhcmd1bWVudHMpLG49dGhpcy5fX3pvb20sbz1pKHQpO3JldHVybiB5KFlfLnRyYW5zbGF0ZShvWzBdLG9bMV0pLnNjYWxlKG4uaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSwiZnVuY3Rpb24iPT10eXBlb2Ygcj8tci5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LXIpLHQsdyl9KX0sYS5wcm90b3R5cGU9e3N0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLmluZGV4PWsucHVzaCh0aGlzKS0xLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09bi5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPW4uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09bi5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPW4sdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihrLnNwbGljZSh0aGlzLmluZGV4LDEpLHRoaXMuaW5kZXg9LTEsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtpdChuZXcgZnVuY3Rpb24odCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX0obix0LHRoaXMudGhhdC5fX3pvb20pLFMuYXBwbHksUyxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxuLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG09ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprcygrdCksbik6bX0sbi5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprcyghIXQpLG4pOmd9LG4udG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh4PSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a3MoISF0KSxuKTp4fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtzKFtbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dKSxuKTpffSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiWzBdPSt0WzBdLGJbMV09K3RbMV0sbik6W2JbMF0sYlsxXV19LG4udHJhbnNsYXRlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3WzBdWzBdPSt0WzBdWzBdLHdbMV1bMF09K3RbMV1bMF0sd1swXVsxXT0rdFswXVsxXSx3WzFdWzFdPSt0WzFdWzFdLG4pOltbd1swXVswXSx3WzBdWzFdXSxbd1sxXVswXSx3WzFdWzFdXV19LG4uY29uc3RyYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh5PXQsbik6eX0sbi5kdXJhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT0rdCxuKTpNfSxuLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhUPXQsbik6VH0sbi5vbj1mdW5jdGlvbigpe3ZhciB0PVMub24uYXBwbHkoUyxhcmd1bWVudHMpO3JldHVybiB0PT09Uz9uOnR9LG4uY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQz0odD0rdCkqdCxuKTpNYXRoLnNxcnQoQyl9LG59LHQuem9vbVRyYW5zZm9ybT1Fcyx0Lnpvb21JZGVudGl0eT1ZXyxPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSl9KTs="></script>
<script src="data:application/javascript;base64,KGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHsKICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnZDMtY29sbGVjdGlvbicpLCByZXF1aXJlKCdkMy1zZWxlY3Rpb24nKSkgOgogIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2QzLWNvbGxlY3Rpb24nLCAnZDMtc2VsZWN0aW9uJ10sIGZhY3RvcnkpIDoKICAoZ2xvYmFsLmQzID0gZ2xvYmFsLmQzIHx8IHt9LCBnbG9iYWwuZDMudGlwID0gZmFjdG9yeShnbG9iYWwuZDMsZ2xvYmFsLmQzKSk7Cn0odGhpcywgKGZ1bmN0aW9uIChkM0NvbGxlY3Rpb24sZDNTZWxlY3Rpb24pIHsgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBkMy50aXAKICAgKiBDb3B5cmlnaHQgKGMpIDIwMTMtMjAxNyBKdXN0aW4gUGFsbWVyCiAgICoKICAgKiBUb29sdGlwcyBmb3IgZDMuanMgU1ZHIHZpc3VhbGl6YXRpb25zCiAgICovCiAgLy8gUHVibGljIC0gY29uc3RydWN0cyBhIG5ldyB0b29sdGlwCiAgLy8KICAvLyBSZXR1cm5zIGEgdGlwCiAgZnVuY3Rpb24gaW5kZXgoKSB7CiAgICB2YXIgZGlyZWN0aW9uICAgPSBkM1RpcERpcmVjdGlvbiwKICAgICAgICBvZmZzZXQgICAgICA9IGQzVGlwT2Zmc2V0LAogICAgICAgIGh0bWwgICAgICAgID0gZDNUaXBIVE1MLAogICAgICAgIHJvb3RFbGVtZW50ID0gZG9jdW1lbnQuYm9keSwKICAgICAgICBub2RlICAgICAgICA9IGluaXROb2RlKCksCiAgICAgICAgc3ZnICAgICAgICAgPSBudWxsLAogICAgICAgIHBvaW50ICAgICAgID0gbnVsbCwKICAgICAgICB0YXJnZXQgICAgICA9IG51bGw7CgogICAgZnVuY3Rpb24gdGlwKHZpcykgewogICAgICBzdmcgPSBnZXRTVkdOb2RlKHZpcyk7CiAgICAgIGlmICghc3ZnKSByZXR1cm4KICAgICAgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTsKICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICB9CgogICAgLy8gUHVibGljIC0gc2hvdyB0aGUgdG9vbHRpcCBvbiB0aGUgc2NyZWVuCiAgICAvLwogICAgLy8gUmV0dXJucyBhIHRpcAogICAgdGlwLnNob3cgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICBpZiAoYXJnc1thcmdzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgdGFyZ2V0ID0gYXJncy5wb3AoKTsKCiAgICAgIHZhciBjb250ZW50ID0gaHRtbC5hcHBseSh0aGlzLCBhcmdzKSwKICAgICAgICAgIHBvZmZzZXQgPSBvZmZzZXQuYXBwbHkodGhpcywgYXJncyksCiAgICAgICAgICBkaXIgICAgID0gZGlyZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3MpLAogICAgICAgICAgbm9kZWwgICA9IGdldE5vZGVFbCgpLAogICAgICAgICAgaSAgICAgICA9IGRpcmVjdGlvbnMubGVuZ3RoLAogICAgICAgICAgY29vcmRzLAogICAgICAgICAgc2Nyb2xsVG9wICA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwKICAgICAgICByb290RWxlbWVudC5zY3JvbGxUb3AsCiAgICAgICAgICBzY3JvbGxMZWZ0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgfHwKICAgICAgICByb290RWxlbWVudC5zY3JvbGxMZWZ0OwoKICAgICAgbm9kZWwuaHRtbChjb250ZW50KQogICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDEpLnN0eWxlKCdwb2ludGVyLWV2ZW50cycsICdhbGwnKTsKCiAgICAgIHdoaWxlIChpLS0pIG5vZGVsLmNsYXNzZWQoZGlyZWN0aW9uc1tpXSwgZmFsc2UpOwogICAgICBjb29yZHMgPSBkaXJlY3Rpb25DYWxsYmFja3MuZ2V0KGRpcikuYXBwbHkodGhpcyk7CiAgICAgIG5vZGVsLmNsYXNzZWQoZGlyLCB0cnVlKQogICAgICAgIC5zdHlsZSgndG9wJywgKGNvb3Jkcy50b3AgKyBwb2Zmc2V0WzBdKSArIHNjcm9sbFRvcCArICdweCcpCiAgICAgICAgLnN0eWxlKCdsZWZ0JywgKGNvb3Jkcy5sZWZ0ICsgcG9mZnNldFsxXSkgKyBzY3JvbGxMZWZ0ICsgJ3B4Jyk7CgogICAgICByZXR1cm4gdGlwCiAgICB9OwoKICAgIC8vIFB1YmxpYyAtIGhpZGUgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuaGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbm9kZWwgPSBnZXROb2RlRWwoKTsKICAgICAgbm9kZWwuc3R5bGUoJ29wYWNpdHknLCAwKS5zdHlsZSgncG9pbnRlci1ldmVudHMnLCAnbm9uZScpOwogICAgICByZXR1cm4gdGlwCiAgICB9OwoKICAgIC8vIFB1YmxpYzogUHJveHkgYXR0ciBjYWxscyB0byB0aGUgZDMgdGlwIGNvbnRhaW5lci4KICAgIC8vIFNldHMgb3IgZ2V0cyBhdHRyaWJ1dGUgdmFsdWUuCiAgICAvLwogICAgLy8gbiAtIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZQogICAgLy8gdiAtIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUKICAgIC8vCiAgICAvLyBSZXR1cm5zIHRpcCBvciBhdHRyaWJ1dGUgdmFsdWUKICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFycwogICAgdGlwLmF0dHIgPSBmdW5jdGlvbihuLCB2KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gZ2V0Tm9kZUVsKCkuYXR0cihuKQogICAgICB9CgogICAgICB2YXIgYXJncyA9ICBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICBkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHIuYXBwbHkoZ2V0Tm9kZUVsKCksIGFyZ3MpOwogICAgICByZXR1cm4gdGlwCiAgICB9OwoKICAgIC8vIFB1YmxpYzogUHJveHkgc3R5bGUgY2FsbHMgdG8gdGhlIGQzIHRpcCBjb250YWluZXIuCiAgICAvLyBTZXRzIG9yIGdldHMgYSBzdHlsZSB2YWx1ZS4KICAgIC8vCiAgICAvLyBuIC0gbmFtZSBvZiB0aGUgcHJvcGVydHkKICAgIC8vIHYgLSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKICAgIC8vCiAgICAvLyBSZXR1cm5zIHRpcCBvciBzdHlsZSBwcm9wZXJ0eSB2YWx1ZQogICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzCiAgICB0aXAuc3R5bGUgPSBmdW5jdGlvbihuLCB2KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gZ2V0Tm9kZUVsKCkuc3R5bGUobikKICAgICAgfQoKICAgICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpOwogICAgICBkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlLmFwcGx5KGdldE5vZGVFbCgpLCBhcmdzKTsKICAgICAgcmV0dXJuIHRpcAogICAgfTsKCiAgICAvLyBQdWJsaWM6IFNldCBvciBnZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgdG9vbHRpcAogICAgLy8KICAgIC8vIHYgLSBPbmUgb2Ygbihub3J0aCksIHMoc291dGgpLCBlKGVhc3QpLCBvciB3KHdlc3QpLCBudyhub3J0aHdlc3QpLAogICAgLy8gICAgIHN3KHNvdXRod2VzdCksIG5lKG5vcnRoZWFzdCkgb3Igc2Uoc291dGhlYXN0KQogICAgLy8KICAgIC8vIFJldHVybnMgdGlwIG9yIGRpcmVjdGlvbgogICAgdGlwLmRpcmVjdGlvbiA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZGlyZWN0aW9uCiAgICAgIGRpcmVjdGlvbiA9IHYgPT0gbnVsbCA/IHYgOiBmdW5jdG9yKHYpOwoKICAgICAgcmV0dXJuIHRpcAogICAgfTsKCiAgICAvLyBQdWJsaWM6IFNldHMgb3IgZ2V0cyB0aGUgb2Zmc2V0IG9mIHRoZSB0aXAKICAgIC8vCiAgICAvLyB2IC0gQXJyYXkgb2YgW3gsIHldIG9mZnNldAogICAgLy8KICAgIC8vIFJldHVybnMgb2Zmc2V0IG9yCiAgICB0aXAub2Zmc2V0ID0gZnVuY3Rpb24odikgewogICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBvZmZzZXQKICAgICAgb2Zmc2V0ID0gdiA9PSBudWxsID8gdiA6IGZ1bmN0b3Iodik7CgogICAgICByZXR1cm4gdGlwCiAgICB9OwoKICAgIC8vIFB1YmxpYzogc2V0cyBvciBnZXRzIHRoZSBodG1sIHZhbHVlIG9mIHRoZSB0b29sdGlwCiAgICAvLwogICAgLy8gdiAtIFN0cmluZyB2YWx1ZSBvZiB0aGUgdGlwCiAgICAvLwogICAgLy8gUmV0dXJucyBodG1sIHZhbHVlIG9yIHRpcAogICAgdGlwLmh0bWwgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh0bWwKICAgICAgaHRtbCA9IHYgPT0gbnVsbCA/IHYgOiBmdW5jdG9yKHYpOwoKICAgICAgcmV0dXJuIHRpcAogICAgfTsKCiAgICAvLyBQdWJsaWM6IHNldHMgb3IgZ2V0cyB0aGUgcm9vdCBlbGVtZW50IGFuY2hvciBvZiB0aGUgdG9vbHRpcAogICAgLy8KICAgIC8vIHYgLSByb290IGVsZW1lbnQgb2YgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyBSZXR1cm5zIHJvb3Qgbm9kZSBvZiB0aXAKICAgIHRpcC5yb290RWxlbWVudCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcm9vdEVsZW1lbnQKICAgICAgcm9vdEVsZW1lbnQgPSB2ID09IG51bGwgPyB2IDogZnVuY3Rvcih2KTsKCiAgICAgIHJldHVybiB0aXAKICAgIH07CgogICAgLy8gUHVibGljOiBkZXN0cm95cyB0aGUgdG9vbHRpcCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICBpZiAobm9kZSkgewogICAgICAgIGdldE5vZGVFbCgpLnJlbW92ZSgpOwogICAgICAgIG5vZGUgPSBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB0aXAKICAgIH07CgogICAgZnVuY3Rpb24gZDNUaXBEaXJlY3Rpb24oKSB7IHJldHVybiAnbicgfQogICAgZnVuY3Rpb24gZDNUaXBPZmZzZXQoKSB7IHJldHVybiBbMCwgMF0gfQogICAgZnVuY3Rpb24gZDNUaXBIVE1MKCkgeyByZXR1cm4gJyAnIH0KCiAgICB2YXIgZGlyZWN0aW9uQ2FsbGJhY2tzID0gZDNDb2xsZWN0aW9uLm1hcCh7CiAgICAgICAgICBuOiAgZGlyZWN0aW9uTm9ydGgsCiAgICAgICAgICBzOiAgZGlyZWN0aW9uU291dGgsCiAgICAgICAgICBlOiAgZGlyZWN0aW9uRWFzdCwKICAgICAgICAgIHc6ICBkaXJlY3Rpb25XZXN0LAogICAgICAgICAgbnc6IGRpcmVjdGlvbk5vcnRoV2VzdCwKICAgICAgICAgIG5lOiBkaXJlY3Rpb25Ob3J0aEVhc3QsCiAgICAgICAgICBzdzogZGlyZWN0aW9uU291dGhXZXN0LAogICAgICAgICAgc2U6IGRpcmVjdGlvblNvdXRoRWFzdAogICAgICAgIH0pLAogICAgICAgIGRpcmVjdGlvbnMgPSBkaXJlY3Rpb25DYWxsYmFja3Mua2V5cygpOwoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbk5vcnRoKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3godGhpcyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uLnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm4ueCAtIG5vZGUub2Zmc2V0V2lkdGggLyAyCiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25Tb3V0aCgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KHRoaXMpOwogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3gucy55LAogICAgICAgIGxlZnQ6IGJib3gucy54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbkVhc3QoKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCh0aGlzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LmUueSAtIG5vZGUub2Zmc2V0SGVpZ2h0IC8gMiwKICAgICAgICBsZWZ0OiBiYm94LmUueAogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uV2VzdCgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KHRoaXMpOwogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3gudy55IC0gbm9kZS5vZmZzZXRIZWlnaHQgLyAyLAogICAgICAgIGxlZnQ6IGJib3gudy54IC0gbm9kZS5vZmZzZXRXaWR0aAogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uTm9ydGhXZXN0KCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3godGhpcyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5udy55IC0gbm9kZS5vZmZzZXRIZWlnaHQsCiAgICAgICAgbGVmdDogYmJveC5udy54IC0gbm9kZS5vZmZzZXRXaWR0aAogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uTm9ydGhFYXN0KCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3godGhpcyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uZS55IC0gbm9kZS5vZmZzZXRIZWlnaHQsCiAgICAgICAgbGVmdDogYmJveC5uZS54CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25Tb3V0aFdlc3QoKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCh0aGlzKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LnN3LnksCiAgICAgICAgbGVmdDogYmJveC5zdy54IC0gbm9kZS5vZmZzZXRXaWR0aAogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlyZWN0aW9uU291dGhFYXN0KCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3godGhpcyk7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5zZS55LAogICAgICAgIGxlZnQ6IGJib3guc2UueAogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdE5vZGUoKSB7CiAgICAgIHZhciBkaXYgPSBkM1NlbGVjdGlvbi5zZWxlY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpOwogICAgICBkaXYKICAgICAgICAuc3R5bGUoJ3Bvc2l0aW9uJywgJ2Fic29sdXRlJykKICAgICAgICAuc3R5bGUoJ3RvcCcsIDApCiAgICAgICAgLnN0eWxlKCdvcGFjaXR5JywgMCkKICAgICAgICAuc3R5bGUoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKQogICAgICAgIC5zdHlsZSgnYm94LXNpemluZycsICdib3JkZXItYm94Jyk7CgogICAgICByZXR1cm4gZGl2Lm5vZGUoKQogICAgfQoKICAgIGZ1bmN0aW9uIGdldFNWR05vZGUoZWxlbWVudCkgewogICAgICB2YXIgc3ZnTm9kZSA9IGVsZW1lbnQubm9kZSgpOwogICAgICBpZiAoIXN2Z05vZGUpIHJldHVybiBudWxsCiAgICAgIGlmIChzdmdOb2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycpIHJldHVybiBzdmdOb2RlCiAgICAgIHJldHVybiBzdmdOb2RlLm93bmVyU1ZHRWxlbWVudAogICAgfQoKICAgIGZ1bmN0aW9uIGdldE5vZGVFbCgpIHsKICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgewogICAgICAgIG5vZGUgPSBpbml0Tm9kZSgpOwogICAgICAgIC8vIHJlLWFkZCBub2RlIHRvIERPTQogICAgICAgIHJvb3RFbGVtZW50LmFwcGVuZENoaWxkKG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiBkM1NlbGVjdGlvbi5zZWxlY3Qobm9kZSkKICAgIH0KCiAgICAvLyBQcml2YXRlIC0gZ2V0cyB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIG9mIGEgc2hhcGUKICAgIC8vCiAgICAvLyBHaXZlbiBhIHNoYXBlIG9uIHRoZSBzY3JlZW4sIHdpbGwgcmV0dXJuIGFuIFNWR1BvaW50IGZvciB0aGUgZGlyZWN0aW9ucwogICAgLy8gbihub3J0aCksIHMoc291dGgpLCBlKGVhc3QpLCB3KHdlc3QpLCBuZShub3J0aGVhc3QpLCBzZShzb3V0aGVhc3QpLAogICAgLy8gbncobm9ydGh3ZXN0KSwgc3coc291dGh3ZXN0KS4KICAgIC8vCiAgICAvLyAgICArLSstKwogICAgLy8gICAgfCAgIHwKICAgIC8vICAgICsgICArCiAgICAvLyAgICB8ICAgfAogICAgLy8gICAgKy0rLSsKICAgIC8vCiAgICAvLyBSZXR1cm5zIGFuIE9iamVjdCB7biwgcywgZSwgdywgbncsIHN3LCBuZSwgc2V9CiAgICBmdW5jdGlvbiBnZXRTY3JlZW5CQm94KHRhcmdldFNoYXBlKSB7CiAgICAgIHZhciB0YXJnZXRlbCAgID0gdGFyZ2V0IHx8IHRhcmdldFNoYXBlOwoKICAgICAgd2hpbGUgKHRhcmdldGVsLmdldFNjcmVlbkNUTSA9PSBudWxsICYmIHRhcmdldGVsLnBhcmVudE5vZGUgIT0gbnVsbCkgewogICAgICAgIHRhcmdldGVsID0gdGFyZ2V0ZWwucGFyZW50Tm9kZTsKICAgICAgfQoKICAgICAgdmFyIGJib3ggICAgICAgPSB7fSwKICAgICAgICAgIG1hdHJpeCAgICAgPSB0YXJnZXRlbC5nZXRTY3JlZW5DVE0oKSwKICAgICAgICAgIHRiYm94ICAgICAgPSB0YXJnZXRlbC5nZXRCQm94KCksCiAgICAgICAgICB3aWR0aCAgICAgID0gdGJib3gud2lkdGgsCiAgICAgICAgICBoZWlnaHQgICAgID0gdGJib3guaGVpZ2h0LAogICAgICAgICAgeCAgICAgICAgICA9IHRiYm94LngsCiAgICAgICAgICB5ICAgICAgICAgID0gdGJib3gueTsKCiAgICAgIHBvaW50LnggPSB4OwogICAgICBwb2ludC55ID0geTsKICAgICAgYmJveC5udyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpOwogICAgICBwb2ludC54ICs9IHdpZHRoOwogICAgICBiYm94Lm5lID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CiAgICAgIHBvaW50LnkgKz0gaGVpZ2h0OwogICAgICBiYm94LnNlID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CiAgICAgIHBvaW50LnggLT0gd2lkdGg7CiAgICAgIGJib3guc3cgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KTsKICAgICAgcG9pbnQueSAtPSBoZWlnaHQgLyAyOwogICAgICBiYm94LncgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KTsKICAgICAgcG9pbnQueCArPSB3aWR0aDsKICAgICAgYmJveC5lID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CiAgICAgIHBvaW50LnggLT0gd2lkdGggLyAyOwogICAgICBwb2ludC55IC09IGhlaWdodCAvIDI7CiAgICAgIGJib3gubiA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpOwogICAgICBwb2ludC55ICs9IGhlaWdodDsKICAgICAgYmJveC5zID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCk7CgogICAgICByZXR1cm4gYmJveAogICAgfQoKICAgIC8vIFByaXZhdGUgLSByZXBsYWNlIEQzSlMgMy5YIGQzLmZ1bmN0b3IoKSBmdW5jdGlvbgogICAgZnVuY3Rpb24gZnVuY3Rvcih2KSB7CiAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJyA/IHYgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdgogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHRpcAogIH0KCiAgcmV0dXJuIGluZGV4OwoKfSkpKTsK"></script>
<link href="data:text/css,%2Ed3%2Dtip%20%7B%0Aline%2Dheight%3A%201%3B%0A%0Apadding%3A%2012px%3B%0Abackground%3A%20rgba%280%2C%200%2C%200%2C%200%2E7%29%3B%0Acolor%3A%20%23fff%3B%0Aborder%2Dradius%3A%202px%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ2Nob3JkZGlhZycsCiAgdHlwZTogJ291dHB1dCcsCgogIGluaXRpYWxpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CgogICAgZDMuc2VsZWN0KGVsKS5hcHBlbmQoInN2ZyIpCiAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGhlaWdodCk7CgogICAgcmV0dXJuIGQzLmNob3JkKCk7CgogIH0sCgogIHJlc2l6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQsIGNob3JkKSB7CgogICAgZDMuc2VsZWN0KGVsKS5zZWxlY3QoInN2ZyIpCiAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgd2lkdGgpCiAgICAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIGhlaWdodCk7CgogICAgdGhpcy5yZW5kZXJWYWx1ZShlbCwgY2hvcmQucGFyYW1zLCBjaG9yZCk7CgogIH0sCgogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgcGFyYW1zLCBjaG9yZCkgewoKICAgIC8vIHNhdmUgcGFyYW1zIGZvciByZWZlcmVuY2UgZnJvbSByZXNpemUgbWV0aG9kCiAgICBjaG9yZC5wYXJhbXMgPSBwYXJhbXM7CgogICAgdmFyIG1hdHJpeCA9IHBhcmFtcy5tYXRyaXgsCiAgICAgICAgb3B0aW9ucyA9IHBhcmFtcy5vcHRpb25zOwoKICAgIC8vIGdldCB3aWR0aCBhbmQgaGVpZ2h0LCBjYWxjdWxhdGUgbWluIGZvciB1c2UgaW4gZGlhZ3JhbSBzaXplCiAgICB2YXIgd2lkdGggPSBlbC5vZmZzZXRXaWR0aCwKICAgICAgICBoZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQsCiAgICAgICAgZCA9IE1hdGgubWluKHdpZHRoLCBoZWlnaHQpOwoKICAgIHZhciB0eXBlID0gb3B0aW9ucy50eXBlLAogICAgICAgIG1hcmdpbiA9IG9wdGlvbnMubWFyZ2luLAogICAgICAgIHNob3dHcm91cG5hbWVzID0gb3B0aW9ucy5zaG93R3JvdXBuYW1lcywKICAgICAgICBncm91cE5hbWVzID0gb3B0aW9ucy5ncm91cE5hbWVzLAogICAgICAgIGdyb3VwQ29sb3JzID0gb3B0aW9ucy5ncm91cENvbG9ycywKICAgICAgICBncm91cFRoaWNrbmVzcyA9IG9wdGlvbnMuZ3JvdXBUaGlja25lc3MsCiAgICAgICAgZ3JvdXBQYWRkaW5nID0gb3B0aW9ucy5ncm91cFBhZGRpbmcsCiAgICAgICAgZ3JvdXBuYW1lUGFkZGluZyA9IG9wdGlvbnMuZ3JvdXBuYW1lUGFkZGluZywKICAgICAgICBncm91cG5hbWVGb250c2l6ZSA9IG9wdGlvbnMuZ3JvdXBuYW1lRm9udHNpemUsCiAgICAgICAgZ3JvdXBlZGdlQ29sb3IgPSBvcHRpb25zLmdyb3VwZWRnZUNvbG9yLAogICAgICAgIGNob3JkZWRnZUNvbG9yID0gb3B0aW9ucy5jaG9yZGVkZ2VDb2xvciwKICAgICAgICBjYXRlZ29yeU5hbWVzID0gb3B0aW9ucy5jYXRlZ29yeU5hbWVzLAogICAgICAgIGNhdGVnb3J5bmFtZVBhZGRpbmcgPSBvcHRpb25zLmNhdGVnb3J5bmFtZVBhZGRpbmcsCiAgICAgICAgY2F0ZWdvcnluYW1lRm9udHNpemUgPSBvcHRpb25zLmNhdGVnb3J5bmFtZUZvbnRzaXplLAogICAgICAgIHNob3dUaWNrcyA9IG9wdGlvbnMuc2hvd1RpY2tzLAogICAgICAgIHRpY2tJbnRlcnZhbCA9IG9wdGlvbnMudGlja0ludGVydmFsLAogICAgICAgIHRpY2tsYWJlbEZvbnRzaXplID0gb3B0aW9ucy50aWNrbGFiZWxGb250c2l6ZSwKICAgICAgICBmYWRlTGV2ZWwgPSBvcHRpb25zLmZhZGVMZXZlbCwKICAgICAgICBzaG93VG9vbHRpcHMgPSBvcHRpb25zLnNob3dUb29sdGlwcywKICAgICAgICBzaG93WmVyb1Rvb2x0aXBzID0gb3B0aW9ucy5zaG93WmVyb1Rvb2x0aXBzLAogICAgICAgIHRvb2x0aXBOYW1lcyA9IG9wdGlvbnMudG9vbHRpcE5hbWVzLAogICAgICAgIHRvb2x0aXBGb250c2l6ZSA9IG9wdGlvbnMudG9vbHRpcEZvbnRzaXplLAogICAgICAgIHRvb2x0aXBVbml0ID0gb3B0aW9ucy50b29sdGlwVW5pdCwKICAgICAgICB0b29sdGlwR3JvdXBDb25uZWN0b3IgPSBvcHRpb25zLnRvb2x0aXBHcm91cENvbm5lY3RvciwKICAgICAgICBwcmVjaXNpb24gPSBvcHRpb25zLnByZWNpc2lvbiwKICAgICAgICBjbGlja0FjdGlvbiA9IG9wdGlvbnMuY2xpY2tBY3Rpb24sCiAgICAgICAgY2xpY2tHcm91cEFjdGlvbiA9IG9wdGlvbnMuY2xpY2tHcm91cEFjdGlvbjsKCiAgICBkMy5zZWxlY3QoZWwpLnNlbGVjdEFsbCgiZGl2LmQzLXRpcCIpLnJlbW92ZSgpOwoKICAgIGlmIChzaG93VG9vbHRpcHMpIHsKICAgICAgICB2YXIgY2hvcmRUaXAgPSBkMy50aXAoKQogICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2QzLXRpcCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIHRvb2x0aXBGb250c2l6ZSArICJweCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmRpcmVjdGlvbignbicpCiAgICAgICAgICAgICAgICAgICAgICAgICAub2Zmc2V0KFsxMCwgMTBdKQogICAgICAgICAgICAgICAgICAgICAgICAgLmh0bWwoZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGV4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgaSA9IGQuc291cmNlLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqID0gZC50YXJnZXQuaW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZpaiA9IHNpZ0ZpZ3MobWF0cml4W2ldW2pdLCBwcmVjaXNpb24pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2amkgPSBzaWdGaWdzKG1hdHJpeFtqXVtpXSwgcHJlY2lzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGlyMSA9IHRvb2x0aXBOYW1lc1tpXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tqXSArICI6ICIgKyB2aWogKyB0b29sdGlwVW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyMiA9IHRvb2x0aXBOYW1lc1tqXSArIHRvb2x0aXBHcm91cENvbm5lY3RvciArIHRvb2x0aXBOYW1lc1tpXSArICI6ICIgKyB2amkgKyB0b29sdGlwVW5pdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAiZGlyZWN0aW9uYWwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXIxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3daZXJvVG9vbHRpcHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyMSArICI8L2JyPiIgKyBkaXIyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyMSArICh2amkgPiAwID8gIjwvYnI+IiArIGRpcjIgOiAiIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImJpcGFydGl0ZSIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpcjI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgIHZhciBncm91cFRpcCA9IGQzLnRpcCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnZDMtdGlwJykKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdG9vbHRpcEZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1mYW1pbHkiLCAic2Fucy1zZXJpZiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAuZGlyZWN0aW9uKCduJykKICAgICAgICAgICAgICAgICAgICAgICAgIC5vZmZzZXQoWzEwLCAxMF0pCiAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2lnRmlncyhkLnZhbHVlLCBwcmVjaXNpb24pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b29sdGlwTmFtZXNbZC5pbmRleF0gKyAiICh0b3RhbCk6ICIgKyB2YWx1ZSArIHRvb2x0aXBVbml0OwogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICB9CgogICAgdmFyIHN2Z0NvbnRhaW5lciA9IGQzLnNlbGVjdChlbCkuc2VsZWN0KCJzdmciKTsKICAgIHN2Z0NvbnRhaW5lci5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTsKCiAgICAvLyBhcHBseSBjaG9yZCBzZXR0aW5ncyBhbmQgZGF0YQogICAgY2hvcmQgPSBjaG9yZC5wYWRBbmdsZShncm91cFBhZGRpbmcpCiAgICAgICAgICAgICAgICAgLnNvcnRTdWJncm91cHMoZDMuZGVzY2VuZGluZykobWF0cml4KTsKCiAgICAvLyBjYWxjdWxhdGUgb3V0ZXIgYW5kIGlubmVyIHJhZGl1cyBmb3IgY2hvcmQgZGlhZ3JhbQogICAgdmFyIG91dGVyUmFkaXVzID0gKGQgLSAyICogbWFyZ2luKSAvIDIsCiAgICAgICAgaW5uZXJSYWRpdXMgPSBvdXRlclJhZGl1cyAqICgxIC0gZ3JvdXBUaGlja25lc3MpOwoKICAgIC8vIGNyZWF0ZSBvcmRpbmFsIGNvbG9yIGZpbGwgc2NhbGUgZnJvbSBncm91cENvbG9ycwogICAgdmFyIGZpbGxTY2FsZSA9IGQzLnNjYWxlT3JkaW5hbCgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9tYWluKGQzLnJhbmdlKG1hdHJpeC5sZW5ndGgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJhbmdlKGdyb3VwQ29sb3JzKTsKCiAgICAvLyBjYWxjdWxhdGUgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgdHJhbnNsYXRpb24gdmFsdWVzCiAgICB2YXIgeFRyYW5zbGF0ZSA9IE1hdGgubWF4KHdpZHRoIC8gMiwgb3V0ZXJSYWRpdXMgKyBtYXJnaW4pLAogICAgICAgIHlUcmFuc2xhdGUgPSBNYXRoLm1heChoZWlnaHQgLyAyLCBvdXRlclJhZGl1cyArIG1hcmdpbik7CgogICAgdmFyIHN2ZyA9IHN2Z0NvbnRhaW5lci5hcHBlbmQoImciKTsKICAgIHN2Zy5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4VHJhbnNsYXRlICsgIiwiICsgeVRyYW5zbGF0ZSArICIpIik7CgogICAgaWYgKHNob3dUb29sdGlwcykgewogICAgICAgc3ZnLmNhbGwoY2hvcmRUaXApCiAgICAgICAgICAuY2FsbChncm91cFRpcCk7CiAgICB9CgogICAgLy8gY3JlYXRlIGdyb3VwcwogICAgdmFyIGdyb3VwcyA9IHN2Zy5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJncm91cHMiKQogICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoInBhdGgiKQogICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmdyb3VwcykKICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJncm91cC0iICsgZ3JvdXBOYW1lc1tpXTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAvLyBzdHlsZSBncm91cHMgYW5kIGRlZmluZSBtb3VzZSBldmVudHMKICAgIGdyb3Vwcy5zdHlsZSgiZmlsbCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLmluZGV4KTsgfSkKICAgICAgICAgIC5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZmlsbFNjYWxlKGQuaW5kZXgpOyB9KQogICAgICAgICAgLmF0dHIoImQiLCBkMy5hcmMoKS5pbm5lclJhZGl1cyhpbm5lclJhZGl1cykub3V0ZXJSYWRpdXMob3V0ZXJSYWRpdXMpKQogICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgaWYgKHNob3dUb29sdGlwcykgZ3JvdXBUaXAuc2hvdyhkLHRoaXMpOwogICAgICAgICAgICAgIHJldHVybiBncm91cEZhZGUoZCwgZmFkZUxldmVsKTsKICAgICAgICAgIH0pCiAgICAgICAgICAub24oIm1vdXNlb3V0IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgIGlmIChzaG93VG9vbHRpcHMpIGdyb3VwVGlwLmhpZGUoZCk7CiAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwRmFkZShkLCAxKTsKICAgICAgICAgIH0pCiAgICAgICAgICAub24oImNsaWNrIiwgY2xpY2tHcm91cCk7CgogICAgaWYgKGdyb3VwZWRnZUNvbG9yKSB7CiAgICAgICAgZ3JvdXBzLnN0eWxlKCJzdHJva2UiLCBncm91cGVkZ2VDb2xvcik7CiAgICB9IGVsc2UgewogICAgICAgIGdyb3Vwcy5zdHlsZSgic3Ryb2tlIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZmlsbFNjYWxlKGQuaW5kZXgpOyB9KTsKICAgIH0KCiAgICBpZiAoc2hvd1RpY2tzKSB7CiAgICAgICAgLy8gY3JlYXRlIHRpY2tzIGZvciBncm91cHMKICAgICAgICB2YXIgdGlja3MgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAidGlja3MiKQogICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoImciKQogICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGNob3JkLmdyb3VwcykKICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKSAvLy5hdHRyKCJjbGFzcyIsICJ0aWNrcyIpCiAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCwgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRpY2tzLSIgKyBncm91cE5hbWVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgiZyIpCiAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoZ3JvdXBUaWNrcykKICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJ0aWNrIikKICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInJvdGF0ZSgiICsgKGQuYW5nbGUgKiAxODAgLyBNYXRoLlBJIC0gOTApICsgIikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0cmFuc2xhdGUoIiArIG91dGVyUmFkaXVzICsgIiwgMCkiOwogICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBhZGQgdGljayBtYXJrcwogICAgICAgIHRpY2tzLmFwcGVuZCgibGluZSIpCiAgICAgICAgICAgICAuYXR0cigieDEiLCAxKQogICAgICAgICAgICAgLmF0dHIoInkxIiwgMCkKICAgICAgICAgICAgIC5hdHRyKCJ4MiIsIDUpCiAgICAgICAgICAgICAuYXR0cigieTIiLCAwKQogICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLCAiIzAwMCIpOwoKICAgICAgICAvLyBhZGQgdGljayBsYWJlbHMKICAgICAgICB0aWNrcy5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAgLmF0dHIoIngiLCAwKQogICAgICAgICAgICAgLmF0dHIoImR5IiwgIi4zNWVtIikKICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgdGlja2xhYmVsRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAgLnN0eWxlKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLmFuZ2xlID4gTWF0aC5QSSA/ICJyb3RhdGUoMTgwKXRyYW5zbGF0ZSgtOCkiIDogInRyYW5zbGF0ZSg4KSI7IH0pCiAgICAgICAgICAgICAuc3R5bGUoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5hbmdsZSA+IE1hdGguUEkgPyAiZW5kIiA6ICJzdGFydCI7IH0pCiAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7IHJldHVybiBkLmxhYmVsOyB9KTsKICAgIH0KCiAgICAvLyBjcmVhdGUgY2hvcmRzCiAgICB2YXIgY2hvcmRzID0gc3ZnLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgImNob3JkcyIpCiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgicGF0aCIpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEoY2hvcmQpCiAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLCBmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY2hvcmQtIiArIGdyb3VwTmFtZXNbZC5zb3VyY2UuaW5kZXhdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICItIiArIGdyb3VwTmFtZXNbZC50YXJnZXQuaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoImQiLCBkMy5yaWJib24oKS5yYWRpdXMoaW5uZXJSYWRpdXMpKTsKCiAgICAvLyBzdHlsZSBjaG9yZHMgYW5kIGRlZmluZSBtb3VzZSBldmVudHMKICAgIGNob3Jkcy5zdHlsZSgiZmlsbCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGZpbGxTY2FsZShkLnRhcmdldC5pbmRleCk7IH0pCiAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsIGNob3JkZWRnZUNvbG9yKQogICAgICAgICAgLnN0eWxlKCJmaWxsLW9wYWNpdHkiLCAwLjY3KQogICAgICAgICAgLnN0eWxlKCJzdHJva2Utd2lkdGgiLCAiMC41cHgiKQogICAgICAgICAgLnN0eWxlKCJvcGFjaXR5IiwgMSkKICAgICAgICAgIC5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgIGlmIChzaG93VG9vbHRpcHMpIGNob3JkVGlwLnNob3coZCwgdGhpcyk7CiAgICAgICAgICAgICAgcmV0dXJuIGNob3JkRmFkZShkLCBmYWRlTGV2ZWwpOwogICAgICAgICAgfSkKICAgICAgICAgIC5vbigibW91c2VvdXQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgaWYgKHNob3dUb29sdGlwcykgY2hvcmRUaXAuaGlkZShkKTsKICAgICAgICAgICAgICByZXR1cm4gY2hvcmRGYWRlKGQsIDEpOwogICAgICAgICAgfSkKICAgICAgICAgIC5vbigiY2xpY2siLCBjbGljayk7CgogICAgLy8gY3JlYXRlIGdyb3VwIGxhYmVscwogICAgaWYgKHNob3dHcm91cG5hbWVzKSB7CiAgICAgICAgdmFyIG5hbWVzID0gc3ZnLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgIm5hbWVzIikKICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShjaG9yZC5ncm91cHMpCiAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAibmFtZSIpCiAgICAgICAgICAgICAgICAgICAgICAgLm9uKCJtb3VzZW92ZXIiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cEZhZGUoZCwgZmFkZUxldmVsKTsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5vbigibW91c2VvdXQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cEZhZGUoZCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShncm91cExhYmVscykKICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJsYWJlbC0iICsgZC5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAicm90YXRlKCIgKyAoZC5hbmdsZSAqIDE4MCAvIE1hdGguUEkgLSA5MCkgKyAiKSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0cmFuc2xhdGUoIiArIChvdXRlclJhZGl1cyArIGQucGFkZGluZykgKyAiLCAwKSI7CiAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgbmFtZXMuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgLmF0dHIoIngiLCAwKQogICAgICAgICAgICAuYXR0cigiZHkiLCAiLjM1ZW0iKQogICAgICAgICAgICAuc3R5bGUoImZvbnQtc2l6ZSIsIGdyb3VwbmFtZUZvbnRzaXplICsgInB4IikKICAgICAgICAgICAgLnN0eWxlKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkLmhhbmRzaWRlID09ICJsZWZ0IiA/ICJyb3RhdGUoMTgwKSIgOiBudWxsOwogICAgICAgICAgICB9KQogICAgICAgICAgICAuc3R5bGUoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5oYW5kc2lkZSA9PSAibGVmdCIgPyAiZW5kIiA6ICJzdGFydCI7IH0pCiAgICAgICAgICAgIC50ZXh0KGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQubGFiZWw7IH0pCiAgICAgICAgICAgIC5hdHRyKCJpZCIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQubGFiZWw7IH0pOwogICAgfQoKICAgIGlmIChjYXRlZ29yeU5hbWVzKSB7CiAgICAgICAgdmFyIGNhdGVnb3JpZXMgPSBzdmcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCAiY2F0ZWdvcmllcyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGNhdGVnb3J5TmFtZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsICJjYXRlZ29yeSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKGNhdGVnb3J5TGFiZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbCIsICJibGFjayIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigiaWQiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJsYWJlbC0iICsgZC5sYWJlbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAicm90YXRlKCIgKyAoZC5hbmdsZSAqIDE4MCAvIE1hdGguUEkpICsgIikiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRyYW5zbGF0ZSgiICsgKG91dGVyUmFkaXVzICsgY2F0ZWdvcnluYW1lUGFkZGluZykgKyAiLCAwKSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgY2F0ZWdvcmllcy5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAgICAgICAuYXR0cigieCIsIDApCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgiZm9udC1zaXplIiwgY2F0ZWdvcnluYW1lRm9udHNpemUgKyAicHgiKQogICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtZmFtaWx5IiwgInNhbnMtc2VyaWYiKQogICAgICAgICAgICAgICAgICAuc3R5bGUoImZvbnQtd2VpZ2h0IiwgImJvbGQiKQogICAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCwgaSkgeyByZXR1cm4gaSA/ICJyb3RhdGUoMjcwKSIgOiAicm90YXRlKDkwKSI7IH0pCiAgICAgICAgICAgICAgICAgIC5zdHlsZSgidGV4dC1hbmNob3IiLCAibWlkZGxlIikKICAgICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSkKICAgICAgICAgICAgICAgICAgLmF0dHIoImlkIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC5sYWJlbDsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2F0ZWdvcnlMYWJlbHMoZCwgaSkgewogICAgICAgIHJldHVybiBbewogICAgICAgICAgYW5nbGU6IGkgKiBNYXRoLlBJLAogICAgICAgICAgbGFiZWw6IGQKICAgICAgICB9XTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGFuIGFycmF5IG9mIHRpY2sgYW5nbGVzIGFuZCBsYWJlbHMsIGdpdmVuIGEgZ3JvdXAKICAgIGZ1bmN0aW9uIGdyb3VwVGlja3MoZCkgewogICAgICB2YXIgayA9IChkLmVuZEFuZ2xlIC0gZC5zdGFydEFuZ2xlKSAvIGQudmFsdWU7CiAgICAgIHJldHVybiBkMy5yYW5nZSgwLCBkLnZhbHVlLCB0aWNrSW50ZXJ2YWwpLm1hcChmdW5jdGlvbih2LCBpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGFuZ2xlOiB2ICogayArIGQuc3RhcnRBbmdsZSwKICAgICAgICAgIGxhYmVsOiBpICUgNSA/IG51bGwgOiB2CiAgICAgICAgfTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ3JvdXBMYWJlbHMoZCkgewogICAgICB2YXIgYSA9IChkLnN0YXJ0QW5nbGUgKyBkLmVuZEFuZ2xlKSAvIDI7CiAgICAgIHJldHVybiBbewogICAgICAgICAgYW5nbGU6IGEsCiAgICAgICAgICBoYW5kc2lkZTogKGEgPCBNYXRoLlBJKSA/ICJyaWdodCIgOiAibGVmdCIsCiAgICAgICAgICBsYWJlbDogZ3JvdXBOYW1lc1tkLmluZGV4XSwKICAgICAgICAgIHBhZGRpbmc6IGdyb3VwbmFtZVBhZGRpbmdbZC5pbmRleF0KICAgICAgICB9XTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGZhZGluZyBhbGwgY2hvcmRzIG5vdCBiZWxvbmdpbmcgdG8gYQogICAgLy8gc3BlY2lmaWMgZ3JvdXAKICAgIGZ1bmN0aW9uIGdyb3VwRmFkZShnLCBvcGFjaXR5KSB7CiAgICAgICAgc3ZnLnNlbGVjdEFsbCgiLmNob3JkcyBwYXRoIikKICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkLnNvdXJjZS5pbmRleCAhPSBnLmluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZC50YXJnZXQuaW5kZXggIT0gZy5pbmRleDsgfSkKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuc3R5bGUoIm9wYWNpdHkiLCBvcGFjaXR5KTsKICAgIH0KCiAgICAvLyByZXR1cm5zIGFuIGV2ZW50IGhhbmRsZXIgZm9yIGZhZGluZyBhbGwgY2hvcmRzIGV4Y2VwdCBmb3IgdGhlIG9uZQogICAgLy8gZ2l2ZW4KICAgIGZ1bmN0aW9uIGNob3JkRmFkZShnLCBvcGFjaXR5KSB7CiAgICAgICAgc3ZnLnNlbGVjdEFsbCgiLmNob3JkcyBwYXRoIikKICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbihkKSB7IHJldHVybiBkLnNvdXJjZS5pbmRleCAhPSBnLnNvdXJjZS5pbmRleAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGQudGFyZ2V0LmluZGV4ICE9IGcudGFyZ2V0LmluZGV4OwogICAgICAgICAgICB9KQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5zdHlsZSgib3BhY2l0eSIsIG9wYWNpdHkpOwogICAgfQoKICAgIC8vIHJvdW5kIHRvIHNpZ25pZmljYW50IGZpZ3VyZXMgLyBkaWdpdHMKICAgIGZ1bmN0aW9uIHNpZ0ZpZ3Mobiwgc2lnKSB7CiAgICAgICAgaWYgKG4gPT0gMCkgeyByZXR1cm4gbn0KICAgICAgICBpZiAoc2lnID09ICJudWxsIikgeyBzaWcgPSA3OyB9CiAgICAgICAgdmFyIG11bHQgPSBNYXRoLnBvdygxMCwgc2lnIC0gTWF0aC5mbG9vcihNYXRoLmxvZyhuKSAvIE1hdGguTE4xMCkgLSAxKTsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChuICogbXVsdCkgLyBtdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaWNrKGQpIHsKICAgICAgcmV0dXJuIGV2YWwoY2xpY2tBY3Rpb24pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaWNrR3JvdXAoZCkgewogICAgICAgIHJldHVybiBldmFsKGNsaWNrR3JvdXBBY3Rpb24pCiAgICB9CgogIH0gIC8vIGVuZCByZW5kZXJWYWx1ZSBmdW5jdGlvbgoKfSk7Cgo="></script>
</head>
<body style="background-color: white;">
<div id="htmlwidget_container">
<div id="htmlwidget-a3204361f1545453ee54" class="chorddiag html-widget" style="width:960px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-a3204361f1545453ee54">{"x":{"matrix":[[0,0,0,0,0,0,0,0,0,0,0,0,288,150],[0,0,0,0,0,0,0,0,0,0,0,0,78,342],[0,0,0,0,0,0,0,0,0,0,0,0,8,240],[0,0,0,0,0,0,0,0,0,0,0,0,148,79],[0,0,0,0,0,0,0,0,0,0,0,0,11,161],[0,0,0,0,0,0,0,0,0,0,0,0,74,79],[0,0,0,0,0,0,0,0,0,0,0,0,66,84],[0,0,0,0,0,0,0,0,0,0,0,0,63,85],[0,0,0,0,0,0,0,0,0,0,0,0,50,79],[0,0,0,0,0,0,0,0,0,0,0,0,56,65],[0,0,0,0,0,0,0,0,0,0,0,0,50,61],[0,0,0,0,0,0,0,0,0,0,0,0,27,80],[288,78,8,148,11,74,66,63,50,56,50,27,0,0],[150,342,240,79,161,79,84,85,79,65,61,80,0,0]],"options":{"type":"directional","width":null,"height":null,"margin":150,"showGroupnames":true,"groupNames":["Barack Obama","Donald Trump","Bloggers","Hillary Clinton","Chain email","John McCain","Scott Walker","Mitt Romney","Rick Perry","Marco Rubio","Rick Scott","Ted Cruz","Truth","Lie"],"groupColors":["#1B9E77","#D95F02","#7570B3","#E7298A","#66A61E","#E6AB02","#A6761D","#666666"],"groupThickness":0.1,"groupPadding":0.0349065850398866,"groupnamePadding":[30,30,30,30,30,30,30,30,30,30,30,30,30,30],"groupnameFontsize":18,"groupedgeColor":null,"chordedgeColor":"#808080","categoryNames":null,"categorynamePadding":100,"categorynameFontsize":28,"showTicks":true,"tickInterval":10,"ticklabelFontsize":10,"fadeLevel":0.1,"showTooltips":true,"showZeroTooltips":true,"tooltipNames":["Barack Obama","Donald Trump","Bloggers","Hillary Clinton","Chain email","John McCain","Scott Walker","Mitt Romney","Rick Perry","Marco Rubio","Rick Scott","Ted Cruz","Truth","Lie"],"tooltipFontsize":12,"tooltipUnit":"","tooltipGroupConnector":" ▶ ","precision":"null","clickAction":null,"clickGroupAction":null}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-a3204361f1545453ee54">{"viewer":{"width":450,"height":350,"padding":0,"fill":true},"browser":{"width":960,"height":500,"padding":0,"fill":true}}</script>
</body>
</html>