Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Last active October 21, 2017 12:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save timelyportfolio/34296462d01cc80915d1f01431723763 to your computer and use it in GitHub Desktop.
Save timelyportfolio/34296462d01cc80915d1f01431723763 to your computer and use it in GitHub Desktop.
sankeytree on Titanic
license: mit

This example courtesy of Displayr who have generously offered to sponsor a series of independently authored posts about interactive visualization with R and JavaScript. Thank you so much Displayr for this opportunity.


Code in R

Below is the R source code for creating this visualization.

library(d3r)
library(dplyr)
library(htmltools)
library(treemap)
#devtools::install_github("https://github.com/Displayr/rhtmlSankeyTree")
library(sankeytreeR)

titan_tree <- as.data.frame(Titanic) %>%
  select(-Age) %>%
  group_by(Class, Sex, Survived) %>%
  summarise(Freq = sum(Freq)) %>%
  treemap(index=c("Class", "Sex", "Survived"), vSize="Freq") %>%
  {.$tm} %>%
  rename(size = vSize) %>%
  mutate(color = mapply(
    function(Sex,Survived,color) {
      if(is.na(Sex)){ return("gray") }
      print(c(Sex,Survived,color))
      if(Sex=="Male" && is.na(Survived)){ return("cadetblue")}
      if(Sex=="Female" && is.na(Survived)){ return("pink")}
      if(!is.na(Survived)&&Survived=="No") {return("red")}
      if(!is.na(Survived)&&Survived=="Yes") {return("green")}
    },
    Sex,
    Survived,
    color,
    SIMPLIFY = FALSE
  )) %>%
  select(1:4, color) %>%
  d3_nest(value_cols=c("size","color"), root="Titanic", json=FALSE) %>%
  mutate(size = sum(Titanic), color="#F0F") %>%
  d3_json(strip=TRUE)

sankeytree(titan_tree, maxLabelLength=15, treeColors=FALSE)
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiaW5kaW5nRGVmLnJlbmRlclZhbHVlKGVsLCBkYXRhLngsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgIH07CgogICAgICAvLyBPbmx5IG92ZXJyaWRlIHJlc2l6ZSBpZiBiaW5kaW5nRGVmIGltcGxlbWVudHMgaXQKICAgICAgaWYgKGJpbmRpbmdEZWYucmVzaXplKSB7CiAgICAgICAgc2hpbnlCaW5kaW5nLnJlc2l6ZSA9IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAvLyBTaGlueSBjYW4gY2FsbCByZXNpemUgYmVmb3JlIGluaXRpYWxpemUvcmVuZGVyVmFsdWUgaGF2ZSBiZWVuCiAgICAgICAgICAvLyBjYWxsZWQsIHdoaWNoIGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3Igd2lkZ2V0cy4KICAgICAgICAgIGlmIChlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIikpIHsKICAgICAgICAgICAgYmluZGluZ0RlZi5yZXNpemUoZWwsIHdpZHRoLCBoZWlnaHQsIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgU2hpbnkub3V0cHV0QmluZGluZ3MucmVnaXN0ZXIoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLm5hbWUpOwogICAgfQogIH07CgogIHZhciBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogIGZ1bmN0aW9uIHNjaGVkdWxlU3RhdGljUmVuZGVyKCkgewogICAgaWYgKCFzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQpIHsKICAgICAgc2NoZWR1bGVTdGF0aWNSZW5kZXJUaW1lcklkID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBudWxsOwogICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIoKTsKICAgICAgfSwgMSk7CiAgICB9CiAgfQoKICAvLyBSZW5kZXIgc3RhdGljIHdpZGdldHMgYWZ0ZXIgdGhlIGRvY3VtZW50IGZpbmlzaGVzIGxvYWRpbmcKICAvLyBTdGF0aWNhbGx5IHJlbmRlciBhbGwgZWxlbWVudHMgdGhhdCBhcmUgb2YgdGhpcyB3aWRnZXQncyBjbGFzcwogIHdpbmRvdy5IVE1MV2lkZ2V0cy5zdGF0aWNSZW5kZXIgPSBmdW5jdGlvbigpIHsKICAgIHZhciBiaW5kaW5ncyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgZm9yRWFjaChiaW5kaW5ncywgZnVuY3Rpb24oYmluZGluZykgewogICAgICB2YXIgbWF0Y2hlcyA9IGJpbmRpbmcuZmluZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpOwogICAgICBmb3JFYWNoKG1hdGNoZXMsIGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgdmFyIHNpemVPYmogPSBpbml0U2l6aW5nKGVsLCBiaW5kaW5nKTsKCiAgICAgICAgaWYgKGhhc0NsYXNzKGVsLCAiaHRtbC13aWRnZXQtc3RhdGljLWJvdW5kIikpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lICsgIiBodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiOwoKICAgICAgICB2YXIgaW5pdFJlc3VsdDsKICAgICAgICBpZiAoYmluZGluZy5pbml0aWFsaXplKSB7CiAgICAgICAgICBpbml0UmVzdWx0ID0gYmluZGluZy5pbml0aWFsaXplKGVsLAogICAgICAgICAgICBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldEhlaWdodCgpIDogZWwub2Zmc2V0SGVpZ2h0CiAgICAgICAgICApOwogICAgICAgICAgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIsIGluaXRSZXN1bHQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRpbmcucmVzaXplKSB7CiAgICAgICAgICB2YXIgbGFzdFNpemUgPSB7fTsKICAgICAgICAgIHZhciByZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgICAgICB3OiBzaXplT2JqID8gc2l6ZU9iai5nZXRXaWR0aCgpIDogZWwub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgaDogc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHNpemUudyA9PT0gMCAmJiBzaXplLmggPT09IDApCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSBsYXN0U2l6ZS53ICYmIHNpemUuaCA9PT0gbGFzdFNpemUuaCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGxhc3RTaXplID0gc2l6ZTsKICAgICAgICAgICAgYmluZGluZy5yZXNpemUoZWwsIHNpemUudywgc2l6ZS5oLCBpbml0UmVzdWx0KTsKICAgICAgICAgIH07CgogICAgICAgICAgb24od2luZG93LCAicmVzaXplIiwgcmVzaXplSGFuZGxlcik7CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIGNhc2VzIHdoZXJlIHdlJ3JlIHJ1bm5pbmcgaW4gYSBTaGlueQogICAgICAgICAgLy8gYXBwLCBidXQgdGhlIHdpZGdldCBpdHNlbGYgaXMgbm90IGEgU2hpbnkgb3V0cHV0LCBidXQKICAgICAgICAgIC8vIHJhdGhlciBhIHNpbXBsZSBzdGF0aWMgd2lkZ2V0LiBPbmUgZXhhbXBsZSBvZiB0aGlzIGlzCiAgICAgICAgICAvLyBhbiBybWFya2Rvd24gZG9jdW1lbnQgdGhhdCBoYXMgcnVudGltZTpzaGlueSBhbmQgd2lkZ2V0CiAgICAgICAgICAvLyB0aGF0IGlzbid0IGluIGEgcmVuZGVyIGZ1bmN0aW9uLiBTaGlueSBvbmx5IGtub3dzIHRvCiAgICAgICAgICAvLyBjYWxsIHJlc2l6ZSBoYW5kbGVycyBmb3IgU2hpbnkgb3V0cHV0cywgbm90IGZvciBzdGF0aWMKICAgICAgICAgIC8vIHdpZGdldHMsIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KICAgICAgICAgIGlmICh3aW5kb3cualF1ZXJ5KSB7CiAgICAgICAgICAgIHdpbmRvdy5qUXVlcnkoZG9jdW1lbnQpLm9uKAogICAgICAgICAgICAgICJzaG93bi5odG1sd2lkZ2V0cyBzaG93bi5icy50YWIuaHRtbHdpZGdldHMgc2hvd24uYnMuY29sbGFwc2UuaHRtbHdpZGdldHMiLAogICAgICAgICAgICAgIHJlc2l6ZUhhbmRsZXIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgImhpZGRlbi5odG1sd2lkZ2V0cyBoaWRkZW4uYnMudGFiLmh0bWx3aWRnZXRzIGhpZGRlbi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWMgY2FzZSBvZiBpb3NsaWRlcywgd2hpY2gKICAgICAgICAgIC8vIGZsaXBzIHNsaWRlcyBiZXR3ZWVuIGRpc3BsYXk6bm9uZSBhbmQgZGlzcGxheTpibG9jay4KICAgICAgICAgIC8vIElkZWFsbHkgd2Ugd291bGQgbm90IGhhdmUgdG8gaGF2ZSBpb3NsaWRlLXNwZWNpZmljIGNvZGUKICAgICAgICAgIC8vIGhlcmUsIGJ1dCByYXRoZXIgaGF2ZSBpb3NsaWRlcyByYWlzZSBhIGdlbmVyaWMgZXZlbnQsCiAgICAgICAgICAvLyBidXQgdGhlIHJtYXJrZG93biBwYWNrYWdlIGp1c3Qgd2VudCB0byBDUkFOIHNvIHRoZQogICAgICAgICAgLy8gd2luZG93IHRvIGdldHRpbmcgdGhhdCBmaXhlZCBtYXkgYmUgbG9uZy4KICAgICAgICAgIGlmICh3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAvLyBJdCdzIE9LIHRvIGxpbWl0IHRoaXMgdG8gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgLy8gYnJvd3NlcnMgYmVjYXVzZSBpb3NsaWRlcyBpdHNlbGYgb25seSBzdXBwb3J0cwogICAgICAgICAgICAvLyBzdWNoIGJyb3dzZXJzLgogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlZW50ZXIiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgICAgb24oZG9jdW1lbnQsICJzbGlkZWxlYXZlIiwgcmVzaXplSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc2NyaXB0RGF0YSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInNjcmlwdFtkYXRhLWZvcj0nIiArIGVsLmlkICsgIiddW3R5cGU9J2FwcGxpY2F0aW9uL2pzb24nXSIpOwogICAgICAgIGlmIChzY3JpcHREYXRhKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IEpTT04ucGFyc2Uoc2NyaXB0RGF0YS50ZXh0Q29udGVudCB8fCBzY3JpcHREYXRhLnRleHQpOwogICAgICAgICAgLy8gUmVzb2x2ZSBzdHJpbmdzIG1hcmtlZCBhcyBqYXZhc2NyaXB0IGxpdGVyYWxzIHRvIG9iamVjdHMKICAgICAgICAgIGlmICghKGRhdGEuZXZhbHMgaW5zdGFuY2VvZiBBcnJheSkpIGRhdGEuZXZhbHMgPSBbZGF0YS5ldmFsc107CiAgICAgICAgICBmb3IgKHZhciBrID0gMDsgZGF0YS5ldmFscyAmJiBrIDwgZGF0YS5ldmFscy5sZW5ndGg7IGsrKykgewogICAgICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIoZGF0YS54LCBkYXRhLmV2YWxzW2tdKTsKICAgICAgICAgIH0KICAgICAgICAgIGJpbmRpbmcucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgaW5pdFJlc3VsdCk7CiAgICAgICAgICBldmFsQW5kUnVuKGRhdGEuanNIb29rcy5yZW5kZXIsIGluaXRSZXN1bHQsIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0pOwoKICAgIGludm9rZVBvc3RSZW5kZXJIYW5kbGVycygpOwogIH0KCiAgLy8gV2FpdCB1bnRpbCBhZnRlciB0aGUgZG9jdW1lbnQgaGFzIGxvYWRlZCB0byByZW5kZXIgdGhlIHdpZGdldHMuCiAgaWYgKGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIpIHsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoIkRPTUNvbnRlbnRMb2FkZWQiLCBmdW5jdGlvbigpIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGFyZ3VtZW50cy5jYWxsZWUsIGZhbHNlKTsKICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgfSwgZmFsc2UpOwogIH0gZWxzZSBpZiAoZG9jdW1lbnQuYXR0YWNoRXZlbnQpIHsKICAgIGRvY3VtZW50LmF0dGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICJjb21wbGV0ZSIpIHsKICAgICAgICBkb2N1bWVudC5kZXRhY2hFdmVudCgib25yZWFkeXN0YXRlY2hhbmdlIiwgYXJndW1lbnRzLmNhbGxlZSk7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9CiAgICB9KTsKICB9CgoKICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0QXR0YWNobWVudFVybCA9IGZ1bmN0aW9uKGRlcG5hbWUsIGtleSkgewogICAgLy8gSWYgbm8ga2V5LCBkZWZhdWx0IHRvIHRoZSBmaXJzdCBpdGVtCiAgICBpZiAodHlwZW9mKGtleSkgPT09ICJ1bmRlZmluZWQiKQogICAgICBrZXkgPSAxOwoKICAgIHZhciBsaW5rID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZGVwbmFtZSArICItIiArIGtleSArICItYXR0YWNobWVudCIpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiQXR0YWNobWVudCAiICsgZGVwbmFtZSArICIvIiArIGtleSArICIgbm90IGZvdW5kIGluIGRvY3VtZW50Iik7CiAgICB9CiAgICByZXR1cm4gbGluay5nZXRBdHRyaWJ1dGUoImhyZWYiKTsKICB9OwoKICB3aW5kb3cuSFRNTFdpZGdldHMuZGF0YWZyYW1lVG9EMyA9IGZ1bmN0aW9uKGRmKSB7CiAgICB2YXIgbmFtZXMgPSBbXTsKICAgIHZhciBsZW5ndGg7CiAgICBmb3IgKHZhciBuYW1lIGluIGRmKSB7CiAgICAgICAgaWYgKGRmLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICAgICAgICBuYW1lcy5wdXNoKG5hbWUpOwogICAgICAgIGlmICh0eXBlb2YoZGZbbmFtZV0pICE9PSAib2JqZWN0IiB8fCB0eXBlb2YoZGZbbmFtZV0ubGVuZ3RoKSA9PT0gInVuZGVmaW5lZCIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIik7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YobGVuZ3RoKSAhPT0gInVuZGVmaW5lZCIgJiYgbGVuZ3RoICE9PSBkZltuYW1lXS5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJBbGwgZmllbGRzIG11c3QgYmUgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICBsZW5ndGggPSBkZltuYW1lXS5sZW5ndGg7CiAgICB9CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgdmFyIGl0ZW07CiAgICBmb3IgKHZhciByb3cgPSAwOyByb3cgPCBsZW5ndGg7IHJvdysrKSB7CiAgICAgICAgaXRlbSA9IHt9OwogICAgICAgIGZvciAodmFyIGNvbCA9IDA7IGNvbCA8IG5hbWVzLmxlbmd0aDsgY29sKyspIHsKICAgICAgICAgICAgaXRlbVtuYW1lc1tjb2xdXSA9IGRmW25hbWVzW2NvbF1dW3Jvd107CiAgICAgICAgfQogICAgICAgIHJlc3VsdHMucHVzaChpdGVtKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy50cmFuc3Bvc2VBcnJheTJEID0gZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkgcmV0dXJuIGFycmF5OwogICAgICB2YXIgbmV3QXJyYXkgPSBhcnJheVswXS5tYXAoZnVuY3Rpb24oY29sLCBpKSB7CiAgICAgICAgICByZXR1cm4gYXJyYXkubWFwKGZ1bmN0aW9uKHJvdykgewogICAgICAgICAgICAgIHJldHVybiByb3dbaV0KICAgICAgICAgIH0pCiAgICAgIH0pOwogICAgICByZXR1cm4gbmV3QXJyYXk7CiAgfTsKICAvLyBTcGxpdCB2YWx1ZSBhdCBzcGxpdENoYXIsIGJ1dCBhbGxvdyBzcGxpdENoYXIgdG8gYmUgZXNjYXBlZAogIC8vIHVzaW5nIGVzY2FwZUNoYXIuIEFueSBvdGhlciBjaGFyYWN0ZXJzIGVzY2FwZWQgYnkgZXNjYXBlQ2hhcgogIC8vIHdpbGwgYmUgaW5jbHVkZWQgYXMgdXN1YWwgKGluY2x1ZGluZyBlc2NhcGVDaGFyIGl0c2VsZikuCiAgZnVuY3Rpb24gc3BsaXRXaXRoRXNjYXBlKHZhbHVlLCBzcGxpdENoYXIsIGVzY2FwZUNoYXIpIHsKICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgdmFyIGN1cnJlbnRSZXN1bHQgPSAiIjsKICAgIGZvciAodmFyIHBvcyA9IDA7IHBvcyA8IHZhbHVlLmxlbmd0aDsgcG9zKyspIHsKICAgICAgaWYgKCFlc2NhcGVNb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlW3Bvc10gPT09IHNwbGl0Q2hhcikgewogICAgICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgICAgICAgY3VycmVudFJlc3VsdCA9ICIiOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWVbcG9zXSA9PT0gZXNjYXBlQ2hhcikgewogICAgICAgICAgZXNjYXBlTW9kZSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1cnJlbnRSZXN1bHQgKz0gdmFsdWVbcG9zXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIGVzY2FwZU1vZGUgPSBmYWxzZTsKICAgICAgfQogICAgfQogICAgaWYgKGN1cnJlbnRSZXN1bHQgIT09ICIiKSB7CiAgICAgIHJlc3VsdHMucHVzaChjdXJyZW50UmVzdWx0KTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH0KICAvLyBGdW5jdGlvbiBhdXRob3JlZCBieSBZaWh1aS9KSiBBbGxhaXJlCiAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyID0gZnVuY3Rpb24obywgbWVtYmVyKSB7CiAgICB2YXIgcGFydHMgPSBzcGxpdFdpdGhFc2NhcGUobWVtYmVyLCAnLicsICdcXCcpOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXJ0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgLy8gcGFydCBtYXkgYmUgYSBjaGFyYWN0ZXIgb3IgJ251bWVyaWMnIG1lbWJlciBuYW1lCiAgICAgIGlmIChvICE9PSBudWxsICYmIHR5cGVvZiBvID09PSAib2JqZWN0IiAmJiBwYXJ0IGluIG8pIHsKICAgICAgICBpZiAoaSA9PSAobCAtIDEpKSB7IC8vIGlmIHdlIGFyZSBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lIHRoZW4gZXZhbHVsYXRlCiAgICAgICAgICBpZiAodHlwZW9mIG9bcGFydF0gPT09ICJzdHJpbmciKQogICAgICAgICAgICBvW3BhcnRdID0gZXZhbCgiKCIgKyBvW3BhcnRdICsgIikiKTsKICAgICAgICB9IGVsc2UgeyAvLyBvdGhlcndpc2UgY29udGludWUgdG8gbmV4dCBlbWJlZGRlZCBvYmplY3QKICAgICAgICAgIG8gPSBvW3BhcnRdOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH07CgogIC8vIFJldHJpZXZlIHRoZSBIVE1MV2lkZ2V0IGluc3RhbmNlIChpLmUuIHRoZSByZXR1cm4gdmFsdWUgb2YgYW4KICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBvciBudWxsIGlmIG5vbmUuCiAgd2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlID0gZnVuY3Rpb24oZWwpIHsKICAgIHJldHVybiBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0Iik7CiAgfTsKCiAgLy8gRmluZHMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIHNjb3BlIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsCiAgLy8gYW5kIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZgogIC8vIGFuIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgZWxlbWVudCwgaWYgYW55LiBJZiBubyBlbGVtZW50IG1hdGNoZXMgdGhlCiAgLy8gc2VsZWN0b3IsIG9yIHRoZSBmaXJzdCBtYXRjaGluZyBlbGVtZW50IGhhcyBubyBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIGl0LCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmQgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgZWwgPSBzY29wZS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgIGlmIChlbCA9PT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UoZWwpOwogICAgfQogIH07CgogIC8vIEZpbmRzIGFsbCBlbGVtZW50cyBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IsIGFuZAogIC8vIHJldHVybnMgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2VzIChpLmUuIHRoZSByZXR1cm4gdmFsdWVzIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnRzLCBpbiBhbiBhcnJheS4gSWYgZWxlbWVudHMgdGhhdAogIC8vIG1hdGNoIHRoZSBzZWxlY3RvciBkb24ndCBoYXZlIGFuIGFzc29jaWF0ZWQgSFRNTFdpZGdldAogIC8vIGluc3RhbmNlLCB0aGUgcmV0dXJuZWQgYXJyYXkgd2lsbCBjb250YWluIG51bGxzLgogIC8vCiAgLy8gVGhlIHNjb3BlIGFyZ3VtZW50IGlzIG9wdGlvbmFsLCBhbmQgZGVmYXVsdHMgdG8gd2luZG93LmRvY3VtZW50LgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5maW5kQWxsID0gZnVuY3Rpb24oc2NvcGUsIHNlbGVjdG9yKSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgIHNlbGVjdG9yID0gc2NvcGU7CiAgICAgIHNjb3BlID0gZG9jdW1lbnQ7CiAgICB9CgogICAgdmFyIG5vZGVzID0gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICByZXN1bHRzLnB1c2god2luZG93LkhUTUxXaWRnZXRzLmdldEluc3RhbmNlKG5vZGVzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0czsKICB9OwoKICB2YXIgcG9zdFJlbmRlckhhbmRsZXJzID0gW107CiAgZnVuY3Rpb24gaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCkgewogICAgd2hpbGUgKHBvc3RSZW5kZXJIYW5kbGVycy5sZW5ndGgpIHsKICAgICAgdmFyIGhhbmRsZXIgPSBwb3N0UmVuZGVySGFuZGxlcnMuc2hpZnQoKTsKICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICBoYW5kbGVyKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIHRoZSBnaXZlbiBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIHRoZQogIC8vIG5leHQgdGltZSBzdGF0aWMgd2lkZ2V0cyBhcmUgcmVuZGVyZWQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmFkZFBvc3RSZW5kZXJIYW5kbGVyID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHBvc3RSZW5kZXJIYW5kbGVycy5wdXNoKGNhbGxiYWNrKTsKICB9OwoKICAvLyBUYWtlcyBhIG5ldy1zdHlsZSBpbnN0YW5jZS1ib3VuZCBkZWZpbml0aW9uLCBhbmQgcmV0dXJucyBhbgogIC8vIG9sZC1zdHlsZSBjbGFzcy1ib3VuZCBkZWZpbml0aW9uLiBUaGlzIHNhdmVzIHVzIGZyb20gaGF2aW5nCiAgLy8gdG8gcmV3cml0ZSBhbGwgdGhlIGxvZ2ljIGluIHRoaXMgZmlsZSB0byBhY2NvbW9kYXRlIGJvdGgKICAvLyB0eXBlcyBvZiBkZWZpbml0aW9ucy4KICBmdW5jdGlvbiBjcmVhdGVMZWdhY3lEZWZpbml0aW9uQWRhcHRlcihkZWZuKSB7CiAgICB2YXIgcmVzdWx0ID0gewogICAgICBuYW1lOiBkZWZuLm5hbWUsCiAgICAgIHR5cGU6IGRlZm4udHlwZSwKICAgICAgaW5pdGlhbGl6ZTogZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICByZXR1cm4gZGVmbi5mYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgfSwKICAgICAgcmVuZGVyVmFsdWU6IGZ1bmN0aW9uKGVsLCB4LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZW5kZXJWYWx1ZSh4KTsKICAgICAgfSwKICAgICAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2UucmVzaXplKHdpZHRoLCBoZWlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIGlmIChkZWZuLmZpbmQpCiAgICAgIHJlc3VsdC5maW5kID0gZGVmbi5maW5kOwogICAgaWYgKGRlZm4ucmVuZGVyRXJyb3IpCiAgICAgIHJlc3VsdC5yZW5kZXJFcnJvciA9IGRlZm4ucmVuZGVyRXJyb3I7CiAgICBpZiAoZGVmbi5jbGVhckVycm9yKQogICAgICByZXN1bHQuY2xlYXJFcnJvciA9IGRlZm4uY2xlYXJFcnJvcjsKCiAgICByZXR1cm4gcmVzdWx0OwogIH0KfSkoKTsKCg=="></script>
<script src="data:application/x-javascript;base64,IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbiYmKG4ub3duZXJEb2N1bWVudHx8bi5kb2N1bWVudHx8bikuZG9jdW1lbnRFbGVtZW50fWZ1bmN0aW9uIHQobil7cmV0dXJuIG4mJihuLm93bmVyRG9jdW1lbnQmJm4ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8bi5kb2N1bWVudCYmbnx8bi5kZWZhdWx0Vmlldyl9ZnVuY3Rpb24gZShuLHQpe3JldHVybiB0Pm4/LTE6bj50PzE6bj49dD8wOjAvMH1mdW5jdGlvbiByKG4pe3JldHVybiBudWxsPT09bj8wLzA6K259ZnVuY3Rpb24gdShuKXtyZXR1cm4haXNOYU4obil9ZnVuY3Rpb24gaShuKXtyZXR1cm57bGVmdDpmdW5jdGlvbih0LGUscix1KXtmb3IoYXJndW1lbnRzLmxlbmd0aDwzJiYocj0wKSxhcmd1bWVudHMubGVuZ3RoPDQmJih1PXQubGVuZ3RoKTt1PnI7KXt2YXIgaT1yK3U+Pj4xO24odFtpXSxlKTwwP3I9aSsxOnU9aX1yZXR1cm4gcn0scmlnaHQ6ZnVuY3Rpb24odCxlLHIsdSl7Zm9yKGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9MCksYXJndW1lbnRzLmxlbmd0aDw0JiYodT10Lmxlbmd0aCk7dT5yOyl7dmFyIGk9cit1Pj4+MTtuKHRbaV0sZSk+MD91PWk6cj1pKzF9cmV0dXJuIHJ9fX1mdW5jdGlvbiBvKG4pe3JldHVybiBuLmxlbmd0aH1mdW5jdGlvbiBhKG4pe2Zvcih2YXIgdD0xO24qdCUxOyl0Kj0xMDtyZXR1cm4gdH1mdW5jdGlvbiBjKG4sdCl7Zm9yKHZhciBlIGluIHQpT2JqZWN0LmRlZmluZVByb3BlcnR5KG4ucHJvdG90eXBlLGUse3ZhbHVlOnRbZV0sZW51bWVyYWJsZTohMX0pfWZ1bmN0aW9uIGwoKXt0aGlzLl89T2JqZWN0LmNyZWF0ZShudWxsKX1mdW5jdGlvbiBzKG4pe3JldHVybihuKz0iIik9PT1wYXx8blswXT09PXZhP3ZhK246bn1mdW5jdGlvbiBmKG4pe3JldHVybihuKz0iIilbMF09PT12YT9uLnNsaWNlKDEpOm59ZnVuY3Rpb24gaChuKXtyZXR1cm4gcyhuKWluIHRoaXMuX31mdW5jdGlvbiBnKG4pe3JldHVybihuPXMobikpaW4gdGhpcy5fJiZkZWxldGUgdGhpcy5fW25dfWZ1bmN0aW9uIHAoKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaChmKHQpKTtyZXR1cm4gbn1mdW5jdGlvbiB2KCl7dmFyIG49MDtmb3IodmFyIHQgaW4gdGhpcy5fKSsrbjtyZXR1cm4gbn1mdW5jdGlvbiBkKCl7Zm9yKHZhciBuIGluIHRoaXMuXylyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtKCl7dGhpcy5fPU9iamVjdC5jcmVhdGUobnVsbCl9ZnVuY3Rpb24geShuKXtyZXR1cm4gbn1mdW5jdGlvbiBNKG4sdCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1lLmFwcGx5KHQsYXJndW1lbnRzKTtyZXR1cm4gcj09PXQ/bjpyfX1mdW5jdGlvbiB4KG4sdCl7aWYodCBpbiBuKXJldHVybiB0O3Q9dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2Zvcih2YXIgZT0wLHI9ZGEubGVuZ3RoO3I+ZTsrK2Upe3ZhciB1PWRhW2VdK3Q7aWYodSBpbiBuKXJldHVybiB1fX1mdW5jdGlvbiBiKCl7fWZ1bmN0aW9uIF8oKXt9ZnVuY3Rpb24gdyhuKXtmdW5jdGlvbiB0KCl7Zm9yKHZhciB0LHI9ZSx1PS0xLGk9ci5sZW5ndGg7Kyt1PGk7KSh0PXJbdV0ub24pJiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gbn12YXIgZT1bXSxyPW5ldyBsO3JldHVybiB0Lm9uPWZ1bmN0aW9uKHQsdSl7dmFyIGksbz1yLmdldCh0KTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP28mJm8ub246KG8mJihvLm9uPW51bGwsZT1lLnNsaWNlKDAsaT1lLmluZGV4T2YobykpLmNvbmNhdChlLnNsaWNlKGkrMSkpLHIucmVtb3ZlKHQpKSx1JiZlLnB1c2goci5zZXQodCx7b246dX0pKSxuKX0sdH1mdW5jdGlvbiBTKCl7dGEuZXZlbnQucHJldmVudERlZmF1bHQoKX1mdW5jdGlvbiBrKCl7Zm9yKHZhciBuLHQ9dGEuZXZlbnQ7bj10LnNvdXJjZUV2ZW50Oyl0PW47cmV0dXJuIHR9ZnVuY3Rpb24gRShuKXtmb3IodmFyIHQ9bmV3IF8sZT0wLHI9YXJndW1lbnRzLmxlbmd0aDsrK2U8cjspdFthcmd1bWVudHNbZV1dPXcodCk7cmV0dXJuIHQub2Y9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dHJ5e3ZhciBpPXUuc291cmNlRXZlbnQ9dGEuZXZlbnQ7dS50YXJnZXQ9bix0YS5ldmVudD11LHRbdS50eXBlXS5hcHBseShlLHIpfWZpbmFsbHl7dGEuZXZlbnQ9aX19fSx0fWZ1bmN0aW9uIEEobil7cmV0dXJuIHlhKG4sX2EpLG59ZnVuY3Rpb24gTihuKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmZ1bmN0aW9uKCl7cmV0dXJuIE1hKG4sdGhpcyl9fWZ1bmN0aW9uIEMobil7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpmdW5jdGlvbigpe3JldHVybiB4YShuLHRoaXMpfX1mdW5jdGlvbiB6KG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCl9ZnVuY3Rpb24gdSgpe3RoaXMuc2V0QXR0cmlidXRlKG4sdCl9ZnVuY3Rpb24gaSgpe3RoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLHQpfWZ1bmN0aW9uIG8oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1lP3RoaXMucmVtb3ZlQXR0cmlidXRlKG4pOnRoaXMuc2V0QXR0cmlidXRlKG4sZSl9ZnVuY3Rpb24gYSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsLGUpfXJldHVybiBuPXRhLm5zLnF1YWxpZnkobiksbnVsbD09dD9uLmxvY2FsP3I6ZToiZnVuY3Rpb24iPT10eXBlb2YgdD9uLmxvY2FsP2E6bzpuLmxvY2FsP2k6dX1mdW5jdGlvbiBxKG4pe3JldHVybiBuLnRyaW0oKS5yZXBsYWNlKC9ccysvZywiICIpfWZ1bmN0aW9uIEwobil7cmV0dXJuIG5ldyBSZWdFeHAoIig/Ol58XFxzKykiK3RhLnJlcXVvdGUobikrIig/Olxccyt8JCkiLCJnIil9ZnVuY3Rpb24gVChuKXtyZXR1cm4obisiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pfWZ1bmN0aW9uIFIobix0KXtmdW5jdGlvbiBlKCl7Zm9yKHZhciBlPS0xOysrZTx1OyluW2VdKHRoaXMsdCl9ZnVuY3Rpb24gcigpe2Zvcih2YXIgZT0tMSxyPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpOysrZTx1OyluW2VdKHRoaXMscil9bj1UKG4pLm1hcChEKTt2YXIgdT1uLmxlbmd0aDtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD9yOmV9ZnVuY3Rpb24gRChuKXt2YXIgdD1MKG4pO3JldHVybiBmdW5jdGlvbihlLHIpe2lmKHU9ZS5jbGFzc0xpc3QpcmV0dXJuIHI/dS5hZGQobik6dS5yZW1vdmUobik7dmFyIHU9ZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiO3I/KHQubGFzdEluZGV4PTAsdC50ZXN0KHUpfHxlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodSsiICIrbikpKTplLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHEodS5yZXBsYWNlKHQsIiAiKSkpfX1mdW5jdGlvbiBQKG4sdCxlKXtmdW5jdGlvbiByKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKX1mdW5jdGlvbiB1KCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuLHQsZSl9ZnVuY3Rpb24gaSgpe3ZhciByPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PXI/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4scixlKX1yZXR1cm4gbnVsbD09dD9yOiJmdW5jdGlvbiI9PXR5cGVvZiB0P2k6dX1mdW5jdGlvbiBVKG4sdCl7ZnVuY3Rpb24gZSgpe2RlbGV0ZSB0aGlzW25dfWZ1bmN0aW9uIHIoKXt0aGlzW25dPXR9ZnVuY3Rpb24gdSgpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/ZGVsZXRlIHRoaXNbbl06dGhpc1tuXT1lfXJldHVybiBudWxsPT10P2U6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dTpyfWZ1bmN0aW9uIGoobil7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlP3QuY3JlYXRlRWxlbWVudE5TKGUsbik6dC5jcmVhdGVFbGVtZW50KG4pfWZ1bmN0aW9uIGUoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhuLnNwYWNlLG4ubG9jYWwpfXJldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246KG49dGEubnMucXVhbGlmeShuKSkubG9jYWw/ZTp0fWZ1bmN0aW9uIEYoKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7biYmbi5yZW1vdmVDaGlsZCh0aGlzKX1mdW5jdGlvbiBIKG4pe3JldHVybntfX2RhdGFfXzpufX1mdW5jdGlvbiBPKG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBiYSh0aGlzLG4pfX1mdW5jdGlvbiBJKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RofHwobj1lKSxmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlP24odC5fX2RhdGFfXyxlLl9fZGF0YV9fKTohdC0hZX19ZnVuY3Rpb24gWShuLHQpe2Zvcih2YXIgZT0wLHI9bi5sZW5ndGg7cj5lO2UrKylmb3IodmFyIHUsaT1uW2VdLG89MCxhPWkubGVuZ3RoO2E+bztvKyspKHU9aVtvXSkmJnQodSxvLGUpO3JldHVybiBufWZ1bmN0aW9uIFoobil7cmV0dXJuIHlhKG4sU2EpLG59ZnVuY3Rpb24gVihuKXt2YXIgdCxlO3JldHVybiBmdW5jdGlvbihyLHUsaSl7dmFyIG8sYT1uW2ldLnVwZGF0ZSxjPWEubGVuZ3RoO2ZvcihpIT1lJiYoZT1pLHQ9MCksdT49dCYmKHQ9dSsxKTshKG89YVt0XSkmJisrdDxjOyk7cmV0dXJuIG99fWZ1bmN0aW9uIFgobix0LGUpe2Z1bmN0aW9uIHIoKXt2YXIgdD10aGlzW29dO3QmJih0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobix0LHQuJCksZGVsZXRlIHRoaXNbb10pfWZ1bmN0aW9uIHUoKXt2YXIgdT1jKHQscmEoYXJndW1lbnRzKSk7ci5jYWxsKHRoaXMpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihuLHRoaXNbb109dSx1LiQ9ZSksdS5fPXR9ZnVuY3Rpb24gaSgpe3ZhciB0LGU9bmV3IFJlZ0V4cCgiXl9fb24oW14uXSspIit0YS5yZXF1b3RlKG4pKyIkIik7Zm9yKHZhciByIGluIHRoaXMpaWYodD1yLm1hdGNoKGUpKXt2YXIgdT10aGlzW3JdO3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHUsdS4kKSxkZWxldGUgdGhpc1tyXX19dmFyIG89Il9fb24iK24sYT1uLmluZGV4T2YoIi4iKSxjPSQ7YT4wJiYobj1uLnNsaWNlKDAsYSkpO3ZhciBsPWthLmdldChuKTtyZXR1cm4gbCYmKG49bCxjPUIpLGE/dD91OnI6dD9iOml9ZnVuY3Rpb24gJChuLHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj10YS5ldmVudDt0YS5ldmVudD1lLHRbMF09dGhpcy5fX2RhdGFfXzt0cnl7bi5hcHBseSh0aGlzLHQpfWZpbmFsbHl7dGEuZXZlbnQ9cn19fWZ1bmN0aW9uIEIobix0KXt2YXIgZT0kKG4sdCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMscj1uLnJlbGF0ZWRUYXJnZXQ7ciYmKHI9PT10fHw4JnIuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCkpfHxlLmNhbGwodCxuKX19ZnVuY3Rpb24gVyhlKXt2YXIgcj0iLmRyYWdzdXBwcmVzcy0iKyArK0FhLHU9ImNsaWNrIityLGk9dGEuc2VsZWN0KHQoZSkpLm9uKCJ0b3VjaG1vdmUiK3IsUykub24oImRyYWdzdGFydCIrcixTKS5vbigic2VsZWN0c3RhcnQiK3IsUyk7aWYobnVsbD09RWEmJihFYT0ib25zZWxlY3RzdGFydCJpbiBlPyExOngoZS5zdHlsZSwidXNlclNlbGVjdCIpKSxFYSl7dmFyIG89bihlKS5zdHlsZSxhPW9bRWFdO29bRWFdPSJub25lIn1yZXR1cm4gZnVuY3Rpb24obil7aWYoaS5vbihyLG51bGwpLEVhJiYob1tFYV09YSksbil7dmFyIHQ9ZnVuY3Rpb24oKXtpLm9uKHUsbnVsbCl9O2kub24odSxmdW5jdGlvbigpe1MoKSx0KCl9LCEwKSxzZXRUaW1lb3V0KHQsMCl9fX1mdW5jdGlvbiBKKG4sZSl7ZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSk7dmFyIHI9bi5vd25lclNWR0VsZW1lbnR8fG47aWYoci5jcmVhdGVTVkdQb2ludCl7dmFyIHU9ci5jcmVhdGVTVkdQb2ludCgpO2lmKDA+TmEpe3ZhciBpPXQobik7aWYoaS5zY3JvbGxYfHxpLnNjcm9sbFkpe3I9dGEuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJzdmciKS5zdHlsZSh7cG9zaXRpb246ImFic29sdXRlIix0b3A6MCxsZWZ0OjAsbWFyZ2luOjAscGFkZGluZzowLGJvcmRlcjoibm9uZSJ9LCJpbXBvcnRhbnQiKTt2YXIgbz1yWzBdWzBdLmdldFNjcmVlbkNUTSgpO05hPSEoby5mfHxvLmUpLHIucmVtb3ZlKCl9fXJldHVybiBOYT8odS54PWUucGFnZVgsdS55PWUucGFnZVkpOih1Lng9ZS5jbGllbnRYLHUueT1lLmNsaWVudFkpLHU9dS5tYXRyaXhUcmFuc2Zvcm0obi5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpLFt1LngsdS55XX12YXIgYT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtYS5sZWZ0LW4uY2xpZW50TGVmdCxlLmNsaWVudFktYS50b3Atbi5jbGllbnRUb3BdfWZ1bmN0aW9uIEcoKXtyZXR1cm4gdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcn1mdW5jdGlvbiBLKG4pe3JldHVybiBuPjA/MTowPm4/LTE6MH1mdW5jdGlvbiBRKG4sdCxlKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS1uWzFdKS0odFsxXS1uWzFdKSooZVswXS1uWzBdKX1mdW5jdGlvbiBudChuKXtyZXR1cm4gbj4xPzA6LTE+bj9xYTpNYXRoLmFjb3Mobil9ZnVuY3Rpb24gdHQobil7cmV0dXJuIG4+MT9SYTotMT5uPy1SYTpNYXRoLmFzaW4obil9ZnVuY3Rpb24gZXQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKS0xL24pLzJ9ZnVuY3Rpb24gcnQobil7cmV0dXJuKChuPU1hdGguZXhwKG4pKSsxL24pLzJ9ZnVuY3Rpb24gdXQobil7cmV0dXJuKChuPU1hdGguZXhwKDIqbikpLTEpLyhuKzEpfWZ1bmN0aW9uIGl0KG4pe3JldHVybihuPU1hdGguc2luKG4vMikpKm59ZnVuY3Rpb24gb3QoKXt9ZnVuY3Rpb24gYXQobix0LGUpe3JldHVybiB0aGlzIGluc3RhbmNlb2YgYXQ/KHRoaXMuaD0rbix0aGlzLnM9K3Qsdm9pZCh0aGlzLmw9K2UpKTphcmd1bWVudHMubGVuZ3RoPDI/biBpbnN0YW5jZW9mIGF0P25ldyBhdChuLmgsbi5zLG4ubCk6YnQoIiIrbixfdCxhdCk6bmV3IGF0KG4sdCxlKX1mdW5jdGlvbiBjdChuLHQsZSl7ZnVuY3Rpb24gcihuKXtyZXR1cm4gbj4zNjA/bi09MzYwOjA+biYmKG4rPTM2MCksNjA+bj9pKyhvLWkpKm4vNjA6MTgwPm4/bzoyNDA+bj9pKyhvLWkpKigyNDAtbikvNjA6aX1mdW5jdGlvbiB1KG4pe3JldHVybiBNYXRoLnJvdW5kKDI1NSpyKG4pKX12YXIgaSxvO3JldHVybiBuPWlzTmFOKG4pPzA6KG4lPTM2MCk8MD9uKzM2MDpuLHQ9aXNOYU4odCk/MDowPnQ/MDp0PjE/MTp0LGU9MD5lPzA6ZT4xPzE6ZSxvPS41Pj1lP2UqKDErdCk6ZSt0LWUqdCxpPTIqZS1vLG5ldyBtdCh1KG4rMTIwKSx1KG4pLHUobi0xMjApKX1mdW5jdGlvbiBsdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBsdD8odGhpcy5oPStuLHRoaXMuYz0rdCx2b2lkKHRoaXMubD0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbHQ/bmV3IGx0KG4uaCxuLmMsbi5sKTpuIGluc3RhbmNlb2YgZnQ/Z3Qobi5sLG4uYSxuLmIpOmd0KChuPXd0KChuPXRhLnJnYihuKSkucixuLmcsbi5iKSkubCxuLmEsbi5iKTpuZXcgbHQobix0LGUpfWZ1bmN0aW9uIHN0KG4sdCxlKXtyZXR1cm4gaXNOYU4obikmJihuPTApLGlzTmFOKHQpJiYodD0wKSxuZXcgZnQoZSxNYXRoLmNvcyhuKj1EYSkqdCxNYXRoLnNpbihuKSp0KX1mdW5jdGlvbiBmdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBmdD8odGhpcy5sPStuLHRoaXMuYT0rdCx2b2lkKHRoaXMuYj0rZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgZnQ/bmV3IGZ0KG4ubCxuLmEsbi5iKTpuIGluc3RhbmNlb2YgbHQ/c3Qobi5oLG4uYyxuLmwpOnd0KChuPW10KG4pKS5yLG4uZyxuLmIpOm5ldyBmdChuLHQsZSl9ZnVuY3Rpb24gaHQobix0LGUpe3ZhciByPShuKzE2KS8xMTYsdT1yK3QvNTAwLGk9ci1lLzIwMDtyZXR1cm4gdT1wdCh1KSpYYSxyPXB0KHIpKiRhLGk9cHQoaSkqQmEsbmV3IG10KGR0KDMuMjQwNDU0Mip1LTEuNTM3MTM4NSpyLS40OTg1MzE0KmkpLGR0KC0uOTY5MjY2KnUrMS44NzYwMTA4KnIrLjA0MTU1NippKSxkdCguMDU1NjQzNCp1LS4yMDQwMjU5KnIrMS4wNTcyMjUyKmkpKX1mdW5jdGlvbiBndChuLHQsZSl7cmV0dXJuIG4+MD9uZXcgbHQoTWF0aC5hdGFuMihlLHQpKlBhLE1hdGguc3FydCh0KnQrZSplKSxuKTpuZXcgbHQoMC8wLDAvMCxuKX1mdW5jdGlvbiBwdChuKXtyZXR1cm4gbj4uMjA2ODkzMDM0P24qbipuOihuLTQvMjkpLzcuNzg3MDM3fWZ1bmN0aW9uIHZ0KG4pe3JldHVybiBuPi4wMDg4NTY/TWF0aC5wb3cobiwxLzMpOjcuNzg3MDM3Km4rNC8yOX1mdW5jdGlvbiBkdChuKXtyZXR1cm4gTWF0aC5yb3VuZCgyNTUqKC4wMDMwND49bj8xMi45MipuOjEuMDU1Kk1hdGgucG93KG4sMS8yLjQpLS4wNTUpKX1mdW5jdGlvbiBtdChuLHQsZSl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBtdD8odGhpcy5yPX5+bix0aGlzLmc9fn50LHZvaWQodGhpcy5iPX5+ZSkpOmFyZ3VtZW50cy5sZW5ndGg8Mj9uIGluc3RhbmNlb2YgbXQ/bmV3IG10KG4ucixuLmcsbi5iKTpidCgiIituLG10LGN0KTpuZXcgbXQobix0LGUpfWZ1bmN0aW9uIHl0KG4pe3JldHVybiBuZXcgbXQobj4+MTYsbj4+OCYyNTUsMjU1Jm4pfWZ1bmN0aW9uIE10KG4pe3JldHVybiB5dChuKSsiIn1mdW5jdGlvbiB4dChuKXtyZXR1cm4gMTY+bj8iMCIrTWF0aC5tYXgoMCxuKS50b1N0cmluZygxNik6TWF0aC5taW4oMjU1LG4pLnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBidChuLHQsZSl7bj1uLnRvTG93ZXJDYXNlKCk7dmFyIHIsdSxpLG89MCxhPTAsYz0wO2lmKHI9LyhbYS16XSspXCgoLiopXCkvLmV4ZWMobikpc3dpdGNoKHU9clsyXS5zcGxpdCgiLCIpLHJbMV0pe2Nhc2UiaHNsIjpyZXR1cm4gZShwYXJzZUZsb2F0KHVbMF0pLHBhcnNlRmxvYXQodVsxXSkvMTAwLHBhcnNlRmxvYXQodVsyXSkvMTAwKTtjYXNlInJnYiI6cmV0dXJuIHQoa3QodVswXSksa3QodVsxXSksa3QodVsyXSkpfXJldHVybihpPUdhLmdldChuKSk/dChpLnIsaS5nLGkuYik6KG51bGw9PW58fCIjIiE9PW4uY2hhckF0KDApfHxpc05hTihpPXBhcnNlSW50KG4uc2xpY2UoMSksMTYpKXx8KDQ9PT1uLmxlbmd0aD8obz0oMzg0MCZpKT4+NCxvPW8+PjR8byxhPTI0MCZpLGE9YT4+NHxhLGM9MTUmaSxjPWM8PDR8Yyk6Nz09PW4ubGVuZ3RoJiYobz0oMTY3MTE2ODAmaSk+PjE2LGE9KDY1MjgwJmkpPj44LGM9MjU1JmkpKSx0KG8sYSxjKSl9ZnVuY3Rpb24gX3Qobix0LGUpe3ZhciByLHUsaT1NYXRoLm1pbihuLz0yNTUsdC89MjU1LGUvPTI1NSksbz1NYXRoLm1heChuLHQsZSksYT1vLWksYz0obytpKS8yO3JldHVybiBhPyh1PS41PmM/YS8obytpKTphLygyLW8taSkscj1uPT1vPyh0LWUpL2ErKGU+dD82OjApOnQ9PW8/KGUtbikvYSsyOihuLXQpL2ErNCxyKj02MCk6KHI9MC8wLHU9Yz4wJiYxPmM/MDpyKSxuZXcgYXQocix1LGMpfWZ1bmN0aW9uIHd0KG4sdCxlKXtuPVN0KG4pLHQ9U3QodCksZT1TdChlKTt2YXIgcj12dCgoLjQxMjQ1NjQqbisuMzU3NTc2MSp0Ky4xODA0Mzc1KmUpL1hhKSx1PXZ0KCguMjEyNjcyOSpuKy43MTUxNTIyKnQrLjA3MjE3NSplKS8kYSksaT12dCgoLjAxOTMzMzkqbisuMTE5MTkyKnQrLjk1MDMwNDEqZSkvQmEpO3JldHVybiBmdCgxMTYqdS0xNiw1MDAqKHItdSksMjAwKih1LWkpKX1mdW5jdGlvbiBTdChuKXtyZXR1cm4obi89MjU1KTw9LjA0MDQ1P24vMTIuOTI6TWF0aC5wb3coKG4rLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBrdChuKXt2YXIgdD1wYXJzZUZsb2F0KG4pO3JldHVybiIlIj09PW4uY2hhckF0KG4ubGVuZ3RoLTEpP01hdGgucm91bmQoMi41NSp0KTp0fWZ1bmN0aW9uIEV0KG4pe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuP246ZnVuY3Rpb24oKXtyZXR1cm4gbn19ZnVuY3Rpb24gQXQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gMj09PWFyZ3VtZW50cy5sZW5ndGgmJiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYocj1lLGU9bnVsbCksTnQodCxlLG4scil9fWZ1bmN0aW9uIE50KG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgbix0PWMuc3RhdHVzO2lmKCF0JiZ6dChjKXx8dD49MjAwJiYzMDA+dHx8MzA0PT09dCl7dHJ5e249ZS5jYWxsKGksYyl9Y2F0Y2gocil7cmV0dXJuIHZvaWQgby5lcnJvci5jYWxsKGkscil9by5sb2FkLmNhbGwoaSxuKX1lbHNlIG8uZXJyb3IuY2FsbChpLGMpfXZhciBpPXt9LG89dGEuZGlzcGF0Y2goImJlZm9yZXNlbmQiLCJwcm9ncmVzcyIsImxvYWQiLCJlcnJvciIpLGE9e30sYz1uZXcgWE1MSHR0cFJlcXVlc3QsbD1udWxsO3JldHVybiF0aGlzLlhEb21haW5SZXF1ZXN0fHwid2l0aENyZWRlbnRpYWxzImluIGN8fCEvXihodHRwKHMpPzopP1wvXC8vLnRlc3Qobil8fChjPW5ldyBYRG9tYWluUmVxdWVzdCksIm9ubG9hZCJpbiBjP2Mub25sb2FkPWMub25lcnJvcj11OmMub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCl7Yy5yZWFkeVN0YXRlPjMmJnUoKX0sYy5vbnByb2dyZXNzPWZ1bmN0aW9uKG4pe3ZhciB0PXRhLmV2ZW50O3RhLmV2ZW50PW47dHJ5e28ucHJvZ3Jlc3MuY2FsbChpLGMpfWZpbmFsbHl7dGEuZXZlbnQ9dH19LGkuaGVhZGVyPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49KG4rIiIpLnRvTG93ZXJDYXNlKCksYXJndW1lbnRzLmxlbmd0aDwyP2Fbbl06KG51bGw9PXQ/ZGVsZXRlIGFbbl06YVtuXT10KyIiLGkpfSxpLm1pbWVUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PW4/bnVsbDpuKyIiLGkpOnR9LGkucmVzcG9uc2VUeXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW4saSk6bH0saS5yZXNwb25zZT1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLGl9LFsiZ2V0IiwicG9zdCJdLmZvckVhY2goZnVuY3Rpb24obil7aVtuXT1mdW5jdGlvbigpe3JldHVybiBpLnNlbmQuYXBwbHkoaSxbbl0uY29uY2F0KHJhKGFyZ3VtZW50cykpKX19KSxpLnNlbmQ9ZnVuY3Rpb24oZSxyLHUpe2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKHU9cixyPW51bGwpLGMub3BlbihlLG4sITApLG51bGw9PXR8fCJhY2NlcHQiaW4gYXx8KGEuYWNjZXB0PXQrIiwqLyoiKSxjLnNldFJlcXVlc3RIZWFkZXIpZm9yKHZhciBzIGluIGEpYy5zZXRSZXF1ZXN0SGVhZGVyKHMsYVtzXSk7cmV0dXJuIG51bGwhPXQmJmMub3ZlcnJpZGVNaW1lVHlwZSYmYy5vdmVycmlkZU1pbWVUeXBlKHQpLG51bGwhPWwmJihjLnJlc3BvbnNlVHlwZT1sKSxudWxsIT11JiZpLm9uKCJlcnJvciIsdSkub24oImxvYWQiLGZ1bmN0aW9uKG4pe3UobnVsbCxuKX0pLG8uYmVmb3Jlc2VuZC5jYWxsKGksYyksYy5zZW5kKG51bGw9PXI/bnVsbDpyKSxpfSxpLmFib3J0PWZ1bmN0aW9uKCl7cmV0dXJuIGMuYWJvcnQoKSxpfSx0YS5yZWJpbmQoaSxvLCJvbiIpLG51bGw9PXI/aTppLmdldChDdChyKSl9ZnVuY3Rpb24gQ3Qobil7cmV0dXJuIDE9PT1uLmxlbmd0aD9mdW5jdGlvbih0LGUpe24obnVsbD09dD9lOm51bGwpfTpufWZ1bmN0aW9uIHp0KG4pe3ZhciB0PW4ucmVzcG9uc2VUeXBlO3JldHVybiB0JiYidGV4dCIhPT10P24ucmVzcG9uc2U6bi5yZXNwb25zZVRleHR9ZnVuY3Rpb24gcXQoKXt2YXIgbj1MdCgpLHQ9VHQoKS1uO3Q+MjQ/KGlzRmluaXRlKHQpJiYoY2xlYXJUaW1lb3V0KHRjKSx0Yz1zZXRUaW1lb3V0KHF0LHQpKSxuYz0wKToobmM9MSxyYyhxdCkpfWZ1bmN0aW9uIEx0KCl7dmFyIG49RGF0ZS5ub3coKTtmb3IoZWM9S2E7ZWM7KW4+PWVjLnQmJihlYy5mPWVjLmMobi1lYy50KSksZWM9ZWMubjtyZXR1cm4gbn1mdW5jdGlvbiBUdCgpe2Zvcih2YXIgbix0PUthLGU9MS8wO3Q7KXQuZj90PW4/bi5uPXQubjpLYT10Lm46KHQudDxlJiYoZT10LnQpLHQ9KG49dCkubik7cmV0dXJuIFFhPW4sZX1mdW5jdGlvbiBSdChuLHQpe3JldHVybiB0LShuP01hdGguY2VpbChNYXRoLmxvZyhuKS9NYXRoLkxOMTApOjEpfWZ1bmN0aW9uIER0KG4sdCl7dmFyIGU9TWF0aC5wb3coMTAsMypnYSg4LXQpKTtyZXR1cm57c2NhbGU6dD44P2Z1bmN0aW9uKG4pe3JldHVybiBuL2V9OmZ1bmN0aW9uKG4pe3JldHVybiBuKmV9LHN5bWJvbDpufX1mdW5jdGlvbiBQdChuKXt2YXIgdD1uLmRlY2ltYWwsZT1uLnRob3VzYW5kcyxyPW4uZ3JvdXBpbmcsdT1uLmN1cnJlbmN5LGk9ciYmZT9mdW5jdGlvbihuLHQpe2Zvcih2YXIgdT1uLmxlbmd0aCxpPVtdLG89MCxhPXJbMF0sYz0wO3U+MCYmYT4wJiYoYythKzE+dCYmKGE9TWF0aC5tYXgoMSx0LWMpKSxpLnB1c2gobi5zdWJzdHJpbmcodS09YSx1K2EpKSwhKChjKz1hKzEpPnQpKTspYT1yW289KG8rMSklci5sZW5ndGhdO3JldHVybiBpLnJldmVyc2UoKS5qb2luKGUpfTp5O3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1pYy5leGVjKG4pLHI9ZVsxXXx8IiAiLG89ZVsyXXx8Ij4iLGE9ZVszXXx8Ii0iLGM9ZVs0XXx8IiIsbD1lWzVdLHM9K2VbNl0sZj1lWzddLGg9ZVs4XSxnPWVbOV0scD0xLHY9IiIsZD0iIixtPSExLHk9ITA7c3dpdGNoKGgmJihoPStoLnN1YnN0cmluZygxKSksKGx8fCIwIj09PXImJiI9Ij09PW8pJiYobD1yPSIwIixvPSI9IiksZyl7Y2FzZSJuIjpmPSEwLGc9ImciO2JyZWFrO2Nhc2UiJSI6cD0xMDAsZD0iJSIsZz0iZiI7YnJlYWs7Y2FzZSJwIjpwPTEwMCxkPSIlIixnPSJyIjticmVhaztjYXNlImIiOmNhc2UibyI6Y2FzZSJ4IjpjYXNlIlgiOiIjIj09PWMmJih2PSIwIitnLnRvTG93ZXJDYXNlKCkpO2Nhc2UiYyI6eT0hMTtjYXNlImQiOm09ITAsaD0wO2JyZWFrO2Nhc2UicyI6cD0tMSxnPSJyIn0iJCI9PT1jJiYodj11WzBdLGQ9dVsxXSksInIiIT1nfHxofHwoZz0iZyIpLG51bGwhPWgmJigiZyI9PWc/aD1NYXRoLm1heCgxLE1hdGgubWluKDIxLGgpKTooImUiPT1nfHwiZiI9PWcpJiYoaD1NYXRoLm1heCgwLE1hdGgubWluKDIwLGgpKSkpLGc9b2MuZ2V0KGcpfHxVdDt2YXIgTT1sJiZmO3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1kO2lmKG0mJm4lMSlyZXR1cm4iIjt2YXIgdT0wPm58fDA9PT1uJiYwPjEvbj8obj0tbiwiLSIpOiItIj09PWE/IiI6YTtpZigwPnApe3ZhciBjPXRhLmZvcm1hdFByZWZpeChuLGgpO249Yy5zY2FsZShuKSxlPWMuc3ltYm9sK2R9ZWxzZSBuKj1wO249ZyhuLGgpO3ZhciB4LGIsXz1uLmxhc3RJbmRleE9mKCIuIik7aWYoMD5fKXt2YXIgdz15P24ubGFzdEluZGV4T2YoImUiKTotMTswPnc/KHg9bixiPSIiKTooeD1uLnN1YnN0cmluZygwLHcpLGI9bi5zdWJzdHJpbmcodykpfWVsc2UgeD1uLnN1YnN0cmluZygwLF8pLGI9dCtuLnN1YnN0cmluZyhfKzEpOyFsJiZmJiYoeD1pKHgsMS8wKSk7dmFyIFM9di5sZW5ndGgreC5sZW5ndGgrYi5sZW5ndGgrKE0/MDp1Lmxlbmd0aCksaz1zPlM/bmV3IEFycmF5KFM9cy1TKzEpLmpvaW4ocik6IiI7cmV0dXJuIE0mJih4PWkoayt4LGsubGVuZ3RoP3MtYi5sZW5ndGg6MS8wKSksdSs9dixuPXgrYiwoIjwiPT09bz91K24razoiPiI9PT1vP2srdStuOiJeIj09PW8/ay5zdWJzdHJpbmcoMCxTPj49MSkrdStuK2suc3Vic3RyaW5nKFMpOnUrKE0/bjprK24pKStlfX19ZnVuY3Rpb24gVXQobil7cmV0dXJuIG4rIiJ9ZnVuY3Rpb24ganQoKXt0aGlzLl89bmV3IERhdGUoYXJndW1lbnRzLmxlbmd0aD4xP0RhdGUuVVRDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTphcmd1bWVudHNbMF0pfWZ1bmN0aW9uIEZ0KG4sdCxlKXtmdW5jdGlvbiByKHQpe3ZhciBlPW4odCkscj1pKGUsMSk7cmV0dXJuIHItdD50LWU/ZTpyfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIHQoZT1uKG5ldyBjYyhlLTEpKSwxKSxlfWZ1bmN0aW9uIGkobixlKXtyZXR1cm4gdChuPW5ldyBjYygrbiksZSksbn1mdW5jdGlvbiBvKG4scixpKXt2YXIgbz11KG4pLGE9W107aWYoaT4xKWZvcig7cj5vOyllKG8pJWl8fGEucHVzaChuZXcgRGF0ZSgrbykpLHQobywxKTtlbHNlIGZvcig7cj5vOylhLnB1c2gobmV3IERhdGUoK28pKSx0KG8sMSk7cmV0dXJuIGF9ZnVuY3Rpb24gYShuLHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPW4sbyhyLHQsZSl9ZmluYWxseXtjYz1EYXRlfX1uLmZsb29yPW4sbi5yb3VuZD1yLG4uY2VpbD11LG4ub2Zmc2V0PWksbi5yYW5nZT1vO3ZhciBjPW4udXRjPUh0KG4pO3JldHVybiBjLmZsb29yPWMsYy5yb3VuZD1IdChyKSxjLmNlaWw9SHQodSksYy5vZmZzZXQ9SHQoaSksYy5yYW5nZT1hLG59ZnVuY3Rpb24gSHQobil7cmV0dXJuIGZ1bmN0aW9uKHQsZSl7dHJ5e2NjPWp0O3ZhciByPW5ldyBqdDtyZXR1cm4gci5fPXQsbihyLGUpLl99ZmluYWxseXtjYz1EYXRlfX19ZnVuY3Rpb24gT3Qobil7ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiB0KHQpe2Zvcih2YXIgZSx1LGksbz1bXSxhPS0xLGM9MDsrK2E8cjspMzc9PT1uLmNoYXJDb2RlQXQoYSkmJihvLnB1c2gobi5zbGljZShjLGEpKSxudWxsIT0odT1zY1tlPW4uY2hhckF0KCsrYSldKSYmKGU9bi5jaGFyQXQoKythKSksKGk9TltlXSkmJihlPWkodCxudWxsPT11PyJlIj09PWU/IiAiOiIwIjp1KSksby5wdXNoKGUpLGM9YSsxKTtyZXR1cm4gby5wdXNoKG4uc2xpY2UoYyxhKSksby5qb2luKCIiKX12YXIgcj1uLmxlbmd0aDtyZXR1cm4gdC5wYXJzZT1mdW5jdGlvbih0KXt2YXIgcj17eToxOTAwLG06MCxkOjEsSDowLE06MCxTOjAsTDowLFo6bnVsbH0sdT1lKHIsbix0LDApO2lmKHUhPXQubGVuZ3RoKXJldHVybiBudWxsOyJwImluIHImJihyLkg9ci5IJTEyKzEyKnIucCk7dmFyIGk9bnVsbCE9ci5aJiZjYyE9PWp0LG89bmV3KGk/anQ6Y2MpO3JldHVybiJqImluIHI/by5zZXRGdWxsWWVhcihyLnksMCxyLmopOiJ3ImluIHImJigiVyJpbiByfHwiVSJpbiByKT8oby5zZXRGdWxsWWVhcihyLnksMCwxKSxvLnNldEZ1bGxZZWFyKHIueSwwLCJXImluIHI/KHIudys2KSU3Kzcqci5XLShvLmdldERheSgpKzUpJTc6ci53Kzcqci5VLShvLmdldERheSgpKzYpJTcpKTpvLnNldEZ1bGxZZWFyKHIueSxyLm0sci5kKSxvLnNldEhvdXJzKHIuSCsoci5aLzEwMHwwKSxyLk0rci5aJTEwMCxyLlMsci5MKSxpP28uXzpvfSx0LnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIG59LHR9ZnVuY3Rpb24gZShuLHQsZSxyKXtmb3IodmFyIHUsaSxvLGE9MCxjPXQubGVuZ3RoLGw9ZS5sZW5ndGg7Yz5hOyl7aWYocj49bClyZXR1cm4tMTtpZih1PXQuY2hhckNvZGVBdChhKyspLDM3PT09dSl7aWYobz10LmNoYXJBdChhKyspLGk9Q1tvIGluIHNjP3QuY2hhckF0KGErKyk6b10sIWl8fChyPWkobixlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYodSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9ZnVuY3Rpb24gcihuLHQsZSl7Xy5sYXN0SW5kZXg9MDt2YXIgcj1fLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4udz13LmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHUobix0LGUpe3gubGFzdEluZGV4PTA7dmFyIHI9eC5leGVjKHQuc2xpY2UoZSkpO3JldHVybiByPyhuLnc9Yi5nZXQoclswXS50b0xvd2VyQ2FzZSgpKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBpKG4sdCxlKXtFLmxhc3RJbmRleD0wO3ZhciByPUUuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5tPUEuZ2V0KHJbMF0udG9Mb3dlckNhc2UoKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbyhuLHQsZSl7Uy5sYXN0SW5kZXg9MDt2YXIgcj1TLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4ubT1rLmdldChyWzBdLnRvTG93ZXJDYXNlKCkpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGEobix0LHIpe3JldHVybiBlKG4sTi5jLnRvU3RyaW5nKCksdCxyKX1mdW5jdGlvbiBjKG4sdCxyKXtyZXR1cm4gZShuLE4ueC50b1N0cmluZygpLHQscil9ZnVuY3Rpb24gbChuLHQscil7cmV0dXJuIGUobixOLlgudG9TdHJpbmcoKSx0LHIpfWZ1bmN0aW9uIHMobix0LGUpe3ZhciByPU0uZ2V0KHQuc2xpY2UoZSxlKz0yKS50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gbnVsbD09cj8tMToobi5wPXIsZSl9dmFyIGY9bi5kYXRlVGltZSxoPW4uZGF0ZSxnPW4udGltZSxwPW4ucGVyaW9kcyx2PW4uZGF5cyxkPW4uc2hvcnREYXlzLG09bi5tb250aHMseT1uLnNob3J0TW9udGhzO3QudXRjPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIGUobil7dHJ5e2NjPWp0O3ZhciB0PW5ldyBjYztyZXR1cm4gdC5fPW4scih0KX1maW5hbGx5e2NjPURhdGV9fXZhciByPXQobik7cmV0dXJuIGUucGFyc2U9ZnVuY3Rpb24obil7dHJ5e2NjPWp0O3ZhciB0PXIucGFyc2Uobik7cmV0dXJuIHQmJnQuX31maW5hbGx5e2NjPURhdGV9fSxlLnRvU3RyaW5nPXIudG9TdHJpbmcsZX0sdC5tdWx0aT10LnV0Yy5tdWx0aT1hZTt2YXIgTT10YS5tYXAoKSx4PVl0KHYpLGI9WnQodiksXz1ZdChkKSx3PVp0KGQpLFM9WXQobSksaz1adChtKSxFPVl0KHkpLEE9WnQoeSk7cC5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7TS5zZXQobi50b0xvd2VyQ2FzZSgpLHQpfSk7dmFyIE49e2E6ZnVuY3Rpb24obil7cmV0dXJuIGRbbi5nZXREYXkoKV19LEE6ZnVuY3Rpb24obil7cmV0dXJuIHZbbi5nZXREYXkoKV19LGI6ZnVuY3Rpb24obil7cmV0dXJuIHlbbi5nZXRNb250aCgpXX0sQjpmdW5jdGlvbihuKXtyZXR1cm4gbVtuLmdldE1vbnRoKCldfSxjOnQoZiksZDpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldERhdGUoKSx0LDIpfSxlOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RGF0ZSgpLHQsMil9LEg6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpLHQsMil9LEk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRIb3VycygpJTEyfHwxMix0LDIpfSxqOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KDErYWMuZGF5T2ZZZWFyKG4pLHQsMyl9LEw6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaWxsaXNlY29uZHMoKSx0LDMpfSxtOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0TW9udGgoKSsxLHQsMil9LE06ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRNaW51dGVzKCksdCwyKX0scDpmdW5jdGlvbihuKXtyZXR1cm4gcFsrKG4uZ2V0SG91cnMoKT49MTIpXX0sUzpmdW5jdGlvbihuLHQpe3JldHVybiBJdChuLmdldFNlY29uZHMoKSx0LDIpfSxVOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLnN1bmRheU9mWWVhcihuKSx0LDIpfSx3OmZ1bmN0aW9uKG4pe3JldHVybiBuLmdldERheSgpfSxXOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KGFjLm1vbmRheU9mWWVhcihuKSx0LDIpfSx4OnQoaCksWDp0KGcpLHk6ZnVuY3Rpb24obix0KXtyZXR1cm4gSXQobi5nZXRGdWxsWWVhcigpJTEwMCx0LDIpfSxZOmZ1bmN0aW9uKG4sdCl7cmV0dXJuIEl0KG4uZ2V0RnVsbFllYXIoKSUxZTQsdCw0KX0sWjppZSwiJSI6ZnVuY3Rpb24oKXtyZXR1cm4iJSJ9fSxDPXthOnIsQTp1LGI6aSxCOm8sYzphLGQ6UXQsZTpRdCxIOnRlLEk6dGUsajpuZSxMOnVlLG06S3QsTTplZSxwOnMsUzpyZSxVOlh0LHc6VnQsVzokdCx4OmMsWDpsLHk6V3QsWTpCdCxaOkp0LCIlIjpvZX07cmV0dXJuIHR9ZnVuY3Rpb24gSXQobix0LGUpe3ZhciByPTA+bj8iLSI6IiIsdT0ocj8tbjpuKSsiIixpPXUubGVuZ3RoO3JldHVybiByKyhlPmk/bmV3IEFycmF5KGUtaSsxKS5qb2luKHQpK3U6dSl9ZnVuY3Rpb24gWXQobil7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK24ubWFwKHRhLnJlcXVvdGUpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBadChuKXtmb3IodmFyIHQ9bmV3IGwsZT0tMSxyPW4ubGVuZ3RoOysrZTxyOyl0LnNldChuW2VdLnRvTG93ZXJDYXNlKCksZSk7cmV0dXJuIHR9ZnVuY3Rpb24gVnQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMSkpO3JldHVybiByPyhuLnc9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gWHQobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlKSk7cmV0dXJuIHI/KG4uVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiAkdChuLHQsZSl7ZmMubGFzdEluZGV4PTA7dmFyIHI9ZmMuZXhlYyh0LnNsaWNlKGUpKTtyZXR1cm4gcj8obi5XPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEJ0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzQpKTtyZXR1cm4gcj8obi55PStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFd0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi55PUd0KCtyWzBdKSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKdChuLHQsZSl7cmV0dXJuL15bKy1dXGR7NH0kLy50ZXN0KHQ9dC5zbGljZShlLGUrNSkpPyhuLlo9LXQsZSs1KTotMX1mdW5jdGlvbiBHdChuKXtyZXR1cm4gbisobj42OD8xOTAwOjJlMyl9ZnVuY3Rpb24gS3Qobix0LGUpe2ZjLmxhc3RJbmRleD0wO3ZhciByPWZjLmV4ZWModC5zbGljZShlLGUrMikpO3JldHVybiByPyhuLm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFF0KG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG5lKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5qPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHRlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHJlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8obi5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVlKG4sdCxlKXtmYy5sYXN0SW5kZXg9MDt2YXIgcj1mYy5leGVjKHQuc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8obi5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGllKG4pe3ZhciB0PW4uZ2V0VGltZXpvbmVPZmZzZXQoKSxlPXQ+MD8iLSI6IisiLHI9Z2EodCkvNjB8MCx1PWdhKHQpJTYwO3JldHVybiBlK0l0KHIsIjAiLDIpK0l0KHUsIjAiLDIpfWZ1bmN0aW9uIG9lKG4sdCxlKXtoYy5sYXN0SW5kZXg9MDt2YXIgcj1oYy5leGVjKHQuc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGFlKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPS0xOysrZTx0OyluW2VdWzBdPXRoaXMobltlXVswXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLHI9bltlXTshclsxXSh0KTspcj1uWysrZV07cmV0dXJuIHJbMF0odCl9fWZ1bmN0aW9uIGNlKCl7fWZ1bmN0aW9uIGxlKG4sdCxlKXt2YXIgcj1lLnM9bit0LHU9ci1uLGk9ci11O2UudD1uLWkrKHQtdSl9ZnVuY3Rpb24gc2Uobix0KXtuJiZkYy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpJiZkY1tuLnR5cGVdKG4sdCl9ZnVuY3Rpb24gZmUobix0LGUpe3ZhciByLHU9LTEsaT1uLmxlbmd0aC1lO2Zvcih0LmxpbmVTdGFydCgpOysrdTxpOylyPW5bdV0sdC5wb2ludChyWzBdLHJbMV0sclsyXSk7dC5saW5lRW5kKCl9ZnVuY3Rpb24gaGUobix0KXt2YXIgZT0tMSxyPW4ubGVuZ3RoO2Zvcih0LnBvbHlnb25TdGFydCgpOysrZTxyOylmZShuW2VdLHQsMSk7dC5wb2x5Z29uRW5kKCl9ZnVuY3Rpb24gZ2UoKXtmdW5jdGlvbiBuKG4sdCl7bio9RGEsdD10KkRhLzIrcWEvNDt2YXIgZT1uLXIsbz1lPj0wPzE6LTEsYT1vKmUsYz1NYXRoLmNvcyh0KSxsPU1hdGguc2luKHQpLHM9aSpsLGY9dSpjK3MqTWF0aC5jb3MoYSksaD1zKm8qTWF0aC5zaW4oYSk7eWMuYWRkKE1hdGguYXRhbjIoaCxmKSkscj1uLHU9YyxpPWx9dmFyIHQsZSxyLHUsaTtNYy5wb2ludD1mdW5jdGlvbihvLGEpe01jLnBvaW50PW4scj0odD1vKSpEYSx1PU1hdGguY29zKGE9KGU9YSkqRGEvMitxYS80KSxpPU1hdGguc2luKGEpfSxNYy5saW5lRW5kPWZ1bmN0aW9uKCl7bih0LGUpfX1mdW5jdGlvbiBwZShuKXt2YXIgdD1uWzBdLGU9blsxXSxyPU1hdGguY29zKGUpO3JldHVybltyKk1hdGguY29zKHQpLHIqTWF0aC5zaW4odCksTWF0aC5zaW4oZSldfWZ1bmN0aW9uIHZlKG4sdCl7cmV0dXJuIG5bMF0qdFswXStuWzFdKnRbMV0rblsyXSp0WzJdfWZ1bmN0aW9uIGRlKG4sdCl7cmV0dXJuW25bMV0qdFsyXS1uWzJdKnRbMV0sblsyXSp0WzBdLW5bMF0qdFsyXSxuWzBdKnRbMV0tblsxXSp0WzBdXX1mdW5jdGlvbiBtZShuLHQpe25bMF0rPXRbMF0sblsxXSs9dFsxXSxuWzJdKz10WzJdfWZ1bmN0aW9uIHllKG4sdCl7cmV0dXJuW25bMF0qdCxuWzFdKnQsblsyXSp0XX1mdW5jdGlvbiBNZShuKXt2YXIgdD1NYXRoLnNxcnQoblswXSpuWzBdK25bMV0qblsxXStuWzJdKm5bMl0pO25bMF0vPXQsblsxXS89dCxuWzJdLz10fWZ1bmN0aW9uIHhlKG4pe3JldHVybltNYXRoLmF0YW4yKG5bMV0sblswXSksdHQoblsyXSldfWZ1bmN0aW9uIGJlKG4sdCl7cmV0dXJuIGdhKG5bMF0tdFswXSk8Q2EmJmdhKG5bMV0tdFsxXSk8Q2F9ZnVuY3Rpb24gX2Uobix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSk7d2UoZSpNYXRoLmNvcyhuKSxlKk1hdGguc2luKG4pLE1hdGguc2luKHQpKX1mdW5jdGlvbiB3ZShuLHQsZSl7Kyt4YyxfYys9KG4tX2MpL3hjLHdjKz0odC13YykveGMsU2MrPShlLVNjKS94Y31mdW5jdGlvbiBTZSgpe2Z1bmN0aW9uIG4obix1KXtuKj1EYTt2YXIgaT1NYXRoLmNvcyh1Kj1EYSksbz1pKk1hdGguY29zKG4pLGE9aSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHUpLGw9TWF0aC5hdGFuMihNYXRoLnNxcnQoKGw9ZSpjLXIqYSkqbCsobD1yKm8tdCpjKSpsKyhsPXQqYS1lKm8pKmwpLHQqbytlKmErcipjKTtiYys9bCxrYys9bCoodCsodD1vKSksRWMrPWwqKGUrKGU9YSkpLEFjKz1sKihyKyhyPWMpKSx3ZSh0LGUscil9dmFyIHQsZSxyO3FjLnBvaW50PWZ1bmN0aW9uKHUsaSl7dSo9RGE7dmFyIG89TWF0aC5jb3MoaSo9RGEpO3Q9bypNYXRoLmNvcyh1KSxlPW8qTWF0aC5zaW4odSkscj1NYXRoLnNpbihpKSxxYy5wb2ludD1uLHdlKHQsZSxyKX19ZnVuY3Rpb24ga2UoKXtxYy5wb2ludD1fZX1mdW5jdGlvbiBFZSgpe2Z1bmN0aW9uIG4obix0KXtuKj1EYTt2YXIgZT1NYXRoLmNvcyh0Kj1EYSksbz1lKk1hdGguY29zKG4pLGE9ZSpNYXRoLnNpbihuKSxjPU1hdGguc2luKHQpLGw9dSpjLWkqYSxzPWkqby1yKmMsZj1yKmEtdSpvLGg9TWF0aC5zcXJ0KGwqbCtzKnMrZipmKSxnPXIqbyt1KmEraSpjLHA9aCYmLW50KGcpL2gsdj1NYXRoLmF0YW4yKGgsZyk7TmMrPXAqbCxDYys9cCpzLHpjKz1wKmYsYmMrPXYsa2MrPXYqKHIrKHI9bykpLEVjKz12Kih1Kyh1PWEpKSxBYys9diooaSsoaT1jKSksd2Uocix1LGkpfXZhciB0LGUscix1LGk7cWMucG9pbnQ9ZnVuY3Rpb24obyxhKXt0PW8sZT1hLHFjLnBvaW50PW4sbyo9RGE7dmFyIGM9TWF0aC5jb3MoYSo9RGEpO3I9YypNYXRoLmNvcyhvKSx1PWMqTWF0aC5zaW4obyksaT1NYXRoLnNpbihhKSx3ZShyLHUsaSl9LHFjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSkscWMubGluZUVuZD1rZSxxYy5wb2ludD1fZX19ZnVuY3Rpb24gQWUobix0KXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9bihlLHIpLHQoZVswXSxlWzFdKX1yZXR1cm4gbi5pbnZlcnQmJnQuaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4gZT10LmludmVydChlLHIpLGUmJm4uaW52ZXJ0KGVbMF0sZVsxXSl9KSxlfWZ1bmN0aW9uIE5lKCl7cmV0dXJuITB9ZnVuY3Rpb24gQ2Uobix0LGUscix1KXt2YXIgaT1bXSxvPVtdO2lmKG4uZm9yRWFjaChmdW5jdGlvbihuKXtpZighKCh0PW4ubGVuZ3RoLTEpPD0wKSl7dmFyIHQsZT1uWzBdLHI9blt0XTtpZihiZShlLHIpKXt1LmxpbmVTdGFydCgpO2Zvcih2YXIgYT0wO3Q+YTsrK2EpdS5wb2ludCgoZT1uW2FdKVswXSxlWzFdKTtyZXR1cm4gdm9pZCB1LmxpbmVFbmQoKX12YXIgYz1uZXcgcWUoZSxuLG51bGwsITApLGw9bmV3IHFlKGUsbnVsbCxjLCExKTtjLm89bCxpLnB1c2goYyksby5wdXNoKGwpLGM9bmV3IHFlKHIsbixudWxsLCExKSxsPW5ldyBxZShyLG51bGwsYywhMCksYy5vPWwsaS5wdXNoKGMpLG8ucHVzaChsKX19KSxvLnNvcnQodCksemUoaSksemUobyksaS5sZW5ndGgpe2Zvcih2YXIgYT0wLGM9ZSxsPW8ubGVuZ3RoO2w+YTsrK2Epb1thXS5lPWM9IWM7Zm9yKHZhciBzLGYsaD1pWzBdOzspe2Zvcih2YXIgZz1oLHA9ITA7Zy52OylpZigoZz1nLm4pPT09aClyZXR1cm47cz1nLnosdS5saW5lU3RhcnQoKTtkb3tpZihnLnY9Zy5vLnY9ITAsZy5lKXtpZihwKWZvcih2YXIgYT0wLGw9cy5sZW5ndGg7bD5hOysrYSl1LnBvaW50KChmPXNbYV0pWzBdLGZbMV0pO2Vsc2UgcihnLngsZy5uLngsMSx1KTtnPWcubn1lbHNle2lmKHApe3M9Zy5wLno7Zm9yKHZhciBhPXMubGVuZ3RoLTE7YT49MDstLWEpdS5wb2ludCgoZj1zW2FdKVswXSxmWzFdKX1lbHNlIHIoZy54LGcucC54LC0xLHUpO2c9Zy5wfWc9Zy5vLHM9Zy56LHA9IXB9d2hpbGUoIWcudik7dS5saW5lRW5kKCl9fX1mdW5jdGlvbiB6ZShuKXtpZih0PW4ubGVuZ3RoKXtmb3IodmFyIHQsZSxyPTAsdT1uWzBdOysrcjx0Oyl1Lm49ZT1uW3JdLGUucD11LHU9ZTt1Lm49ZT1uWzBdLGUucD11fX1mdW5jdGlvbiBxZShuLHQsZSxyKXt0aGlzLng9bix0aGlzLno9dCx0aGlzLm89ZSx0aGlzLmU9cix0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIExlKG4sdCxlLHIpe3JldHVybiBmdW5jdGlvbih1LGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgcj11KHQsZSk7bih0PXJbMF0sZT1yWzFdKSYmaS5wb2ludCh0LGUpfWZ1bmN0aW9uIGEobix0KXt2YXIgZT11KG4sdCk7ZC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIGMoKXt5LnBvaW50PWEsZC5saW5lU3RhcnQoKX1mdW5jdGlvbiBsKCl7eS5wb2ludD1vLGQubGluZUVuZCgpfWZ1bmN0aW9uIHMobix0KXt2LnB1c2goW24sdF0pO3ZhciBlPXUobix0KTt4LnBvaW50KGVbMF0sZVsxXSl9ZnVuY3Rpb24gZigpe3gubGluZVN0YXJ0KCksdj1bXX1mdW5jdGlvbiBoKCl7cyh2WzBdWzBdLHZbMF1bMV0pLHgubGluZUVuZCgpO3ZhciBuLHQ9eC5jbGVhbigpLGU9TS5idWZmZXIoKSxyPWUubGVuZ3RoO2lmKHYucG9wKCkscC5wdXNoKHYpLHY9bnVsbCxyKWlmKDEmdCl7bj1lWzBdO3ZhciB1LHI9bi5sZW5ndGgtMSxvPS0xO2lmKHI+MCl7Zm9yKGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLGkubGluZVN0YXJ0KCk7KytvPHI7KWkucG9pbnQoKHU9bltvXSlbMF0sdVsxXSk7aS5saW5lRW5kKCl9fWVsc2Ugcj4xJiYyJnQmJmUucHVzaChlLnBvcCgpLmNvbmNhdChlLnNoaWZ0KCkpKSxnLnB1c2goZS5maWx0ZXIoVGUpKX12YXIgZyxwLHYsZD10KGkpLG09dS5pbnZlcnQoclswXSxyWzFdKSx5PXtwb2ludDpvLGxpbmVTdGFydDpjLGxpbmVFbmQ6bCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt5LnBvaW50PXMseS5saW5lU3RhcnQ9Zix5LmxpbmVFbmQ9aCxnPVtdLHA9W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt5LnBvaW50PW8seS5saW5lU3RhcnQ9Yyx5LmxpbmVFbmQ9bCxnPXRhLm1lcmdlKGcpO3ZhciBuPUZlKG0scCk7Zy5sZW5ndGg/KGJ8fChpLnBvbHlnb25TdGFydCgpLGI9ITApLENlKGcsRGUsbixlLGkpKTpuJiYoYnx8KGkucG9seWdvblN0YXJ0KCksYj0hMCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpKSxiJiYoaS5wb2x5Z29uRW5kKCksYj0hMSksZz1wPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe2kucG9seWdvblN0YXJ0KCksaS5saW5lU3RhcnQoKSxlKG51bGwsbnVsbCwxLGkpLGkubGluZUVuZCgpLGkucG9seWdvbkVuZCgpfX0sTT1SZSgpLHg9dChNKSxiPSExO3JldHVybiB5fX1mdW5jdGlvbiBUZShuKXtyZXR1cm4gbi5sZW5ndGg+MX1mdW5jdGlvbiBSZSgpe3ZhciBuLHQ9W107cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe3QucHVzaChuPVtdKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtuLnB1c2goW3QsZV0pfSxsaW5lRW5kOmIsYnVmZmVyOmZ1bmN0aW9uKCl7dmFyIGU9dDtyZXR1cm4gdD1bXSxuPW51bGwsZX0scmVqb2luOmZ1bmN0aW9uKCl7dC5sZW5ndGg+MSYmdC5wdXNoKHQucG9wKCkuY29uY2F0KHQuc2hpZnQoKSkpfX19ZnVuY3Rpb24gRGUobix0KXtyZXR1cm4oKG49bi54KVswXTwwP25bMV0tUmEtQ2E6UmEtblsxXSktKCh0PXQueClbMF08MD90WzFdLVJhLUNhOlJhLXRbMV0pfWZ1bmN0aW9uIFBlKG4pe3ZhciB0LGU9MC8wLHI9MC8wLHU9MC8wO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtuLmxpbmVTdGFydCgpLHQ9MX0scG9pbnQ6ZnVuY3Rpb24oaSxvKXt2YXIgYT1pPjA/cWE6LXFhLGM9Z2EoaS1lKTtnYShjLXFhKTxDYT8obi5wb2ludChlLHI9KHIrbykvMj4wP1JhOi1SYSksbi5wb2ludCh1LHIpLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChhLHIpLG4ucG9pbnQoaSxyKSx0PTApOnUhPT1hJiZjPj1xYSYmKGdhKGUtdSk8Q2EmJihlLT11KkNhKSxnYShpLWEpPENhJiYoaS09YSpDYSkscj1VZShlLHIsaSxvKSxuLnBvaW50KHUsciksbi5saW5lRW5kKCksbi5saW5lU3RhcnQoKSxuLnBvaW50KGEsciksdD0wKSxuLnBvaW50KGU9aSxyPW8pLHU9YX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpLGU9cj0wLzB9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItdH19fWZ1bmN0aW9uIFVlKG4sdCxlLHIpe3ZhciB1LGksbz1NYXRoLnNpbihuLWUpO3JldHVybiBnYShvKT5DYT9NYXRoLmF0YW4oKE1hdGguc2luKHQpKihpPU1hdGguY29zKHIpKSpNYXRoLnNpbihlKS1NYXRoLnNpbihyKSoodT1NYXRoLmNvcyh0KSkqTWF0aC5zaW4obikpLyh1KmkqbykpOih0K3IpLzJ9ZnVuY3Rpb24gamUobix0LGUscil7dmFyIHU7aWYobnVsbD09bil1PWUqUmEsci5wb2ludCgtcWEsdSksci5wb2ludCgwLHUpLHIucG9pbnQocWEsdSksci5wb2ludChxYSwwKSxyLnBvaW50KHFhLC11KSxyLnBvaW50KDAsLXUpLHIucG9pbnQoLXFhLC11KSxyLnBvaW50KC1xYSwwKSxyLnBvaW50KC1xYSx1KTtlbHNlIGlmKGdhKG5bMF0tdFswXSk+Q2Epe3ZhciBpPW5bMF08dFswXT9xYTotcWE7dT1lKmkvMixyLnBvaW50KC1pLHUpLHIucG9pbnQoMCx1KSxyLnBvaW50KGksdSl9ZWxzZSByLnBvaW50KHRbMF0sdFsxXSl9ZnVuY3Rpb24gRmUobix0KXt2YXIgZT1uWzBdLHI9blsxXSx1PVtNYXRoLnNpbihlKSwtTWF0aC5jb3MoZSksMF0saT0wLG89MDt5Yy5yZXNldCgpO2Zvcih2YXIgYT0wLGM9dC5sZW5ndGg7Yz5hOysrYSl7dmFyIGw9dFthXSxzPWwubGVuZ3RoO2lmKHMpZm9yKHZhciBmPWxbMF0saD1mWzBdLGc9ZlsxXS8yK3FhLzQscD1NYXRoLnNpbihnKSx2PU1hdGguY29zKGcpLGQ9MTs7KXtkPT09cyYmKGQ9MCksbj1sW2RdO3ZhciBtPW5bMF0seT1uWzFdLzIrcWEvNCxNPU1hdGguc2luKHkpLHg9TWF0aC5jb3MoeSksYj1tLWgsXz1iPj0wPzE6LTEsdz1fKmIsUz13PnFhLGs9cCpNO2lmKHljLmFkZChNYXRoLmF0YW4yKGsqXypNYXRoLnNpbih3KSx2KngraypNYXRoLmNvcyh3KSkpLGkrPVM/YitfKkxhOmIsU15oPj1lXm0+PWUpe3ZhciBFPWRlKHBlKGYpLHBlKG4pKTtNZShFKTt2YXIgQT1kZSh1LEUpO01lKEEpO3ZhciBOPShTXmI+PTA/LTE6MSkqdHQoQVsyXSk7KHI+Tnx8cj09PU4mJihFWzBdfHxFWzFdKSkmJihvKz1TXmI+PTA/MTotMSl9aWYoIWQrKylicmVhaztoPW0scD1NLHY9eCxmPW59fXJldHVybigtQ2E+aXx8Q2E+aSYmMD55YyleMSZvfWZ1bmN0aW9uIEhlKG4pe2Z1bmN0aW9uIHQobix0KXtyZXR1cm4gTWF0aC5jb3MobikqTWF0aC5jb3ModCk+aX1mdW5jdGlvbiBlKG4pe3ZhciBlLGksYyxsLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2w9Yz0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGYsaCl7dmFyIGcscD1bZixoXSx2PXQoZixoKSxkPW8/dj8wOnUoZixoKTp2P3UoZisoMD5mP3FhOi1xYSksaCk6MDtpZighZSYmKGw9Yz12KSYmbi5saW5lU3RhcnQoKSx2IT09YyYmKGc9cihlLHApLChiZShlLGcpfHxiZShwLGcpKSYmKHBbMF0rPUNhLHBbMV0rPUNhLHY9dChwWzBdLHBbMV0pKSksdiE9PWMpcz0wLHY/KG4ubGluZVN0YXJ0KCksZz1yKHAsZSksbi5wb2ludChnWzBdLGdbMV0pKTooZz1yKGUscCksbi5wb2ludChnWzBdLGdbMV0pLG4ubGluZUVuZCgpKSxlPWc7ZWxzZSBpZihhJiZlJiZvXnYpe3ZhciBtO2QmaXx8IShtPXIocCxlLCEwKSl8fChzPTAsbz8obi5saW5lU3RhcnQoKSxuLnBvaW50KG1bMF1bMF0sbVswXVsxXSksbi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpKToobi5wb2ludChtWzFdWzBdLG1bMV1bMV0pLG4ubGluZUVuZCgpLG4ubGluZVN0YXJ0KCksbi5wb2ludChtWzBdWzBdLG1bMF1bMV0pKSl9IXZ8fGUmJmJlKGUscCl8fG4ucG9pbnQocFswXSxwWzFdKSxlPXAsYz12LGk9ZH0sbGluZUVuZDpmdW5jdGlvbigpe2MmJm4ubGluZUVuZCgpLGU9bnVsbH0sY2xlYW46ZnVuY3Rpb24oKXtyZXR1cm4gc3wobCYmYyk8PDF9fX1mdW5jdGlvbiByKG4sdCxlKXt2YXIgcj1wZShuKSx1PXBlKHQpLG89WzEsMCwwXSxhPWRlKHIsdSksYz12ZShhLGEpLGw9YVswXSxzPWMtbCpsO2lmKCFzKXJldHVybiFlJiZuO3ZhciBmPWkqYy9zLGg9LWkqbC9zLGc9ZGUobyxhKSxwPXllKG8sZiksdj15ZShhLGgpO21lKHAsdik7dmFyIGQ9ZyxtPXZlKHAsZCkseT12ZShkLGQpLE09bSptLXkqKHZlKHAscCktMSk7aWYoISgwPk0pKXt2YXIgeD1NYXRoLnNxcnQoTSksYj15ZShkLCgtbS14KS95KTtpZihtZShiLHApLGI9eGUoYiksIWUpcmV0dXJuIGI7dmFyIF8sdz1uWzBdLFM9dFswXSxrPW5bMV0sRT10WzFdO3c+UyYmKF89dyx3PVMsUz1fKTt2YXIgQT1TLXcsTj1nYShBLXFhKTxDYSxDPU58fENhPkE7aWYoIU4mJms+RSYmKF89ayxrPUUsRT1fKSxDP04/aytFPjBeYlsxXTwoZ2EoYlswXS13KTxDYT9rOkUpOms8PWJbMV0mJmJbMV08PUU6QT5xYV4odzw9YlswXSYmYlswXTw9Uykpe3ZhciB6PXllKGQsKC1tK3gpL3kpO3JldHVybiBtZSh6LHApLFtiLHhlKHopXX19fWZ1bmN0aW9uIHUodCxlKXt2YXIgcj1vP246cWEtbix1PTA7cmV0dXJuLXI+dD91fD0xOnQ+ciYmKHV8PTIpLC1yPmU/dXw9NDplPnImJih1fD04KSx1fXZhciBpPU1hdGguY29zKG4pLG89aT4wLGE9Z2EoaSk+Q2EsYz1ncihuLDYqRGEpO3JldHVybiBMZSh0LGUsYyxvP1swLC1uXTpbLXFhLG4tcWFdKX1mdW5jdGlvbiBPZShuLHQsZSxyKXtyZXR1cm4gZnVuY3Rpb24odSl7dmFyIGksbz11LmEsYT11LmIsYz1vLngsbD1vLnkscz1hLngsZj1hLnksaD0wLGc9MSxwPXMtYyx2PWYtbDtpZihpPW4tYyxwfHwhKGk+MCkpe2lmKGkvPXAsMD5wKXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZihwPjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPWUtYyxwfHwhKDA+aSkpe2lmKGkvPXAsMD5wKXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZihwPjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1pZihpPXQtbCx2fHwhKGk+MCkpe2lmKGkvPXYsMD52KXtpZihoPmkpcmV0dXJuO2c+aSYmKGc9aSl9ZWxzZSBpZih2PjApe2lmKGk+ZylyZXR1cm47aT5oJiYoaD1pKX1pZihpPXItbCx2fHwhKDA+aSkpe2lmKGkvPXYsMD52KXtpZihpPmcpcmV0dXJuO2k+aCYmKGg9aSl9ZWxzZSBpZih2PjApe2lmKGg+aSlyZXR1cm47Zz5pJiYoZz1pKX1yZXR1cm4gaD4wJiYodS5hPXt4OmMraCpwLHk6bCtoKnZ9KSwxPmcmJih1LmI9e3g6YytnKnAseTpsK2cqdn0pLHV9fX19fX1mdW5jdGlvbiBJZShuLHQsZSxyKXtmdW5jdGlvbiB1KHIsdSl7cmV0dXJuIGdhKHJbMF0tbik8Q2E/dT4wPzA6MzpnYShyWzBdLWUpPENhP3U+MD8yOjE6Z2EoclsxXS10KTxDYT91PjA/MTowOnU+MD8zOjJ9ZnVuY3Rpb24gaShuLHQpe3JldHVybiBvKG4ueCx0LngpfWZ1bmN0aW9uIG8obix0KXt2YXIgZT11KG4sMSkscj11KHQsMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT90WzFdLW5bMV06MT09PWU/blswXS10WzBdOjI9PT1lP25bMV0tdFsxXTp0WzBdLW5bMF19cmV0dXJuIGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMobil7Zm9yKHZhciB0PTAsZT1kLmxlbmd0aCxyPW5bMV0sdT0wO2U+dTsrK3UpZm9yKHZhciBpLG89MSxhPWRbdV0sYz1hLmxlbmd0aCxsPWFbMF07Yz5vOysrbylpPWFbb10sbFsxXTw9cj9pWzFdPnImJlEobCxpLG4pPjAmJisrdDppWzFdPD1yJiZRKGwsaSxuKTwwJiYtLXQsbD1pO3JldHVybiAwIT09dH1mdW5jdGlvbiBsKGksYSxjLGwpe3ZhciBzPTAsZj0wO2lmKG51bGw9PWl8fChzPXUoaSxjKSkhPT0oZj11KGEsYykpfHxvKGksYSk8MF5jPjApe2RvIGwucG9pbnQoMD09PXN8fDM9PT1zP246ZSxzPjE/cjp0KTt3aGlsZSgocz0ocytjKzQpJTQpIT09Zil9ZWxzZSBsLnBvaW50KGFbMF0sYVsxXSl9ZnVuY3Rpb24gcyh1LGkpe3JldHVybiB1Pj1uJiZlPj11JiZpPj10JiZyPj1pfWZ1bmN0aW9uIGYobix0KXtzKG4sdCkmJmEucG9pbnQobix0KX1mdW5jdGlvbiBoKCl7Qy5wb2ludD1wLGQmJmQucHVzaChtPVtdKSxTPSEwLHc9ITEsYj1fPTAvMH1mdW5jdGlvbiBnKCl7diYmKHAoeSxNKSx4JiZ3JiZBLnJlam9pbigpLHYucHVzaChBLmJ1ZmZlcigpKSksQy5wb2ludD1mLHcmJmEubGluZUVuZCgpfWZ1bmN0aW9uIHAobix0KXtuPU1hdGgubWF4KC1UYyxNYXRoLm1pbihUYyxuKSksdD1NYXRoLm1heCgtVGMsTWF0aC5taW4oVGMsdCkpO3ZhciBlPXMobix0KTtpZihkJiZtLnB1c2goW24sdF0pLFMpeT1uLE09dCx4PWUsUz0hMSxlJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCkpO2Vsc2UgaWYoZSYmdylhLnBvaW50KG4sdCk7ZWxzZXt2YXIgcj17YTp7eDpiLHk6X30sYjp7eDpuLHk6dH19O04ocik/KHd8fChhLmxpbmVTdGFydCgpLGEucG9pbnQoci5hLngsci5hLnkpKSxhLnBvaW50KHIuYi54LHIuYi55KSxlfHxhLmxpbmVFbmQoKSxrPSExKTplJiYoYS5saW5lU3RhcnQoKSxhLnBvaW50KG4sdCksaz0hMSl9Yj1uLF89dCx3PWV9dmFyIHYsZCxtLHksTSx4LGIsXyx3LFMsayxFPWEsQT1SZSgpLE49T2Uobix0LGUsciksQz17cG9pbnQ6ZixsaW5lU3RhcnQ6aCxsaW5lRW5kOmcscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YT1BLHY9W10sZD1bXSxrPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7YT1FLHY9dGEubWVyZ2Uodik7dmFyIHQ9YyhbbixyXSksZT1rJiZ0LHU9di5sZW5ndGg7KGV8fHUpJiYoYS5wb2x5Z29uU3RhcnQoKSxlJiYoYS5saW5lU3RhcnQoKSxsKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSx1JiZDZSh2LGksdCxsLGEpLGEucG9seWdvbkVuZCgpKSx2PWQ9bT1udWxsfX07cmV0dXJuIEN9fWZ1bmN0aW9uIFllKG4pe3ZhciB0PTAsZT1xYS8zLHI9aXIobiksdT1yKHQsZSk7cmV0dXJuIHUucGFyYWxsZWxzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3IodD1uWzBdKnFhLzE4MCxlPW5bMV0qcWEvMTgwKTpbdC9xYSoxODAsZS9xYSoxODBdfSx1fWZ1bmN0aW9uIFplKG4sdCl7ZnVuY3Rpb24gZShuLHQpe3ZhciBlPU1hdGguc3FydChpLTIqdSpNYXRoLnNpbih0KSkvdTtyZXR1cm5bZSpNYXRoLnNpbihuKj11KSxvLWUqTWF0aC5jb3MobildfXZhciByPU1hdGguc2luKG4pLHU9KHIrTWF0aC5zaW4odCkpLzIsaT0xK3IqKDIqdS1yKSxvPU1hdGguc3FydChpKS91O3JldHVybiBlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdDtyZXR1cm5bTWF0aC5hdGFuMihuLGUpL3UsdHQoKGktKG4qbitlKmUpKnUqdSkvKDIqdSkpXX0sZX1mdW5jdGlvbiBWZSgpe2Z1bmN0aW9uIG4obix0KXtEYys9dSpuLXIqdCxyPW4sdT10fXZhciB0LGUscix1O0hjLnBvaW50PWZ1bmN0aW9uKGksbyl7SGMucG9pbnQ9bix0PXI9aSxlPXU9b30sSGMubGluZUVuZD1mdW5jdGlvbigpe24odCxlKX19ZnVuY3Rpb24gWGUobix0KXtQYz5uJiYoUGM9biksbj5qYyYmKGpjPW4pLFVjPnQmJihVYz10KSx0PkZjJiYoRmM9dCl9ZnVuY3Rpb24gJGUoKXtmdW5jdGlvbiBuKG4sdCl7by5wdXNoKCJNIixuLCIsIix0LGkpfWZ1bmN0aW9uIHQobix0KXtvLnB1c2goIk0iLG4sIiwiLHQpLGEucG9pbnQ9ZX1mdW5jdGlvbiBlKG4sdCl7by5wdXNoKCJMIixuLCIsIix0KX1mdW5jdGlvbiByKCl7YS5wb2ludD1ufWZ1bmN0aW9uIHUoKXtvLnB1c2goIloiKX12YXIgaT1CZSg0LjUpLG89W10sYT17cG9pbnQ6bixsaW5lU3RhcnQ6ZnVuY3Rpb24oKXthLnBvaW50PXR9LGxpbmVFbmQ6cixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2EubGluZUVuZD1yLGEucG9pbnQ9bn0scG9pbnRSYWRpdXM6ZnVuY3Rpb24obil7cmV0dXJuIGk9QmUobiksYX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYoby5sZW5ndGgpe3ZhciBuPW8uam9pbigiIik7cmV0dXJuIG89W10sbn19fTtyZXR1cm4gYX1mdW5jdGlvbiBCZShuKXtyZXR1cm4ibTAsIituKyJhIituKyIsIituKyIgMCAxLDEgMCwiKy0yKm4rImEiK24rIiwiK24rIiAwIDEsMSAwLCIrMipuKyJ6In1mdW5jdGlvbiBXZShuLHQpe19jKz1uLHdjKz10LCsrU2N9ZnVuY3Rpb24gSmUoKXtmdW5jdGlvbiBuKG4scil7dmFyIHU9bi10LGk9ci1lLG89TWF0aC5zcXJ0KHUqdStpKmkpO2tjKz1vKih0K24pLzIsRWMrPW8qKGUrcikvMixBYys9byxXZSh0PW4sZT1yKX12YXIgdCxlO0ljLnBvaW50PWZ1bmN0aW9uKHIsdSl7SWMucG9pbnQ9bixXZSh0PXIsZT11KX19ZnVuY3Rpb24gR2UoKXtJYy5wb2ludD1XZX1mdW5jdGlvbiBLZSgpe2Z1bmN0aW9uIG4obix0KXt2YXIgZT1uLXIsaT10LXUsbz1NYXRoLnNxcnQoZSplK2kqaSk7a2MrPW8qKHIrbikvMixFYys9byoodSt0KS8yLEFjKz1vLG89dSpuLXIqdCxOYys9byoocituKSxDYys9byoodSt0KSx6Yys9MypvLFdlKHI9bix1PXQpfXZhciB0LGUscix1O0ljLnBvaW50PWZ1bmN0aW9uKGksbyl7SWMucG9pbnQ9bixXZSh0PXI9aSxlPXU9byl9LEljLmxpbmVFbmQ9ZnVuY3Rpb24oKXtuKHQsZSl9fWZ1bmN0aW9uIFFlKG4pe2Z1bmN0aW9uIHQodCxlKXtuLm1vdmVUbyh0K28sZSksbi5hcmModCxlLG8sMCxMYSl9ZnVuY3Rpb24gZSh0LGUpe24ubW92ZVRvKHQsZSksYS5wb2ludD1yfWZ1bmN0aW9uIHIodCxlKXtuLmxpbmVUbyh0LGUpfWZ1bmN0aW9uIHUoKXthLnBvaW50PXR9ZnVuY3Rpb24gaSgpe24uY2xvc2VQYXRoKCl9dmFyIG89NC41LGE9e3BvaW50OnQsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7YS5wb2ludD1lfSxsaW5lRW5kOnUscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7YS5saW5lRW5kPWl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXthLmxpbmVFbmQ9dSxhLnBvaW50PXR9LHBvaW50UmFkaXVzOmZ1bmN0aW9uKG4pe3JldHVybiBvPW4sYX0scmVzdWx0OmJ9O3JldHVybiBhfWZ1bmN0aW9uIG5yKG4pe2Z1bmN0aW9uIHQobil7cmV0dXJuKGE/cjplKShuKX1mdW5jdGlvbiBlKHQpe3JldHVybiBycih0LGZ1bmN0aW9uKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfSl9ZnVuY3Rpb24gcih0KXtmdW5jdGlvbiBlKGUscil7ZT1uKGUsciksdC5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHIoKXtNPTAvMCxTLnBvaW50PWksdC5saW5lU3RhcnQoKX1mdW5jdGlvbiBpKGUscil7dmFyIGk9cGUoW2Uscl0pLG89bihlLHIpO3UoTSx4LHksYixfLHcsTT1vWzBdLHg9b1sxXSx5PWUsYj1pWzBdLF89aVsxXSx3PWlbMl0sYSx0KSx0LnBvaW50KE0seCl9ZnVuY3Rpb24gbygpe1MucG9pbnQ9ZSx0LmxpbmVFbmQoKX1mdW5jdGlvbiBjKCl7cigpLFMucG9pbnQ9bCxTLmxpbmVFbmQ9c31mdW5jdGlvbiBsKG4sdCl7aShmPW4saD10KSxnPU0scD14LHY9YixkPV8sbT13LFMucG9pbnQ9aX1mdW5jdGlvbiBzKCl7dShNLHgseSxiLF8sdyxnLHAsZix2LGQsbSxhLHQpLFMubGluZUVuZD1vLG8oKX12YXIgZixoLGcscCx2LGQsbSx5LE0seCxiLF8sdyxTPXtwb2ludDplLGxpbmVTdGFydDpyLGxpbmVFbmQ6byxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0LnBvbHlnb25TdGFydCgpLFMubGluZVN0YXJ0PWMKfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksUy5saW5lU3RhcnQ9cn19O3JldHVybiBTfWZ1bmN0aW9uIHUodCxlLHIsYSxjLGwscyxmLGgsZyxwLHYsZCxtKXt2YXIgeT1zLXQsTT1mLWUseD15KnkrTSpNO2lmKHg+NCppJiZkLS0pe3ZhciBiPWErZyxfPWMrcCx3PWwrdixTPU1hdGguc3FydChiKmIrXypfK3cqdyksaz1NYXRoLmFzaW4ody89UyksRT1nYShnYSh3KS0xKTxDYXx8Z2Eoci1oKTxDYT8ocitoKS8yOk1hdGguYXRhbjIoXyxiKSxBPW4oRSxrKSxOPUFbMF0sQz1BWzFdLHo9Ti10LHE9Qy1lLEw9TSp6LXkqcTsoTCpML3g+aXx8Z2EoKHkqeitNKnEpL3gtLjUpPi4zfHxvPmEqZytjKnArbCp2KSYmKHUodCxlLHIsYSxjLGwsTixDLEUsYi89UyxfLz1TLHcsZCxtKSxtLnBvaW50KE4sQyksdShOLEMsRSxiLF8sdyxzLGYsaCxnLHAsdixkLG0pKX19dmFyIGk9LjUsbz1NYXRoLmNvcygzMCpEYSksYT0xNjtyZXR1cm4gdC5wcmVjaXNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9KGk9bipuKT4wJiYxNix0KTpNYXRoLnNxcnQoaSl9LHR9ZnVuY3Rpb24gdHIobil7dmFyIHQ9bnIoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihbdCpQYSxlKlBhXSl9KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG9yKHQobikpfX1mdW5jdGlvbiBlcihuKXt0aGlzLnN0cmVhbT1ufWZ1bmN0aW9uIHJyKG4sdCl7cmV0dXJue3BvaW50OnQsc3BoZXJlOmZ1bmN0aW9uKCl7bi5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bi5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe24ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtuLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7bi5wb2x5Z29uRW5kKCl9fX1mdW5jdGlvbiB1cihuKXtyZXR1cm4gaXIoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKCl9ZnVuY3Rpb24gaXIobil7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj1hKG5bMF0qRGEsblsxXSpEYSksW25bMF0qaCtjLGwtblsxXSpoXX1mdW5jdGlvbiBlKG4pe3JldHVybiBuPWEuaW52ZXJ0KChuWzBdLWMpL2gsKGwtblsxXSkvaCksbiYmW25bMF0qUGEsblsxXSpQYV19ZnVuY3Rpb24gcigpe2E9QWUobz1scihtLE0seCksaSk7dmFyIG49aSh2LGQpO3JldHVybiBjPWctblswXSpoLGw9cCtuWzFdKmgsdSgpfWZ1bmN0aW9uIHUoKXtyZXR1cm4gcyYmKHMudmFsaWQ9ITEscz1udWxsKSx0fXZhciBpLG8sYSxjLGwscyxmPW5yKGZ1bmN0aW9uKG4sdCl7cmV0dXJuIG49aShuLHQpLFtuWzBdKmgrYyxsLW5bMV0qaF19KSxoPTE1MCxnPTQ4MCxwPTI1MCx2PTAsZD0wLG09MCxNPTAseD0wLGI9TGMsXz15LHc9bnVsbCxTPW51bGw7cmV0dXJuIHQuc3RyZWFtPWZ1bmN0aW9uKG4pe3JldHVybiBzJiYocy52YWxpZD0hMSkscz1vcihiKG8sZihfKG4pKSkpLHMudmFsaWQ9ITAsc30sdC5jbGlwQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGI9bnVsbD09bj8odz1uLExjKTpIZSgodz0rbikqRGEpLHUoKSk6d30sdC5jbGlwRXh0ZW50PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPW4sXz1uP0llKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pOnksdSgpKTpTfSx0LnNjYWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPStuLHIoKSk6aH0sdC50cmFuc2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K25bMF0scD0rblsxXSxyKCkpOltnLHBdfSx0LmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj1uWzBdJTM2MCpEYSxkPW5bMV0lMzYwKkRhLHIoKSk6W3YqUGEsZCpQYV19LHQucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW5bMF0lMzYwKkRhLE09blsxXSUzNjAqRGEseD1uLmxlbmd0aD4yP25bMl0lMzYwKkRhOjAscigpKTpbbSpQYSxNKlBhLHgqUGFdfSx0YS5yZWJpbmQodCxmLCJwcmVjaXNpb24iKSxmdW5jdGlvbigpe3JldHVybiBpPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuaW52ZXJ0PWkuaW52ZXJ0JiZlLHIoKX19ZnVuY3Rpb24gb3Iobil7cmV0dXJuIHJyKG4sZnVuY3Rpb24odCxlKXtuLnBvaW50KHQqRGEsZSpEYSl9KX1mdW5jdGlvbiBhcihuLHQpe3JldHVybltuLHRdfWZ1bmN0aW9uIGNyKG4sdCl7cmV0dXJuW24+cWE/bi1MYTotcWE+bj9uK0xhOm4sdF19ZnVuY3Rpb24gbHIobix0LGUpe3JldHVybiBuP3R8fGU/QWUoZnIobiksaHIodCxlKSk6ZnIobik6dHx8ZT9ocih0LGUpOmNyfWZ1bmN0aW9uIHNyKG4pe3JldHVybiBmdW5jdGlvbih0LGUpe3JldHVybiB0Kz1uLFt0PnFhP3QtTGE6LXFhPnQ/dCtMYTp0LGVdfX1mdW5jdGlvbiBmcihuKXt2YXIgdD1zcihuKTtyZXR1cm4gdC5pbnZlcnQ9c3IoLW4pLHR9ZnVuY3Rpb24gaHIobix0KXtmdW5jdGlvbiBlKG4sdCl7dmFyIGU9TWF0aC5jb3ModCksYT1NYXRoLmNvcyhuKSplLGM9TWF0aC5zaW4obikqZSxsPU1hdGguc2luKHQpLHM9bCpyK2EqdTtyZXR1cm5bTWF0aC5hdGFuMihjKmktcypvLGEqci1sKnUpLHR0KHMqaStjKm8pXX12YXIgcj1NYXRoLmNvcyhuKSx1PU1hdGguc2luKG4pLGk9TWF0aC5jb3ModCksbz1NYXRoLnNpbih0KTtyZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obix0KXt2YXIgZT1NYXRoLmNvcyh0KSxhPU1hdGguY29zKG4pKmUsYz1NYXRoLnNpbihuKSplLGw9TWF0aC5zaW4odCkscz1sKmktYypvO3JldHVybltNYXRoLmF0YW4yKGMqaStsKm8sYSpyK3MqdSksdHQocypyLWEqdSldfSxlfWZ1bmN0aW9uIGdyKG4sdCl7dmFyIGU9TWF0aC5jb3Mobikscj1NYXRoLnNpbihuKTtyZXR1cm4gZnVuY3Rpb24odSxpLG8sYSl7dmFyIGM9byp0O251bGwhPXU/KHU9cHIoZSx1KSxpPXByKGUsaSksKG8+MD9pPnU6dT5pKSYmKHUrPW8qTGEpKToodT1uK28qTGEsaT1uLS41KmMpO2Zvcih2YXIgbCxzPXU7bz4wP3M+aTppPnM7cy09YylhLnBvaW50KChsPXhlKFtlLC1yKk1hdGguY29zKHMpLC1yKk1hdGguc2luKHMpXSkpWzBdLGxbMV0pfX1mdW5jdGlvbiBwcihuLHQpe3ZhciBlPXBlKHQpO2VbMF0tPW4sTWUoZSk7dmFyIHI9bnQoLWVbMV0pO3JldHVybigoLWVbMl08MD8tcjpyKSsyKk1hdGguUEktQ2EpJSgyKk1hdGguUEkpfWZ1bmN0aW9uIHZyKG4sdCxlKXt2YXIgcj10YS5yYW5nZShuLHQtQ2EsZSkuY29uY2F0KHQpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gci5tYXAoZnVuY3Rpb24odCl7cmV0dXJuW24sdF19KX19ZnVuY3Rpb24gZHIobix0LGUpe3ZhciByPXRhLnJhbmdlKG4sdC1DYSxlKS5jb25jYXQodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiByLm1hcChmdW5jdGlvbih0KXtyZXR1cm5bdCxuXX0pfX1mdW5jdGlvbiBtcihuKXtyZXR1cm4gbi5zb3VyY2V9ZnVuY3Rpb24geXIobil7cmV0dXJuIG4udGFyZ2V0fWZ1bmN0aW9uIE1yKG4sdCxlLHIpe3ZhciB1PU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCksbz1NYXRoLmNvcyhyKSxhPU1hdGguc2luKHIpLGM9dSpNYXRoLmNvcyhuKSxsPXUqTWF0aC5zaW4obikscz1vKk1hdGguY29zKGUpLGY9bypNYXRoLnNpbihlKSxoPTIqTWF0aC5hc2luKE1hdGguc3FydChpdChyLXQpK3UqbyppdChlLW4pKSksZz0xL01hdGguc2luKGgpLHA9aD9mdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNpbihuKj1oKSpnLGU9TWF0aC5zaW4oaC1uKSpnLHI9ZSpjK3Qqcyx1PWUqbCt0KmYsbz1lKmkrdCphO3JldHVybltNYXRoLmF0YW4yKHUscikqUGEsTWF0aC5hdGFuMihvLE1hdGguc3FydChyKnIrdSp1KSkqUGFdfTpmdW5jdGlvbigpe3JldHVybltuKlBhLHQqUGFdfTtyZXR1cm4gcC5kaXN0YW5jZT1oLHB9ZnVuY3Rpb24geHIoKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9TWF0aC5zaW4odSo9RGEpLG89TWF0aC5jb3ModSksYT1nYSgobio9RGEpLXQpLGM9TWF0aC5jb3MoYSk7WWMrPU1hdGguYXRhbjIoTWF0aC5zcXJ0KChhPW8qTWF0aC5zaW4oYSkpKmErKGE9cippLWUqbypjKSphKSxlKmkrcipvKmMpLHQ9bixlPWkscj1vfXZhciB0LGUscjtaYy5wb2ludD1mdW5jdGlvbih1LGkpe3Q9dSpEYSxlPU1hdGguc2luKGkqPURhKSxyPU1hdGguY29zKGkpLFpjLnBvaW50PW59LFpjLmxpbmVFbmQ9ZnVuY3Rpb24oKXtaYy5wb2ludD1aYy5saW5lRW5kPWJ9fWZ1bmN0aW9uIGJyKG4sdCl7ZnVuY3Rpb24gZSh0LGUpe3ZhciByPU1hdGguY29zKHQpLHU9TWF0aC5jb3MoZSksaT1uKHIqdSk7cmV0dXJuW2kqdSpNYXRoLnNpbih0KSxpKk1hdGguc2luKGUpXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24obixlKXt2YXIgcj1NYXRoLnNxcnQobipuK2UqZSksdT10KHIpLGk9TWF0aC5zaW4odSksbz1NYXRoLmNvcyh1KTtyZXR1cm5bTWF0aC5hdGFuMihuKmkscipvKSxNYXRoLmFzaW4ociYmZSppL3IpXX0sZX1mdW5jdGlvbiBfcihuLHQpe2Z1bmN0aW9uIGUobix0KXtvPjA/LVJhK0NhPnQmJih0PS1SYStDYSk6dD5SYS1DYSYmKHQ9UmEtQ2EpO3ZhciBlPW8vTWF0aC5wb3codSh0KSxpKTtyZXR1cm5bZSpNYXRoLnNpbihpKm4pLG8tZSpNYXRoLmNvcyhpKm4pXX12YXIgcj1NYXRoLmNvcyhuKSx1PWZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnRhbihxYS80K24vMil9LGk9bj09PXQ/TWF0aC5zaW4obik6TWF0aC5sb2coci9NYXRoLmNvcyh0KSkvTWF0aC5sb2codSh0KS91KG4pKSxvPXIqTWF0aC5wb3codShuKSxpKS9pO3JldHVybiBpPyhlLmludmVydD1mdW5jdGlvbihuLHQpe3ZhciBlPW8tdCxyPUsoaSkqTWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybltNYXRoLmF0YW4yKG4sZSkvaSwyKk1hdGguYXRhbihNYXRoLnBvdyhvL3IsMS9pKSktUmFdfSxlKTpTcn1mdW5jdGlvbiB3cihuLHQpe2Z1bmN0aW9uIGUobix0KXt2YXIgZT1pLXQ7cmV0dXJuW2UqTWF0aC5zaW4odSpuKSxpLWUqTWF0aC5jb3ModSpuKV19dmFyIHI9TWF0aC5jb3MobiksdT1uPT09dD9NYXRoLnNpbihuKTooci1NYXRoLmNvcyh0KSkvKHQtbiksaT1yL3UrbjtyZXR1cm4gZ2EodSk8Q2E/YXI6KGUuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7dmFyIGU9aS10O3JldHVybltNYXRoLmF0YW4yKG4sZSkvdSxpLUsodSkqTWF0aC5zcXJ0KG4qbitlKmUpXX0sZSl9ZnVuY3Rpb24gU3Iobix0KXtyZXR1cm5bbixNYXRoLmxvZyhNYXRoLnRhbihxYS80K3QvMikpXX1mdW5jdGlvbiBrcihuKXt2YXIgdCxlPXVyKG4pLHI9ZS5zY2FsZSx1PWUudHJhbnNsYXRlLGk9ZS5jbGlwRXh0ZW50O3JldHVybiBlLnNjYWxlPWZ1bmN0aW9uKCl7dmFyIG49ci5hcHBseShlLGFyZ3VtZW50cyk7cmV0dXJuIG49PT1lP3Q/ZS5jbGlwRXh0ZW50KG51bGwpOmU6bn0sZS50cmFuc2xhdGU9ZnVuY3Rpb24oKXt2YXIgbj11LmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gbj09PWU/dD9lLmNsaXBFeHRlbnQobnVsbCk6ZTpufSxlLmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7dmFyIG89aS5hcHBseShlLGFyZ3VtZW50cyk7aWYobz09PWUpe2lmKHQ9bnVsbD09bil7dmFyIGE9cWEqcigpLGM9dSgpO2koW1tjWzBdLWEsY1sxXS1hXSxbY1swXSthLGNbMV0rYV1dKX19ZWxzZSB0JiYobz1udWxsKTtyZXR1cm4gb30sZS5jbGlwRXh0ZW50KG51bGwpfWZ1bmN0aW9uIEVyKG4sdCl7cmV0dXJuW01hdGgubG9nKE1hdGgudGFuKHFhLzQrdC8yKSksLW5dfWZ1bmN0aW9uIEFyKG4pe3JldHVybiBuWzBdfWZ1bmN0aW9uIE5yKG4pe3JldHVybiBuWzFdfWZ1bmN0aW9uIENyKG4pe2Zvcih2YXIgdD1uLmxlbmd0aCxlPVswLDFdLHI9Mix1PTI7dD51O3UrKyl7Zm9yKDtyPjEmJlEobltlW3ItMl1dLG5bZVtyLTFdXSxuW3VdKTw9MDspLS1yO2VbcisrXT11fXJldHVybiBlLnNsaWNlKDAscil9ZnVuY3Rpb24genIobix0KXtyZXR1cm4gblswXS10WzBdfHxuWzFdLXRbMV19ZnVuY3Rpb24gcXIobix0LGUpe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pPChlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIExyKG4sdCxlLHIpe3ZhciB1PW5bMF0saT1lWzBdLG89dFswXS11LGE9clswXS1pLGM9blsxXSxsPWVbMV0scz10WzFdLWMsZj1yWzFdLWwsaD0oYSooYy1sKS1mKih1LWkpKS8oZipvLWEqcyk7cmV0dXJuW3UraCpvLGMraCpzXX1mdW5jdGlvbiBUcihuKXt2YXIgdD1uWzBdLGU9bltuLmxlbmd0aC0xXTtyZXR1cm4hKHRbMF0tZVswXXx8dFsxXS1lWzFdKX1mdW5jdGlvbiBScigpe3R1KHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBEcihuKXt2YXIgdD1lbC5wb3AoKXx8bmV3IFJyO3JldHVybiB0LnNpdGU9bix0fWZ1bmN0aW9uIFByKG4pe1hyKG4pLFFjLnJlbW92ZShuKSxlbC5wdXNoKG4pLHR1KG4pfWZ1bmN0aW9uIFVyKG4pe3ZhciB0PW4uY2lyY2xlLGU9dC54LHI9dC5jeSx1PXt4OmUseTpyfSxpPW4uUCxvPW4uTixhPVtuXTtQcihuKTtmb3IodmFyIGM9aTtjLmNpcmNsZSYmZ2EoZS1jLmNpcmNsZS54KTxDYSYmZ2Eoci1jLmNpcmNsZS5jeSk8Q2E7KWk9Yy5QLGEudW5zaGlmdChjKSxQcihjKSxjPWk7YS51bnNoaWZ0KGMpLFhyKGMpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZnYShlLWwuY2lyY2xlLngpPENhJiZnYShyLWwuY2lyY2xlLmN5KTxDYTspbz1sLk4sYS5wdXNoKGwpLFByKGwpLGw9bzthLnB1c2gobCksWHIobCk7dmFyIHMsZj1hLmxlbmd0aDtmb3Iocz0xO2Y+czsrK3MpbD1hW3NdLGM9YVtzLTFdLEtyKGwuZWRnZSxjLnNpdGUsbC5zaXRlLHUpO2M9YVswXSxsPWFbZi0xXSxsLmVkZ2U9SnIoYy5zaXRlLGwuc2l0ZSxudWxsLHUpLFZyKGMpLFZyKGwpfWZ1bmN0aW9uIGpyKG4pe2Zvcih2YXIgdCxlLHIsdSxpPW4ueCxvPW4ueSxhPVFjLl87YTspaWYocj1GcihhLG8pLWkscj5DYSlhPWEuTDtlbHNle2lmKHU9aS1IcihhLG8pLCEodT5DYSkpe3I+LUNhPyh0PWEuUCxlPWEpOnU+LUNhPyh0PWEsZT1hLk4pOnQ9ZT1hO2JyZWFrfWlmKCFhLlIpe3Q9YTticmVha31hPWEuUn12YXIgYz1EcihuKTtpZihRYy5pbnNlcnQodCxjKSx0fHxlKXtpZih0PT09ZSlyZXR1cm4gWHIodCksZT1Ecih0LnNpdGUpLFFjLmluc2VydChjLGUpLGMuZWRnZT1lLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSksVnIodCksdm9pZCBWcihlKTtpZighZSlyZXR1cm4gdm9pZChjLmVkZ2U9SnIodC5zaXRlLGMuc2l0ZSkpO1hyKHQpLFhyKGUpO3ZhciBsPXQuc2l0ZSxzPWwueCxmPWwueSxoPW4ueC1zLGc9bi55LWYscD1lLnNpdGUsdj1wLngtcyxkPXAueS1mLG09MiooaCpkLWcqdikseT1oKmgrZypnLE09dip2K2QqZCx4PXt4OihkKnktZypNKS9tK3MseTooaCpNLXYqeSkvbStmfTtLcihlLmVkZ2UsbCxwLHgpLGMuZWRnZT1KcihsLG4sbnVsbCx4KSxlLmVkZ2U9SnIobixwLG51bGwseCksVnIodCksVnIoZSl9fWZ1bmN0aW9uIEZyKG4sdCl7dmFyIGU9bi5zaXRlLHI9ZS54LHU9ZS55LGk9dS10O2lmKCFpKXJldHVybiByO3ZhciBvPW4uUDtpZighbylyZXR1cm4tMS8wO2U9by5zaXRlO3ZhciBhPWUueCxjPWUueSxsPWMtdDtpZighbClyZXR1cm4gYTt2YXIgcz1hLXIsZj0xL2ktMS9sLGg9cy9sO3JldHVybiBmPygtaCtNYXRoLnNxcnQoaCpoLTIqZioocypzLygtMipsKS1jK2wvMit1LWkvMikpKS9mK3I6KHIrYSkvMn1mdW5jdGlvbiBIcihuLHQpe3ZhciBlPW4uTjtpZihlKXJldHVybiBGcihlLHQpO3ZhciByPW4uc2l0ZTtyZXR1cm4gci55PT09dD9yLng6MS8wfWZ1bmN0aW9uIE9yKG4pe3RoaXMuc2l0ZT1uLHRoaXMuZWRnZXM9W119ZnVuY3Rpb24gSXIobil7Zm9yKHZhciB0LGUscix1LGksbyxhLGMsbCxzLGY9blswXVswXSxoPW5bMV1bMF0sZz1uWzBdWzFdLHA9blsxXVsxXSx2PUtjLGQ9di5sZW5ndGg7ZC0tOylpZihpPXZbZF0saSYmaS5wcmVwYXJlKCkpZm9yKGE9aS5lZGdlcyxjPWEubGVuZ3RoLG89MDtjPm87KXM9YVtvXS5lbmQoKSxyPXMueCx1PXMueSxsPWFbKytvJWNdLnN0YXJ0KCksdD1sLngsZT1sLnksKGdhKHItdCk+Q2F8fGdhKHUtZSk+Q2EpJiYoYS5zcGxpY2UobywwLG5ldyBRcihHcihpLnNpdGUscyxnYShyLWYpPENhJiZwLXU+Q2E/e3g6Zix5OmdhKHQtZik8Q2E/ZTpwfTpnYSh1LXApPENhJiZoLXI+Q2E/e3g6Z2EoZS1wKTxDYT90OmgseTpwfTpnYShyLWgpPENhJiZ1LWc+Q2E/e3g6aCx5OmdhKHQtaCk8Q2E/ZTpnfTpnYSh1LWcpPENhJiZyLWY+Q2E/e3g6Z2EoZS1nKTxDYT90OmYseTpnfTpudWxsKSxpLnNpdGUsbnVsbCkpLCsrYyl9ZnVuY3Rpb24gWXIobix0KXtyZXR1cm4gdC5hbmdsZS1uLmFuZ2xlfWZ1bmN0aW9uIFpyKCl7dHUodGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFZyKG4pe3ZhciB0PW4uUCxlPW4uTjtpZih0JiZlKXt2YXIgcj10LnNpdGUsdT1uLnNpdGUsaT1lLnNpdGU7aWYociE9PWkpe3ZhciBvPXUueCxhPXUueSxjPXIueC1vLGw9ci55LWEscz1pLngtbyxmPWkueS1hLGg9MiooYypmLWwqcyk7aWYoIShoPj0temEpKXt2YXIgZz1jKmMrbCpsLHA9cypzK2YqZix2PShmKmctbCpwKS9oLGQ9KGMqcC1zKmcpL2gsZj1kK2EsbT1ybC5wb3AoKXx8bmV3IFpyO20uYXJjPW4sbS5zaXRlPXUsbS54PXYrbyxtLnk9ZitNYXRoLnNxcnQodip2K2QqZCksbS5jeT1mLG4uY2lyY2xlPW07Zm9yKHZhciB5PW51bGwsTT10bC5fO007KWlmKG0ueTxNLnl8fG0ueT09PU0ueSYmbS54PD1NLngpe2lmKCFNLkwpe3k9TS5QO2JyZWFrfU09TS5MfWVsc2V7aWYoIU0uUil7eT1NO2JyZWFrfU09TS5SfXRsLmluc2VydCh5LG0pLHl8fChubD1tKX19fX1mdW5jdGlvbiBYcihuKXt2YXIgdD1uLmNpcmNsZTt0JiYodC5QfHwobmw9dC5OKSx0bC5yZW1vdmUodCkscmwucHVzaCh0KSx0dSh0KSxuLmNpcmNsZT1udWxsKX1mdW5jdGlvbiAkcihuKXtmb3IodmFyIHQsZT1HYyxyPU9lKG5bMF1bMF0sblswXVsxXSxuWzFdWzBdLG5bMV1bMV0pLHU9ZS5sZW5ndGg7dS0tOyl0PWVbdV0sKCFCcih0LG4pfHwhcih0KXx8Z2EodC5hLngtdC5iLngpPENhJiZnYSh0LmEueS10LmIueSk8Q2EpJiYodC5hPXQuYj1udWxsLGUuc3BsaWNlKHUsMSkpfWZ1bmN0aW9uIEJyKG4sdCl7dmFyIGU9bi5iO2lmKGUpcmV0dXJuITA7dmFyIHIsdSxpPW4uYSxvPXRbMF1bMF0sYT10WzFdWzBdLGM9dFswXVsxXSxsPXRbMV1bMV0scz1uLmwsZj1uLnIsaD1zLngsZz1zLnkscD1mLngsdj1mLnksZD0oaCtwKS8yLG09KGcrdikvMjtpZih2PT09Zyl7aWYobz5kfHxkPj1hKXJldHVybjtpZihoPnApe2lmKGkpe2lmKGkueT49bClyZXR1cm59ZWxzZSBpPXt4OmQseTpjfTtlPXt4OmQseTpsfX1lbHNle2lmKGkpe2lmKGkueTxjKXJldHVybn1lbHNlIGk9e3g6ZCx5Omx9O2U9e3g6ZCx5OmN9fX1lbHNlIGlmKHI9KGgtcCkvKHYtZyksdT1tLXIqZCwtMT5yfHxyPjEpaWYoaD5wKXtpZihpKXtpZihpLnk+PWwpcmV0dXJufWVsc2UgaT17eDooYy11KS9yLHk6Y307ZT17eDoobC11KS9yLHk6bH19ZWxzZXtpZihpKXtpZihpLnk8YylyZXR1cm59ZWxzZSBpPXt4OihsLXUpL3IseTpsfTtlPXt4OihjLXUpL3IseTpjfX1lbHNlIGlmKHY+Zyl7aWYoaSl7aWYoaS54Pj1hKXJldHVybn1lbHNlIGk9e3g6byx5OnIqbyt1fTtlPXt4OmEseTpyKmErdX19ZWxzZXtpZihpKXtpZihpLng8bylyZXR1cm59ZWxzZSBpPXt4OmEseTpyKmErdX07ZT17eDpvLHk6cipvK3V9fXJldHVybiBuLmE9aSxuLmI9ZSwhMH1mdW5jdGlvbiBXcihuLHQpe3RoaXMubD1uLHRoaXMucj10LHRoaXMuYT10aGlzLmI9bnVsbH1mdW5jdGlvbiBKcihuLHQsZSxyKXt2YXIgdT1uZXcgV3Iobix0KTtyZXR1cm4gR2MucHVzaCh1KSxlJiZLcih1LG4sdCxlKSxyJiZLcih1LHQsbixyKSxLY1tuLmldLmVkZ2VzLnB1c2gobmV3IFFyKHUsbix0KSksS2NbdC5pXS5lZGdlcy5wdXNoKG5ldyBRcih1LHQsbikpLHV9ZnVuY3Rpb24gR3Iobix0LGUpe3ZhciByPW5ldyBXcihuLG51bGwpO3JldHVybiByLmE9dCxyLmI9ZSxHYy5wdXNoKHIpLHJ9ZnVuY3Rpb24gS3Iobix0LGUscil7bi5hfHxuLmI/bi5sPT09ZT9uLmI9cjpuLmE9cjoobi5hPXIsbi5sPXQsbi5yPWUpfWZ1bmN0aW9uIFFyKG4sdCxlKXt2YXIgcj1uLmEsdT1uLmI7dGhpcy5lZGdlPW4sdGhpcy5zaXRlPXQsdGhpcy5hbmdsZT1lP01hdGguYXRhbjIoZS55LXQueSxlLngtdC54KTpuLmw9PT10P01hdGguYXRhbjIodS54LXIueCxyLnktdS55KTpNYXRoLmF0YW4yKHIueC11LngsdS55LXIueSl9ZnVuY3Rpb24gbnUoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiB0dShuKXtuLlU9bi5DPW4uTD1uLlI9bi5QPW4uTj1udWxsfWZ1bmN0aW9uIGV1KG4sdCl7dmFyIGU9dCxyPXQuUix1PWUuVTt1P3UuTD09PWU/dS5MPXI6dS5SPXI6bi5fPXIsci5VPXUsZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBydShuLHQpe3ZhciBlPXQscj10LkwsdT1lLlU7dT91Lkw9PT1lP3UuTD1yOnUuUj1yOm4uXz1yLHIuVT11LGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gdXUobil7Zm9yKDtuLkw7KW49bi5MO3JldHVybiBufWZ1bmN0aW9uIGl1KG4sdCl7dmFyIGUscix1LGk9bi5zb3J0KG91KS5wb3AoKTtmb3IoR2M9W10sS2M9bmV3IEFycmF5KG4ubGVuZ3RoKSxRYz1uZXcgbnUsdGw9bmV3IG51OzspaWYodT1ubCxpJiYoIXV8fGkueTx1Lnl8fGkueT09PXUueSYmaS54PHUueCkpKGkueCE9PWV8fGkueSE9PXIpJiYoS2NbaS5pXT1uZXcgT3IoaSksanIoaSksZT1pLngscj1pLnkpLGk9bi5wb3AoKTtlbHNle2lmKCF1KWJyZWFrO1VyKHUuYXJjKX10JiYoJHIodCksSXIodCkpO3ZhciBvPXtjZWxsczpLYyxlZGdlczpHY307cmV0dXJuIFFjPXRsPUdjPUtjPW51bGwsb31mdW5jdGlvbiBvdShuLHQpe3JldHVybiB0Lnktbi55fHx0Lngtbi54fWZ1bmN0aW9uIGF1KG4sdCxlKXtyZXR1cm4obi54LWUueCkqKHQueS1uLnkpLShuLngtdC54KSooZS55LW4ueSl9ZnVuY3Rpb24gY3Uobil7cmV0dXJuIG4ueH1mdW5jdGlvbiBsdShuKXtyZXR1cm4gbi55fWZ1bmN0aW9uIHN1KCl7cmV0dXJue2xlYWY6ITAsbm9kZXM6W10scG9pbnQ6bnVsbCx4Om51bGwseTpudWxsfX1mdW5jdGlvbiBmdShuLHQsZSxyLHUsaSl7aWYoIW4odCxlLHIsdSxpKSl7dmFyIG89LjUqKGUrdSksYT0uNSoocitpKSxjPXQubm9kZXM7Y1swXSYmZnUobixjWzBdLGUscixvLGEpLGNbMV0mJmZ1KG4sY1sxXSxvLHIsdSxhKSxjWzJdJiZmdShuLGNbMl0sZSxhLG8saSksY1szXSYmZnUobixjWzNdLG8sYSx1LGkpfX1mdW5jdGlvbiBodShuLHQsZSxyLHUsaSxvKXt2YXIgYSxjPTEvMDtyZXR1cm4gZnVuY3Rpb24gbChuLHMsZixoLGcpe2lmKCEocz5pfHxmPm98fHI+aHx8dT5nKSl7aWYocD1uLnBvaW50KXt2YXIgcCx2PXQtbi54LGQ9ZS1uLnksbT12KnYrZCpkO2lmKGM+bSl7dmFyIHk9TWF0aC5zcXJ0KGM9bSk7cj10LXksdT1lLXksaT10K3ksbz1lK3ksYT1wfX1mb3IodmFyIE09bi5ub2Rlcyx4PS41KihzK2gpLGI9LjUqKGYrZyksXz10Pj14LHc9ZT49YixTPXc8PDF8XyxrPVMrNDtrPlM7KytTKWlmKG49TVszJlNdKXN3aXRjaCgzJlMpe2Nhc2UgMDpsKG4scyxmLHgsYik7YnJlYWs7Y2FzZSAxOmwobix4LGYsaCxiKTticmVhaztjYXNlIDI6bChuLHMsYix4LGcpO2JyZWFrO2Nhc2UgMzpsKG4seCxiLGgsZyl9fX0obixyLHUsaSxvKSxhfWZ1bmN0aW9uIGd1KG4sdCl7bj10YS5yZ2IobiksdD10YS5yZ2IodCk7dmFyIGU9bi5yLHI9bi5nLHU9bi5iLGk9dC5yLWUsbz10LmctcixhPXQuYi11O3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4iIyIreHQoTWF0aC5yb3VuZChlK2kqbikpK3h0KE1hdGgucm91bmQocitvKm4pKSt4dChNYXRoLnJvdW5kKHUrYSpuKSl9fWZ1bmN0aW9uIHB1KG4sdCl7dmFyIGUscj17fSx1PXt9O2ZvcihlIGluIG4pZSBpbiB0P3JbZV09bXUobltlXSx0W2VdKTp1W2VdPW5bZV07Zm9yKGUgaW4gdCllIGluIG58fCh1W2VdPXRbZV0pO3JldHVybiBmdW5jdGlvbihuKXtmb3IoZSBpbiByKXVbZV09cltlXShuKTtyZXR1cm4gdX19ZnVuY3Rpb24gdnUobix0KXtyZXR1cm4gbj0rbix0PSt0LGZ1bmN0aW9uKGUpe3JldHVybiBuKigxLWUpK3QqZX19ZnVuY3Rpb24gZHUobix0KXt2YXIgZSxyLHUsaT1pbC5sYXN0SW5kZXg9b2wubGFzdEluZGV4PTAsbz0tMSxhPVtdLGM9W107Zm9yKG4rPSIiLHQrPSIiOyhlPWlsLmV4ZWMobikpJiYocj1vbC5leGVjKHQpKTspKHU9ci5pbmRleCk+aSYmKHU9dC5zbGljZShpLHUpLGFbb10/YVtvXSs9dTphWysrb109dSksKGU9ZVswXSk9PT0ocj1yWzBdKT9hW29dP2Fbb10rPXI6YVsrK29dPXI6KGFbKytvXT1udWxsLGMucHVzaCh7aTpvLHg6dnUoZSxyKX0pKSxpPW9sLmxhc3RJbmRleDtyZXR1cm4gaTx0Lmxlbmd0aCYmKHU9dC5zbGljZShpKSxhW29dP2Fbb10rPXU6YVsrK29dPXUpLGEubGVuZ3RoPDI/Y1swXT8odD1jWzBdLngsZnVuY3Rpb24obil7cmV0dXJuIHQobikrIiJ9KTpmdW5jdGlvbigpe3JldHVybiB0fToodD1jLmxlbmd0aCxmdW5jdGlvbihuKXtmb3IodmFyIGUscj0wO3Q+cjsrK3IpYVsoZT1jW3JdKS5pXT1lLngobik7cmV0dXJuIGEuam9pbigiIil9KX1mdW5jdGlvbiBtdShuLHQpe2Zvcih2YXIgZSxyPXRhLmludGVycG9sYXRvcnMubGVuZ3RoOy0tcj49MCYmIShlPXRhLmludGVycG9sYXRvcnNbcl0obix0KSk7KTtyZXR1cm4gZX1mdW5jdGlvbiB5dShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPW4ubGVuZ3RoLG89dC5sZW5ndGgsYT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKGU9MDthPmU7KytlKXIucHVzaChtdShuW2VdLHRbZV0pKTtmb3IoO2k+ZTsrK2UpdVtlXT1uW2VdO2Zvcig7bz5lOysrZSl1W2VdPXRbZV07cmV0dXJuIGZ1bmN0aW9uKG4pe2ZvcihlPTA7YT5lOysrZSl1W2VdPXJbZV0obik7cmV0dXJuIHV9fWZ1bmN0aW9uIE11KG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD49dD8wOnQ+PTE/MTpuKHQpfX1mdW5jdGlvbiB4dShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIDEtbigxLXQpfX1mdW5jdGlvbiBidShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuLjUqKC41PnQ/bigyKnQpOjItbigyLTIqdCkpfX1mdW5jdGlvbiBfdShuKXtyZXR1cm4gbipufWZ1bmN0aW9uIHd1KG4pe3JldHVybiBuKm4qbn1mdW5jdGlvbiBTdShuKXtpZigwPj1uKXJldHVybiAwO2lmKG4+PTEpcmV0dXJuIDE7dmFyIHQ9bipuLGU9dCpuO3JldHVybiA0KiguNT5uP2U6Myoobi10KStlLS43NSl9ZnVuY3Rpb24ga3Uobil7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBFdShuKXtyZXR1cm4gMS1NYXRoLmNvcyhuKlJhKX1mdW5jdGlvbiBBdShuKXtyZXR1cm4gTWF0aC5wb3coMiwxMCoobi0xKSl9ZnVuY3Rpb24gTnUobil7cmV0dXJuIDEtTWF0aC5zcXJ0KDEtbipuKX1mdW5jdGlvbiBDdShuLHQpe3ZhciBlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDImJih0PS40NSksYXJndW1lbnRzLmxlbmd0aD9lPXQvTGEqTWF0aC5hc2luKDEvbik6KG49MSxlPXQvNCksZnVuY3Rpb24ocil7cmV0dXJuIDErbipNYXRoLnBvdygyLC0xMCpyKSpNYXRoLnNpbigoci1lKSpMYS90KX19ZnVuY3Rpb24genUobil7cmV0dXJuIG58fChuPTEuNzAxNTgpLGZ1bmN0aW9uKHQpe3JldHVybiB0KnQqKChuKzEpKnQtbil9fWZ1bmN0aW9uIHF1KG4pe3JldHVybiAxLzIuNzU+bj83LjU2MjUqbipuOjIvMi43NT5uPzcuNTYyNSoobi09MS41LzIuNzUpKm4rLjc1OjIuNS8yLjc1Pm4/Ny41NjI1KihuLT0yLjI1LzIuNzUpKm4rLjkzNzU6Ny41NjI1KihuLT0yLjYyNS8yLjc1KSpuKy45ODQzNzV9ZnVuY3Rpb24gTHUobix0KXtuPXRhLmhjbChuKSx0PXRhLmhjbCh0KTt2YXIgZT1uLmgscj1uLmMsdT1uLmwsaT10LmgtZSxvPXQuYy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5jOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIHN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gVHUobix0KXtuPXRhLmhzbChuKSx0PXRhLmhzbCh0KTt2YXIgZT1uLmgscj1uLnMsdT1uLmwsaT10LmgtZSxvPXQucy1yLGE9dC5sLXU7cmV0dXJuIGlzTmFOKG8pJiYobz0wLHI9aXNOYU4ocik/dC5zOnIpLGlzTmFOKGkpPyhpPTAsZT1pc05hTihlKT90Lmg6ZSk6aT4xODA/aS09MzYwOi0xODA+aSYmKGkrPTM2MCksZnVuY3Rpb24obil7cmV0dXJuIGN0KGUraSpuLHIrbypuLHUrYSpuKSsiIn19ZnVuY3Rpb24gUnUobix0KXtuPXRhLmxhYihuKSx0PXRhLmxhYih0KTt2YXIgZT1uLmwscj1uLmEsdT1uLmIsaT10LmwtZSxvPXQuYS1yLGE9dC5iLXU7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBodChlK2kqbixyK28qbix1K2EqbikrIiJ9fWZ1bmN0aW9uIER1KG4sdCl7cmV0dXJuIHQtPW4sZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQobit0KmUpfX1mdW5jdGlvbiBQdShuKXt2YXIgdD1bbi5hLG4uYl0sZT1bbi5jLG4uZF0scj1qdSh0KSx1PVV1KHQsZSksaT1qdShGdShlLHQsLXUpKXx8MDt0WzBdKmVbMV08ZVswXSp0WzFdJiYodFswXSo9LTEsdFsxXSo9LTEscio9LTEsdSo9LTEpLHRoaXMucm90YXRlPShyP01hdGguYXRhbjIodFsxXSx0WzBdKTpNYXRoLmF0YW4yKC1lWzBdLGVbMV0pKSpQYSx0aGlzLnRyYW5zbGF0ZT1bbi5lLG4uZl0sdGhpcy5zY2FsZT1bcixpXSx0aGlzLnNrZXc9aT9NYXRoLmF0YW4yKHUsaSkqUGE6MH1mdW5jdGlvbiBVdShuLHQpe3JldHVybiBuWzBdKnRbMF0rblsxXSp0WzFdfWZ1bmN0aW9uIGp1KG4pe3ZhciB0PU1hdGguc3FydChVdShuLG4pKTtyZXR1cm4gdCYmKG5bMF0vPXQsblsxXS89dCksdH1mdW5jdGlvbiBGdShuLHQsZSl7cmV0dXJuIG5bMF0rPWUqdFswXSxuWzFdKz1lKnRbMV0sbn1mdW5jdGlvbiBIdShuLHQpe3ZhciBlLHI9W10sdT1bXSxpPXRhLnRyYW5zZm9ybShuKSxvPXRhLnRyYW5zZm9ybSh0KSxhPWkudHJhbnNsYXRlLGM9by50cmFuc2xhdGUsbD1pLnJvdGF0ZSxzPW8ucm90YXRlLGY9aS5za2V3LGg9by5za2V3LGc9aS5zY2FsZSxwPW8uc2NhbGU7cmV0dXJuIGFbMF0hPWNbMF18fGFbMV0hPWNbMV0/KHIucHVzaCgidHJhbnNsYXRlKCIsbnVsbCwiLCIsbnVsbCwiKSIpLHUucHVzaCh7aToxLHg6dnUoYVswXSxjWzBdKX0se2k6Myx4OnZ1KGFbMV0sY1sxXSl9KSk6ci5wdXNoKGNbMF18fGNbMV0/InRyYW5zbGF0ZSgiK2MrIikiOiIiKSxsIT1zPyhsLXM+MTgwP3MrPTM2MDpzLWw+MTgwJiYobCs9MzYwKSx1LnB1c2goe2k6ci5wdXNoKHIucG9wKCkrInJvdGF0ZSgiLG51bGwsIikiKS0yLHg6dnUobCxzKX0pKTpzJiZyLnB1c2goci5wb3AoKSsicm90YXRlKCIrcysiKSIpLGYhPWg/dS5wdXNoKHtpOnIucHVzaChyLnBvcCgpKyJza2V3WCgiLG51bGwsIikiKS0yLHg6dnUoZixoKX0pOmgmJnIucHVzaChyLnBvcCgpKyJza2V3WCgiK2grIikiKSxnWzBdIT1wWzBdfHxnWzFdIT1wWzFdPyhlPXIucHVzaChyLnBvcCgpKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKSx1LnB1c2goe2k6ZS00LHg6dnUoZ1swXSxwWzBdKX0se2k6ZS0yLHg6dnUoZ1sxXSxwWzFdKX0pKTooMSE9cFswXXx8MSE9cFsxXSkmJnIucHVzaChyLnBvcCgpKyJzY2FsZSgiK3ArIikiKSxlPXUubGVuZ3RoLGZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxpPS0xOysraTxlOylyWyh0PXVbaV0pLmldPXQueChuKTtyZXR1cm4gci5qb2luKCIiKX19ZnVuY3Rpb24gT3Uobix0KXtyZXR1cm4gdD0odC09bj0rbil8fDEvdCxmdW5jdGlvbihlKXtyZXR1cm4oZS1uKS90fX1mdW5jdGlvbiBJdShuLHQpe3JldHVybiB0PSh0LT1uPStuKXx8MS90LGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDEsKGUtbikvdCkpfX1mdW5jdGlvbiBZdShuKXtmb3IodmFyIHQ9bi5zb3VyY2UsZT1uLnRhcmdldCxyPVZ1KHQsZSksdT1bdF07dCE9PXI7KXQ9dC5wYXJlbnQsdS5wdXNoKHQpO2Zvcih2YXIgaT11Lmxlbmd0aDtlIT09cjspdS5zcGxpY2UoaSwwLGUpLGU9ZS5wYXJlbnQ7cmV0dXJuIHV9ZnVuY3Rpb24gWnUobil7Zm9yKHZhciB0PVtdLGU9bi5wYXJlbnQ7bnVsbCE9ZTspdC5wdXNoKG4pLG49ZSxlPWUucGFyZW50O3JldHVybiB0LnB1c2gobiksdH1mdW5jdGlvbiBWdShuLHQpe2lmKG49PT10KXJldHVybiBuO2Zvcih2YXIgZT1adShuKSxyPVp1KHQpLHU9ZS5wb3AoKSxpPXIucG9wKCksbz1udWxsO3U9PT1pOylvPXUsdT1lLnBvcCgpLGk9ci5wb3AoKTtyZXR1cm4gb31mdW5jdGlvbiBYdShuKXtuLmZpeGVkfD0yfWZ1bmN0aW9uICR1KG4pe24uZml4ZWQmPS03fWZ1bmN0aW9uIEJ1KG4pe24uZml4ZWR8PTQsbi5weD1uLngsbi5weT1uLnl9ZnVuY3Rpb24gV3Uobil7bi5maXhlZCY9LTV9ZnVuY3Rpb24gSnUobix0LGUpe3ZhciByPTAsdT0wO2lmKG4uY2hhcmdlPTAsIW4ubGVhZilmb3IodmFyIGksbz1uLm5vZGVzLGE9by5sZW5ndGgsYz0tMTsrK2M8YTspaT1vW2NdLG51bGwhPWkmJihKdShpLHQsZSksbi5jaGFyZ2UrPWkuY2hhcmdlLHIrPWkuY2hhcmdlKmkuY3gsdSs9aS5jaGFyZ2UqaS5jeSk7aWYobi5wb2ludCl7bi5sZWFmfHwobi5wb2ludC54Kz1NYXRoLnJhbmRvbSgpLS41LG4ucG9pbnQueSs9TWF0aC5yYW5kb20oKS0uNSk7dmFyIGw9dCplW24ucG9pbnQuaW5kZXhdO24uY2hhcmdlKz1uLnBvaW50Q2hhcmdlPWwscis9bCpuLnBvaW50LngsdSs9bCpuLnBvaW50Lnl9bi5jeD1yL24uY2hhcmdlLG4uY3k9dS9uLmNoYXJnZX1mdW5jdGlvbiBHdShuLHQpe3JldHVybiB0YS5yZWJpbmQobix0LCJzb3J0IiwiY2hpbGRyZW4iLCJ2YWx1ZSIpLG4ubm9kZXM9bixuLmxpbmtzPXJpLG59ZnVuY3Rpb24gS3Uobix0KXtmb3IodmFyIGU9W25dO251bGwhPShuPWUucG9wKCkpOylpZih0KG4pLCh1PW4uY2hpbGRyZW4pJiYocj11Lmxlbmd0aCkpZm9yKHZhciByLHU7LS1yPj0wOyllLnB1c2godVtyXSl9ZnVuY3Rpb24gUXUobix0KXtmb3IodmFyIGU9W25dLHI9W107bnVsbCE9KG49ZS5wb3AoKSk7KWlmKHIucHVzaChuKSwoaT1uLmNoaWxkcmVuKSYmKHU9aS5sZW5ndGgpKWZvcih2YXIgdSxpLG89LTE7KytvPHU7KWUucHVzaChpW29dKTtmb3IoO251bGwhPShuPXIucG9wKCkpOyl0KG4pfWZ1bmN0aW9uIG5pKG4pe3JldHVybiBuLmNoaWxkcmVufWZ1bmN0aW9uIHRpKG4pe3JldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGVpKG4sdCl7cmV0dXJuIHQudmFsdWUtbi52YWx1ZX1mdW5jdGlvbiByaShuKXtyZXR1cm4gdGEubWVyZ2Uobi5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4uY2hpbGRyZW58fFtdKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuLHRhcmdldDp0fX0pfSkpfWZ1bmN0aW9uIHVpKG4pe3JldHVybiBuLnh9ZnVuY3Rpb24gaWkobil7cmV0dXJuIG4ueX1mdW5jdGlvbiBvaShuLHQsZSl7bi55MD10LG4ueT1lfWZ1bmN0aW9uIGFpKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCl9ZnVuY3Rpb24gY2kobil7Zm9yKHZhciB0PS0xLGU9blswXS5sZW5ndGgscj1bXTsrK3Q8ZTspclt0XT0wO3JldHVybiByfWZ1bmN0aW9uIGxpKG4pe2Zvcih2YXIgdCxlPTEscj0wLHU9blswXVsxXSxpPW4ubGVuZ3RoO2k+ZTsrK2UpKHQ9bltlXVsxXSk+dSYmKHI9ZSx1PXQpO3JldHVybiByfWZ1bmN0aW9uIHNpKG4pe3JldHVybiBuLnJlZHVjZShmaSwwKX1mdW5jdGlvbiBmaShuLHQpe3JldHVybiBuK3RbMV19ZnVuY3Rpb24gaGkobix0KXtyZXR1cm4gZ2kobixNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKzEpKX1mdW5jdGlvbiBnaShuLHQpe2Zvcih2YXIgZT0tMSxyPStuWzBdLHU9KG5bMV0tcikvdCxpPVtdOysrZTw9dDspaVtlXT11KmUrcjtyZXR1cm4gaX1mdW5jdGlvbiBwaShuKXtyZXR1cm5bdGEubWluKG4pLHRhLm1heChuKV19ZnVuY3Rpb24gdmkobix0KXtyZXR1cm4gbi52YWx1ZS10LnZhbHVlfWZ1bmN0aW9uIGRpKG4sdCl7dmFyIGU9bi5fcGFja19uZXh0O24uX3BhY2tfbmV4dD10LHQuX3BhY2tfcHJldj1uLHQuX3BhY2tfbmV4dD1lLGUuX3BhY2tfcHJldj10fWZ1bmN0aW9uIG1pKG4sdCl7bi5fcGFja19uZXh0PXQsdC5fcGFja19wcmV2PW59ZnVuY3Rpb24geWkobix0KXt2YXIgZT10Lngtbi54LHI9dC55LW4ueSx1PW4ucit0LnI7cmV0dXJuLjk5OSp1KnU+ZSplK3Iqcn1mdW5jdGlvbiBNaShuKXtmdW5jdGlvbiB0KG4pe3M9TWF0aC5taW4obi54LW4ucixzKSxmPU1hdGgubWF4KG4ueCtuLnIsZiksaD1NYXRoLm1pbihuLnktbi5yLGgpLGc9TWF0aC5tYXgobi55K24ucixnKX1pZigoZT1uLmNoaWxkcmVuKSYmKGw9ZS5sZW5ndGgpKXt2YXIgZSxyLHUsaSxvLGEsYyxsLHM9MS8wLGY9LTEvMCxoPTEvMCxnPS0xLzA7aWYoZS5mb3JFYWNoKHhpKSxyPWVbMF0sci54PS1yLnIsci55PTAsdChyKSxsPjEmJih1PWVbMV0sdS54PXUucix1Lnk9MCx0KHUpLGw+MikpZm9yKGk9ZVsyXSx3aShyLHUsaSksdChpKSxkaShyLGkpLHIuX3BhY2tfcHJldj1pLGRpKGksdSksdT1yLl9wYWNrX25leHQsbz0zO2w+bztvKyspe3dpKHIsdSxpPWVbb10pO3ZhciBwPTAsdj0xLGQ9MTtmb3IoYT11Ll9wYWNrX25leHQ7YSE9PXU7YT1hLl9wYWNrX25leHQsdisrKWlmKHlpKGEsaSkpe3A9MTticmVha31pZigxPT1wKWZvcihjPXIuX3BhY2tfcHJldjtjIT09YS5fcGFja19wcmV2JiYheWkoYyxpKTtjPWMuX3BhY2tfcHJldixkKyspO3A/KGQ+dnx8dj09ZCYmdS5yPHIucj9taShyLHU9YSk6bWkocj1jLHUpLG8tLSk6KGRpKHIsaSksdT1pLHQoaSkpfXZhciBtPShzK2YpLzIseT0oaCtnKS8yLE09MDtmb3Iobz0wO2w+bztvKyspaT1lW29dLGkueC09bSxpLnktPXksTT1NYXRoLm1heChNLGkucitNYXRoLnNxcnQoaS54KmkueCtpLnkqaS55KSk7bi5yPU0sZS5mb3JFYWNoKGJpKX19ZnVuY3Rpb24geGkobil7bi5fcGFja19uZXh0PW4uX3BhY2tfcHJldj1ufWZ1bmN0aW9uIGJpKG4pe2RlbGV0ZSBuLl9wYWNrX25leHQsZGVsZXRlIG4uX3BhY2tfcHJldn1mdW5jdGlvbiBfaShuLHQsZSxyKXt2YXIgdT1uLmNoaWxkcmVuO2lmKG4ueD10Kz1yKm4ueCxuLnk9ZSs9cipuLnksbi5yKj1yLHUpZm9yKHZhciBpPS0xLG89dS5sZW5ndGg7KytpPG87KV9pKHVbaV0sdCxlLHIpfWZ1bmN0aW9uIHdpKG4sdCxlKXt2YXIgcj1uLnIrZS5yLHU9dC54LW4ueCxpPXQueS1uLnk7aWYociYmKHV8fGkpKXt2YXIgbz10LnIrZS5yLGE9dSp1K2kqaTtvKj1vLHIqPXI7dmFyIGM9LjUrKHItbykvKDIqYSksbD1NYXRoLnNxcnQoTWF0aC5tYXgoMCwyKm8qKHIrYSktKHItPWEpKnItbypvKSkvKDIqYSk7ZS54PW4ueCtjKnUrbCppLGUueT1uLnkrYyppLWwqdX1lbHNlIGUueD1uLngrcixlLnk9bi55fWZ1bmN0aW9uIFNpKG4sdCl7cmV0dXJuIG4ucGFyZW50PT10LnBhcmVudD8xOjJ9ZnVuY3Rpb24ga2kobil7dmFyIHQ9bi5jaGlsZHJlbjtyZXR1cm4gdC5sZW5ndGg/dFswXTpuLnR9ZnVuY3Rpb24gRWkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybih0PWUubGVuZ3RoKT9lW3QtMV06bi50fWZ1bmN0aW9uIEFpKG4sdCxlKXt2YXIgcj1lLyh0Lmktbi5pKTt0LmMtPXIsdC5zKz1lLG4uYys9cix0LnorPWUsdC5tKz1lfWZ1bmN0aW9uIE5pKG4pe2Zvcih2YXIgdCxlPTAscj0wLHU9bi5jaGlsZHJlbixpPXUubGVuZ3RoOy0taT49MDspdD11W2ldLHQueis9ZSx0Lm0rPWUsZSs9dC5zKyhyKz10LmMpfWZ1bmN0aW9uIENpKG4sdCxlKXtyZXR1cm4gbi5hLnBhcmVudD09PXQucGFyZW50P24uYTplfWZ1bmN0aW9uIHppKG4pe3JldHVybiAxK3RhLm1heChuLGZ1bmN0aW9uKG4pe3JldHVybiBuLnl9KX1mdW5jdGlvbiBxaShuKXtyZXR1cm4gbi5yZWR1Y2UoZnVuY3Rpb24obix0KXtyZXR1cm4gbit0Lnh9LDApL24ubGVuZ3RofWZ1bmN0aW9uIExpKG4pe3ZhciB0PW4uY2hpbGRyZW47cmV0dXJuIHQmJnQubGVuZ3RoP0xpKHRbMF0pOm59ZnVuY3Rpb24gVGkobil7dmFyIHQsZT1uLmNoaWxkcmVuO3JldHVybiBlJiYodD1lLmxlbmd0aCk/VGkoZVt0LTFdKTpufWZ1bmN0aW9uIFJpKG4pe3JldHVybnt4Om4ueCx5Om4ueSxkeDpuLmR4LGR5Om4uZHl9fWZ1bmN0aW9uIERpKG4sdCl7dmFyIGU9bi54K3RbM10scj1uLnkrdFswXSx1PW4uZHgtdFsxXS10WzNdLGk9bi5keS10WzBdLXRbMl07cmV0dXJuIDA+dSYmKGUrPXUvMix1PTApLDA+aSYmKHIrPWkvMixpPTApLHt4OmUseTpyLGR4OnUsZHk6aX19ZnVuY3Rpb24gUGkobil7dmFyIHQ9blswXSxlPW5bbi5sZW5ndGgtMV07cmV0dXJuIGU+dD9bdCxlXTpbZSx0XX1mdW5jdGlvbiBVaShuKXtyZXR1cm4gbi5yYW5nZUV4dGVudD9uLnJhbmdlRXh0ZW50KCk6UGkobi5yYW5nZSgpKX1mdW5jdGlvbiBqaShuLHQsZSxyKXt2YXIgdT1lKG5bMF0sblsxXSksaT1yKHRbMF0sdFsxXSk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBpKHUobikpfX1mdW5jdGlvbiBGaShuLHQpe3ZhciBlLHI9MCx1PW4ubGVuZ3RoLTEsaT1uW3JdLG89blt1XTtyZXR1cm4gaT5vJiYoZT1yLHI9dSx1PWUsZT1pLGk9byxvPWUpLG5bcl09dC5mbG9vcihpKSxuW3VdPXQuY2VpbChvKSxufWZ1bmN0aW9uIEhpKG4pe3JldHVybiBuP3tmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5mbG9vcih0L24pKm59LGNlaWw6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguY2VpbCh0L24pKm59fTptbH1mdW5jdGlvbiBPaShuLHQsZSxyKXt2YXIgdT1bXSxpPVtdLG89MCxhPU1hdGgubWluKG4ubGVuZ3RoLHQubGVuZ3RoKS0xO2ZvcihuW2FdPG5bMF0mJihuPW4uc2xpY2UoKS5yZXZlcnNlKCksdD10LnNsaWNlKCkucmV2ZXJzZSgpKTsrK288PWE7KXUucHVzaChlKG5bby0xXSxuW29dKSksaS5wdXNoKHIodFtvLTFdLHRbb10pKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9dGEuYmlzZWN0KG4sdCwxLGEpLTE7cmV0dXJuIGlbZV0odVtlXSh0KSl9fWZ1bmN0aW9uIElpKG4sdCxlLHIpe2Z1bmN0aW9uIHUoKXt2YXIgdT1NYXRoLm1pbihuLmxlbmd0aCx0Lmxlbmd0aCk+Mj9PaTpqaSxjPXI/SXU6T3U7cmV0dXJuIG89dShuLHQsYyxlKSxhPXUodCxuLGMsbXUpLGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbyhuKX12YXIgbyxhO3JldHVybiBpLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYShuKX0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dC5tYXAoTnVtYmVyKSx1KCkpOm59LGkucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bix1KCkpOnR9LGkucmFuZ2VSb3VuZD1mdW5jdGlvbihuKXtyZXR1cm4gaS5yYW5nZShuKS5pbnRlcnBvbGF0ZShEdSl9LGkuY2xhbXA9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix1KCkpOnJ9LGkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix1KCkpOmV9LGkudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LGkubmljZT1mdW5jdGlvbih0KXtyZXR1cm4gWmkobix0KSx1KCl9LGkuY29weT1mdW5jdGlvbigpe3JldHVybiBJaShuLHQsZSxyKX0sdSgpfWZ1bmN0aW9uIFlpKG4sdCl7cmV0dXJuIHRhLnJlYmluZChuLHQsInJhbmdlIiwicmFuZ2VSb3VuZCIsImludGVycG9sYXRlIiwiY2xhbXAiKX1mdW5jdGlvbiBaaShuLHQpe3JldHVybiBGaShuLEhpKFZpKG4sdClbMl0pKX1mdW5jdGlvbiBWaShuLHQpe251bGw9PXQmJih0PTEwKTt2YXIgZT1QaShuKSxyPWVbMV0tZVswXSx1PU1hdGgucG93KDEwLE1hdGguZmxvb3IoTWF0aC5sb2coci90KS9NYXRoLkxOMTApKSxpPXQvcip1O3JldHVybi4xNT49aT91Kj0xMDouMzU+PWk/dSo9NTouNzU+PWkmJih1Kj0yKSxlWzBdPU1hdGguY2VpbChlWzBdL3UpKnUsZVsxXT1NYXRoLmZsb29yKGVbMV0vdSkqdSsuNSp1LGVbMl09dSxlfWZ1bmN0aW9uIFhpKG4sdCl7cmV0dXJuIHRhLnJhbmdlLmFwcGx5KHRhLFZpKG4sdCkpfWZ1bmN0aW9uICRpKG4sdCxlKXt2YXIgcj1WaShuLHQpO2lmKGUpe3ZhciB1PWljLmV4ZWMoZSk7aWYodS5zaGlmdCgpLCJzIj09PXVbOF0pe3ZhciBpPXRhLmZvcm1hdFByZWZpeChNYXRoLm1heChnYShyWzBdKSxnYShyWzFdKSkpO3JldHVybiB1WzddfHwodVs3XT0iLiIrQmkoaS5zY2FsZShyWzJdKSkpLHVbOF09ImYiLGU9dGEuZm9ybWF0KHUuam9pbigiIikpLGZ1bmN0aW9uKG4pe3JldHVybiBlKGkuc2NhbGUobikpK2kuc3ltYm9sfX11WzddfHwodVs3XT0iLiIrV2kodVs4XSxyKSksZT11LmpvaW4oIiIpfWVsc2UgZT0iLC4iK0JpKHJbMl0pKyJmIjtyZXR1cm4gdGEuZm9ybWF0KGUpfWZ1bmN0aW9uIEJpKG4pe3JldHVybi1NYXRoLmZsb29yKE1hdGgubG9nKG4pL01hdGguTE4xMCsuMDEpfWZ1bmN0aW9uIFdpKG4sdCl7dmFyIGU9QmkodFsyXSk7cmV0dXJuIG4gaW4geWw/TWF0aC5hYnMoZS1CaShNYXRoLm1heChnYSh0WzBdKSxnYSh0WzFdKSkpKSsgKygiZSIhPT1uKTplLTIqKCIlIj09PW4pfWZ1bmN0aW9uIEppKG4sdCxlLHIpe2Z1bmN0aW9uIHUobil7cmV0dXJuKGU/TWF0aC5sb2coMD5uPzA6bik6LU1hdGgubG9nKG4+MD8wOi1uKSkvTWF0aC5sb2codCl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gZT9NYXRoLnBvdyh0LG4pOi1NYXRoLnBvdyh0LC1uKX1mdW5jdGlvbiBvKHQpe3JldHVybiBuKHUodCkpfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXRbMF0+PTAsbi5kb21haW4oKHI9dC5tYXAoTnVtYmVyKSkubWFwKHUpKSxvKTpyfSxvLmJhc2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K2Usbi5kb21haW4oci5tYXAodSkpLG8pOnR9LG8ubmljZT1mdW5jdGlvbigpe3ZhciB0PUZpKHIubWFwKHUpLGU/TWF0aDp4bCk7cmV0dXJuIG4uZG9tYWluKHQpLHI9dC5tYXAoaSksb30sby50aWNrcz1mdW5jdGlvbigpe3ZhciBuPVBpKHIpLG89W10sYT1uWzBdLGM9blsxXSxsPU1hdGguZmxvb3IodShhKSkscz1NYXRoLmNlaWwodShjKSksZj10JTE/Mjp0O2lmKGlzRmluaXRlKHMtbCkpe2lmKGUpe2Zvcig7cz5sO2wrKylmb3IodmFyIGg9MTtmPmg7aCsrKW8ucHVzaChpKGwpKmgpO28ucHVzaChpKGwpKX1lbHNlIGZvcihvLnB1c2goaShsKSk7bCsrPHM7KWZvcih2YXIgaD1mLTE7aD4wO2gtLSlvLnB1c2goaShsKSpoKTtmb3IobD0wO29bbF08YTtsKyspO2ZvcihzPW8ubGVuZ3RoO29bcy0xXT5jO3MtLSk7bz1vLnNsaWNlKGwscyl9cmV0dXJuIG99LG8udGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNbDthcmd1bWVudHMubGVuZ3RoPDI/dD1NbDoiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9dGEuZm9ybWF0KHQpKTt2YXIgcixhPU1hdGgubWF4KC4xLG4vby50aWNrcygpLmxlbmd0aCksYz1lPyhyPTFlLTEyLE1hdGguY2VpbCk6KHI9LTFlLTEyLE1hdGguZmxvb3IpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi9pKGModShuKStyKSk8PWE/dChuKToiIn19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBKaShuLmNvcHkoKSx0LGUscil9LFlpKG8sbil9ZnVuY3Rpb24gR2kobix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIG4odSh0KSl9dmFyIHU9S2kodCksaT1LaSgxL3QpO3JldHVybiByLmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gaShuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbigoZT10Lm1hcChOdW1iZXIpKS5tYXAodSkpLHIpOmV9LHIudGlja3M9ZnVuY3Rpb24obil7cmV0dXJuIFhpKGUsbil9LHIudGlja0Zvcm1hdD1mdW5jdGlvbihuLHQpe3JldHVybiAkaShlLG4sdCl9LHIubmljZT1mdW5jdGlvbihuKXtyZXR1cm4gci5kb21haW4oWmkoZSxuKSl9LHIuZXhwb25lbnQ9ZnVuY3Rpb24obyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9S2kodD1vKSxpPUtpKDEvdCksbi5kb21haW4oZS5tYXAodSkpLHIpOnR9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHaShuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtpKG4pe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gMD50Py1NYXRoLnBvdygtdCxuKTpNYXRoLnBvdyh0LG4pfX1mdW5jdGlvbiBRaShuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGlbKCh1LmdldChlKXx8KCJyYW5nZSI9PT10LnQ/dS5zZXQoZSxuLnB1c2goZSkpOjAvMCkpLTEpJWkubGVuZ3RoXX1mdW5jdGlvbiByKHQsZSl7cmV0dXJuIHRhLnJhbmdlKG4ubGVuZ3RoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIHQrZSpufSl9dmFyIHUsaSxvO3JldHVybiBlLmRvbWFpbj1mdW5jdGlvbihyKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbjtuPVtdLHU9bmV3IGw7Zm9yKHZhciBpLG89LTEsYT1yLmxlbmd0aDsrK288YTspdS5oYXMoaT1yW29dKXx8dS5zZXQoaSxuLnB1c2goaSkpO3JldHVybiBlW3QudF0uYXBwbHkoZSx0LmEpfSxlLnJhbmdlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW4sbz0wLHQ9e3Q6InJhbmdlIixhOmFyZ3VtZW50c30sZSk6aX0sZS5yYW5nZVBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPShjK2wpLzIsMCk6KGwtYykvKG4ubGVuZ3RoLTErYSk7cmV0dXJuIGk9cihjK3MqYS8yLHMpLG89MCx0PXt0OiJyYW5nZVBvaW50cyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VSb3VuZFBvaW50cz1mdW5jdGlvbih1LGEpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCk7dmFyIGM9dVswXSxsPXVbMV0scz1uLmxlbmd0aDwyPyhjPWw9TWF0aC5yb3VuZCgoYytsKS8yKSwwKToobC1jKS8obi5sZW5ndGgtMSthKXwwO3JldHVybiBpPXIoYytNYXRoLnJvdW5kKHMqYS8yKyhsLWMtKG4ubGVuZ3RoLTErYSkqcykvMikscyksbz0wLHQ9e3Q6InJhbmdlUm91bmRQb2ludHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlQmFuZHM9ZnVuY3Rpb24odSxhLGMpe2FyZ3VtZW50cy5sZW5ndGg8MiYmKGE9MCksYXJndW1lbnRzLmxlbmd0aDwzJiYoYz1hKTt2YXIgbD11WzFdPHVbMF0scz11W2wtMF0sZj11WzEtbF0saD0oZi1zKS8obi5sZW5ndGgtYSsyKmMpO3JldHVybiBpPXIocytoKmMsaCksbCYmaS5yZXZlcnNlKCksbz1oKigxLWEpLHQ9e3Q6InJhbmdlQmFuZHMiLGE6YXJndW1lbnRzfSxlfSxlLnJhbmdlUm91bmRCYW5kcz1mdW5jdGlvbih1LGEsYyl7YXJndW1lbnRzLmxlbmd0aDwyJiYoYT0wKSxhcmd1bWVudHMubGVuZ3RoPDMmJihjPWEpO3ZhciBsPXVbMV08dVswXSxzPXVbbC0wXSxmPXVbMS1sXSxoPU1hdGguZmxvb3IoKGYtcykvKG4ubGVuZ3RoLWErMipjKSk7cmV0dXJuIGk9cihzK01hdGgucm91bmQoKGYtcy0obi5sZW5ndGgtYSkqaCkvMiksaCksbCYmaS5yZXZlcnNlKCksbz1NYXRoLnJvdW5kKGgqKDEtYSkpLHQ9e3Q6InJhbmdlUm91bmRCYW5kcyIsYTphcmd1bWVudHN9LGV9LGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIG99LGUucmFuZ2VFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gUGkodC5hWzBdKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFFpKG4sdCl9LGUuZG9tYWluKG4pfWZ1bmN0aW9uIG5vKG4sdCl7ZnVuY3Rpb24gaSgpe3ZhciBlPTAscj10Lmxlbmd0aDtmb3IoYT1bXTsrK2U8cjspYVtlLTFdPXRhLnF1YW50aWxlKG4sZS9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKG4pe3JldHVybiBpc05hTihuPStuKT92b2lkIDA6dFt0YS5iaXNlY3QoYSxuKV19dmFyIGE7cmV0dXJuIG8uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQubWFwKHIpLmZpbHRlcih1KS5zb3J0KGUpLGkoKSk6bn0sby5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGkoKSk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gYX0sby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9dC5pbmRleE9mKGUpLDA+ZT9bMC8wLDAvMF06W2U+MD9hW2UtMV06blswXSxlPGEubGVuZ3RoP2FbZV06bltuLmxlbmd0aC0xXV19LG8uY29weT1mdW5jdGlvbigpe3JldHVybiBubyhuLHQpfSxpKCl9ZnVuY3Rpb24gdG8obix0LGUpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIGVbTWF0aC5tYXgoMCxNYXRoLm1pbihvLE1hdGguZmxvb3IoaSoodC1uKSkpKV19ZnVuY3Rpb24gdSgpe3JldHVybiBpPWUubGVuZ3RoLyh0LW4pLG89ZS5sZW5ndGgtMSxyfXZhciBpLG87cmV0dXJuIHIuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPStlWzBdLHQ9K2VbZS5sZW5ndGgtMV0sdSgpKTpbbix0XX0sci5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHUoKSk6ZX0sci5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9ZS5pbmRleE9mKHQpLHQ9MD50PzAvMDp0L2krbixbdCx0KzEvaV19LHIuY29weT1mdW5jdGlvbigpe3JldHVybiB0byhuLHQsZSl9LHUoKX1mdW5jdGlvbiBlbyhuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIGU+PWU/dFt0YS5iaXNlY3QobixlKV06dm9pZCAwfXJldHVybiBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGUpOm59LGUucmFuZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixlKTp0fSxlLmludmVydEV4dGVudD1mdW5jdGlvbihlKXtyZXR1cm4gZT10LmluZGV4T2YoZSksW25bZS0xXSxuW2VdXX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGVvKG4sdCl9LGV9ZnVuY3Rpb24gcm8obil7ZnVuY3Rpb24gdChuKXtyZXR1cm4rbn1yZXR1cm4gdC5pbnZlcnQ9dCx0LmRvbWFpbj10LnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWUubWFwKHQpLHQpOm59LHQudGlja3M9ZnVuY3Rpb24odCl7cmV0dXJuIFhpKG4sdCl9LHQudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiAkaShuLHQsZSl9LHQuY29weT1mdW5jdGlvbigpe3JldHVybiBybyhuKX0sdH1mdW5jdGlvbiB1bygpe3JldHVybiAwfWZ1bmN0aW9uIGlvKG4pe3JldHVybiBuLmlubmVyUmFkaXVzfWZ1bmN0aW9uIG9vKG4pe3JldHVybiBuLm91dGVyUmFkaXVzfWZ1bmN0aW9uIGFvKG4pe3JldHVybiBuLnN0YXJ0QW5nbGV9ZnVuY3Rpb24gY28obil7cmV0dXJuIG4uZW5kQW5nbGV9ZnVuY3Rpb24gbG8obil7cmV0dXJuIG4mJm4ucGFkQW5nbGV9ZnVuY3Rpb24gc28obix0LGUscil7cmV0dXJuKG4tZSkqdC0odC1yKSpuPjA/MDoxfWZ1bmN0aW9uIGZvKG4sdCxlLHIsdSl7dmFyIGk9blswXS10WzBdLG89blsxXS10WzFdLGE9KHU/cjotcikvTWF0aC5zcXJ0KGkqaStvKm8pLGM9YSpvLGw9LWEqaSxzPW5bMF0rYyxmPW5bMV0rbCxoPXRbMF0rYyxnPXRbMV0rbCxwPShzK2gpLzIsdj0oZitnKS8yLGQ9aC1zLG09Zy1mLHk9ZCpkK20qbSxNPWUtcix4PXMqZy1oKmYsYj0oMD5tPy0xOjEpKk1hdGguc3FydChNKk0qeS14KngpLF89KHgqbS1kKmIpL3ksdz0oLXgqZC1tKmIpL3ksUz0oeCptK2QqYikveSxrPSgteCpkK20qYikveSxFPV8tcCxBPXctdixOPVMtcCxDPWstdjtyZXR1cm4gRSpFK0EqQT5OKk4rQypDJiYoXz1TLHc9ayksW1tfLWMsdy1sXSxbXyplL00sdyplL01dXX1mdW5jdGlvbiBobyhuKXtmdW5jdGlvbiB0KHQpe2Z1bmN0aW9uIG8oKXtsLnB1c2goIk0iLGkobihzKSxhKSl9Zm9yKHZhciBjLGw9W10scz1bXSxmPS0xLGg9dC5sZW5ndGgsZz1FdChlKSxwPUV0KHIpOysrZjxoOyl1LmNhbGwodGhpcyxjPXRbZl0sZik/cy5wdXNoKFsrZy5jYWxsKHRoaXMsYyxmKSwrcC5jYWxsKHRoaXMsYyxmKV0pOnMubGVuZ3RoJiYobygpLHM9W10pO3JldHVybiBzLmxlbmd0aCYmbygpLGwubGVuZ3RoP2wuam9pbigiIik6bnVsbH12YXIgZT1BcixyPU5yLHU9TmUsaT1nbyxvPWkua2V5LGE9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1uLHQpOnJ9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT1uLHQpOnV9LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIG4/aT1uOihpPUVsLmdldChuKXx8Z28pLmtleSx0KTpvfSx0LnRlbnNpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bix0KTphfSx0fWZ1bmN0aW9uIGdvKG4pe3JldHVybiBuLmpvaW4oIkwiKX1mdW5jdGlvbiBwbyhuKXtyZXR1cm4gZ28obikrIloifWZ1bmN0aW9uIHZvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyWzBdKyhyPW5bdF0pWzBdKS8yLCJWIixyWzFdKTtyZXR1cm4gZT4xJiZ1LnB1c2goIkgiLHJbMF0pLHUuam9pbigiIil9ZnVuY3Rpb24gbW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aCxyPW5bMF0sdT1bclswXSwiLCIsclsxXV07Kyt0PGU7KXUucHVzaCgiViIsKHI9blt0XSlbMV0sIkgiLHJbMF0pO3JldHVybiB1LmpvaW4oIiIpfWZ1bmN0aW9uIHlvKG4pe2Zvcih2YXIgdD0wLGU9bi5sZW5ndGgscj1uWzBdLHU9W3JbMF0sIiwiLHJbMV1dOysrdDxlOyl1LnB1c2goIkgiLChyPW5bdF0pWzBdLCJWIixyWzFdKTtyZXR1cm4gdS5qb2luKCIiKX1mdW5jdGlvbiBNbyhuLHQpe3JldHVybiBuLmxlbmd0aDw0P2dvKG4pOm5bMV0rX28obi5zbGljZSgxLC0xKSx3byhuLHQpKX1mdW5jdGlvbiB4byhuLHQpe3JldHVybiBuLmxlbmd0aDwzP2dvKG4pOm5bMF0rX28oKG4ucHVzaChuWzBdKSxuKSx3byhbbltuLmxlbmd0aC0yXV0uY29uY2F0KG4sW25bMV1dKSx0KSl9ZnVuY3Rpb24gYm8obix0KXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sd28obix0KSl9ZnVuY3Rpb24gX28obix0KXtpZih0Lmxlbmd0aDwxfHxuLmxlbmd0aCE9dC5sZW5ndGgmJm4ubGVuZ3RoIT10Lmxlbmd0aCsyKXJldHVybiBnbyhuKTt2YXIgZT1uLmxlbmd0aCE9dC5sZW5ndGgscj0iIix1PW5bMF0saT1uWzFdLG89dFswXSxhPW8sYz0xO2lmKGUmJihyKz0iUSIrKGlbMF0tMipvWzBdLzMpKyIsIisoaVsxXS0yKm9bMV0vMykrIiwiK2lbMF0rIiwiK2lbMV0sdT1uWzFdLGM9MiksdC5sZW5ndGg+MSl7YT10WzFdLGk9bltjXSxjKysscis9IkMiKyh1WzBdK29bMF0pKyIsIisodVsxXStvWzFdKSsiLCIrKGlbMF0tYVswXSkrIiwiKyhpWzFdLWFbMV0pKyIsIitpWzBdKyIsIitpWzFdO2Zvcih2YXIgbD0yO2w8dC5sZW5ndGg7bCsrLGMrKylpPW5bY10sYT10W2xdLHIrPSJTIisoaVswXS1hWzBdKSsiLCIrKGlbMV0tYVsxXSkrIiwiK2lbMF0rIiwiK2lbMV19aWYoZSl7dmFyIHM9bltjXTtyKz0iUSIrKGlbMF0rMiphWzBdLzMpKyIsIisoaVsxXSsyKmFbMV0vMykrIiwiK3NbMF0rIiwiK3NbMV19cmV0dXJuIHJ9ZnVuY3Rpb24gd28obix0KXtmb3IodmFyIGUscj1bXSx1PSgxLXQpLzIsaT1uWzBdLG89blsxXSxhPTEsYz1uLmxlbmd0aDsrK2E8YzspZT1pLGk9byxvPW5bYV0sci5wdXNoKFt1KihvWzBdLWVbMF0pLHUqKG9bMV0tZVsxXSldKTtyZXR1cm4gcn1mdW5jdGlvbiBTbyhuKXtpZihuLmxlbmd0aDwzKXJldHVybiBnbyhuKTt2YXIgdD0xLGU9bi5sZW5ndGgscj1uWzBdLHU9clswXSxpPXJbMV0sbz1bdSx1LHUsKHI9blsxXSlbMF1dLGE9W2ksaSxpLHJbMV1dLGM9W3UsIiwiLGksIkwiLE5vKENsLG8pLCIsIixObyhDbCxhKV07Zm9yKG4ucHVzaChuW2UtMV0pOysrdDw9ZTspcj1uW3RdLG8uc2hpZnQoKSxvLnB1c2goclswXSksYS5zaGlmdCgpLGEucHVzaChyWzFdKSxDbyhjLG8sYSk7cmV0dXJuIG4ucG9wKCksYy5wdXNoKCJMIixyKSxjLmpvaW4oIiIpfWZ1bmN0aW9uIGtvKG4pe2lmKG4ubGVuZ3RoPDQpcmV0dXJuIGdvKG4pO2Zvcih2YXIgdCxlPVtdLHI9LTEsdT1uLmxlbmd0aCxpPVswXSxvPVswXTsrK3I8MzspdD1uW3JdLGkucHVzaCh0WzBdKSxvLnB1c2godFsxXSk7Zm9yKGUucHVzaChObyhDbCxpKSsiLCIrTm8oQ2wsbykpLC0tcjsrK3I8dTspdD1uW3JdLGkuc2hpZnQoKSxpLnB1c2godFswXSksby5zaGlmdCgpLG8ucHVzaCh0WzFdKSxDbyhlLGksbyk7cmV0dXJuIGUuam9pbigiIil9ZnVuY3Rpb24gRW8obil7Zm9yKHZhciB0LGUscj0tMSx1PW4ubGVuZ3RoLGk9dSs0LG89W10sYT1bXTsrK3I8NDspZT1uW3IldV0sby5wdXNoKGVbMF0pLGEucHVzaChlWzFdKTtmb3IodD1bTm8oQ2wsbyksIiwiLE5vKENsLGEpXSwtLXI7KytyPGk7KWU9bltyJXVdLG8uc2hpZnQoKSxvLnB1c2goZVswXSksYS5zaGlmdCgpLGEucHVzaChlWzFdKSxDbyh0LG8sYSk7cmV0dXJuIHQuam9pbigiIil9ZnVuY3Rpb24gQW8obix0KXt2YXIgZT1uLmxlbmd0aC0xO2lmKGUpZm9yKHZhciByLHUsaT1uWzBdWzBdLG89blswXVsxXSxhPW5bZV1bMF0taSxjPW5bZV1bMV0tbyxsPS0xOysrbDw9ZTspcj1uW2xdLHU9bC9lLHJbMF09dCpyWzBdKygxLXQpKihpK3UqYSksclsxXT10KnJbMV0rKDEtdCkqKG8rdSpjKTtyZXR1cm4gU28obil9ZnVuY3Rpb24gTm8obix0KXtyZXR1cm4gblswXSp0WzBdK25bMV0qdFsxXStuWzJdKnRbMl0rblszXSp0WzNdfWZ1bmN0aW9uIENvKG4sdCxlKXtuLnB1c2goIkMiLE5vKEFsLHQpLCIsIixObyhBbCxlKSwiLCIsTm8oTmwsdCksIiwiLE5vKE5sLGUpLCIsIixObyhDbCx0KSwiLCIsTm8oQ2wsZSkpfWZ1bmN0aW9uIHpvKG4sdCl7cmV0dXJuKHRbMV0tblsxXSkvKHRbMF0tblswXSl9ZnVuY3Rpb24gcW8obil7Zm9yKHZhciB0PTAsZT1uLmxlbmd0aC0xLHI9W10sdT1uWzBdLGk9blsxXSxvPXJbMF09em8odSxpKTsrK3Q8ZTspclt0XT0obysobz16byh1PWksaT1uW3QrMV0pKSkvMjtyZXR1cm4gclt0XT1vLHJ9ZnVuY3Rpb24gTG8obil7Zm9yKHZhciB0LGUscix1LGk9W10sbz1xbyhuKSxhPS0xLGM9bi5sZW5ndGgtMTsrK2E8YzspdD16byhuW2FdLG5bYSsxXSksZ2EodCk8Q2E/b1thXT1vW2ErMV09MDooZT1vW2FdL3Qscj1vW2ErMV0vdCx1PWUqZStyKnIsdT45JiYodT0zKnQvTWF0aC5zcXJ0KHUpLG9bYV09dSplLG9bYSsxXT11KnIpKTtmb3IoYT0tMTsrK2E8PWM7KXU9KG5bTWF0aC5taW4oYyxhKzEpXVswXS1uW01hdGgubWF4KDAsYS0xKV1bMF0pLyg2KigxK29bYV0qb1thXSkpLGkucHVzaChbdXx8MCxvW2FdKnV8fDBdKTtyZXR1cm4gaX1mdW5jdGlvbiBUbyhuKXtyZXR1cm4gbi5sZW5ndGg8Mz9nbyhuKTpuWzBdK19vKG4sTG8obikpfWZ1bmN0aW9uIFJvKG4pe2Zvcih2YXIgdCxlLHIsdT0tMSxpPW4ubGVuZ3RoOysrdTxpOyl0PW5bdV0sZT10WzBdLHI9dFsxXS1SYSx0WzBdPWUqTWF0aC5jb3MociksdFsxXT1lKk1hdGguc2luKHIpO3JldHVybiBufWZ1bmN0aW9uIERvKG4pe2Z1bmN0aW9uIHQodCl7ZnVuY3Rpb24gYygpe3YucHVzaCgiTSIsYShuKG0pLGYpLHMsbChuKGQucmV2ZXJzZSgpKSxmKSwiWiIpfWZvcih2YXIgaCxnLHAsdj1bXSxkPVtdLG09W10seT0tMSxNPXQubGVuZ3RoLHg9RXQoZSksYj1FdCh1KSxfPWU9PT1yP2Z1bmN0aW9uKCl7cmV0dXJuIGd9OkV0KHIpLHc9dT09PWk/ZnVuY3Rpb24oKXtyZXR1cm4gcH06RXQoaSk7Kyt5PE07KW8uY2FsbCh0aGlzLGg9dFt5XSx5KT8oZC5wdXNoKFtnPSt4LmNhbGwodGhpcyxoLHkpLHA9K2IuY2FsbCh0aGlzLGgseSldKSxtLnB1c2goWytfLmNhbGwodGhpcyxoLHkpLCt3LmNhbGwodGhpcyxoLHkpXSkpOmQubGVuZ3RoJiYoYygpLGQ9W10sbT1bXSk7cmV0dXJuIGQubGVuZ3RoJiZjKCksdi5sZW5ndGg/di5qb2luKCIiKTpudWxsfXZhciBlPUFyLHI9QXIsdT0wLGk9TnIsbz1OZSxhPWdvLGM9YS5rZXksbD1hLHM9IkwiLGY9Ljc7cmV0dXJuIHQueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1yPW4sdCk6cn0sdC54MD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1uLHQpOmV9LHQueDE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyCn0sdC55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWk9bix0KTppfSx0LnkwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW4sdCk6dX0sdC55MT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1uLHQpOml9LHQuZGVmaW5lZD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1uLHQpOm99LHQuaW50ZXJwb2xhdGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIG4/YT1uOihhPUVsLmdldChuKXx8Z28pLmtleSxsPWEucmV2ZXJzZXx8YSxzPWEuY2xvc2VkPyJNIjoiTCIsdCk6Y30sdC50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPW4sdCk6Zn0sdH1mdW5jdGlvbiBQbyhuKXtyZXR1cm4gbi5yYWRpdXN9ZnVuY3Rpb24gVW8obil7cmV0dXJuW24ueCxuLnldfWZ1bmN0aW9uIGpvKG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGU9dFswXSxyPXRbMV0tUmE7cmV0dXJuW2UqTWF0aC5jb3MociksZSpNYXRoLnNpbihyKV19fWZ1bmN0aW9uIEZvKCl7cmV0dXJuIDY0fWZ1bmN0aW9uIEhvKCl7cmV0dXJuImNpcmNsZSJ9ZnVuY3Rpb24gT28obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWEpO3JldHVybiJNMCwiK3QrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrLXQrIkEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrdCsiWiJ9ZnVuY3Rpb24gSW8obil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQsZTsodD10aGlzW25dKSYmKGU9dFt0LmFjdGl2ZV0pJiYoLS10LmNvdW50P2RlbGV0ZSB0W3QuYWN0aXZlXTpkZWxldGUgdGhpc1tuXSx0LmFjdGl2ZSs9LjUsZS5ldmVudCYmZS5ldmVudC5pbnRlcnJ1cHQuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZS5pbmRleCkpfX1mdW5jdGlvbiBZbyhuLHQsZSl7cmV0dXJuIHlhKG4sUGwpLG4ubmFtZXNwYWNlPXQsbi5pZD1lLG59ZnVuY3Rpb24gWm8obix0LGUscil7dmFyIHU9bi5pZCxpPW4ubmFtZXNwYWNlO3JldHVybiBZKG4sImZ1bmN0aW9uIj09dHlwZW9mIGU/ZnVuY3Rpb24obixvLGEpe25baV1bdV0udHdlZW4uc2V0KHQscihlLmNhbGwobixuLl9fZGF0YV9fLG8sYSkpKX06KGU9cihlKSxmdW5jdGlvbihuKXtuW2ldW3VdLnR3ZWVuLnNldCh0LGUpfSkpfWZ1bmN0aW9uIFZvKG4pe3JldHVybiBudWxsPT1uJiYobj0iIiksZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59fWZ1bmN0aW9uIFhvKG4pe3JldHVybiBudWxsPT1uPyJfX3RyYW5zaXRpb25fXyI6Il9fdHJhbnNpdGlvbl8iK24rIl9fIn1mdW5jdGlvbiAkbyhuLHQsZSxyLHUpe3ZhciBpPW5bZV18fChuW2VdPXthY3RpdmU6MCxjb3VudDowfSksbz1pW3JdO2lmKCFvKXt2YXIgYT11LnRpbWU7bz1pW3JdPXt0d2VlbjpuZXcgbCx0aW1lOmEsZGVsYXk6dS5kZWxheSxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlLGluZGV4OnR9LHU9bnVsbCwrK2kuY291bnQsdGEudGltZXIoZnVuY3Rpb24odSl7ZnVuY3Rpb24gYyhlKXtpZihpLmFjdGl2ZT5yKXJldHVybiBzKCk7dmFyIHU9aVtpLmFjdGl2ZV07dSYmKC0taS5jb3VudCxkZWxldGUgaVtpLmFjdGl2ZV0sdS5ldmVudCYmdS5ldmVudC5pbnRlcnJ1cHQuY2FsbChuLG4uX19kYXRhX18sdS5pbmRleCkpLGkuYWN0aXZlPXIsby5ldmVudCYmby5ldmVudC5zdGFydC5jYWxsKG4sbi5fX2RhdGFfXyx0KSxvLnR3ZWVuLmZvckVhY2goZnVuY3Rpb24oZSxyKXsocj1yLmNhbGwobixuLl9fZGF0YV9fLHQpKSYmdi5wdXNoKHIpfSksaD1vLmVhc2UsZj1vLmR1cmF0aW9uLHRhLnRpbWVyKGZ1bmN0aW9uKCl7cmV0dXJuIHAuYz1sKGV8fDEpP05lOmwsMX0sMCxhKX1mdW5jdGlvbiBsKGUpe2lmKGkuYWN0aXZlIT09cilyZXR1cm4gMTtmb3IodmFyIHU9ZS9mLGE9aCh1KSxjPXYubGVuZ3RoO2M+MDspdlstLWNdLmNhbGwobixhKTtyZXR1cm4gdT49MT8oby5ldmVudCYmby5ldmVudC5lbmQuY2FsbChuLG4uX19kYXRhX18sdCkscygpKTp2b2lkIDB9ZnVuY3Rpb24gcygpe3JldHVybi0taS5jb3VudD9kZWxldGUgaVtyXTpkZWxldGUgbltlXSwxfXZhciBmLGgsZz1vLmRlbGF5LHA9ZWMsdj1bXTtyZXR1cm4gcC50PWcrYSx1Pj1nP2ModS1nKTp2b2lkKHAuYz1jKX0sMCxhKX19ZnVuY3Rpb24gQm8obix0LGUpe24uYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihuKXt2YXIgcj10KG4pO3JldHVybiJ0cmFuc2xhdGUoIisoaXNGaW5pdGUocik/cjplKG4pKSsiLDApIn0pfWZ1bmN0aW9uIFdvKG4sdCxlKXtuLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24obil7dmFyIHI9dChuKTtyZXR1cm4idHJhbnNsYXRlKDAsIisoaXNGaW5pdGUocik/cjplKG4pKSsiKSJ9KX1mdW5jdGlvbiBKbyhuKXtyZXR1cm4gbi50b0lTT1N0cmluZygpfWZ1bmN0aW9uIEdvKG4sdCxlKXtmdW5jdGlvbiByKHQpe3JldHVybiBuKHQpfWZ1bmN0aW9uIHUobixlKXt2YXIgcj1uWzFdLW5bMF0sdT1yL2UsaT10YS5iaXNlY3QoVmwsdSk7cmV0dXJuIGk9PVZsLmxlbmd0aD9bdC55ZWFyLFZpKG4ubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBuLzMxNTM2ZTZ9KSxlKVsyXV06aT90W3UvVmxbaS0xXTxWbFtpXS91P2ktMTppXTpbQmwsVmkobixlKVsyXV19cmV0dXJuIHIuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBLbyhuLmludmVydCh0KSl9LHIuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuLmRvbWFpbih0KSxyKTpuLmRvbWFpbigpLm1hcChLbyl9LHIubmljZT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIWlzTmFOKGUpJiYhbi5yYW5nZShlLEtvKCtlKzEpLHQpLmxlbmd0aH12YXIgaT1yLmRvbWFpbigpLG89UGkoaSksYT1udWxsPT1uP3UobywxMCk6Im51bWJlciI9PXR5cGVvZiBuJiZ1KG8sbik7cmV0dXJuIGEmJihuPWFbMF0sdD1hWzFdKSxyLmRvbWFpbihGaShpLHQ+MT97Zmxvb3I6ZnVuY3Rpb24odCl7Zm9yKDtlKHQ9bi5mbG9vcih0KSk7KXQ9S28odC0xKTtyZXR1cm4gdH0sY2VpbDpmdW5jdGlvbih0KXtmb3IoO2UodD1uLmNlaWwodCkpOyl0PUtvKCt0KzEpO3JldHVybiB0fX06bikpfSxyLnRpY2tzPWZ1bmN0aW9uKG4sdCl7dmFyIGU9UGkoci5kb21haW4oKSksaT1udWxsPT1uP3UoZSwxMCk6Im51bWJlciI9PXR5cGVvZiBuP3UoZSxuKTohbi5yYW5nZSYmW3tyYW5nZTpufSx0XTtyZXR1cm4gaSYmKG49aVswXSx0PWlbMV0pLG4ucmFuZ2UoZVswXSxLbygrZVsxXSsxKSwxPnQ/MTp0KX0sci50aWNrRm9ybWF0PWZ1bmN0aW9uKCl7cmV0dXJuIGV9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBHbyhuLmNvcHkoKSx0LGUpfSxZaShyLG4pfWZ1bmN0aW9uIEtvKG4pe3JldHVybiBuZXcgRGF0ZShuKX1mdW5jdGlvbiBRbyhuKXtyZXR1cm4gSlNPTi5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gbmEobil7dmFyIHQ9dWEuY3JlYXRlUmFuZ2UoKTtyZXR1cm4gdC5zZWxlY3ROb2RlKHVhLmJvZHkpLHQuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KG4ucmVzcG9uc2VUZXh0KX12YXIgdGE9e3ZlcnNpb246IjMuNS42In0sZWE9W10uc2xpY2UscmE9ZnVuY3Rpb24obil7cmV0dXJuIGVhLmNhbGwobil9LHVhPXRoaXMuZG9jdW1lbnQ7aWYodWEpdHJ5e3JhKHVhLmRvY3VtZW50RWxlbWVudC5jaGlsZE5vZGVzKVswXS5ub2RlVHlwZX1jYXRjaChpYSl7cmE9ZnVuY3Rpb24obil7Zm9yKHZhciB0PW4ubGVuZ3RoLGU9bmV3IEFycmF5KHQpO3QtLTspZVt0XT1uW3RdO3JldHVybiBlfX1pZihEYXRlLm5vd3x8KERhdGUubm93PWZ1bmN0aW9uKCl7cmV0dXJuK25ldyBEYXRlfSksdWEpdHJ5e3VhLmNyZWF0ZUVsZW1lbnQoIkRJViIpLnN0eWxlLnNldFByb3BlcnR5KCJvcGFjaXR5IiwwLCIiKX1jYXRjaChvYSl7dmFyIGFhPXRoaXMuRWxlbWVudC5wcm90b3R5cGUsY2E9YWEuc2V0QXR0cmlidXRlLGxhPWFhLnNldEF0dHJpYnV0ZU5TLHNhPXRoaXMuQ1NTU3R5bGVEZWNsYXJhdGlvbi5wcm90b3R5cGUsZmE9c2Euc2V0UHJvcGVydHk7YWEuc2V0QXR0cmlidXRlPWZ1bmN0aW9uKG4sdCl7Y2EuY2FsbCh0aGlzLG4sdCsiIil9LGFhLnNldEF0dHJpYnV0ZU5TPWZ1bmN0aW9uKG4sdCxlKXtsYS5jYWxsKHRoaXMsbix0LGUrIiIpfSxzYS5zZXRQcm9wZXJ0eT1mdW5jdGlvbihuLHQsZSl7ZmEuY2FsbCh0aGlzLG4sdCsiIixlKX19dGEuYXNjZW5kaW5nPWUsdGEuZGVzY2VuZGluZz1mdW5jdGlvbihuLHQpe3JldHVybiBuPnQ/LTE6dD5uPzE6dD49bj8wOjAvMH0sdGEubWluPWZ1bmN0aW9uKG4sdCl7dmFyIGUscix1PS0xLGk9bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPW5bdV0pJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9blt1XSkmJmU+ciYmKGU9cil9ZWxzZXtmb3IoOysrdTxpOylpZihudWxsIT0ocj10LmNhbGwobixuW3VdLHUpKSYmcj49cil7ZT1yO2JyZWFrfWZvcig7Kyt1PGk7KW51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZlPnImJihlPXIpfXJldHVybiBlfSx0YS5tYXg9ZnVuY3Rpb24obix0KXt2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDtpZigxPT09YXJndW1lbnRzLmxlbmd0aCl7Zm9yKDsrK3U8aTspaWYobnVsbCE9KHI9blt1XSkmJnI+PXIpe2U9cjticmVha31mb3IoOysrdTxpOyludWxsIT0ocj1uW3VdKSYmcj5lJiYoZT1yKX1lbHNle2Zvcig7Kyt1PGk7KWlmKG51bGwhPShyPXQuY2FsbChuLG5bdV0sdSkpJiZyPj1yKXtlPXI7YnJlYWt9Zm9yKDsrK3U8aTspbnVsbCE9KHI9dC5jYWxsKG4sblt1XSx1KSkmJnI+ZSYmKGU9cil9cmV0dXJuIGV9LHRhLmV4dGVudD1mdW5jdGlvbihuLHQpe3ZhciBlLHIsdSxpPS0xLG89bi5sZW5ndGg7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpe2Zvcig7KytpPG87KWlmKG51bGwhPShyPW5baV0pJiZyPj1yKXtlPXU9cjticmVha31mb3IoOysraTxvOyludWxsIT0ocj1uW2ldKSYmKGU+ciYmKGU9cikscj51JiYodT1yKSl9ZWxzZXtmb3IoOysraTxvOylpZihudWxsIT0ocj10LmNhbGwobixuW2ldLGkpKSYmcj49cil7ZT11PXI7YnJlYWt9Zm9yKDsrK2k8bzspbnVsbCE9KHI9dC5jYWxsKG4sbltpXSxpKSkmJihlPnImJihlPXIpLHI+dSYmKHU9cikpfXJldHVybltlLHVdfSx0YS5zdW09ZnVuY3Rpb24obix0KXt2YXIgZSxyPTAsaT1uLmxlbmd0aCxvPS0xO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KytvPGk7KXUoZT0rbltvXSkmJihyKz1lKTtlbHNlIGZvcig7KytvPGk7KXUoZT0rdC5jYWxsKG4sbltvXSxvKSkmJihyKz1lKTtyZXR1cm4gcn0sdGEubWVhbj1mdW5jdGlvbihuLHQpe3ZhciBlLGk9MCxvPW4ubGVuZ3RoLGE9LTEsYz1vO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7KythPG87KXUoZT1yKG5bYV0pKT9pKz1lOi0tYztlbHNlIGZvcig7KythPG87KXUoZT1yKHQuY2FsbChuLG5bYV0sYSkpKT9pKz1lOi0tYztyZXR1cm4gYz9pL2M6dm9pZCAwfSx0YS5xdWFudGlsZT1mdW5jdGlvbihuLHQpe3ZhciBlPShuLmxlbmd0aC0xKSp0KzEscj1NYXRoLmZsb29yKGUpLHU9K25bci0xXSxpPWUtcjtyZXR1cm4gaT91K2kqKG5bcl0tdSk6dX0sdGEubWVkaWFuPWZ1bmN0aW9uKG4sdCl7dmFyIGksbz1bXSxhPW4ubGVuZ3RoLGM9LTE7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2M8YTspdShpPXIobltjXSkpJiZvLnB1c2goaSk7ZWxzZSBmb3IoOysrYzxhOyl1KGk9cih0LmNhbGwobixuW2NdLGMpKSkmJm8ucHVzaChpKTtyZXR1cm4gby5sZW5ndGg/dGEucXVhbnRpbGUoby5zb3J0KGUpLC41KTp2b2lkIDB9LHRhLnZhcmlhbmNlPWZ1bmN0aW9uKG4sdCl7dmFyIGUsaSxvPW4ubGVuZ3RoLGE9MCxjPTAsbD0tMSxzPTA7aWYoMT09PWFyZ3VtZW50cy5sZW5ndGgpZm9yKDsrK2w8bzspdShlPXIobltsXSkpJiYoaT1lLWEsYSs9aS8rK3MsYys9aSooZS1hKSk7ZWxzZSBmb3IoOysrbDxvOyl1KGU9cih0LmNhbGwobixuW2xdLGwpKSkmJihpPWUtYSxhKz1pLysrcyxjKz1pKihlLWEpKTtyZXR1cm4gcz4xP2MvKHMtMSk6dm9pZCAwfSx0YS5kZXZpYXRpb249ZnVuY3Rpb24oKXt2YXIgbj10YS52YXJpYW5jZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59O3ZhciBoYT1pKGUpO3RhLmJpc2VjdExlZnQ9aGEubGVmdCx0YS5iaXNlY3Q9dGEuYmlzZWN0UmlnaHQ9aGEucmlnaHQsdGEuYmlzZWN0b3I9ZnVuY3Rpb24obil7cmV0dXJuIGkoMT09PW4ubGVuZ3RoP2Z1bmN0aW9uKHQscil7cmV0dXJuIGUobih0KSxyKX06bil9LHRhLnNodWZmbGU9ZnVuY3Rpb24obix0LGUpeyhpPWFyZ3VtZW50cy5sZW5ndGgpPDMmJihlPW4ubGVuZ3RoLDI+aSYmKHQ9MCkpO2Zvcih2YXIgcix1LGk9ZS10O2k7KXU9TWF0aC5yYW5kb20oKSppLS18MCxyPW5baSt0XSxuW2krdF09blt1K3RdLG5bdSt0XT1yO3JldHVybiBufSx0YS5wZXJtdXRlPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPXQubGVuZ3RoLHI9bmV3IEFycmF5KGUpO2UtLTspcltlXT1uW3RbZV1dO3JldHVybiByfSx0YS5wYWlycz1mdW5jdGlvbihuKXtmb3IodmFyIHQsZT0wLHI9bi5sZW5ndGgtMSx1PW5bMF0saT1uZXcgQXJyYXkoMD5yPzA6cik7cj5lOylpW2VdPVt0PXUsdT1uWysrZV1dO3JldHVybiBpfSx0YS56aXA9ZnVuY3Rpb24oKXtpZighKHI9YXJndW1lbnRzLmxlbmd0aCkpcmV0dXJuW107Zm9yKHZhciBuPS0xLHQ9dGEubWluKGFyZ3VtZW50cyxvKSxlPW5ldyBBcnJheSh0KTsrK248dDspZm9yKHZhciByLHU9LTEsaT1lW25dPW5ldyBBcnJheShyKTsrK3U8cjspaVt1XT1hcmd1bWVudHNbdV1bbl07cmV0dXJuIGV9LHRhLnRyYW5zcG9zZT1mdW5jdGlvbihuKXtyZXR1cm4gdGEuemlwLmFwcGx5KHRhLG4pfSx0YS5rZXlzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChlKTtyZXR1cm4gdH0sdGEudmFsdWVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiBuKXQucHVzaChuW2VdKTtyZXR1cm4gdH0sdGEuZW50cmllcz1mdW5jdGlvbihuKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gbil0LnB1c2goe2tleTplLHZhbHVlOm5bZV19KTtyZXR1cm4gdH0sdGEubWVyZ2U9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1PW4ubGVuZ3RoLGk9LTEsbz0wOysraTx1OylvKz1uW2ldLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkobyk7LS11Pj0wOylmb3Iocj1uW3VdLHQ9ci5sZW5ndGg7LS10Pj0wOyllWy0tb109clt0XTtyZXR1cm4gZX07dmFyIGdhPU1hdGguYWJzO3RhLnJhbmdlPWZ1bmN0aW9uKG4sdCxlKXtpZihhcmd1bWVudHMubGVuZ3RoPDMmJihlPTEsYXJndW1lbnRzLmxlbmd0aDwyJiYodD1uLG49MCkpLCh0LW4pL2U9PT0xLzApdGhyb3cgbmV3IEVycm9yKCJpbmZpbml0ZSByYW5nZSIpO3ZhciByLHU9W10saT1hKGdhKGUpKSxvPS0xO2lmKG4qPWksdCo9aSxlKj1pLDA+ZSlmb3IoOyhyPW4rZSorK28pPnQ7KXUucHVzaChyL2kpO2Vsc2UgZm9yKDsocj1uK2UqKytvKTx0Oyl1LnB1c2goci9pKTtyZXR1cm4gdX0sdGEubWFwPWZ1bmN0aW9uKG4sdCl7dmFyIGU9bmV3IGw7aWYobiBpbnN0YW5jZW9mIGwpbi5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7ZS5zZXQobix0KX0pO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7dmFyIHIsdT0tMSxpPW4ubGVuZ3RoO2lmKDE9PT1hcmd1bWVudHMubGVuZ3RoKWZvcig7Kyt1PGk7KWUuc2V0KHUsblt1XSk7ZWxzZSBmb3IoOysrdTxpOyllLnNldCh0LmNhbGwobixyPW5bdV0sdSkscil9ZWxzZSBmb3IodmFyIG8gaW4gbillLnNldChvLG5bb10pO3JldHVybiBlfTt2YXIgcGE9Il9fcHJvdG9fXyIsdmE9Ilx4MDAiO2MobCx7aGFzOmgsZ2V0OmZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9bcyhuKV19LHNldDpmdW5jdGlvbihuLHQpe3JldHVybiB0aGlzLl9bcyhuKV09dH0scmVtb3ZlOmcsa2V5czpwLHZhbHVlczpmdW5jdGlvbigpe3ZhciBuPVtdO2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5wdXNoKHRoaXMuX1t0XSk7cmV0dXJuIG59LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgbj1bXTtmb3IodmFyIHQgaW4gdGhpcy5fKW4ucHVzaCh7a2V5OmYodCksdmFsdWU6dGhpcy5fW3RdfSk7cmV0dXJuIG59LHNpemU6dixlbXB0eTpkLGZvckVhY2g6ZnVuY3Rpb24obil7Zm9yKHZhciB0IGluIHRoaXMuXyluLmNhbGwodGhpcyxmKHQpLHRoaXMuX1t0XSl9fSksdGEubmVzdD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCxvLGEpe2lmKGE+PWkubGVuZ3RoKXJldHVybiByP3IuY2FsbCh1LG8pOmU/by5zb3J0KGUpOm87Zm9yKHZhciBjLHMsZixoLGc9LTEscD1vLmxlbmd0aCx2PWlbYSsrXSxkPW5ldyBsOysrZzxwOykoaD1kLmdldChjPXYocz1vW2ddKSkpP2gucHVzaChzKTpkLnNldChjLFtzXSk7cmV0dXJuIHQ/KHM9dCgpLGY9ZnVuY3Rpb24oZSxyKXtzLnNldChlLG4odCxyLGEpKX0pOihzPXt9LGY9ZnVuY3Rpb24oZSxyKXtzW2VdPW4odCxyLGEpfSksZC5mb3JFYWNoKGYpLHN9ZnVuY3Rpb24gdChuLGUpe2lmKGU+PWkubGVuZ3RoKXJldHVybiBuO3ZhciByPVtdLHU9b1tlKytdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24obix1KXtyLnB1c2goe2tleTpuLHZhbHVlczp0KHUsZSl9KX0pLHU/ci5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHUobi5rZXksdC5rZXkpfSk6cn12YXIgZSxyLHU9e30saT1bXSxvPVtdO3JldHVybiB1Lm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiBuKGUsdCwwKX0sdS5lbnRyaWVzPWZ1bmN0aW9uKGUpe3JldHVybiB0KG4odGEubWFwLGUsMCksMCl9LHUua2V5PWZ1bmN0aW9uKG4pe3JldHVybiBpLnB1c2gobiksdX0sdS5zb3J0S2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gb1tpLmxlbmd0aC0xXT1uLHV9LHUuc29ydFZhbHVlcz1mdW5jdGlvbihuKXtyZXR1cm4gZT1uLHV9LHUucm9sbHVwPWZ1bmN0aW9uKG4pe3JldHVybiByPW4sdX0sdX0sdGEuc2V0PWZ1bmN0aW9uKG4pe3ZhciB0PW5ldyBtO2lmKG4pZm9yKHZhciBlPTAscj1uLmxlbmd0aDtyPmU7KytlKXQuYWRkKG5bZV0pO3JldHVybiB0fSxjKG0se2hhczpoLGFkZDpmdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5fW3Mobis9IiIpXT0hMCxufSxyZW1vdmU6Zyx2YWx1ZXM6cCxzaXplOnYsZW1wdHk6ZCxmb3JFYWNoOmZ1bmN0aW9uKG4pe2Zvcih2YXIgdCBpbiB0aGlzLl8pbi5jYWxsKHRoaXMsZih0KSl9fSksdGEuYmVoYXZpb3I9e30sdGEucmViaW5kPWZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlLHI9MSx1PWFyZ3VtZW50cy5sZW5ndGg7KytyPHU7KW5bZT1hcmd1bWVudHNbcl1dPU0obix0LHRbZV0pO3JldHVybiBufTt2YXIgZGE9WyJ3ZWJraXQiLCJtcyIsIm1veiIsIk1veiIsIm8iLCJPIl07dGEuZGlzcGF0Y2g9ZnVuY3Rpb24oKXtmb3IodmFyIG49bmV3IF8sdD0tMSxlPWFyZ3VtZW50cy5sZW5ndGg7Kyt0PGU7KW5bYXJndW1lbnRzW3RdXT13KG4pO3JldHVybiBufSxfLnByb3RvdHlwZS5vbj1mdW5jdGlvbihuLHQpe3ZhciBlPW4uaW5kZXhPZigiLiIpLHI9IiI7aWYoZT49MCYmKHI9bi5zbGljZShlKzEpLG49bi5zbGljZSgwLGUpKSxuKXJldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/dGhpc1tuXS5vbihyKTp0aGlzW25dLm9uKHIsdCk7aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgpe2lmKG51bGw9PXQpZm9yKG4gaW4gdGhpcyl0aGlzLmhhc093blByb3BlcnR5KG4pJiZ0aGlzW25dLm9uKHIsbnVsbCk7cmV0dXJuIHRoaXN9fSx0YS5ldmVudD1udWxsLHRhLnJlcXVvdGU9ZnVuY3Rpb24obil7cmV0dXJuIG4ucmVwbGFjZShtYSwiXFwkJiIpfTt2YXIgbWE9L1tcXFxeXCRcKlwrXD9cfFxbXF1cKFwpXC5ce1x9XS9nLHlhPXt9Ll9fcHJvdG9fXz9mdW5jdGlvbihuLHQpe24uX19wcm90b19fPXR9OmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlIGluIHQpbltlXT10W2VdfSxNYT1mdW5jdGlvbihuLHQpe3JldHVybiB0LnF1ZXJ5U2VsZWN0b3Iobil9LHhhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIHQucXVlcnlTZWxlY3RvckFsbChuKX0sYmE9ZnVuY3Rpb24obix0KXt2YXIgZT1uLm1hdGNoZXN8fG5beChuLCJtYXRjaGVzU2VsZWN0b3IiKV07cmV0dXJuKGJhPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUuY2FsbChuLHQpfSkobix0KX07ImZ1bmN0aW9uIj09dHlwZW9mIFNpenpsZSYmKE1hPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIFNpenpsZShuLHQpWzBdfHxudWxsfSx4YT1TaXp6bGUsYmE9U2l6emxlLm1hdGNoZXNTZWxlY3RvciksdGEuc2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNlbGVjdCh1YS5kb2N1bWVudEVsZW1lbnQpfTt2YXIgX2E9dGEuc2VsZWN0aW9uLnByb3RvdHlwZT1bXTtfYS5zZWxlY3Q9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaT1bXTtuPU4obik7Zm9yKHZhciBvPS0xLGE9dGhpcy5sZW5ndGg7KytvPGE7KXtpLnB1c2godD1bXSksdC5wYXJlbnROb2RlPShyPXRoaXNbb10pLnBhcmVudE5vZGU7Zm9yKHZhciBjPS0xLGw9ci5sZW5ndGg7KytjPGw7KSh1PXJbY10pPyh0LnB1c2goZT1uLmNhbGwodSx1Ll9fZGF0YV9fLGMsbykpLGUmJiJfX2RhdGFfXyJpbiB1JiYoZS5fX2RhdGFfXz11Ll9fZGF0YV9fKSk6dC5wdXNoKG51bGwpfXJldHVybiBBKGkpfSxfYS5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyPVtdO249QyhuKTtmb3IodmFyIHU9LTEsaT10aGlzLmxlbmd0aDsrK3U8aTspZm9yKHZhciBvPXRoaXNbdV0sYT0tMSxjPW8ubGVuZ3RoOysrYTxjOykoZT1vW2FdKSYmKHIucHVzaCh0PXJhKG4uY2FsbChlLGUuX19kYXRhX18sYSx1KSkpLHQucGFyZW50Tm9kZT1lKTtyZXR1cm4gQShyKX07dmFyIHdhPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTt0YS5ucz17cHJlZml4OndhLHF1YWxpZnk6ZnVuY3Rpb24obil7dmFyIHQ9bi5pbmRleE9mKCI6IiksZT1uO3JldHVybiB0Pj0wJiYoZT1uLnNsaWNlKDAsdCksbj1uLnNsaWNlKHQrMSkpLHdhLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTp3YVtlXSxsb2NhbDpufTpufX0sX2EuYXR0cj1mdW5jdGlvbihuLHQpe2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgZT10aGlzLm5vZGUoKTtyZXR1cm4gbj10YS5ucy5xdWFsaWZ5KG4pLG4ubG9jYWw/ZS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmUuZ2V0QXR0cmlidXRlKG4pfWZvcih0IGluIG4pdGhpcy5lYWNoKHoodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaCh6KG4sdCkpfSxfYS5jbGFzc2VkPWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pe3ZhciBlPXRoaXMubm9kZSgpLHI9KG49VChuKSkubGVuZ3RoLHU9LTE7aWYodD1lLmNsYXNzTGlzdCl7Zm9yKDsrK3U8cjspaWYoIXQuY29udGFpbnMoblt1XSkpcmV0dXJuITF9ZWxzZSBmb3IodD1lLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsrK3U8cjspaWYoIUwoblt1XSkudGVzdCh0KSlyZXR1cm4hMTtyZXR1cm4hMH1mb3IodCBpbiBuKXRoaXMuZWFjaChSKHQsblt0XSkpO3JldHVybiB0aGlzfXJldHVybiB0aGlzLmVhY2goUihuLHQpKX0sX2Euc3R5bGU9ZnVuY3Rpb24obixlLHIpe3ZhciB1PWFyZ3VtZW50cy5sZW5ndGg7aWYoMz51KXtpZigic3RyaW5nIiE9dHlwZW9mIG4pezI+dSYmKGU9IiIpO2ZvcihyIGluIG4pdGhpcy5lYWNoKFAocixuW3JdLGUpKTtyZXR1cm4gdGhpc31pZigyPnUpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiB0KGkpLmdldENvbXB1dGVkU3R5bGUoaSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfXI9IiJ9cmV0dXJuIHRoaXMuZWFjaChQKG4sZSxyKSl9LF9hLnByb3BlcnR5PWZ1bmN0aW9uKG4sdCl7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtpZigic3RyaW5nIj09dHlwZW9mIG4pcmV0dXJuIHRoaXMubm9kZSgpW25dO2Zvcih0IGluIG4pdGhpcy5lYWNoKFUodCxuW3RdKSk7cmV0dXJuIHRoaXN9cmV0dXJuIHRoaXMuZWFjaChVKG4sdCkpfSxfYS50ZXh0PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbigpe3ZhciB0PW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09dD8iIjp0fTpudWxsPT1uP2Z1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD0iIn06ZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PW59KTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0sX2EuaHRtbD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24oKXt2YXIgdD1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT10PyIiOnR9Om51bGw9PW4/ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD0iIn06ZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD1ufSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxfYS5hcHBlbmQ9ZnVuY3Rpb24obil7cmV0dXJuIG49aihuKSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pfSxfYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gbj1qKG4pLHQ9Tih0KSx0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0sX2EucmVtb3ZlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChGKX0sX2EuZGF0YT1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlKXt2YXIgcix1LGksbz1uLmxlbmd0aCxmPWUubGVuZ3RoLGg9TWF0aC5taW4obyxmKSxnPW5ldyBBcnJheShmKSxwPW5ldyBBcnJheShmKSx2PW5ldyBBcnJheShvKTtpZih0KXt2YXIgZCxtPW5ldyBsLHk9bmV3IEFycmF5KG8pO2ZvcihyPS0xOysrcjxvOyltLmhhcyhkPXQuY2FsbCh1PW5bcl0sdS5fX2RhdGFfXyxyKSk/dltyXT11Om0uc2V0KGQsdSkseVtyXT1kO2ZvcihyPS0xOysrcjxmOykodT1tLmdldChkPXQuY2FsbChlLGk9ZVtyXSxyKSkpP3UhPT0hMCYmKGdbcl09dSx1Ll9fZGF0YV9fPWkpOnBbcl09SChpKSxtLnNldChkLCEwKTtmb3Iocj0tMTsrK3I8bzspbS5nZXQoeVtyXSkhPT0hMCYmKHZbcl09bltyXSl9ZWxzZXtmb3Iocj0tMTsrK3I8aDspdT1uW3JdLGk9ZVtyXSx1Pyh1Ll9fZGF0YV9fPWksZ1tyXT11KTpwW3JdPUgoaSk7Zm9yKDtmPnI7KytyKXBbcl09SChlW3JdKTtmb3IoO28+cjsrK3IpdltyXT1uW3JdfXAudXBkYXRlPWcscC5wYXJlbnROb2RlPWcucGFyZW50Tm9kZT12LnBhcmVudE5vZGU9bi5wYXJlbnROb2RlLGEucHVzaChwKSxjLnB1c2goZykscy5wdXNoKHYpfXZhciByLHUsaT0tMSxvPXRoaXMubGVuZ3RoO2lmKCFhcmd1bWVudHMubGVuZ3RoKXtmb3Iobj1uZXcgQXJyYXkobz0ocj10aGlzWzBdKS5sZW5ndGgpOysraTxvOykodT1yW2ldKSYmKG5baV09dS5fX2RhdGFfXyk7cmV0dXJuIG59dmFyIGE9WihbXSksYz1BKFtdKSxzPUEoW10pO2lmKCJmdW5jdGlvbiI9PXR5cGVvZiBuKWZvcig7KytpPG87KWUocj10aGlzW2ldLG4uY2FsbChyLHIucGFyZW50Tm9kZS5fX2RhdGFfXyxpKSk7ZWxzZSBmb3IoOysraTxvOyllKHI9dGhpc1tpXSxuKTtyZXR1cm4gYy5lbnRlcj1mdW5jdGlvbigpe3JldHVybiBhfSxjLmV4aXQ9ZnVuY3Rpb24oKXtyZXR1cm4gc30sY30sX2EuZGF0dW09ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLG4pOnRoaXMucHJvcGVydHkoIl9fZGF0YV9fIil9LF9hLmZpbHRlcj1mdW5jdGlvbihuKXt2YXIgdCxlLHIsdT1bXTsiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49TyhuKSk7Zm9yKHZhciBpPTAsbz10aGlzLmxlbmd0aDtvPmk7aSsrKXt1LnB1c2godD1bXSksdC5wYXJlbnROb2RlPShlPXRoaXNbaV0pLnBhcmVudE5vZGU7Zm9yKHZhciBhPTAsYz1lLmxlbmd0aDtjPmE7YSsrKShyPWVbYV0pJiZuLmNhbGwocixyLl9fZGF0YV9fLGEsaSkmJnQucHVzaChyKX1yZXR1cm4gQSh1KX0sX2Eub3JkZXI9ZnVuY3Rpb24oKXtmb3IodmFyIG49LTEsdD10aGlzLmxlbmd0aDsrK248dDspZm9yKHZhciBlLHI9dGhpc1tuXSx1PXIubGVuZ3RoLTEsaT1yW3VdOy0tdT49MDspKGU9clt1XSkmJihpJiZpIT09ZS5uZXh0U2libGluZyYmaS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLGkpLGk9ZSk7cmV0dXJuIHRoaXN9LF9hLnNvcnQ9ZnVuY3Rpb24obil7bj1JLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtmb3IodmFyIHQ9LTEsZT10aGlzLmxlbmd0aDsrK3Q8ZTspdGhpc1t0XS5zb3J0KG4pO3JldHVybiB0aGlzLm9yZGVyKCl9LF9hLmVhY2g9ZnVuY3Rpb24obil7cmV0dXJuIFkodGhpcyxmdW5jdGlvbih0LGUscil7bi5jYWxsKHQsdC5fX2RhdGFfXyxlLHIpfSl9LF9hLmNhbGw9ZnVuY3Rpb24obil7dmFyIHQ9cmEoYXJndW1lbnRzKTtyZXR1cm4gbi5hcHBseSh0WzBdPXRoaXMsdCksdGhpc30sX2EuZW1wdHk9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LF9hLm5vZGU9ZnVuY3Rpb24oKXtmb3IodmFyIG49MCx0PXRoaXMubGVuZ3RoO3Q+bjtuKyspZm9yKHZhciBlPXRoaXNbbl0scj0wLHU9ZS5sZW5ndGg7dT5yO3IrKyl7dmFyIGk9ZVtyXTtpZihpKXJldHVybiBpfXJldHVybiBudWxsfSxfYS5zaXplPWZ1bmN0aW9uKCl7dmFyIG49MDtyZXR1cm4gWSh0aGlzLGZ1bmN0aW9uKCl7KytufSksbn07dmFyIFNhPVtdO3RhLnNlbGVjdGlvbi5lbnRlcj1aLHRhLnNlbGVjdGlvbi5lbnRlci5wcm90b3R5cGU9U2EsU2EuYXBwZW5kPV9hLmFwcGVuZCxTYS5lbXB0eT1fYS5lbXB0eSxTYS5ub2RlPV9hLm5vZGUsU2EuY2FsbD1fYS5jYWxsLFNhLnNpemU9X2Euc2l6ZSxTYS5zZWxlY3Q9ZnVuY3Rpb24obil7Zm9yKHZhciB0LGUscix1LGksbz1bXSxhPS0xLGM9dGhpcy5sZW5ndGg7KythPGM7KXtyPSh1PXRoaXNbYV0pLnVwZGF0ZSxvLnB1c2godD1bXSksdC5wYXJlbnROb2RlPXUucGFyZW50Tm9kZTtmb3IodmFyIGw9LTEscz11Lmxlbmd0aDsrK2w8czspKGk9dVtsXSk/KHQucHVzaChyW2xdPWU9bi5jYWxsKHUucGFyZW50Tm9kZSxpLl9fZGF0YV9fLGwsYSkpLGUuX19kYXRhX189aS5fX2RhdGFfXyk6dC5wdXNoKG51bGwpfXJldHVybiBBKG8pfSxTYS5pbnNlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyJiYodD1WKHRoaXMpKSxfYS5pbnNlcnQuY2FsbCh0aGlzLG4sdCl9LHRhLnNlbGVjdD1mdW5jdGlvbih0KXt2YXIgZTtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/KGU9W01hKHQsdWEpXSxlLnBhcmVudE5vZGU9dWEuZG9jdW1lbnRFbGVtZW50KTooZT1bdF0sZS5wYXJlbnROb2RlPW4odCkpLEEoW2VdKX0sdGEuc2VsZWN0QWxsPWZ1bmN0aW9uKG4pe3ZhciB0O3JldHVybiJzdHJpbmciPT10eXBlb2Ygbj8odD1yYSh4YShuLHVhKSksdC5wYXJlbnROb2RlPXVhLmRvY3VtZW50RWxlbWVudCk6KHQ9bix0LnBhcmVudE5vZGU9bnVsbCksQShbdF0pfSxfYS5vbj1mdW5jdGlvbihuLHQsZSl7dmFyIHI9YXJndW1lbnRzLmxlbmd0aDtpZigzPnIpe2lmKCJzdHJpbmciIT10eXBlb2Ygbil7Mj5yJiYodD0hMSk7Zm9yKGUgaW4gbil0aGlzLmVhY2goWChlLG5bZV0sdCkpO3JldHVybiB0aGlzfWlmKDI+cilyZXR1cm4ocj10aGlzLm5vZGUoKVsiX19vbiIrbl0pJiZyLl87ZT0hMX1yZXR1cm4gdGhpcy5lYWNoKFgobix0LGUpKX07dmFyIGthPXRhLm1hcCh7bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KTt1YSYma2EuZm9yRWFjaChmdW5jdGlvbihuKXsib24iK24gaW4gdWEmJmthLnJlbW92ZShuKX0pO3ZhciBFYSxBYT0wO3RhLm1vdXNlPWZ1bmN0aW9uKG4pe3JldHVybiBKKG4saygpKX07dmFyIE5hPXRoaXMubmF2aWdhdG9yJiYvV2ViS2l0Ly50ZXN0KHRoaXMubmF2aWdhdG9yLnVzZXJBZ2VudCk/LTE6MDt0YS50b3VjaD1mdW5jdGlvbihuLHQsZSl7aWYoYXJndW1lbnRzLmxlbmd0aDwzJiYoZT10LHQ9aygpLmNoYW5nZWRUb3VjaGVzKSx0KWZvcih2YXIgcix1PTAsaT10Lmxlbmd0aDtpPnU7Kyt1KWlmKChyPXRbdV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBKKG4scil9LHRhLmJlaGF2aW9yLmRyYWc9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dGhpcy5vbigibW91c2Vkb3duLmRyYWciLGkpLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLG8pfWZ1bmN0aW9uIGUobix0LGUsaSxvKXtyZXR1cm4gZnVuY3Rpb24oKXtmdW5jdGlvbiBhKCl7dmFyIG4sZSxyPXQoaCx2KTtyJiYobj1yWzBdLU1bMF0sZT1yWzFdLU1bMV0scHw9bnxlLE09cixnKHt0eXBlOiJkcmFnIix4OnJbMF0rbFswXSx5OnJbMV0rbFsxXSxkeDpuLGR5OmV9KSl9ZnVuY3Rpb24gYygpe3QoaCx2KSYmKG0ub24oaStkLG51bGwpLm9uKG8rZCxudWxsKSx5KHAmJnRhLmV2ZW50LnRhcmdldD09PWYpLGcoe3R5cGU6ImRyYWdlbmQifSkpfXZhciBsLHM9dGhpcyxmPXRhLmV2ZW50LnRhcmdldCxoPXMucGFyZW50Tm9kZSxnPXIub2Yocyxhcmd1bWVudHMpLHA9MCx2PW4oKSxkPSIuZHJhZyIrKG51bGw9PXY/IiI6Ii0iK3YpLG09dGEuc2VsZWN0KGUoZikpLm9uKGkrZCxhKS5vbihvK2QsYykseT1XKGYpLE09dChoLHYpO3U/KGw9dS5hcHBseShzLGFyZ3VtZW50cyksbD1bbC54LU1bMF0sbC55LU1bMV1dKTpsPVswLDBdLGcoe3R5cGU6ImRyYWdzdGFydCJ9KX19dmFyIHI9RShuLCJkcmFnIiwiZHJhZ3N0YXJ0IiwiZHJhZ2VuZCIpLHU9bnVsbCxpPWUoYix0YS5tb3VzZSx0LCJtb3VzZW1vdmUiLCJtb3VzZXVwIiksbz1lKEcsdGEudG91Y2gseSwidG91Y2htb3ZlIiwidG91Y2hlbmQiKTtyZXR1cm4gbi5vcmlnaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxuKTp1fSx0YS5yZWJpbmQobixyLCJvbiIpfSx0YS50b3VjaGVzPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MiYmKHQ9aygpLnRvdWNoZXMpLHQ/cmEodCkubWFwKGZ1bmN0aW9uKHQpe3ZhciBlPUoobix0KTtyZXR1cm4gZS5pZGVudGlmaWVyPXQuaWRlbnRpZmllcixlfSk6W119O3ZhciBDYT0xZS02LHphPUNhKkNhLHFhPU1hdGguUEksTGE9MipxYSxUYT1MYS1DYSxSYT1xYS8yLERhPXFhLzE4MCxQYT0xODAvcWEsVWE9TWF0aC5TUVJUMixqYT0yLEZhPTQ7dGEuaW50ZXJwb2xhdGVab29tPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuKXt2YXIgdD1uKnk7aWYobSl7dmFyIGU9cnQodiksbz1pLyhqYSpoKSooZSp1dChVYSp0K3YpLWV0KHYpKTtyZXR1cm5bcitvKmwsdStvKnMsaSplL3J0KFVhKnQrdildfXJldHVybltyK24qbCx1K24qcyxpKk1hdGguZXhwKFVhKnQpXX12YXIgcj1uWzBdLHU9blsxXSxpPW5bMl0sbz10WzBdLGE9dFsxXSxjPXRbMl0sbD1vLXIscz1hLXUsZj1sKmwrcypzLGg9TWF0aC5zcXJ0KGYpLGc9KGMqYy1pKmkrRmEqZikvKDIqaSpqYSpoKSxwPShjKmMtaSppLUZhKmYpLygyKmMqamEqaCksdj1NYXRoLmxvZyhNYXRoLnNxcnQoZypnKzEpLWcpLGQ9TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKSxtPWQtdix5PShtfHxNYXRoLmxvZyhjL2kpKS9VYTtyZXR1cm4gZS5kdXJhdGlvbj0xZTMqeSxlfSx0YS5iZWhhdmlvci56b29tPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLm9uKHEsZikub24oT2ErIi56b29tIixnKS5vbigiZGJsY2xpY2suem9vbSIscCkub24oUixoKX1mdW5jdGlvbiBlKG4pe3JldHVyblsoblswXS1rLngpL2suaywoblsxXS1rLnkpL2sua119ZnVuY3Rpb24gcihuKXtyZXR1cm5bblswXSprLmsray54LG5bMV0qay5rK2sueV19ZnVuY3Rpb24gdShuKXtrLms9TWF0aC5tYXgoTlswXSxNYXRoLm1pbihOWzFdLG4pKX1mdW5jdGlvbiBpKG4sdCl7dD1yKHQpLGsueCs9blswXS10WzBdLGsueSs9blsxXS10WzFdfWZ1bmN0aW9uIG8odCxlLHIsbyl7dC5fX2NoYXJ0X189e3g6ay54LHk6ay55LGs6ay5rfSx1KE1hdGgucG93KDIsbykpLGkoZD1lLHIpLHQ9dGEuc2VsZWN0KHQpLEM+MCYmKHQ9dC50cmFuc2l0aW9uKCkuZHVyYXRpb24oQykpLHQuY2FsbChuLmV2ZW50KX1mdW5jdGlvbiBhKCl7YiYmYi5kb21haW4oeC5yYW5nZSgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm4obi1rLngpL2sua30pLm1hcCh4LmludmVydCkpLHcmJncuZG9tYWluKF8ucmFuZ2UoKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuKG4tay55KS9rLmt9KS5tYXAoXy5pbnZlcnQpKX1mdW5jdGlvbiBjKG4pe3orK3x8bih7dHlwZToiem9vbXN0YXJ0In0pfWZ1bmN0aW9uIGwobil7YSgpLG4oe3R5cGU6Inpvb20iLHNjYWxlOmsuayx0cmFuc2xhdGU6W2sueCxrLnldfSl9ZnVuY3Rpb24gcyhuKXstLXp8fChuKHt0eXBlOiJ6b29tZW5kIn0pLGQ9bnVsbCl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIG4oKXtmPTEsaSh0YS5tb3VzZSh1KSxnKSxsKGEpfWZ1bmN0aW9uIHIoKXtoLm9uKEwsbnVsbCkub24oVCxudWxsKSxwKGYmJnRhLmV2ZW50LnRhcmdldD09PW8pLHMoYSl9dmFyIHU9dGhpcyxvPXRhLmV2ZW50LnRhcmdldCxhPUQub2YodSxhcmd1bWVudHMpLGY9MCxoPXRhLnNlbGVjdCh0KHUpKS5vbihMLG4pLm9uKFQsciksZz1lKHRhLm1vdXNlKHUpKSxwPVcodSk7RGwuY2FsbCh1KSxjKGEpfWZ1bmN0aW9uIGgoKXtmdW5jdGlvbiBuKCl7dmFyIG49dGEudG91Y2hlcyhwKTtyZXR1cm4gZz1rLmssbi5mb3JFYWNoKGZ1bmN0aW9uKG4pe24uaWRlbnRpZmllciBpbiBkJiYoZFtuLmlkZW50aWZpZXJdPWUobikpfSksbn1mdW5jdGlvbiB0KCl7dmFyIHQ9dGEuZXZlbnQudGFyZ2V0O3RhLnNlbGVjdCh0KS5vbih4LHIpLm9uKGIsYSksXy5wdXNoKHQpO2Zvcih2YXIgZT10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyx1PTAsaT1lLmxlbmd0aDtpPnU7Kyt1KWRbZVt1XS5pZGVudGlmaWVyXT1udWxsO3ZhciBjPW4oKSxsPURhdGUubm93KCk7aWYoMT09PWMubGVuZ3RoKXtpZig1MDA+bC1NKXt2YXIgcz1jWzBdO28ocCxzLGRbcy5pZGVudGlmaWVyXSxNYXRoLmZsb29yKE1hdGgubG9nKGsuaykvTWF0aC5MTjIpKzEpLFMoKX1NPWx9ZWxzZSBpZihjLmxlbmd0aD4xKXt2YXIgcz1jWzBdLGY9Y1sxXSxoPXNbMF0tZlswXSxnPXNbMV0tZlsxXTttPWgqaCtnKmd9fWZ1bmN0aW9uIHIoKXt2YXIgbix0LGUscixvPXRhLnRvdWNoZXMocCk7RGwuY2FsbChwKTtmb3IodmFyIGE9MCxjPW8ubGVuZ3RoO2M+YTsrK2Escj1udWxsKWlmKGU9b1thXSxyPWRbZS5pZGVudGlmaWVyXSl7aWYodClicmVhaztuPWUsdD1yfWlmKHIpe3ZhciBzPShzPWVbMF0tblswXSkqcysocz1lWzFdLW5bMV0pKnMsZj1tJiZNYXRoLnNxcnQocy9tKTtuPVsoblswXStlWzBdKS8yLChuWzFdK2VbMV0pLzJdLHQ9Wyh0WzBdK3JbMF0pLzIsKHRbMV0rclsxXSkvMl0sdShmKmcpfU09bnVsbCxpKG4sdCksbCh2KX1mdW5jdGlvbiBhKCl7aWYodGEuZXZlbnQudG91Y2hlcy5sZW5ndGgpe2Zvcih2YXIgdD10YS5ldmVudC5jaGFuZ2VkVG91Y2hlcyxlPTAscj10Lmxlbmd0aDtyPmU7KytlKWRlbGV0ZSBkW3RbZV0uaWRlbnRpZmllcl07Zm9yKHZhciB1IGluIGQpcmV0dXJuIHZvaWQgbigpfXRhLnNlbGVjdEFsbChfKS5vbih5LG51bGwpLHcub24ocSxmKS5vbihSLGgpLEUoKSxzKHYpfXZhciBnLHA9dGhpcyx2PUQub2YocCxhcmd1bWVudHMpLGQ9e30sbT0wLHk9Ii56b29tLSIrdGEuZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcix4PSJ0b3VjaG1vdmUiK3ksYj0idG91Y2hlbmQiK3ksXz1bXSx3PXRhLnNlbGVjdChwKSxFPVcocCk7dCgpLGModiksdy5vbihxLG51bGwpLm9uKFIsdCl9ZnVuY3Rpb24gZygpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpO3k/Y2xlYXJUaW1lb3V0KHkpOihEbC5jYWxsKHRoaXMpLHY9ZShkPW18fHRhLm1vdXNlKHRoaXMpKSxjKG4pKSx5PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt5PW51bGwscyhuKX0sNTApLFMoKSx1KE1hdGgucG93KDIsLjAwMipIYSgpKSprLmspLGkoZCx2KSxsKG4pfWZ1bmN0aW9uIHAoKXt2YXIgbj10YS5tb3VzZSh0aGlzKSx0PU1hdGgubG9nKGsuaykvTWF0aC5MTjI7byh0aGlzLG4sZShuKSx0YS5ldmVudC5zaGlmdEtleT9NYXRoLmNlaWwodCktMTpNYXRoLmZsb29yKHQpKzEpfXZhciB2LGQsbSx5LE0seCxiLF8sdyxrPXt4OjAseTowLGs6MX0sQT1bOTYwLDUwMF0sTj1JYSxDPTI1MCx6PTAscT0ibW91c2Vkb3duLnpvb20iLEw9Im1vdXNlbW92ZS56b29tIixUPSJtb3VzZXVwLnpvb20iLFI9InRvdWNoc3RhcnQuem9vbSIsRD1FKG4sInpvb21zdGFydCIsInpvb20iLCJ6b29tZW5kIik7cmV0dXJuIE9hfHwoT2E9Im9ud2hlZWwiaW4gdWE/KEhhPWZ1bmN0aW9uKCl7cmV0dXJuLXRhLmV2ZW50LmRlbHRhWSoodGEuZXZlbnQuZGVsdGFNb2RlPzEyMDoxKX0sIndoZWVsIik6Im9ubW91c2V3aGVlbCJpbiB1YT8oSGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGEuZXZlbnQud2hlZWxEZWx0YX0sIm1vdXNld2hlZWwiKTooSGE9ZnVuY3Rpb24oKXtyZXR1cm4tdGEuZXZlbnQuZGV0YWlsfSwiTW96TW91c2VQaXhlbFNjcm9sbCIpKSxuLmV2ZW50PWZ1bmN0aW9uKG4pe24uZWFjaChmdW5jdGlvbigpe3ZhciBuPUQub2YodGhpcyxhcmd1bWVudHMpLHQ9aztUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0Lnpvb20iLGZ1bmN0aW9uKCl7az10aGlzLl9fY2hhcnRfX3x8e3g6MCx5OjAsazoxfSxjKG4pfSkudHdlZW4oInpvb206em9vbSIsZnVuY3Rpb24oKXt2YXIgZT1BWzBdLHI9QVsxXSx1PWQ/ZFswXTplLzIsaT1kP2RbMV06ci8yLG89dGEuaW50ZXJwb2xhdGVab29tKFsodS1rLngpL2suaywoaS1rLnkpL2suayxlL2sua10sWyh1LXQueCkvdC5rLChpLXQueSkvdC5rLGUvdC5rXSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPW8odCksYT1lL3JbMl07dGhpcy5fX2NoYXJ0X189az17eDp1LXJbMF0qYSx5OmktclsxXSphLGs6YX0sbChuKX19KS5lYWNoKCJpbnRlcnJ1cHQuem9vbSIsZnVuY3Rpb24oKXtzKG4pfSkuZWFjaCgiZW5kLnpvb20iLGZ1bmN0aW9uKCl7cyhuKX0pOih0aGlzLl9fY2hhcnRfXz1rLGMobiksbChuKSxzKG4pKX0pfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaz17eDordFswXSx5Oit0WzFdLGs6ay5rfSxhKCksbik6W2sueCxrLnldfSxuLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhrPXt4OmsueCx5OmsueSxrOit0fSxhKCksbik6ay5rfSxuLnNjYWxlRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhOPW51bGw9PXQ/SWE6Wyt0WzBdLCt0WzFdXSxuKTpOfSxuLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obT10JiZbK3RbMF0sK3RbMV1dLG4pOm19LG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oQT10JiZbK3RbMF0sK3RbMV1dLG4pOkF9LG4uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KEM9K3Qsbik6Q30sbi54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQseD10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6Yn0sbi55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh3PXQsXz10LmNvcHkoKSxrPXt4OjAseTowLGs6MX0sbik6d30sdGEucmViaW5kKG4sRCwib24iKX07dmFyIEhhLE9hLElhPVswLDEvMF07dGEuY29sb3I9b3Qsb3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkrIiJ9LHRhLmhzbD1hdDt2YXIgWWE9YXQucHJvdG90eXBlPW5ldyBvdDtZYS5icmlnaHRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj1NYXRoLnBvdyguNyxhcmd1bWVudHMubGVuZ3RoP246MSksbmV3IGF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sL24pfSxZYS5kYXJrZXI9ZnVuY3Rpb24obil7cmV0dXJuIG49TWF0aC5wb3coLjcsYXJndW1lbnRzLmxlbmd0aD9uOjEpLG5ldyBhdCh0aGlzLmgsdGhpcy5zLG4qdGhpcy5sKX0sWWEucmdiPWZ1bmN0aW9uKCl7cmV0dXJuIGN0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKX0sdGEuaGNsPWx0O3ZhciBaYT1sdC5wcm90b3R5cGU9bmV3IG90O1phLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1pbigxMDAsdGhpcy5sK1ZhKihhcmd1bWVudHMubGVuZ3RoP246MSkpKX0sWmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgbHQodGhpcy5oLHRoaXMuYyxNYXRoLm1heCgwLHRoaXMubC1WYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSl9LFphLnJnYj1mdW5jdGlvbigpe3JldHVybiBzdCh0aGlzLmgsdGhpcy5jLHRoaXMubCkucmdiKCl9LHRhLmxhYj1mdDt2YXIgVmE9MTgsWGE9Ljk1MDQ3LCRhPTEsQmE9MS4wODg4MyxXYT1mdC5wcm90b3R5cGU9bmV3IG90O1dhLmJyaWdodGVyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5taW4oMTAwLHRoaXMubCtWYSooYXJndW1lbnRzLmxlbmd0aD9uOjEpKSx0aGlzLmEsdGhpcy5iKX0sV2EuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuZXcgZnQoTWF0aC5tYXgoMCx0aGlzLmwtVmEqKGFyZ3VtZW50cy5sZW5ndGg/bjoxKSksdGhpcy5hLHRoaXMuYil9LFdhLnJnYj1mdW5jdGlvbigpe3JldHVybiBodCh0aGlzLmwsdGhpcy5hLHRoaXMuYil9LHRhLnJnYj1tdDt2YXIgSmE9bXQucHJvdG90eXBlPW5ldyBvdDtKYS5icmlnaHRlcj1mdW5jdGlvbihuKXtuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKTt2YXIgdD10aGlzLnIsZT10aGlzLmcscj10aGlzLmIsdT0zMDtyZXR1cm4gdHx8ZXx8cj8odCYmdT50JiYodD11KSxlJiZ1PmUmJihlPXUpLHImJnU+ciYmKHI9dSksbmV3IG10KE1hdGgubWluKDI1NSx0L24pLE1hdGgubWluKDI1NSxlL24pLE1hdGgubWluKDI1NSxyL24pKSk6bmV3IG10KHUsdSx1KX0sSmEuZGFya2VyPWZ1bmN0aW9uKG4pe3JldHVybiBuPU1hdGgucG93KC43LGFyZ3VtZW50cy5sZW5ndGg/bjoxKSxuZXcgbXQobip0aGlzLnIsbip0aGlzLmcsbip0aGlzLmIpfSxKYS5oc2w9ZnVuY3Rpb24oKXtyZXR1cm4gX3QodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxKYS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiIjIit4dCh0aGlzLnIpK3h0KHRoaXMuZykreHQodGhpcy5iKX07dmFyIEdhPXRhLm1hcCh7YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fSk7R2EuZm9yRWFjaChmdW5jdGlvbihuLHQpe0dhLnNldChuLHl0KHQpKX0pLHRhLmZ1bmN0b3I9RXQsdGEueGhyPUF0KHkpLHRhLmRzdj1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUobixlLGkpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKGk9ZSxlPW51bGwpO3ZhciBvPU50KG4sdCxudWxsPT1lP3I6dShlKSxpKTtyZXR1cm4gby5yb3c9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/by5yZXNwb25zZShudWxsPT0oZT1uKT9yOnUobikpOmV9LG99ZnVuY3Rpb24gcihuKXtyZXR1cm4gZS5wYXJzZShuLnJlc3BvbnNlVGV4dCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUucGFyc2UodC5yZXNwb25zZVRleHQsbil9fWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4obil9ZnVuY3Rpb24gbyhuKXtyZXR1cm4gYS50ZXN0KG4pPyciJytuLnJlcGxhY2UoL1wiL2csJyIiJykrJyInOm59dmFyIGE9bmV3IFJlZ0V4cCgnWyInK24rIlxuXSIpLGM9bi5jaGFyQ29kZUF0KDApO3JldHVybiBlLnBhcnNlPWZ1bmN0aW9uKG4sdCl7dmFyIHI7cmV0dXJuIGUucGFyc2VSb3dzKG4sZnVuY3Rpb24obixlKXtpZihyKXJldHVybiByKG4sZS0xKTt2YXIgdT1uZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkobikrIjogZFsiK3QrIl0ifSkuam9pbigiLCIpKyJ9Iik7cj10P2Z1bmN0aW9uKG4sZSl7cmV0dXJuIHQodShuKSxlKX06dX0pfSxlLnBhcnNlUm93cz1mdW5jdGlvbihuLHQpe2Z1bmN0aW9uIGUoKXtpZihzPj1sKXJldHVybiBvO2lmKHUpcmV0dXJuIHU9ITEsaTt2YXIgdD1zO2lmKDM0PT09bi5jaGFyQ29kZUF0KHQpKXtmb3IodmFyIGU9dDtlKys8bDspaWYoMzQ9PT1uLmNoYXJDb2RlQXQoZSkpe2lmKDM0IT09bi5jaGFyQ29kZUF0KGUrMSkpYnJlYWs7KytlfXM9ZSsyO3ZhciByPW4uY2hhckNvZGVBdChlKzEpO3JldHVybiAxMz09PXI/KHU9ITAsMTA9PT1uLmNoYXJDb2RlQXQoZSsyKSYmKytzKToxMD09PXImJih1PSEwKSxuLnNsaWNlKHQrMSxlKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDtsPnM7KXt2YXIgcj1uLmNoYXJDb2RlQXQocysrKSxhPTE7aWYoMTA9PT1yKXU9ITA7ZWxzZSBpZigxMz09PXIpdT0hMCwxMD09PW4uY2hhckNvZGVBdChzKSYmKCsrcywrK2EpO2Vsc2UgaWYociE9PWMpY29udGludWU7cmV0dXJuIG4uc2xpY2UodCxzLWEpfXJldHVybiBuLnNsaWNlKHQpfWZvcih2YXIgcix1LGk9e30sbz17fSxhPVtdLGw9bi5sZW5ndGgscz0wLGY9MDsocj1lKCkpIT09bzspe2Zvcih2YXIgaD1bXTtyIT09aSYmciE9PW87KWgucHVzaChyKSxyPWUoKTt0JiZudWxsPT0oaD10KGgsZisrKSl8fGEucHVzaChoKX1yZXR1cm4gYX0sZS5mb3JtYXQ9ZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0WzBdKSlyZXR1cm4gZS5mb3JtYXRSb3dzKHQpO3ZhciByPW5ldyBtLHU9W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihuKXtmb3IodmFyIHQgaW4gbilyLmhhcyh0KXx8dS5wdXNoKHIuYWRkKHQpKX0pLFt1Lm1hcChvKS5qb2luKG4pXS5jb25jYXQodC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHUubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBvKHRbbl0pfSkuam9pbihuKX0pKS5qb2luKCJcbiIpfSxlLmZvcm1hdFJvd3M9ZnVuY3Rpb24obil7cmV0dXJuIG4ubWFwKGkpLmpvaW4oIlxuIil9LGV9LHRhLmNzdj10YS5kc3YoIiwiLCJ0ZXh0L2NzdiIpLHRhLnRzdj10YS5kc3YoIgkiLCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIik7dmFyIEthLFFhLG5jLHRjLGVjLHJjPXRoaXNbeCh0aGlzLCJyZXF1ZXN0QW5pbWF0aW9uRnJhbWUiKV18fGZ1bmN0aW9uKG4pe3NldFRpbWVvdXQobiwxNyl9O3RhLnRpbWVyPWZ1bmN0aW9uKG4sdCxlKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoOzI+ciYmKHQ9MCksMz5yJiYoZT1EYXRlLm5vdygpKTt2YXIgdT1lK3QsaT17YzpuLHQ6dSxmOiExLG46bnVsbH07UWE/UWEubj1pOkthPWksUWE9aSxuY3x8KHRjPWNsZWFyVGltZW91dCh0YyksbmM9MSxyYyhxdCkpfSx0YS50aW1lci5mbHVzaD1mdW5jdGlvbigpe0x0KCksVHQoKX0sdGEucm91bmQ9ZnVuY3Rpb24obix0KXtyZXR1cm4gdD9NYXRoLnJvdW5kKG4qKHQ9TWF0aC5wb3coMTAsdCkpKS90Ok1hdGgucm91bmQobil9O3ZhciB1Yz1bInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIlx4YjUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXS5tYXAoRHQpO3RhLmZvcm1hdFByZWZpeD1mdW5jdGlvbihuLHQpe3ZhciBlPTA7cmV0dXJuIG4mJigwPm4mJihuKj0tMSksdCYmKG49dGEucm91bmQobixSdChuLHQpKSksZT0xK01hdGguZmxvb3IoMWUtMTIrTWF0aC5sb2cobikvTWF0aC5MTjEwKSxlPU1hdGgubWF4KC0yNCxNYXRoLm1pbigyNCwzKk1hdGguZmxvb3IoKGUtMSkvMykpKSksdWNbOCtlLzNdfTt2YXIgaWM9Lyg/OihbXntdKT8oWzw+PV5dKSk/KFsrXC0gXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuLT9cZCspPyhbYS16JV0pPy9pLG9jPXRhLm1hcCh7YjpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygyKX0sYzpmdW5jdGlvbihuKXtyZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShuKX0sbzpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZyg4KX0seDpmdW5jdGlvbihuKXtyZXR1cm4gbi50b1N0cmluZygxNil9LFg6ZnVuY3Rpb24obil7cmV0dXJuIG4udG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LGc6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b1ByZWNpc2lvbih0KX0sZTpmdW5jdGlvbihuLHQpe3JldHVybiBuLnRvRXhwb25lbnRpYWwodCl9LGY6ZnVuY3Rpb24obix0KXtyZXR1cm4gbi50b0ZpeGVkKHQpfSxyOmZ1bmN0aW9uKG4sdCl7cmV0dXJuKG49dGEucm91bmQobixSdChuLHQpKSkudG9GaXhlZChNYXRoLm1heCgwLE1hdGgubWluKDIwLFJ0KG4qKDErMWUtMTUpLHQpKSkpfX0pLGFjPXRhLnRpbWU9e30sY2M9RGF0ZTtqdC5wcm90b3R5cGU9e2dldERhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0RhdGUoKX0sZ2V0RGF5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENEYXkoKX0sZ2V0RnVsbFllYXI6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ0Z1bGxZZWFyKCl9LGdldEhvdXJzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENIb3VycygpfSxnZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFVUQ01pbGxpc2Vjb25kcygpfSxnZXRNaW51dGVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNaW51dGVzKCl9LGdldE1vbnRoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENNb250aCgpfSxnZXRTZWNvbmRzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuXy5nZXRVVENTZWNvbmRzKCl9LGdldFRpbWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fLmdldFRpbWUoKX0sZ2V0VGltZXpvbmVPZmZzZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl8udmFsdWVPZigpfSxzZXREYXRlOmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF0ZS5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0RGF5OmZ1bmN0aW9uKCl7bGMuc2V0VVRDRGF5LmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRGdWxsWWVhcjpmdW5jdGlvbigpe2xjLnNldFVUQ0Z1bGxZZWFyLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRIb3VyczpmdW5jdGlvbigpe2xjLnNldFVUQ0hvdXJzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNaWxsaXNlY29uZHM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaWxsaXNlY29uZHMuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9LHNldE1pbnV0ZXM6ZnVuY3Rpb24oKXtsYy5zZXRVVENNaW51dGVzLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRNb250aDpmdW5jdGlvbigpe2xjLnNldFVUQ01vbnRoLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpfSxzZXRTZWNvbmRzOmZ1bmN0aW9uKCl7bGMuc2V0VVRDU2Vjb25kcy5hcHBseSh0aGlzLl8sYXJndW1lbnRzKX0sc2V0VGltZTpmdW5jdGlvbigpe2xjLnNldFRpbWUuYXBwbHkodGhpcy5fLGFyZ3VtZW50cyl9fTt2YXIgbGM9RGF0ZS5wcm90b3R5cGU7YWMueWVhcj1GdChmdW5jdGlvbihuKXtyZXR1cm4gbj1hYy5kYXkobiksbi5zZXRNb250aCgwLDEpLG59LGZ1bmN0aW9uKG4sdCl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrdCl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldEZ1bGxZZWFyKCl9KSxhYy55ZWFycz1hYy55ZWFyLnJhbmdlLGFjLnllYXJzLnV0Yz1hYy55ZWFyLnV0Yy5yYW5nZSxhYy5kYXk9RnQoZnVuY3Rpb24obil7dmFyIHQ9bmV3IGNjKDJlMywwKTtyZXR1cm4gdC5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCksbi5nZXRNb250aCgpLG4uZ2V0RGF0ZSgpKSx0fSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSt0KX0sZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF0ZSgpLTF9KSxhYy5kYXlzPWFjLmRheS5yYW5nZSxhYy5kYXlzLnV0Yz1hYy5kYXkudXRjLnJhbmdlLGFjLmRheU9mWWVhcj1mdW5jdGlvbihuKXt2YXIgdD1hYy55ZWFyKG4pO3JldHVybiBNYXRoLmZsb29yKChuLXQtNmU0KihuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvODY0ZTUpfSxbInN1bmRheSIsIm1vbmRheSIsInR1ZXNkYXkiLCJ3ZWRuZXNkYXkiLCJ0aHVyc2RheSIsImZyaWRheSIsInNhdHVyZGF5Il0uZm9yRWFjaChmdW5jdGlvbihuLHQpe3Q9Ny10O3ZhciBlPWFjW25dPUZ0KGZ1bmN0aW9uKG4pe3JldHVybihuPWFjLmRheShuKSkuc2V0RGF0ZShuLmdldERhdGUoKS0obi5nZXREYXkoKSt0KSU3KSxufSxmdW5jdGlvbihuLHQpe24uc2V0RGF0ZShuLmdldERhdGUoKSs3Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXt2YXIgZT1hYy55ZWFyKG4pLmdldERheSgpO3JldHVybiBNYXRoLmZsb29yKChhYy5kYXlPZlllYXIobikrKGUrdCklNykvNyktKGUhPT10KX0pO2FjW24rInMiXT1lLnJhbmdlLGFjW24rInMiXS51dGM9ZS51dGMucmFuZ2UsYWNbbisiT2ZZZWFyIl09ZnVuY3Rpb24obil7dmFyIGU9YWMueWVhcihuKS5nZXREYXkoKTtyZXR1cm4gTWF0aC5mbG9vcigoYWMuZGF5T2ZZZWFyKG4pKyhlK3QpJTcpLzcpfX0pLGFjLndlZWs9YWMuc3VuZGF5LGFjLndlZWtzPWFjLnN1bmRheS5yYW5nZSxhYy53ZWVrcy51dGM9YWMuc3VuZGF5LnV0Yy5yYW5nZSxhYy53ZWVrT2ZZZWFyPWFjLnN1bmRheU9mWWVhcjt2YXIgc2M9eyItIjoiIixfOiIgIiwwOiIwIn0sZmM9L15ccypcZCsvLGhjPS9eJS87dGEubG9jYWxlPWZ1bmN0aW9uKG4pe3JldHVybntudW1iZXJGb3JtYXQ6UHQobiksdGltZUZvcm1hdDpPdChuKX19O3ZhciBnYz10YS5sb2NhbGUoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLGRhdGVUaW1lOiIlYSAlYiAlZSAlWCAlWSIsZGF0ZToiJW0vJWQvJVkiLHRpbWU6IiVIOiVNOiVTIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3RhLmZvcm1hdD1nYy5udW1iZXJGb3JtYXQsdGEuZ2VvPXt9LGNlLnByb3RvdHlwZT17czowLHQ6MCxhZGQ6ZnVuY3Rpb24obil7bGUobix0aGlzLnQscGMpLGxlKHBjLnMsdGhpcy5zLHRoaXMpLHRoaXMucz90aGlzLnQrPXBjLnQ6dGhpcy5zPXBjLnQKfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgcGM9bmV3IGNlO3RhLmdlby5zdHJlYW09ZnVuY3Rpb24obix0KXtuJiZ2Yy5oYXNPd25Qcm9wZXJ0eShuLnR5cGUpP3ZjW24udHlwZV0obix0KTpzZShuLHQpfTt2YXIgdmM9e0ZlYXR1cmU6ZnVuY3Rpb24obix0KXtzZShuLmdlb21ldHJ5LHQpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmZlYXR1cmVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspc2UoZVtyXS5nZW9tZXRyeSx0KX19LGRjPXtTcGhlcmU6ZnVuY3Rpb24obix0KXt0LnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbihuLHQpe249bi5jb29yZGluYXRlcyx0LnBvaW50KG5bMF0sblsxXSxuWzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspbj1lW3JdLHQucG9pbnQoblswXSxuWzFdLG5bMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKG4sdCl7ZmUobi5jb29yZGluYXRlcyx0LDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24obix0KXtmb3IodmFyIGU9bi5jb29yZGluYXRlcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KWZlKGVbcl0sdCwwKX0sUG9seWdvbjpmdW5jdGlvbihuLHQpe2hlKG4uY29vcmRpbmF0ZXMsdCl9LE11bHRpUG9seWdvbjpmdW5jdGlvbihuLHQpe2Zvcih2YXIgZT1uLmNvb3JkaW5hdGVzLHI9LTEsdT1lLmxlbmd0aDsrK3I8dTspaGUoZVtyXSx0KX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKG4sdCl7Zm9yKHZhciBlPW4uZ2VvbWV0cmllcyxyPS0xLHU9ZS5sZW5ndGg7KytyPHU7KXNlKGVbcl0sdCl9fTt0YS5nZW8uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gbWM9MCx0YS5nZW8uc3RyZWFtKG4sTWMpLG1jfTt2YXIgbWMseWM9bmV3IGNlLE1jPXtzcGhlcmU6ZnVuY3Rpb24oKXttYys9NCpxYX0scG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eWMucmVzZXQoKSxNYy5saW5lU3RhcnQ9Z2V9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt2YXIgbj0yKnljO21jKz0wPm4/NCpxYStuOm4sTWMubGluZVN0YXJ0PU1jLmxpbmVFbmQ9TWMucG9pbnQ9Yn19O3RhLmdlby5ib3VuZHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdCl7TS5wdXNoKHg9W3M9bixoPW5dKSxmPnQmJihmPXQpLHQ+ZyYmKGc9dCl9ZnVuY3Rpb24gdCh0LGUpe3ZhciByPXBlKFt0KkRhLGUqRGFdKTtpZihtKXt2YXIgdT1kZShtLHIpLGk9W3VbMV0sLXVbMF0sMF0sbz1kZShpLHUpO01lKG8pLG89eGUobyk7dmFyIGM9dC1wLGw9Yz4wPzE6LTEsdj1vWzBdKlBhKmwsZD1nYShjKT4xODA7aWYoZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9b1sxXSpQYTt5PmcmJihnPXkpfWVsc2UgaWYodj0odiszNjApJTM2MC0xODAsZF4odj5sKnAmJmwqdD52KSl7dmFyIHk9LW9bMV0qUGE7Zj55JiYoZj15KX1lbHNlIGY+ZSYmKGY9ZSksZT5nJiYoZz1lKTtkP3A+dD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KTpoPj1zPyhzPnQmJihzPXQpLHQ+aCYmKGg9dCkpOnQ+cD9hKHMsdCk+YShzLGgpJiYoaD10KTphKHQsaCk+YShzLGgpJiYocz10KX1lbHNlIG4odCxlKTttPXIscD10fWZ1bmN0aW9uIGUoKXtiLnBvaW50PXR9ZnVuY3Rpb24gcigpe3hbMF09cyx4WzFdPWgsYi5wb2ludD1uLG09bnVsbH1mdW5jdGlvbiB1KG4sZSl7aWYobSl7dmFyIHI9bi1wO3krPWdhKHIpPjE4MD9yKyhyPjA/MzYwOi0zNjApOnJ9ZWxzZSB2PW4sZD1lO01jLnBvaW50KG4sZSksdChuLGUpfWZ1bmN0aW9uIGkoKXtNYy5saW5lU3RhcnQoKX1mdW5jdGlvbiBvKCl7dSh2LGQpLE1jLmxpbmVFbmQoKSxnYSh5KT5DYSYmKHM9LShoPTE4MCkpLHhbMF09cyx4WzFdPWgsbT1udWxsfWZ1bmN0aW9uIGEobix0KXtyZXR1cm4odC09bik8MD90KzM2MDp0fWZ1bmN0aW9uIGMobix0KXtyZXR1cm4gblswXS10WzBdfWZ1bmN0aW9uIGwobix0KXtyZXR1cm4gdFswXTw9dFsxXT90WzBdPD1uJiZuPD10WzFdOm48dFswXXx8dFsxXTxufXZhciBzLGYsaCxnLHAsdixkLG0seSxNLHgsYj17cG9pbnQ6bixsaW5lU3RhcnQ6ZSxsaW5lRW5kOnIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Yi5wb2ludD11LGIubGluZVN0YXJ0PWksYi5saW5lRW5kPW8seT0wLE1jLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7TWMucG9seWdvbkVuZCgpLGIucG9pbnQ9bixiLmxpbmVTdGFydD1lLGIubGluZUVuZD1yLDA+eWM/KHM9LShoPTE4MCksZj0tKGc9OTApKTp5PkNhP2c9OTA6LUNhPnkmJihmPS05MCkseFswXT1zLHhbMV09aH19O3JldHVybiBmdW5jdGlvbihuKXtnPWg9LShzPWY9MS8wKSxNPVtdLHRhLmdlby5zdHJlYW0obixiKTt2YXIgdD1NLmxlbmd0aDtpZih0KXtNLnNvcnQoYyk7Zm9yKHZhciBlLHI9MSx1PU1bMF0saT1bdV07dD5yOysrcillPU1bcl0sbChlWzBdLHUpfHxsKGVbMV0sdSk/KGEodVswXSxlWzFdKT5hKHVbMF0sdVsxXSkmJih1WzFdPWVbMV0pLGEoZVswXSx1WzFdKT5hKHVbMF0sdVsxXSkmJih1WzBdPWVbMF0pKTppLnB1c2godT1lKTtmb3IodmFyIG8sZSxwPS0xLzAsdD1pLmxlbmd0aC0xLHI9MCx1PWlbdF07dD49cjt1PWUsKytyKWU9aVtyXSwobz1hKHVbMV0sZVswXSkpPnAmJihwPW8scz1lWzBdLGg9dVsxXSl9cmV0dXJuIE09eD1udWxsLDEvMD09PXN8fDEvMD09PWY/W1swLzAsMC8wXSxbMC8wLDAvMF1dOltbcyxmXSxbaCxnXV19fSgpLHRhLmdlby5jZW50cm9pZD1mdW5jdGlvbihuKXt4Yz1iYz1fYz13Yz1TYz1rYz1FYz1BYz1OYz1DYz16Yz0wLHRhLmdlby5zdHJlYW0obixxYyk7dmFyIHQ9TmMsZT1DYyxyPXpjLHU9dCp0K2UqZStyKnI7cmV0dXJuIHphPnUmJih0PWtjLGU9RWMscj1BYyxDYT5iYyYmKHQ9X2MsZT13YyxyPVNjKSx1PXQqdCtlKmUrcipyLHphPnUpP1swLzAsMC8wXTpbTWF0aC5hdGFuMihlLHQpKlBhLHR0KHIvTWF0aC5zcXJ0KHUpKSpQYV19O3ZhciB4YyxiYyxfYyx3YyxTYyxrYyxFYyxBYyxOYyxDYyx6YyxxYz17c3BoZXJlOmIscG9pbnQ6X2UsbGluZVN0YXJ0OlNlLGxpbmVFbmQ6a2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cWMubGluZVN0YXJ0PUVlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7cWMubGluZVN0YXJ0PVNlfX0sTGM9TGUoTmUsUGUsamUsWy1xYSwtcWEvMl0pLFRjPTFlOTt0YS5nZW8uY2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciBuLHQsZSxyLHUsaSxvPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHUmJih1LnZhbGlkPSExKSx1PWkobiksdS52YWxpZD0hMCx1fSxleHRlbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9SWUobj0rYVswXVswXSx0PSthWzBdWzFdLGU9K2FbMV1bMF0scj0rYVsxXVsxXSksdSYmKHUudmFsaWQ9ITEsdT1udWxsKSxvKTpbW24sdF0sW2Uscl1dfX07cmV0dXJuIG8uZXh0ZW50KFtbMCwwXSxbOTYwLDUwMF1dKX0sKHRhLmdlby5jb25pY0VxdWFsQXJlYT1mdW5jdGlvbigpe3JldHVybiBZZShaZSl9KS5yYXc9WmUsdGEuZ2VvLmFsYmVycz1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKX0sdGEuZ2VvLmFsYmVyc1VzYT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7dmFyIGk9blswXSxvPW5bMV07cmV0dXJuIHQ9bnVsbCxlKGksbyksdHx8KHIoaSxvKSx0KXx8dShpLG8pLHR9dmFyIHQsZSxyLHUsaT10YS5nZW8uYWxiZXJzKCksbz10YS5nZW8uY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGE9dGEuZ2VvLmNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKG4sZSl7dD1bbixlXX19O3JldHVybiBuLmludmVydD1mdW5jdGlvbihuKXt2YXIgdD1pLnNjYWxlKCksZT1pLnRyYW5zbGF0ZSgpLHI9KG5bMF0tZVswXSkvdCx1PShuWzFdLWVbMV0pL3Q7cmV0dXJuKHU+PS4xMiYmLjIzND51JiZyPj0tLjQyNSYmLS4yMTQ+cj9vOnU+PS4xNjYmJi4yMzQ+dSYmcj49LS4yMTQmJi0uMTE1PnI/YTppKS5pbnZlcnQobil9LG4uc3RyZWFtPWZ1bmN0aW9uKG4pe3ZhciB0PWkuc3RyZWFtKG4pLGU9by5zdHJlYW0obikscj1hLnN0cmVhbShuKTtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obix1KXt0LnBvaW50KG4sdSksZS5wb2ludChuLHUpLHIucG9pbnQobix1KX0sc3BoZXJlOmZ1bmN0aW9uKCl7dC5zcGhlcmUoKSxlLnNwaGVyZSgpLHIuc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3QubGluZVN0YXJ0KCksZS5saW5lU3RhcnQoKSxyLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dC5saW5lRW5kKCksZS5saW5lRW5kKCksci5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3QucG9seWdvblN0YXJ0KCksZS5wb2x5Z29uU3RhcnQoKSxyLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dC5wb2x5Z29uRW5kKCksZS5wb2x5Z29uRW5kKCksci5wb2x5Z29uRW5kKCl9fX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkucHJlY2lzaW9uKHQpLG8ucHJlY2lzaW9uKHQpLGEucHJlY2lzaW9uKHQpLG4pOmkucHJlY2lzaW9uKCl9LG4uc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkuc2NhbGUodCksby5zY2FsZSguMzUqdCksYS5zY2FsZSh0KSxuLnRyYW5zbGF0ZShpLnRyYW5zbGF0ZSgpKSk6aS5zY2FsZSgpfSxuLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gaS50cmFuc2xhdGUoKTt2YXIgbD1pLnNjYWxlKCkscz0rdFswXSxmPSt0WzFdO3JldHVybiBlPWkudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tzLS40NTUqbCxmLS4yMzgqbF0sW3MrLjQ1NSpsLGYrLjIzOCpsXV0pLnN0cmVhbShjKS5wb2ludCxyPW8udHJhbnNsYXRlKFtzLS4zMDcqbCxmKy4yMDEqbF0pLmNsaXBFeHRlbnQoW1tzLS40MjUqbCtDYSxmKy4xMipsK0NhXSxbcy0uMjE0KmwtQ2EsZisuMjM0KmwtQ2FdXSkuc3RyZWFtKGMpLnBvaW50LHU9YS50cmFuc2xhdGUoW3MtLjIwNSpsLGYrLjIxMipsXSkuY2xpcEV4dGVudChbW3MtLjIxNCpsK0NhLGYrLjE2NipsK0NhXSxbcy0uMTE1KmwtQ2EsZisuMjM0KmwtQ2FdXSkuc3RyZWFtKGMpLnBvaW50LG59LG4uc2NhbGUoMTA3MCl9O3ZhciBSYyxEYyxQYyxVYyxqYyxGYyxIYz17cG9pbnQ6YixsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7RGM9MCxIYy5saW5lU3RhcnQ9VmV9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtIYy5saW5lU3RhcnQ9SGMubGluZUVuZD1IYy5wb2ludD1iLFJjKz1nYShEYy8yKX19LE9jPXtwb2ludDpYZSxsaW5lU3RhcnQ6YixsaW5lRW5kOmIscG9seWdvblN0YXJ0OmIscG9seWdvbkVuZDpifSxJYz17cG9pbnQ6V2UsbGluZVN0YXJ0OkplLGxpbmVFbmQ6R2UscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7SWMubGluZVN0YXJ0PUtlfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7SWMucG9pbnQ9V2UsSWMubGluZVN0YXJ0PUplLEljLmxpbmVFbmQ9R2V9fTt0YS5nZW8ucGF0aD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obil7cmV0dXJuIG4mJigiZnVuY3Rpb24iPT10eXBlb2YgYSYmaS5wb2ludFJhZGl1cygrYS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLG8mJm8udmFsaWR8fChvPXUoaSkpLHRhLmdlby5zdHJlYW0obixvKSksaS5yZXN1bHQoKX1mdW5jdGlvbiB0KCl7cmV0dXJuIG89bnVsbCxufXZhciBlLHIsdSxpLG8sYT00LjU7cmV0dXJuIG4uYXJlYT1mdW5jdGlvbihuKXtyZXR1cm4gUmM9MCx0YS5nZW8uc3RyZWFtKG4sdShIYykpLFJjfSxuLmNlbnRyb2lkPWZ1bmN0aW9uKG4pe3JldHVybiBfYz13Yz1TYz1rYz1FYz1BYz1OYz1DYz16Yz0wLHRhLmdlby5zdHJlYW0obix1KEljKSksemM/W05jL3pjLENjL3pjXTpBYz9ba2MvQWMsRWMvQWNdOlNjP1tfYy9TYyx3Yy9TY106WzAvMCwwLzBdfSxuLmJvdW5kcz1mdW5jdGlvbihuKXtyZXR1cm4gamM9RmM9LShQYz1VYz0xLzApLHRhLmdlby5zdHJlYW0obix1KE9jKSksW1tQYyxVY10sW2pjLEZjXV19LG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT0oZT1uKT9uLnN0cmVhbXx8dHIobik6eSx0KCkpOmV9LG4uY29udGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT0ocj1uKT9uZXcgJGU6bmV3IFFlKG4pLCJmdW5jdGlvbiIhPXR5cGVvZiBhJiZpLnBvaW50UmFkaXVzKGEpLHQoKSk6cn0sbi5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbik6YX0sbi5wcm9qZWN0aW9uKHRhLmdlby5hbGJlcnNVc2EoKSkuY29udGV4dChudWxsKX0sdGEuZ2VvLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtyZXR1cm57c3RyZWFtOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBlcih0KTtmb3IodmFyIHIgaW4gbillW3JdPW5bcl07cmV0dXJuIGV9fX0sZXIucHJvdG90eXBlPXtwb2ludDpmdW5jdGlvbihuLHQpe3RoaXMuc3RyZWFtLnBvaW50KG4sdCl9LHNwaGVyZTpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCl9fSx0YS5nZW8ucHJvamVjdGlvbj11cix0YS5nZW8ucHJvamVjdGlvbk11dGF0b3I9aXIsKHRhLmdlby5lcXVpcmVjdGFuZ3VsYXI9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoYXIpfSkucmF3PWFyLmludmVydD1hcix0YS5nZW8ucm90YXRpb249ZnVuY3Rpb24obil7ZnVuY3Rpb24gdCh0KXtyZXR1cm4gdD1uKHRbMF0qRGEsdFsxXSpEYSksdFswXSo9UGEsdFsxXSo9UGEsdH1yZXR1cm4gbj1scihuWzBdJTM2MCpEYSxuWzFdKkRhLG4ubGVuZ3RoPjI/blsyXSpEYTowKSx0LmludmVydD1mdW5jdGlvbih0KXtyZXR1cm4gdD1uLmludmVydCh0WzBdKkRhLHRbMV0qRGEpLHRbMF0qPVBhLHRbMV0qPVBhLHR9LHR9LGNyLmludmVydD1hcix0YS5nZW8uY2lyY2xlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiByP3IuYXBwbHkodGhpcyxhcmd1bWVudHMpOnIsdD1scigtblswXSpEYSwtblsxXSpEYSwwKS5pbnZlcnQsdT1bXTtyZXR1cm4gZShudWxsLG51bGwsMSx7cG9pbnQ6ZnVuY3Rpb24obixlKXt1LnB1c2gobj10KG4sZSkpLG5bMF0qPVBhLG5bMV0qPVBhfX0pLHt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdV19fXZhciB0LGUscj1bMCwwXSx1PTY7cmV0dXJuIG4ub3JpZ2luPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5hbmdsZT1mdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1ncigodD0rcikqRGEsdSpEYSksbik6dH0sbi5wcmVjaXNpb249ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9Z3IodCpEYSwodT0rcikqRGEpLG4pOnV9LG4uYW5nbGUoOTApfSx0YS5nZW8uZGlzdGFuY2U9ZnVuY3Rpb24obix0KXt2YXIgZSxyPSh0WzBdLW5bMF0pKkRhLHU9blsxXSpEYSxpPXRbMV0qRGEsbz1NYXRoLnNpbihyKSxhPU1hdGguY29zKHIpLGM9TWF0aC5zaW4odSksbD1NYXRoLmNvcyh1KSxzPU1hdGguc2luKGkpLGY9TWF0aC5jb3MoaSk7cmV0dXJuIE1hdGguYXRhbjIoTWF0aC5zcXJ0KChlPWYqbykqZSsoZT1sKnMtYypmKmEpKmUpLGMqcytsKmYqYSl9LHRhLmdlby5ncmF0aWN1bGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6dCgpfX1mdW5jdGlvbiB0KCl7cmV0dXJuIHRhLnJhbmdlKE1hdGguY2VpbChpL2QpKmQsdSxkKS5tYXAoaCkuY29uY2F0KHRhLnJhbmdlKE1hdGguY2VpbChsL20pKm0sYyxtKS5tYXAoZykpLmNvbmNhdCh0YS5yYW5nZShNYXRoLmNlaWwoci9wKSpwLGUscCkuZmlsdGVyKGZ1bmN0aW9uKG4pe3JldHVybiBnYShuJWQpPkNhfSkubWFwKHMpKS5jb25jYXQodGEucmFuZ2UoTWF0aC5jZWlsKGEvdikqdixvLHYpLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gZ2EobiVtKT5DYX0pLm1hcChmKSl9dmFyIGUscix1LGksbyxhLGMsbCxzLGYsaCxnLHA9MTAsdj1wLGQ9OTAsbT0zNjAseT0yLjU7cmV0dXJuIG4ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLm1hcChmdW5jdGlvbihuKXtyZXR1cm57dHlwZToiTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6bn19KX0sbi5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOltoKGkpLmNvbmNhdChnKGMpLnNsaWNlKDEpLGgodSkucmV2ZXJzZSgpLnNsaWNlKDEpLGcobCkucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxuLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yRXh0ZW50KHQpLm1pbm9yRXh0ZW50KHQpOm4ubWlub3JFeHRlbnQoKX0sbi5tYWpvckV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdFswXVswXSx1PSt0WzFdWzBdLGw9K3RbMF1bMV0sYz0rdFsxXVsxXSxpPnUmJih0PWksaT11LHU9dCksbD5jJiYodD1sLGw9YyxjPXQpLG4ucHJlY2lzaW9uKHkpKTpbW2ksbF0sW3UsY11dfSxuLm1pbm9yRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sYT0rdFswXVsxXSxvPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSxhPm8mJih0PWEsYT1vLG89dCksbi5wcmVjaXNpb24oeSkpOltbcixhXSxbZSxvXV19LG4uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uLm1ham9yU3RlcCh0KS5taW5vclN0ZXAodCk6bi5taW5vclN0ZXAoKX0sbi5tYWpvclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0sbT0rdFsxXSxuKTpbZCxtXX0sbi5taW5vclN0ZXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9K3RbMF0sdj0rdFsxXSxuKTpbcCx2XX0sbi5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHk9K3Qscz12cihhLG8sOTApLGY9ZHIocixlLHkpLGg9dnIobCxjLDkwKSxnPWRyKGksdSx5KSxuKTp5fSxuLm1ham9yRXh0ZW50KFtbLTE4MCwtOTArQ2FdLFsxODAsOTAtQ2FdXSkubWlub3JFeHRlbnQoW1stMTgwLC04MC1DYV0sWzE4MCw4MCtDYV1dKX0sdGEuZ2VvLmdyZWF0QXJjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbigpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpbdHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cyldfX12YXIgdCxlLHI9bXIsdT15cjtyZXR1cm4gbi5kaXN0YW5jZT1mdW5jdGlvbigpe3JldHVybiB0YS5nZW8uZGlzdGFuY2UodHx8ci5hcHBseSh0aGlzLGFyZ3VtZW50cyksZXx8dS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxuLnNvdXJjZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj1lLHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/bnVsbDplLG4pOnJ9LG4udGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZT0iZnVuY3Rpb24iPT10eXBlb2YgdD9udWxsOnQsbik6dX0sbi5wcmVjaXNpb249ZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uOjB9LG59LHRhLmdlby5pbnRlcnBvbGF0ZT1mdW5jdGlvbihuLHQpe3JldHVybiBNcihuWzBdKkRhLG5bMV0qRGEsdFswXSpEYSx0WzFdKkRhKX0sdGEuZ2VvLmxlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gWWM9MCx0YS5nZW8uc3RyZWFtKG4sWmMpLFljfTt2YXIgWWMsWmM9e3NwaGVyZTpiLHBvaW50OmIsbGluZVN0YXJ0OnhyLGxpbmVFbmQ6Yixwb2x5Z29uU3RhcnQ6Yixwb2x5Z29uRW5kOmJ9LFZjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnNxcnQoMi8oMStuKSl9LGZ1bmN0aW9uKG4pe3JldHVybiAyKk1hdGguYXNpbihuLzIpfSk7KHRhLmdlby5hemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoVmMpfSkucmF3PVZjO3ZhciBYYz1icihmdW5jdGlvbihuKXt2YXIgdD1NYXRoLmFjb3Mobik7cmV0dXJuIHQmJnQvTWF0aC5zaW4odCl9LHkpOyh0YS5nZW8uYXppbXV0aGFsRXF1aWRpc3RhbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoWGMpfSkucmF3PVhjLCh0YS5nZW8uY29uaWNDb25mb3JtYWw9ZnVuY3Rpb24oKXtyZXR1cm4gWWUoX3IpfSkucmF3PV9yLCh0YS5nZW8uY29uaWNFcXVpZGlzdGFudD1mdW5jdGlvbigpe3JldHVybiBZZSh3cil9KS5yYXc9d3I7dmFyICRjPWJyKGZ1bmN0aW9uKG4pe3JldHVybiAxL259LE1hdGguYXRhbik7KHRhLmdlby5nbm9tb25pYz1mdW5jdGlvbigpe3JldHVybiB1cigkYyl9KS5yYXc9JGMsU3IuaW52ZXJ0PWZ1bmN0aW9uKG4sdCl7cmV0dXJuW24sMipNYXRoLmF0YW4oTWF0aC5leHAodCkpLVJhXX0sKHRhLmdlby5tZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBrcihTcil9KS5yYXc9U3I7dmFyIEJjPWJyKGZ1bmN0aW9uKCl7cmV0dXJuIDF9LE1hdGguYXNpbik7KHRhLmdlby5vcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gdXIoQmMpfSkucmF3PUJjO3ZhciBXYz1icihmdW5jdGlvbihuKXtyZXR1cm4gMS8oMStuKX0sZnVuY3Rpb24obil7cmV0dXJuIDIqTWF0aC5hdGFuKG4pfSk7KHRhLmdlby5zdGVyZW9ncmFwaGljPWZ1bmN0aW9uKCl7cmV0dXJuIHVyKFdjKX0pLnJhdz1XYyxFci5pbnZlcnQ9ZnVuY3Rpb24obix0KXtyZXR1cm5bLXQsMipNYXRoLmF0YW4oTWF0aC5leHAobikpLVJhXX0sKHRhLmdlby50cmFuc3ZlcnNlTWVyY2F0b3I9ZnVuY3Rpb24oKXt2YXIgbj1rcihFciksdD1uLmNlbnRlcixlPW4ucm90YXRlO3JldHVybiBuLmNlbnRlcj1mdW5jdGlvbihuKXtyZXR1cm4gbj90KFstblsxXSxuWzBdXSk6KG49dCgpLFtuWzFdLC1uWzBdXSl9LG4ucm90YXRlPWZ1bmN0aW9uKG4pe3JldHVybiBuP2UoW25bMF0sblsxXSxuLmxlbmd0aD4yP25bMl0rOTA6OTBdKToobj1lKCksW25bMF0sblsxXSxuWzJdLTkwXSl9LGUoWzAsMCw5MF0pfSkucmF3PUVyLHRhLmdlb209e30sdGEuZ2VvbS5odWxsPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHQobil7aWYobi5sZW5ndGg8MylyZXR1cm5bXTt2YXIgdCx1PUV0KGUpLGk9RXQociksbz1uLmxlbmd0aCxhPVtdLGM9W107Zm9yKHQ9MDtvPnQ7dCsrKWEucHVzaChbK3UuY2FsbCh0aGlzLG5bdF0sdCksK2kuY2FsbCh0aGlzLG5bdF0sdCksdF0pO2ZvcihhLnNvcnQoenIpLHQ9MDtvPnQ7dCsrKWMucHVzaChbYVt0XVswXSwtYVt0XVsxXV0pO3ZhciBsPUNyKGEpLHM9Q3IoYyksZj1zWzBdPT09bFswXSxoPXNbcy5sZW5ndGgtMV09PT1sW2wubGVuZ3RoLTFdLGc9W107Zm9yKHQ9bC5sZW5ndGgtMTt0Pj0wOy0tdClnLnB1c2goblthW2xbdF1dWzJdXSk7Zm9yKHQ9K2Y7dDxzLmxlbmd0aC1oOysrdClnLnB1c2goblthW3NbdF1dWzJdXSk7cmV0dXJuIGd9dmFyIGU9QXIscj1OcjtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90KG4pOih0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bix0KTplfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bix0KTpyfSx0KX0sdGEuZ2VvbS5wb2x5Z29uPWZ1bmN0aW9uKG4pe3JldHVybiB5YShuLEpjKSxufTt2YXIgSmM9dGEuZ2VvbS5wb2x5Z29uLnByb3RvdHlwZT1bXTtKYy5hcmVhPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9LTEsZT10aGlzLmxlbmd0aCxyPXRoaXNbZS0xXSx1PTA7Kyt0PGU7KW49cixyPXRoaXNbdF0sdSs9blsxXSpyWzBdLW5bMF0qclsxXTtyZXR1cm4uNSp1fSxKYy5jZW50cm9pZD1mdW5jdGlvbihuKXt2YXIgdCxlLHI9LTEsdT10aGlzLmxlbmd0aCxpPTAsbz0wLGE9dGhpc1t1LTFdO2Zvcihhcmd1bWVudHMubGVuZ3RofHwobj0tMS8oNip0aGlzLmFyZWEoKSkpOysrcjx1Oyl0PWEsYT10aGlzW3JdLGU9dFswXSphWzFdLWFbMF0qdFsxXSxpKz0odFswXSthWzBdKSplLG8rPSh0WzFdK2FbMV0pKmU7cmV0dXJuW2kqbixvKm5dfSxKYy5jbGlwPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHIsdSxpLG8sYT1UcihuKSxjPS0xLGw9dGhpcy5sZW5ndGgtVHIodGhpcykscz10aGlzW2wtMV07KytjPGw7KXtmb3IodD1uLnNsaWNlKCksbi5sZW5ndGg9MCx1PXRoaXNbY10saT10WyhyPXQubGVuZ3RoLWEpLTFdLGU9LTE7KytlPHI7KW89dFtlXSxxcihvLHMsdSk/KHFyKGkscyx1KXx8bi5wdXNoKExyKGksbyxzLHUpKSxuLnB1c2gobykpOnFyKGkscyx1KSYmbi5wdXNoKExyKGksbyxzLHUpKSxpPW87YSYmbi5wdXNoKG5bMF0pLHM9dX1yZXR1cm4gbn07dmFyIEdjLEtjLFFjLG5sLHRsLGVsPVtdLHJsPVtdO09yLnByb3RvdHlwZS5wcmVwYXJlPWZ1bmN0aW9uKCl7Zm9yKHZhciBuLHQ9dGhpcy5lZGdlcyxlPXQubGVuZ3RoO2UtLTspbj10W2VdLmVkZ2Usbi5iJiZuLmF8fHQuc3BsaWNlKGUsMSk7cmV0dXJuIHQuc29ydChZciksdC5sZW5ndGh9LFFyLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlLmw9PT10aGlzLnNpdGU/dGhpcy5lZGdlLmE6dGhpcy5lZGdlLmJ9LGVuZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2UubD09PXRoaXMuc2l0ZT90aGlzLmVkZ2UuYjp0aGlzLmVkZ2UuYX19LG51LnByb3RvdHlwZT17aW5zZXJ0OmZ1bmN0aW9uKG4sdCl7dmFyIGUscix1O2lmKG4pe2lmKHQuUD1uLHQuTj1uLk4sbi5OJiYobi5OLlA9dCksbi5OPXQsbi5SKXtmb3Iobj1uLlI7bi5MOyluPW4uTDtuLkw9dH1lbHNlIG4uUj10O2U9bn1lbHNlIHRoaXMuXz8obj11dSh0aGlzLl8pLHQuUD1udWxsLHQuTj1uLG4uUD1uLkw9dCxlPW4pOih0LlA9dC5OPW51bGwsdGhpcy5fPXQsZT1udWxsKTtmb3IodC5MPXQuUj1udWxsLHQuVT1lLHQuQz0hMCxuPXQ7ZSYmZS5DOylyPWUuVSxlPT09ci5MPyh1PXIuUix1JiZ1LkM/KGUuQz11LkM9ITEsci5DPSEwLG49cik6KG49PT1lLlImJihldSh0aGlzLGUpLG49ZSxlPW4uVSksZS5DPSExLHIuQz0hMCxydSh0aGlzLHIpKSk6KHU9ci5MLHUmJnUuQz8oZS5DPXUuQz0hMSxyLkM9ITAsbj1yKToobj09PWUuTCYmKHJ1KHRoaXMsZSksbj1lLGU9bi5VKSxlLkM9ITEsci5DPSEwLGV1KHRoaXMscikpKSxlPW4uVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKG4pe24uTiYmKG4uTi5QPW4uUCksbi5QJiYobi5QLk49bi5OKSxuLk49bi5QPW51bGw7dmFyIHQsZSxyLHU9bi5VLGk9bi5MLG89bi5SO2lmKGU9aT9vP3V1KG8pOmk6byx1P3UuTD09PW4/dS5MPWU6dS5SPWU6dGhpcy5fPWUsaSYmbz8ocj1lLkMsZS5DPW4uQyxlLkw9aSxpLlU9ZSxlIT09bz8odT1lLlUsZS5VPW4uVSxuPWUuUix1Lkw9bixlLlI9byxvLlU9ZSk6KGUuVT11LHU9ZSxuPWUuUikpOihyPW4uQyxuPWUpLG4mJihuLlU9dSksIXIpe2lmKG4mJm4uQylyZXR1cm4gdm9pZChuLkM9ITEpO2Rve2lmKG49PT10aGlzLl8pYnJlYWs7aWYobj09PXUuTCl7aWYodD11LlIsdC5DJiYodC5DPSExLHUuQz0hMCxldSh0aGlzLHUpLHQ9dS5SKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LlImJnQuUi5DfHwodC5MLkM9ITEsdC5DPSEwLHJ1KHRoaXMsdCksdD11LlIpLHQuQz11LkMsdS5DPXQuUi5DPSExLGV1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9fWVsc2UgaWYodD11LkwsdC5DJiYodC5DPSExLHUuQz0hMCxydSh0aGlzLHUpLHQ9dS5MKSx0LkwmJnQuTC5DfHx0LlImJnQuUi5DKXt0LkwmJnQuTC5DfHwodC5SLkM9ITEsdC5DPSEwLGV1KHRoaXMsdCksdD11LkwpLHQuQz11LkMsdS5DPXQuTC5DPSExLHJ1KHRoaXMsdSksbj10aGlzLl87YnJlYWt9dC5DPSEwLG49dSx1PXUuVX13aGlsZSghbi5DKTtuJiYobi5DPSExKX19fSx0YS5nZW9tLnZvcm9ub2k9ZnVuY3Rpb24obil7ZnVuY3Rpb24gdChuKXt2YXIgdD1uZXcgQXJyYXkobi5sZW5ndGgpLHI9YVswXVswXSx1PWFbMF1bMV0saT1hWzFdWzBdLG89YVsxXVsxXTtyZXR1cm4gaXUoZShuKSxhKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUsYSl7dmFyIGM9ZS5lZGdlcyxsPWUuc2l0ZSxzPXRbYV09Yy5sZW5ndGg/Yy5tYXAoZnVuY3Rpb24obil7dmFyIHQ9bi5zdGFydCgpO3JldHVyblt0LngsdC55XX0pOmwueD49ciYmbC54PD1pJiZsLnk+PXUmJmwueTw9bz9bW3Isb10sW2ksb10sW2ksdV0sW3IsdV1dOltdO3MucG9pbnQ9blthXX0pLHR9ZnVuY3Rpb24gZShuKXtyZXR1cm4gbi5tYXAoZnVuY3Rpb24obix0KXtyZXR1cm57eDpNYXRoLnJvdW5kKGkobix0KS9DYSkqQ2EseTpNYXRoLnJvdW5kKG8obix0KS9DYSkqQ2EsaTp0fX0pfXZhciByPUFyLHU9TnIsaT1yLG89dSxhPXVsO3JldHVybiBuP3Qobik6KHQubGlua3M9ZnVuY3Rpb24obil7cmV0dXJuIGl1KGUobikpLmVkZ2VzLmZpbHRlcihmdW5jdGlvbihuKXtyZXR1cm4gbi5sJiZuLnJ9KS5tYXAoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTpuW3QubC5pXSx0YXJnZXQ6blt0LnIuaV19fSl9LHQudHJpYW5nbGVzPWZ1bmN0aW9uKG4pe3ZhciB0PVtdO3JldHVybiBpdShlKG4pKS5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGUscil7Zm9yKHZhciB1LGksbz1lLnNpdGUsYT1lLmVkZ2VzLnNvcnQoWXIpLGM9LTEsbD1hLmxlbmd0aCxzPWFbbC0xXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sOysrYzxsOyl1PXMsaT1mLHM9YVtjXS5lZGdlLGY9cy5sPT09bz9zLnI6cy5sLHI8aS5pJiZyPGYuaSYmYXUobyxpLGYpPDAmJnQucHVzaChbbltyXSxuW2kuaV0sbltmLmldXSl9KSx0fSx0Lng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9RXQocj1uKSx0KTpyfSx0Lnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89RXQodT1uKSx0KTp1fSx0LmNsaXBFeHRlbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bnVsbD09bj91bDpuLHQpOmE9PT11bD9udWxsOmF9LHQuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90LmNsaXBFeHRlbnQobiYmW1swLDBdLG5dKTphPT09dWw/bnVsbDphJiZhWzFdfSx0KX07dmFyIHVsPVtbLTFlNiwtMWU2XSxbMWU2LDFlNl1dO3RhLmdlb20uZGVsYXVuYXk9ZnVuY3Rpb24obil7cmV0dXJuIHRhLmdlb20udm9yb25vaSgpLnRyaWFuZ2xlcyhuKX0sdGEuZ2VvbS5xdWFkdHJlZT1mdW5jdGlvbihuLHQsZSxyLHUpe2Z1bmN0aW9uIGkobil7ZnVuY3Rpb24gaShuLHQsZSxyLHUsaSxvLGEpe2lmKCFpc05hTihlKSYmIWlzTmFOKHIpKWlmKG4ubGVhZil7dmFyIGM9bi54LHM9bi55O2lmKG51bGwhPWMpaWYoZ2EoYy1lKStnYShzLXIpPC4wMSlsKG4sdCxlLHIsdSxpLG8sYSk7ZWxzZXt2YXIgZj1uLnBvaW50O24ueD1uLnk9bi5wb2ludD1udWxsLGwobixmLGMscyx1LGksbyxhKSxsKG4sdCxlLHIsdSxpLG8sYSl9ZWxzZSBuLng9ZSxuLnk9cixuLnBvaW50PXR9ZWxzZSBsKG4sdCxlLHIsdSxpLG8sYSl9ZnVuY3Rpb24gbChuLHQsZSxyLHUsbyxhLGMpe3ZhciBsPS41Kih1K2EpLHM9LjUqKG8rYyksZj1lPj1sLGg9cj49cyxnPWg8PDF8ZjtuLmxlYWY9ITEsbj1uLm5vZGVzW2ddfHwobi5ub2Rlc1tnXT1zdSgpKSxmP3U9bDphPWwsaD9vPXM6Yz1zLGkobix0LGUscix1LG8sYSxjKX12YXIgcyxmLGgsZyxwLHYsZCxtLHksTT1FdChhKSx4PUV0KGMpO2lmKG51bGwhPXQpdj10LGQ9ZSxtPXIseT11O2Vsc2UgaWYobT15PS0odj1kPTEvMCksZj1bXSxoPVtdLHA9bi5sZW5ndGgsbylmb3IoZz0wO3A+ZzsrK2cpcz1uW2ddLHMueDx2JiYodj1zLngpLHMueTxkJiYoZD1zLnkpLHMueD5tJiYobT1zLngpLHMueT55JiYoeT1zLnkpLGYucHVzaChzLngpLGgucHVzaChzLnkpO2Vsc2UgZm9yKGc9MDtwPmc7KytnKXt2YXIgYj0rTShzPW5bZ10sZyksXz0reChzLGcpO3Y+YiYmKHY9YiksZD5fJiYoZD1fKSxiPm0mJihtPWIpLF8+eSYmKHk9XyksZi5wdXNoKGIpLGgucHVzaChfKX12YXIgdz1tLXYsUz15LWQ7dz5TP3k9ZCt3Om09ditTO3ZhciBrPXN1KCk7aWYoay5hZGQ9ZnVuY3Rpb24obil7aShrLG4sK00obiwrK2cpLCt4KG4sZyksdixkLG0seSl9LGsudmlzaXQ9ZnVuY3Rpb24obil7ZnUobixrLHYsZCxtLHkpfSxrLmZpbmQ9ZnVuY3Rpb24obil7cmV0dXJuIGh1KGssblswXSxuWzFdLHYsZCxtLHkpfSxnPS0xLG51bGw9PXQpe2Zvcig7KytnPHA7KWkoayxuW2ddLGZbZ10saFtnXSx2LGQsbSx5KTstLWd9ZWxzZSBuLmZvckVhY2goay5hZGQpO3JldHVybiBmPWg9bj1zPW51bGwsa312YXIgbyxhPUFyLGM9TnI7cmV0dXJuKG89YXJndW1lbnRzLmxlbmd0aCk/KGE9Y3UsYz1sdSwzPT09byYmKHU9ZSxyPXQsZT10PTApLGkobikpOihpLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixpKTphfSxpLnk9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bixpKTpjfSxpLmV4dGVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09bj90PWU9cj11PW51bGw6KHQ9K25bMF1bMF0sZT0rblswXVsxXSxyPStuWzFdWzBdLHU9K25bMV1bMV0pLGkpOm51bGw9PXQ/bnVsbDpbW3QsZV0sW3IsdV1dfSxpLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PW4/dD1lPXI9dT1udWxsOih0PWU9MCxyPStuWzBdLHU9K25bMV0pLGkpOm51bGw9PXQ/bnVsbDpbci10LHUtZV19LGkpfSx0YS5pbnRlcnBvbGF0ZVJnYj1ndSx0YS5pbnRlcnBvbGF0ZU9iamVjdD1wdSx0YS5pbnRlcnBvbGF0ZU51bWJlcj12dSx0YS5pbnRlcnBvbGF0ZVN0cmluZz1kdTt2YXIgaWw9L1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLG9sPW5ldyBSZWdFeHAoaWwuc291cmNlLCJnIik7dGEuaW50ZXJwb2xhdGU9bXUsdGEuaW50ZXJwb2xhdG9ycz1bZnVuY3Rpb24obix0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4oInN0cmluZyI9PT1lP0dhLmhhcyh0LnRvTG93ZXJDYXNlKCkpfHwvXigjfHJnYlwofGhzbFwoKS9pLnRlc3QodCk/Z3U6ZHU6dCBpbnN0YW5jZW9mIG90P2d1OkFycmF5LmlzQXJyYXkodCk/eXU6Im9iamVjdCI9PT1lJiZpc05hTih0KT9wdTp2dSkobix0KX1dLHRhLmludGVycG9sYXRlQXJyYXk9eXU7dmFyIGFsPWZ1bmN0aW9uKCl7cmV0dXJuIHl9LGNsPXRhLm1hcCh7bGluZWFyOmFsLHBvbHk6a3UscXVhZDpmdW5jdGlvbigpe3JldHVybiBfdX0sY3ViaWM6ZnVuY3Rpb24oKXtyZXR1cm4gd3V9LHNpbjpmdW5jdGlvbigpe3JldHVybiBFdX0sZXhwOmZ1bmN0aW9uKCl7cmV0dXJuIEF1fSxjaXJjbGU6ZnVuY3Rpb24oKXtyZXR1cm4gTnV9LGVsYXN0aWM6Q3UsYmFjazp6dSxib3VuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gcXV9fSksbGw9dGEubWFwKHsiaW4iOnksb3V0Onh1LCJpbi1vdXQiOmJ1LCJvdXQtaW4iOmZ1bmN0aW9uKG4pe3JldHVybiBidSh4dShuKSl9fSk7dGEuZWFzZT1mdW5jdGlvbihuKXt2YXIgdD1uLmluZGV4T2YoIi0iKSxlPXQ+PTA/bi5zbGljZSgwLHQpOm4scj10Pj0wP24uc2xpY2UodCsxKToiaW4iO3JldHVybiBlPWNsLmdldChlKXx8YWwscj1sbC5nZXQocil8fHksTXUocihlLmFwcGx5KG51bGwsZWEuY2FsbChhcmd1bWVudHMsMSkpKSl9LHRhLmludGVycG9sYXRlSGNsPUx1LHRhLmludGVycG9sYXRlSHNsPVR1LHRhLmludGVycG9sYXRlTGFiPVJ1LHRhLmludGVycG9sYXRlUm91bmQ9RHUsdGEudHJhbnNmb3JtPWZ1bmN0aW9uKG4pe3ZhciB0PXVhLmNyZWF0ZUVsZW1lbnROUyh0YS5ucy5wcmVmaXguc3ZnLCJnIik7cmV0dXJuKHRhLnRyYW5zZm9ybT1mdW5jdGlvbihuKXtpZihudWxsIT1uKXt0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixuKTt2YXIgZT10LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCl9cmV0dXJuIG5ldyBQdShlP2UubWF0cml4OnNsKX0pKG4pfSxQdS5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4idHJhbnNsYXRlKCIrdGhpcy50cmFuc2xhdGUrIilyb3RhdGUoIit0aGlzLnJvdGF0ZSsiKXNrZXdYKCIrdGhpcy5za2V3KyIpc2NhbGUoIit0aGlzLnNjYWxlKyIpIn07dmFyIHNsPXthOjEsYjowLGM6MCxkOjEsZTowLGY6MH07dGEuaW50ZXJwb2xhdGVUcmFuc2Zvcm09SHUsdGEubGF5b3V0PXt9LHRhLmxheW91dC5idW5kbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obil7Zm9yKHZhciB0PVtdLGU9LTEscj1uLmxlbmd0aDsrK2U8cjspdC5wdXNoKFl1KG5bZV0pKTtyZXR1cm4gdH19LHRhLmxheW91dC5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4oKXt2YXIgbixsLGYsaCxnLHA9e30sdj1bXSxkPXRhLnJhbmdlKGkpLG09W107Zm9yKGU9W10scj1bXSxuPTAsaD0tMTsrK2g8aTspe2ZvcihsPTAsZz0tMTsrK2c8aTspbCs9dVtoXVtnXTt2LnB1c2gobCksbS5wdXNoKHRhLnJhbmdlKGkpKSxuKz1sfWZvcihvJiZkLnNvcnQoZnVuY3Rpb24obix0KXtyZXR1cm4gbyh2W25dLHZbdF0pfSksYSYmbS5mb3JFYWNoKGZ1bmN0aW9uKG4sdCl7bi5zb3J0KGZ1bmN0aW9uKG4sZSl7cmV0dXJuIGEodVt0XVtuXSx1W3RdW2VdKX0pfSksbj0oTGEtcyppKS9uLGw9MCxoPS0xOysraDxpOyl7Zm9yKGY9bCxnPS0xOysrZzxpOyl7dmFyIHk9ZFtoXSxNPW1beV1bZ10seD11W3ldW01dLGI9bCxfPWwrPXgqbjtwW3krIi0iK01dPXtpbmRleDp5LHN1YmluZGV4Ok0sc3RhcnRBbmdsZTpiLGVuZEFuZ2xlOl8sdmFsdWU6eH19clt5XT17aW5kZXg6eSxzdGFydEFuZ2xlOmYsZW5kQW5nbGU6bCx2YWx1ZToobC1mKS9ufSxsKz1zfWZvcihoPS0xOysraDxpOylmb3IoZz1oLTE7KytnPGk7KXt2YXIgdz1wW2grIi0iK2ddLFM9cFtnKyItIitoXTsody52YWx1ZXx8Uy52YWx1ZSkmJmUucHVzaCh3LnZhbHVlPFMudmFsdWU/e3NvdXJjZTpTLHRhcmdldDp3fTp7c291cmNlOncsdGFyZ2V0OlN9KX1jJiZ0KCl9ZnVuY3Rpb24gdCgpe2Uuc29ydChmdW5jdGlvbihuLHQpe3JldHVybiBjKChuLnNvdXJjZS52YWx1ZStuLnRhcmdldC52YWx1ZSkvMiwodC5zb3VyY2UudmFsdWUrdC50YXJnZXQudmFsdWUpLzIpfSl9dmFyIGUscix1LGksbyxhLGMsbD17fSxzPTA7cmV0dXJuIGwubWF0cml4PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSh1PW4pJiZ1Lmxlbmd0aCxlPXI9bnVsbCxsKTp1fSxsLnBhZGRpbmc9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bixlPXI9bnVsbCxsKTpzfSxsLnNvcnRHcm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bixlPXI9bnVsbCxsKTpvfSxsLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bixlPW51bGwsbCk6YX0sbC5zb3J0Q2hvcmRzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPW4sZSYmdCgpLGwpOmN9LGwuY2hvcmRzPWZ1bmN0aW9uKCl7cmV0dXJuIGV8fG4oKSxlfSxsLmdyb3Vwcz1mdW5jdGlvbigpe3JldHVybiByfHxuKCkscn0sbH0sdGEubGF5b3V0LmZvcmNlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gZnVuY3Rpb24odCxlLHIsdSl7aWYodC5wb2ludCE9PW4pe3ZhciBpPXQuY3gtbi54LG89dC5jeS1uLnksYT11LWUsYz1pKmkrbypvO2lmKGM+YSphL2Qpe2lmKHA+Yyl7dmFyIGw9dC5jaGFyZ2UvYztuLnB4LT1pKmwsbi5weS09bypsfXJldHVybiEwfWlmKHQucG9pbnQmJmMmJnA+Yyl7dmFyIGw9dC5wb2ludENoYXJnZS9jO24ucHgtPWkqbCxuLnB5LT1vKmx9fXJldHVybiF0LmNoYXJnZX19ZnVuY3Rpb24gdChuKXtuLnB4PXRhLmV2ZW50Lngsbi5weT10YS5ldmVudC55LGEucmVzdW1lKCl9dmFyIGUscix1LGksbyxhPXt9LGM9dGEuZGlzcGF0Y2goInN0YXJ0IiwidGljayIsImVuZCIpLGw9WzEsMV0scz0uOSxmPWZsLGg9aGwsZz0tMzAscD1nbCx2PS4xLGQ9LjY0LG09W10sTT1bXTtyZXR1cm4gYS50aWNrPWZ1bmN0aW9uKCl7aWYoKHIqPS45OSk8LjAwNSlyZXR1cm4gYy5lbmQoe3R5cGU6ImVuZCIsYWxwaGE6cj0wfSksITA7dmFyIHQsZSxhLGYsaCxwLGQseSx4LGI9bS5sZW5ndGgsXz1NLmxlbmd0aDtmb3IoZT0wO18+ZTsrK2UpYT1NW2VdLGY9YS5zb3VyY2UsaD1hLnRhcmdldCx5PWgueC1mLngseD1oLnktZi55LChwPXkqeSt4KngpJiYocD1yKmlbZV0qKChwPU1hdGguc3FydChwKSktdVtlXSkvcCx5Kj1wLHgqPXAsaC54LT15KihkPWYud2VpZ2h0LyhoLndlaWdodCtmLndlaWdodCkpLGgueS09eCpkLGYueCs9eSooZD0xLWQpLGYueSs9eCpkKTtpZigoZD1yKnYpJiYoeT1sWzBdLzIseD1sWzFdLzIsZT0tMSxkKSlmb3IoOysrZTxiOylhPW1bZV0sYS54Kz0oeS1hLngpKmQsYS55Kz0oeC1hLnkpKmQ7aWYoZylmb3IoSnUodD10YS5nZW9tLnF1YWR0cmVlKG0pLHIsbyksZT0tMTsrK2U8YjspKGE9bVtlXSkuZml4ZWR8fHQudmlzaXQobihhKSk7Zm9yKGU9LTE7KytlPGI7KWE9bVtlXSxhLmZpeGVkPyhhLng9YS5weCxhLnk9YS5weSk6KGEueC09KGEucHgtKGEucHg9YS54KSkqcyxhLnktPShhLnB5LShhLnB5PWEueSkpKnMpO2MudGljayh7dHlwZToidGljayIsYWxwaGE6cn0pfSxhLm5vZGVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhtPW4sYSk6bX0sYS5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT1uLGEpOk19LGEuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGEpOmx9LGEubGlua0Rpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246K24sYSk6Zn0sYS5kaXN0YW5jZT1hLmxpbmtEaXN0YW5jZSxhLmxpbmtTdHJlbmd0aD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOituLGEpOmh9LGEuZnJpY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K24sYSk6c30sYS5jaGFyZ2U9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjorbixhKTpnfSxhLmNoYXJnZURpc3RhbmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPW4qbixhKTpNYXRoLnNxcnQocCl9LGEuZ3Jhdml0eT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odj0rbixhKTp2fSxhLnRoZXRhPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhkPW4qbixhKTpNYXRoLnNxcnQoZCl9LGEuYWxwaGE9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K24scj9yPW4+MD9uOjA6bj4wJiYoYy5zdGFydCh7dHlwZToic3RhcnQiLGFscGhhOnI9bn0pLHRhLnRpbWVyKGEudGljaykpLGEpOnJ9LGEuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7aWYoIWUpe2ZvcihlPW5ldyBBcnJheShjKSxhPTA7Yz5hOysrYSllW2FdPVtdO2ZvcihhPTA7cz5hOysrYSl7dmFyIHU9TVthXTtlW3Uuc291cmNlLmluZGV4XS5wdXNoKHUudGFyZ2V0KSxlW3UudGFyZ2V0LmluZGV4XS5wdXNoKHUuc291cmNlKX19Zm9yKHZhciBpLG89ZVt0XSxhPS0xLGw9by5sZW5ndGg7KythPGw7KWlmKCFpc05hTihpPW9bYV1bbl0pKXJldHVybiBpO3JldHVybiBNYXRoLnJhbmRvbSgpKnJ9dmFyIHQsZSxyLGM9bS5sZW5ndGgscz1NLmxlbmd0aCxwPWxbMF0sdj1sWzFdO2Zvcih0PTA7Yz50OysrdCkocj1tW3RdKS5pbmRleD10LHIud2VpZ2h0PTA7Zm9yKHQ9MDtzPnQ7Kyt0KXI9TVt0XSwibnVtYmVyIj09dHlwZW9mIHIuc291cmNlJiYoci5zb3VyY2U9bVtyLnNvdXJjZV0pLCJudW1iZXIiPT10eXBlb2Ygci50YXJnZXQmJihyLnRhcmdldD1tW3IudGFyZ2V0XSksKytyLnNvdXJjZS53ZWlnaHQsKytyLnRhcmdldC53ZWlnaHQ7Zm9yKHQ9MDtjPnQ7Kyt0KXI9bVt0XSxpc05hTihyLngpJiYoci54PW4oIngiLHApKSxpc05hTihyLnkpJiYoci55PW4oInkiLHYpKSxpc05hTihyLnB4KSYmKHIucHg9ci54KSxpc05hTihyLnB5KSYmKHIucHk9ci55KTtpZih1PVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBmKWZvcih0PTA7cz50OysrdCl1W3RdPStmLmNhbGwodGhpcyxNW3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KXVbdF09ZjtpZihpPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBoKWZvcih0PTA7cz50OysrdClpW3RdPStoLmNhbGwodGhpcyxNW3RdLHQpO2Vsc2UgZm9yKHQ9MDtzPnQ7Kyt0KWlbdF09aDtpZihvPVtdLCJmdW5jdGlvbiI9PXR5cGVvZiBnKWZvcih0PTA7Yz50OysrdClvW3RdPStnLmNhbGwodGhpcyxtW3RdLHQpO2Vsc2UgZm9yKHQ9MDtjPnQ7Kyt0KW9bdF09ZztyZXR1cm4gYS5yZXN1bWUoKX0sYS5yZXN1bWU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5hbHBoYSguMSl9LGEuc3RvcD1mdW5jdGlvbigpe3JldHVybiBhLmFscGhhKDApfSxhLmRyYWc9ZnVuY3Rpb24oKXtyZXR1cm4gZXx8KGU9dGEuYmVoYXZpb3IuZHJhZygpLm9yaWdpbih5KS5vbigiZHJhZ3N0YXJ0LmZvcmNlIixYdSkub24oImRyYWcuZm9yY2UiLHQpLm9uKCJkcmFnZW5kLmZvcmNlIiwkdSkpLGFyZ3VtZW50cy5sZW5ndGg/dm9pZCB0aGlzLm9uKCJtb3VzZW92ZXIuZm9yY2UiLEJ1KS5vbigibW91c2VvdXQuZm9yY2UiLFd1KS5jYWxsKGUpOmV9LHRhLnJlYmluZChhLGMsIm9uIil9O3ZhciBmbD0yMCxobD0xLGdsPTEvMDt0YS5sYXlvdXQuaGllcmFyY2h5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbih1KXt2YXIgaSxvPVt1XSxhPVtdO2Zvcih1LmRlcHRoPTA7bnVsbCE9KGk9by5wb3AoKSk7KWlmKGEucHVzaChpKSwobD1lLmNhbGwobixpLGkuZGVwdGgpKSYmKGM9bC5sZW5ndGgpKXtmb3IodmFyIGMsbCxzOy0tYz49MDspby5wdXNoKHM9bFtjXSkscy5wYXJlbnQ9aSxzLmRlcHRoPWkuZGVwdGgrMTtyJiYoaS52YWx1ZT0wKSxpLmNoaWxkcmVuPWx9ZWxzZSByJiYoaS52YWx1ZT0rci5jYWxsKG4saSxpLmRlcHRoKXx8MCksZGVsZXRlIGkuY2hpbGRyZW47cmV0dXJuIFF1KHUsZnVuY3Rpb24obil7dmFyIGUsdTt0JiYoZT1uLmNoaWxkcmVuKSYmZS5zb3J0KHQpLHImJih1PW4ucGFyZW50KSYmKHUudmFsdWUrPW4udmFsdWUpfSksYX12YXIgdD1laSxlPW5pLHI9dGk7cmV0dXJuIG4uc29ydD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4uY2hpbGRyZW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5yZXZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiByJiYoS3UodCxmdW5jdGlvbihuKXtuLmNoaWxkcmVuJiYobi52YWx1ZT0wKX0pLFF1KHQsZnVuY3Rpb24odCl7dmFyIGU7dC5jaGlsZHJlbnx8KHQudmFsdWU9K3IuY2FsbChuLHQsdC5kZXB0aCl8fDApLChlPXQucGFyZW50KSYmKGUudmFsdWUrPXQudmFsdWUpfSkpLHR9LG59LHRhLmxheW91dC5wYXJ0aXRpb249ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKHQsZSxyLHUpe3ZhciBpPXQuY2hpbGRyZW47aWYodC54PWUsdC55PXQuZGVwdGgqdSx0LmR4PXIsdC5keT11LGkmJihvPWkubGVuZ3RoKSl7dmFyIG8sYSxjLGw9LTE7Zm9yKHI9dC52YWx1ZT9yL3QudmFsdWU6MDsrK2w8bzspbihhPWlbbF0sZSxjPWEudmFsdWUqcix1KSxlKz1jfX1mdW5jdGlvbiB0KG4pe3ZhciBlPW4uY2hpbGRyZW4scj0wO2lmKGUmJih1PWUubGVuZ3RoKSlmb3IodmFyIHUsaT0tMTsrK2k8dTspcj1NYXRoLm1heChyLHQoZVtpXSkpO3JldHVybiAxK3J9ZnVuY3Rpb24gZShlLGkpe3ZhciBvPXIuY2FsbCh0aGlzLGUsaSk7cmV0dXJuIG4ob1swXSwwLHVbMF0sdVsxXS90KG9bMF0pKSxvfXZhciByPXRhLmxheW91dC5oaWVyYXJjaHkoKSx1PVsxLDFdO3JldHVybiBlLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bixlKTp1fSxHdShlLHIpfSx0YS5sYXlvdXQucGllPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihvKXt2YXIgYSxjPW8ubGVuZ3RoLGw9by5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4rdC5jYWxsKG4sZSxyKX0pLHM9KygiZnVuY3Rpb24iPT10eXBlb2Ygcj9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpyKSxmPSgiZnVuY3Rpb24iPT10eXBlb2YgdT91LmFwcGx5KHRoaXMsYXJndW1lbnRzKTp1KS1zLGg9TWF0aC5taW4oTWF0aC5hYnMoZikvYywrKCJmdW5jdGlvbiI9PXR5cGVvZiBpP2kuYXBwbHkodGhpcyxhcmd1bWVudHMpOmkpKSxnPWgqKDA+Zj8tMToxKSxwPShmLWMqZykvdGEuc3VtKGwpLHY9dGEucmFuZ2UoYyksZD1bXTtyZXR1cm4gbnVsbCE9ZSYmdi5zb3J0KGU9PT1wbD9mdW5jdGlvbihuLHQpe3JldHVybiBsW3RdLWxbbl19OmZ1bmN0aW9uKG4sdCl7cmV0dXJuIGUob1tuXSxvW3RdKX0pLHYuZm9yRWFjaChmdW5jdGlvbihuKXtkW25dPXtkYXRhOm9bbl0sdmFsdWU6YT1sW25dLHN0YXJ0QW5nbGU6cyxlbmRBbmdsZTpzKz1hKnArZyxwYWRBbmdsZTpofX0pLGR9dmFyIHQ9TnVtYmVyLGU9cGwscj0wLHU9TGEsaT0wO3JldHVybiBuLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbik6dH0sbi5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbik6ZX0sbi5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxufTt2YXIgcGw9e307dGEubGF5b3V0LnN0YWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihhLGMpe2lmKCEoaD1hLmxlbmd0aCkpcmV0dXJuIGE7dmFyIGw9YS5tYXAoZnVuY3Rpb24oZSxyKXtyZXR1cm4gdC5jYWxsKG4sZSxyKX0pLHM9bC5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGZ1bmN0aW9uKHQsZSl7cmV0dXJuW2kuY2FsbChuLHQsZSksby5jYWxsKG4sdCxlKV19KX0pLGY9ZS5jYWxsKG4scyxjKTtsPXRhLnBlcm11dGUobCxmKSxzPXRhLnBlcm11dGUocyxmKTt2YXIgaCxnLHAsdixkPXIuY2FsbChuLHMsYyksbT1sWzBdLmxlbmd0aDtmb3IocD0wO20+cDsrK3ApZm9yKHUuY2FsbChuLGxbMF1bcF0sdj1kW3BdLHNbMF1bcF1bMV0pLGc9MTtoPmc7KytnKXUuY2FsbChuLGxbZ11bcF0sdis9c1tnLTFdW3BdWzFdLHNbZ11bcF1bMV0pO3JldHVybiBhfXZhciB0PXksZT1haSxyPWNpLHU9b2ksaT11aSxvPWlpO3JldHVybiBuLnZhbHVlcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4ub3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp2bC5nZXQodCl8fGFpLG4pOmV9LG4ub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZGwuZ2V0KHQpfHxjaSxuKTpyfSxuLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9dCxuKTppfSxuLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCxuKTpvfSxuLm91dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG59O3ZhciB2bD10YS5tYXAoeyJpbnNpZGUtb3V0IjpmdW5jdGlvbihuKXt2YXIgdCxlLHI9bi5sZW5ndGgsdT1uLm1hcChsaSksaT1uLm1hcChzaSksbz10YS5yYW5nZShyKS5zb3J0KGZ1bmN0aW9uKG4sdCl7cmV0dXJuIHVbbl0tdVt0XX0pLGE9MCxjPTAsbD1bXSxzPVtdO2Zvcih0PTA7cj50OysrdCllPW9bdF0sYz5hPyhhKz1pW2VdLGwucHVzaChlKSk6KGMrPWlbZV0scy5wdXNoKGUpKTtyZXR1cm4gcy5yZXZlcnNlKCkuY29uY2F0KGwpfSxyZXZlcnNlOmZ1bmN0aW9uKG4pe3JldHVybiB0YS5yYW5nZShuLmxlbmd0aCkucmV2ZXJzZSgpfSwiZGVmYXVsdCI6YWl9KSxkbD10YS5tYXAoe3NpbGhvdWV0dGU6ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9bi5sZW5ndGgsaT1uWzBdLmxlbmd0aCxvPVtdLGE9MCxjPVtdO2ZvcihlPTA7aT5lOysrZSl7Zm9yKHQ9MCxyPTA7dT50O3QrKylyKz1uW3RdW2VdWzFdO3I+YSYmKGE9ciksby5wdXNoKHIpfWZvcihlPTA7aT5lOysrZSljW2VdPShhLW9bZV0pLzI7cmV0dXJuIGN9LHdpZ2dsZTpmdW5jdGlvbihuKXt2YXIgdCxlLHIsdSxpLG8sYSxjLGwscz1uLmxlbmd0aCxmPW5bMF0saD1mLmxlbmd0aCxnPVtdO2ZvcihnWzBdPWM9bD0wLGU9MTtoPmU7KytlKXtmb3IodD0wLHU9MDtzPnQ7Kyt0KXUrPW5bdF1bZV1bMV07Zm9yKHQ9MCxpPTAsYT1mW2VdWzBdLWZbZS0xXVswXTtzPnQ7Kyt0KXtmb3Iocj0wLG89KG5bdF1bZV1bMV0tblt0XVtlLTFdWzFdKS8oMiphKTt0PnI7KytyKW8rPShuW3JdW2VdWzFdLW5bcl1bZS0xXVsxXSkvYTtpKz1vKm5bdF1bZV1bMV19Z1tlXT1jLT11P2kvdSphOjAsbD5jJiYobD1jKX1mb3IoZT0wO2g+ZTsrK2UpZ1tlXS09bDtyZXR1cm4gZ30sZXhwYW5kOmZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PW4ubGVuZ3RoLGk9blswXS5sZW5ndGgsbz0xL3UsYT1bXTtmb3IoZT0wO2k+ZTsrK2Upe2Zvcih0PTAscj0wO3U+dDt0Kyspcis9blt0XVtlXVsxXTtpZihyKWZvcih0PTA7dT50O3QrKyluW3RdW2VdWzFdLz1yO2Vsc2UgZm9yKHQ9MDt1PnQ7dCsrKW5bdF1bZV1bMV09b31mb3IoZT0wO2k+ZTsrK2UpYVtlXT0wO3JldHVybiBhfSx6ZXJvOmNpfSk7dGEubGF5b3V0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixpKXtmb3IodmFyIG8sYSxjPVtdLGw9bi5tYXAoZSx0aGlzKSxzPXIuY2FsbCh0aGlzLGwsaSksZj11LmNhbGwodGhpcyxzLGwsaSksaT0tMSxoPWwubGVuZ3RoLGc9Zi5sZW5ndGgtMSxwPXQ/MToxL2g7KytpPGc7KW89Y1tpXT1bXSxvLmR4PWZbaSsxXS0oby54PWZbaV0pLG8ueT0wO2lmKGc+MClmb3IoaT0tMTsrK2k8aDspYT1sW2ldLGE+PXNbMF0mJmE8PXNbMV0mJihvPWNbdGEuYmlzZWN0KGYsYSwxLGcpLTFdLG8ueSs9cCxvLnB1c2gobltpXSkpO3JldHVybiBjfXZhciB0PSEwLGU9TnVtYmVyLHI9cGksdT1oaTtyZXR1cm4gbi52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9RXQodCksbik6cn0sbi5iaW5zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSJudW1iZXIiPT10eXBlb2YgdD9mdW5jdGlvbihuKXtyZXR1cm4gZ2kobix0KX06RXQodCksbik6dX0sbi5mcmVxdWVuY3k9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ISFlLG4pOnR9LG59LHRhLmxheW91dC5wYWNrPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLGkpe3ZhciBvPWUuY2FsbCh0aGlzLG4saSksYT1vWzBdLGM9dVswXSxsPXVbMV0scz1udWxsPT10P01hdGguc3FydDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O2lmKGEueD1hLnk9MCxRdShhLGZ1bmN0aW9uKG4pe24ucj0rcyhuLnZhbHVlKX0pLFF1KGEsTWkpLHIpe3ZhciBmPXIqKHQ/MTpNYXRoLm1heCgyKmEuci9jLDIqYS5yL2wpKS8yO1F1KGEsZnVuY3Rpb24obil7bi5yKz1mfSksUXUoYSxNaSksUXUoYSxmdW5jdGlvbihuKXtuLnItPWZ9KX1yZXR1cm4gX2koYSxjLzIsbC8yLHQ/MToxL01hdGgubWF4KDIqYS5yL2MsMiphLnIvbCkpLG99dmFyIHQsZT10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydCh2aSkscj0wLHU9WzEsMV07cmV0dXJuIG4uc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG4pOnV9LG4ucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PWV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6K2Usbik6dH0sbi5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LG4pOnJ9LEd1KG4sZSl9LHRhLmxheW91dC50cmVlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHUpe3ZhciBzPW8uY2FsbCh0aGlzLG4sdSksZj1zWzBdLGg9dChmKTtpZihRdShoLGUpLGgucGFyZW50Lm09LWgueixLdShoLHIpLGwpS3UoZixpKTtlbHNle3ZhciBnPWYscD1mLHY9ZjtLdShmLGZ1bmN0aW9uKG4pe24ueDxnLngmJihnPW4pLG4ueD5wLngmJihwPW4pLG4uZGVwdGg+di5kZXB0aCYmKHY9bil9KTt2YXIgZD1hKGcscCkvMi1nLngsbT1jWzBdLyhwLngrYShwLGcpLzIrZCkseT1jWzFdLyh2LmRlcHRofHwxKTtLdShmLGZ1bmN0aW9uKG4pe24ueD0obi54K2QpKm0sbi55PW4uZGVwdGgqeX0pfXJldHVybiBzfWZ1bmN0aW9uIHQobil7Zm9yKHZhciB0LGU9e0E6bnVsbCxjaGlsZHJlbjpbbl19LHI9W2VdO251bGwhPSh0PXIucG9wKCkpOylmb3IodmFyIHUsaT10LmNoaWxkcmVuLG89MCxhPWkubGVuZ3RoO2E+bzsrK28pci5wdXNoKChpW29dPXU9e186aVtvXSxwYXJlbnQ6dCxjaGlsZHJlbjoodT1pW29dLmNoaWxkcmVuKSYmdS5zbGljZSgpfHxbXSxBOm51bGwsYTpudWxsLHo6MCxtOjAsYzowLHM6MCx0Om51bGwsaTpvfSkuYT11KTtyZXR1cm4gZS5jaGlsZHJlblswXX1mdW5jdGlvbiBlKG4pe3ZhciB0PW4uY2hpbGRyZW4sZT1uLnBhcmVudC5jaGlsZHJlbixyPW4uaT9lW24uaS0xXTpudWxsO2lmKHQubGVuZ3RoKXtOaShuKTt2YXIgaT0odFswXS56K3RbdC5sZW5ndGgtMV0ueikvMjtyPyhuLno9ci56K2Eobi5fLHIuXyksbi5tPW4uei1pKTpuLno9aX1lbHNlIHImJihuLno9ci56K2Eobi5fLHIuXykpO24ucGFyZW50LkE9dShuLHIsbi5wYXJlbnQuQXx8ZVswXSl9ZnVuY3Rpb24gcihuKXtuLl8ueD1uLnorbi5wYXJlbnQubSxuLm0rPW4ucGFyZW50Lm19ZnVuY3Rpb24gdShuLHQsZSl7aWYodCl7Zm9yKHZhciByLHU9bixpPW4sbz10LGM9dS5wYXJlbnQuY2hpbGRyZW5bMF0sbD11Lm0scz1pLm0sZj1vLm0saD1jLm07bz1FaShvKSx1PWtpKHUpLG8mJnU7KWM9a2koYyksaT1FaShpKSxpLmE9bixyPW8ueitmLXUuei1sK2Eoby5fLHUuXykscj4wJiYoQWkoQ2kobyxuLGUpLG4sciksbCs9cixzKz1yKSxmKz1vLm0sbCs9dS5tLGgrPWMubSxzKz1pLm07byYmIUVpKGkpJiYoaS50PW8saS5tKz1mLXMpLHUmJiFraShjKSYmKGMudD11LGMubSs9bC1oLGU9bil9cmV0dXJuIGV9ZnVuY3Rpb24gaShuKXtuLngqPWNbMF0sbi55PW4uZGVwdGgqY1sxXX12YXIgbz10YS5sYXlvdXQuaGllcmFyY2h5KCkuc29ydChudWxsKS52YWx1ZShudWxsKSxhPVNpLGM9WzEsMV0sbD1udWxsO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxuKTphfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9bnVsbD09KGM9dCk/aTpudWxsLG4pOmw/bnVsbDpjfSxuLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPW51bGw9PShjPXQpP251bGw6aSxuKTpsP2M6bnVsbH0sR3UobixvKX0sdGEubGF5b3V0LmNsdXN0ZXI9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4saSl7dmFyIG8sYT10LmNhbGwodGhpcyxuLGkpLGM9YVswXSxsPTA7UXUoYyxmdW5jdGlvbihuKXt2YXIgdD1uLmNoaWxkcmVuO3QmJnQubGVuZ3RoPyhuLng9cWkodCksbi55PXppKHQpKToobi54PW8/bCs9ZShuLG8pOjAsbi55PTAsbz1uKX0pO3ZhciBzPUxpKGMpLGY9VGkoYyksaD1zLngtZShzLGYpLzIsZz1mLngrZShmLHMpLzI7cmV0dXJuIFF1KGMsdT9mdW5jdGlvbihuKXtuLng9KG4ueC1jLngpKnJbMF0sbi55PShjLnktbi55KSpyWzFdfTpmdW5jdGlvbihuKXtuLng9KG4ueC1oKS8oZy1oKSpyWzBdLG4ueT0oMS0oYy55P24ueS9jLnk6MSkpKnJbMV19KSxhfXZhciB0PXRhLmxheW91dC5oaWVyYXJjaHkoKS5zb3J0KG51bGwpLnZhbHVlKG51bGwpLGU9U2kscj1bMSwxXSx1PSExO3JldHVybiBuLnNlcGFyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuKTplfSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbD09KHI9dCksbik6dT9udWxsOnJ9LG4ubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9bnVsbCE9KHI9dCksbik6dT9yOm51bGx9LEd1KG4sdCl9LHRhLmxheW91dC50cmVlbWFwPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuLHQpe2Zvcih2YXIgZSxyLHU9LTEsaT1uLmxlbmd0aDsrK3U8aTspcj0oZT1uW3VdKS52YWx1ZSooMD50PzA6dCksZS5hcmVhPWlzTmFOKHIpfHwwPj1yPzA6cn1mdW5jdGlvbiB0KGUpe3ZhciBpPWUuY2hpbGRyZW47aWYoaSYmaS5sZW5ndGgpe3ZhciBvLGEsYyxsPWYoZSkscz1bXSxoPWkuc2xpY2UoKSxwPTEvMCx2PSJzbGljZSI9PT1nP2wuZHg6ImRpY2UiPT09Zz9sLmR5OiJzbGljZS1kaWNlIj09PWc/MSZlLmRlcHRoP2wuZHk6bC5keDpNYXRoLm1pbihsLmR4LGwuZHkpO2ZvcihuKGgsbC5keCpsLmR5L2UudmFsdWUpLHMuYXJlYT0wOyhjPWgubGVuZ3RoKT4wOylzLnB1c2gobz1oW2MtMV0pLHMuYXJlYSs9by5hcmVhLCJzcXVhcmlmeSIhPT1nfHwoYT1yKHMsdikpPD1wPyhoLnBvcCgpLHA9YSk6KHMuYXJlYS09cy5wb3AoKS5hcmVhLHUocyx2LGwsITEpLHY9TWF0aC5taW4obC5keCxsLmR5KSxzLmxlbmd0aD1zLmFyZWE9MCxwPTEvMCk7cy5sZW5ndGgmJih1KHMsdixsLCEwKSxzLmxlbmd0aD1zLmFyZWE9MCksaS5mb3JFYWNoKHQpfX1mdW5jdGlvbiBlKHQpe3ZhciByPXQuY2hpbGRyZW47aWYociYmci5sZW5ndGgpe3ZhciBpLG89Zih0KSxhPXIuc2xpY2UoKSxjPVtdO2ZvcihuKGEsby5keCpvLmR5L3QudmFsdWUpLGMuYXJlYT0wO2k9YS5wb3AoKTspYy5wdXNoKGkpLGMuYXJlYSs9aS5hcmVhLG51bGwhPWkueiYmKHUoYyxpLno/by5keDpvLmR5LG8sIWEubGVuZ3RoKSxjLmxlbmd0aD1jLmFyZWE9MCk7ci5mb3JFYWNoKGUpfX1mdW5jdGlvbiByKG4sdCl7Zm9yKHZhciBlLHI9bi5hcmVhLHU9MCxpPTEvMCxvPS0xLGE9bi5sZW5ndGg7KytvPGE7KShlPW5bb10uYXJlYSkmJihpPmUmJihpPWUpLGU+dSYmKHU9ZSkpO3JldHVybiByKj1yLHQqPXQscj9NYXRoLm1heCh0KnUqcC9yLHIvKHQqaSpwKSk6MS8wfWZ1bmN0aW9uIHUobix0LGUscil7dmFyIHUsaT0tMSxvPW4ubGVuZ3RoLGE9ZS54LGw9ZS55LHM9dD9jKG4uYXJlYS90KTowO2lmKHQ9PWUuZHgpe2Zvcigocnx8cz5lLmR5KSYmKHM9ZS5keSk7KytpPG87KXU9bltpXSx1Lng9YSx1Lnk9bCx1LmR5PXMsYSs9dS5keD1NYXRoLm1pbihlLngrZS5keC1hLHM/Yyh1LmFyZWEvcyk6MCk7dS56PSEwLHUuZHgrPWUueCtlLmR4LWEsZS55Kz1zLGUuZHktPXN9ZWxzZXtmb3IoKHJ8fHM+ZS5keCkmJihzPWUuZHgpOysraTxvOyl1PW5baV0sdS54PWEsdS55PWwsdS5keD1zLGwrPXUuZHk9TWF0aC5taW4oZS55K2UuZHktbCxzP2ModS5hcmVhL3MpOjApO3Uuej0hMSx1LmR5Kz1lLnkrZS5keS1sLGUueCs9cyxlLmR4LT1zfX1mdW5jdGlvbiBpKHIpe3ZhciB1PW98fGEociksaT11WzBdO3JldHVybiBpLng9MCxpLnk9MCxpLmR4PWxbMF0saS5keT1sWzFdLG8mJmEucmV2YWx1ZShpKSxuKFtpXSxpLmR4KmkuZHkvaS52YWx1ZSksKG8/ZTp0KShpKSxoJiYobz11KSx1fXZhciBvLGE9dGEubGF5b3V0LmhpZXJhcmNoeSgpLGM9TWF0aC5yb3VuZCxsPVsxLDFdLHM9bnVsbCxmPVJpLGg9ITEsZz0ic3F1YXJpZnkiLHA9LjUqKDErTWF0aC5zcXJ0KDUpKTsKcmV0dXJuIGkuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1uLGkpOmx9LGkucGFkZGluZz1mdW5jdGlvbihuKXtmdW5jdGlvbiB0KHQpe3ZhciBlPW4uY2FsbChpLHQsdC5kZXB0aCk7cmV0dXJuIG51bGw9PWU/UmkodCk6RGkodCwibnVtYmVyIj09dHlwZW9mIGU/W2UsZSxlLGVdOmUpfWZ1bmN0aW9uIGUodCl7cmV0dXJuIERpKHQsbil9aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHM7dmFyIHI7cmV0dXJuIGY9bnVsbD09KHM9bik/Umk6ImZ1bmN0aW9uIj09KHI9dHlwZW9mIG4pP3Q6Im51bWJlciI9PT1yPyhuPVtuLG4sbixuXSxlKTplLGl9LGkucm91bmQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9bj9NYXRoLnJvdW5kOk51bWJlcixpKTpjIT1OdW1iZXJ9LGkuc3RpY2t5PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPW4sbz1udWxsLGkpOmh9LGkucmF0aW89ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bixpKTpwfSxpLm1vZGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9bisiIixpKTpnfSxHdShpLGEpfSx0YS5yYW5kb209e25vcm1hbDpmdW5jdGlvbihuLHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIDI+ZSYmKHQ9MSksMT5lJiYobj0wKSxmdW5jdGlvbigpe3ZhciBlLHIsdTtkbyBlPTIqTWF0aC5yYW5kb20oKS0xLHI9MipNYXRoLnJhbmRvbSgpLTEsdT1lKmUrcipyO3doaWxlKCF1fHx1PjEpO3JldHVybiBuK3QqZSpNYXRoLnNxcnQoLTIqTWF0aC5sb2codSkvdSl9fSxsb2dOb3JtYWw6ZnVuY3Rpb24oKXt2YXIgbj10YS5yYW5kb20ubm9ybWFsLmFwcGx5KHRhLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKG4oKSl9fSxiYXRlczpmdW5jdGlvbihuKXt2YXIgdD10YS5yYW5kb20uaXJ3aW5IYWxsKG4pO3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0KCkvbn19LGlyd2luSGFsbDpmdW5jdGlvbihuKXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTA7bj5lO2UrKyl0Kz1NYXRoLnJhbmRvbSgpO3JldHVybiB0fX19LHRhLnNjYWxlPXt9O3ZhciBtbD17Zmxvb3I6eSxjZWlsOnl9O3RhLnNjYWxlLmxpbmVhcj1mdW5jdGlvbigpe3JldHVybiBJaShbMCwxXSxbMCwxXSxtdSwhMSl9O3ZhciB5bD17czoxLGc6MSxwOjEscjoxLGU6MX07dGEuc2NhbGUubG9nPWZ1bmN0aW9uKCl7cmV0dXJuIEppKHRhLnNjYWxlLmxpbmVhcigpLmRvbWFpbihbMCwxXSksMTAsITAsWzEsMTBdKX07dmFyIE1sPXRhLmZvcm1hdCgiLjBlIikseGw9e2Zsb29yOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmNlaWwoLW4pfSxjZWlsOmZ1bmN0aW9uKG4pe3JldHVybi1NYXRoLmZsb29yKC1uKX19O3RhLnNjYWxlLnBvdz1mdW5jdGlvbigpe3JldHVybiBHaSh0YS5zY2FsZS5saW5lYXIoKSwxLFswLDFdKX0sdGEuc2NhbGUuc3FydD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5wb3coKS5leHBvbmVudCguNSl9LHRhLnNjYWxlLm9yZGluYWw9ZnVuY3Rpb24oKXtyZXR1cm4gUWkoW10se3Q6InJhbmdlIixhOltbXV19KX0sdGEuc2NhbGUuY2F0ZWdvcnkxMD1mdW5jdGlvbigpe3JldHVybiB0YS5zY2FsZS5vcmRpbmFsKCkucmFuZ2UoYmwpfSx0YS5zY2FsZS5jYXRlZ29yeTIwPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShfbCl9LHRhLnNjYWxlLmNhdGVnb3J5MjBiPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZSh3bCl9LHRhLnNjYWxlLmNhdGVnb3J5MjBjPWZ1bmN0aW9uKCl7cmV0dXJuIHRhLnNjYWxlLm9yZGluYWwoKS5yYW5nZShTbCl9O3ZhciBibD1bMjA2MjI2MCwxNjc0NDIwNiwyOTI0NTg4LDE0MDM0NzI4LDk3MjU4ODUsOTE5NzEzMSwxNDkwNzMzMCw4MzU1NzExLDEyMzY5MTg2LDE1NTYxNzVdLm1hcChNdCksX2w9WzIwNjIyNjAsMTE0NTQ0NDAsMTY3NDQyMDYsMTY3NTk2NzIsMjkyNDU4OCwxMDAxODY5OCwxNDAzNDcyOCwxNjc1MDc0Miw5NzI1ODg1LDEyOTU1ODYxLDkxOTcxMzEsMTI4ODUxNDAsMTQ5MDczMzAsMTYyMzQxOTQsODM1NTcxMSwxMzA5MjgwNywxMjM2OTE4NiwxNDQwODU4OSwxNTU2MTc1LDEwNDEwNzI1XS5tYXAoTXQpLHdsPVszNzUwNzc3LDUzOTU2MTksNzA0MDcxOSwxMDI2NDI4Niw2NTE5MDk3LDkyMTY1OTQsMTE5MTUxMTUsMTM1NTY2MzYsOTIwMjk5MywxMjQyNjgwOSwxNTE4NjUxNCwxNTE5MDkzMiw4NjY2MTY5LDExMzU2NDkwLDE0MDQ5NjQzLDE1MTc3MzcyLDgwNzc2ODMsMTA4MzQzMjQsMTM1Mjg1MDksMTQ1ODk2NTRdLm1hcChNdCksU2w9WzMyNDQ3MzMsNzA1NzExMCwxMDQwNjYyNSwxMzAzMjQzMSwxNTA5NTA1MywxNjYxNjc2NCwxNjYyNTI1OSwxNjYzNDAxOCwzMjUzMDc2LDc2NTI0NzAsMTA2MDcwMDMsMTMxMDE1MDQsNzY5NTI4MSwxMDM5NDMxMiwxMjM2OTM3MiwxNDM0Mjg5MSw2NTEzNTA3LDk4Njg5NTAsMTI0MzQ4NzcsMTQyNzcwODFdLm1hcChNdCk7dGEuc2NhbGUucXVhbnRpbGU9ZnVuY3Rpb24oKXtyZXR1cm4gbm8oW10sW10pfSx0YS5zY2FsZS5xdWFudGl6ZT1mdW5jdGlvbigpe3JldHVybiB0bygwLDEsWzAsMV0pfSx0YS5zY2FsZS50aHJlc2hvbGQ9ZnVuY3Rpb24oKXtyZXR1cm4gZW8oWy41XSxbMCwxXSl9LHRhLnNjYWxlLmlkZW50aXR5PWZ1bmN0aW9uKCl7cmV0dXJuIHJvKFswLDFdKX0sdGEuc3ZnPXt9LHRhLnN2Zy5hcmM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKCl7dmFyIG49TWF0aC5tYXgoMCwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGw9TWF0aC5tYXgoMCwrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLHM9by5hcHBseSh0aGlzLGFyZ3VtZW50cyktUmEsZj1hLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1SYSxoPU1hdGguYWJzKGYtcyksZz1zPmY/MDoxO2lmKG4+bCYmKHA9bCxsPW4sbj1wKSxoPj1UYSlyZXR1cm4gdChsLGcpKyhuP3QobiwxLWcpOiIiKSsiWiI7dmFyIHAsdixkLG0seSxNLHgsYixfLHcsUyxrLEU9MCxBPTAsTj1bXTtpZigobT0oK2MuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwwKS8yKSYmKGQ9aT09PWtsP01hdGguc3FydChuKm4rbCpsKToraS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZ3x8KEEqPS0xKSxsJiYoQT10dChkL2wqTWF0aC5zaW4obSkpKSxuJiYoRT10dChkL24qTWF0aC5zaW4obSkpKSksbCl7eT1sKk1hdGguY29zKHMrQSksTT1sKk1hdGguc2luKHMrQSkseD1sKk1hdGguY29zKGYtQSksYj1sKk1hdGguc2luKGYtQSk7dmFyIEM9TWF0aC5hYnMoZi1zLTIqQSk8PXFhPzA6MTtpZihBJiZzbyh5LE0seCxiKT09PWdeQyl7dmFyIHo9KHMrZikvMjt5PWwqTWF0aC5jb3MoeiksTT1sKk1hdGguc2luKHopLHg9Yj1udWxsfX1lbHNlIHk9TT0wO2lmKG4pe189bipNYXRoLmNvcyhmLUUpLHc9bipNYXRoLnNpbihmLUUpLFM9bipNYXRoLmNvcyhzK0UpLGs9bipNYXRoLnNpbihzK0UpO3ZhciBxPU1hdGguYWJzKHMtZisyKkUpPD1xYT8wOjE7aWYoRSYmc28oXyx3LFMsayk9PT0xLWdecSl7dmFyIEw9KHMrZikvMjtfPW4qTWF0aC5jb3MoTCksdz1uKk1hdGguc2luKEwpLFM9az1udWxsfX1lbHNlIF89dz0wO2lmKChwPU1hdGgubWluKE1hdGguYWJzKGwtbikvMiwrdS5hcHBseSh0aGlzLGFyZ3VtZW50cykpKT4uMDAxKXt2PWw+bl5nPzA6MTt2YXIgVD1udWxsPT1TP1tfLHddOm51bGw9PXg/W3ksTV06THIoW3ksTV0sW1Msa10sW3gsYl0sW18sd10pLFI9eS1UWzBdLEQ9TS1UWzFdLFA9eC1UWzBdLFU9Yi1UWzFdLGo9MS9NYXRoLnNpbihNYXRoLmFjb3MoKFIqUCtEKlUpLyhNYXRoLnNxcnQoUipSK0QqRCkqTWF0aC5zcXJ0KFAqUCtVKlUpKSkvMiksRj1NYXRoLnNxcnQoVFswXSpUWzBdK1RbMV0qVFsxXSk7aWYobnVsbCE9eCl7dmFyIEg9TWF0aC5taW4ocCwobC1GKS8oaisxKSksTz1mbyhudWxsPT1TP1tfLHddOltTLGtdLFt5LE1dLGwsSCxnKSxJPWZvKFt4LGJdLFtfLHddLGwsSCxnKTtwPT09SD9OLnB1c2goIk0iLE9bMF0sIkEiLEgsIiwiLEgsIiAwIDAsIix2LCIgIixPWzFdLCJBIixsLCIsIixsLCIgMCAiLDEtZ15zbyhPWzFdWzBdLE9bMV1bMV0sSVsxXVswXSxJWzFdWzFdKSwiLCIsZywiICIsSVsxXSwiQSIsSCwiLCIsSCwiIDAgMCwiLHYsIiAiLElbMF0pOk4ucHVzaCgiTSIsT1swXSwiQSIsSCwiLCIsSCwiIDAgMSwiLHYsIiAiLElbMF0pfWVsc2UgTi5wdXNoKCJNIix5LCIsIixNKTtpZihudWxsIT1TKXt2YXIgWT1NYXRoLm1pbihwLChuLUYpLyhqLTEpKSxaPWZvKFt5LE1dLFtTLGtdLG4sLVksZyksVj1mbyhbXyx3XSxudWxsPT14P1t5LE1dOlt4LGJdLG4sLVksZyk7cD09PVk/Ti5wdXNoKCJMIixWWzBdLCJBIixZLCIsIixZLCIgMCAwLCIsdiwiICIsVlsxXSwiQSIsbiwiLCIsbiwiIDAgIixnXnNvKFZbMV1bMF0sVlsxXVsxXSxaWzFdWzBdLFpbMV1bMV0pLCIsIiwxLWcsIiAiLFpbMV0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixaWzBdKTpOLnB1c2goIkwiLFZbMF0sIkEiLFksIiwiLFksIiAwIDAsIix2LCIgIixaWzBdKX1lbHNlIE4ucHVzaCgiTCIsXywiLCIsdyl9ZWxzZSBOLnB1c2goIk0iLHksIiwiLE0pLG51bGwhPXgmJk4ucHVzaCgiQSIsbCwiLCIsbCwiIDAgIixDLCIsIixnLCIgIix4LCIsIixiKSxOLnB1c2goIkwiLF8sIiwiLHcpLG51bGwhPVMmJk4ucHVzaCgiQSIsbiwiLCIsbiwiIDAgIixxLCIsIiwxLWcsIiAiLFMsIiwiLGspO3JldHVybiBOLnB1c2goIloiKSxOLmpvaW4oIiIpfWZ1bmN0aW9uIHQobix0KXtyZXR1cm4iTTAsIituKyJBIituKyIsIituKyIgMCAxLCIrdCsiIDAsIistbisiQSIrbisiLCIrbisiIDAgMSwiK3QrIiAwLCIrbn12YXIgZT1pbyxyPW9vLHU9dW8saT1rbCxvPWFvLGE9Y28sYz1sbztyZXR1cm4gbi5pbm5lclJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1FdCh0KSxuKTplfSxuLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPUV0KHQpLG4pOnJ9LG4uY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PUV0KHQpLG4pOnV9LG4ucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQ9PWtsP2tsOkV0KHQpLG4pOml9LG4uc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1FdCh0KSxuKTpvfSxuLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPUV0KHQpLG4pOmF9LG4ucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9RXQodCksbik6Y30sbi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBuPSgrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMix0PSgrby5hcHBseSh0aGlzLGFyZ3VtZW50cykrICthLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1SYTtyZXR1cm5bTWF0aC5jb3ModCkqbixNYXRoLnNpbih0KSpuXX0sbn07dmFyIGtsPSJhdXRvIjt0YS5zdmcubGluZT1mdW5jdGlvbigpe3JldHVybiBobyh5KX07dmFyIEVsPXRhLm1hcCh7bGluZWFyOmdvLCJsaW5lYXItY2xvc2VkIjpwbyxzdGVwOnZvLCJzdGVwLWJlZm9yZSI6bW8sInN0ZXAtYWZ0ZXIiOnlvLGJhc2lzOlNvLCJiYXNpcy1vcGVuIjprbywiYmFzaXMtY2xvc2VkIjpFbyxidW5kbGU6QW8sY2FyZGluYWw6Ym8sImNhcmRpbmFsLW9wZW4iOk1vLCJjYXJkaW5hbC1jbG9zZWQiOnhvLG1vbm90b25lOlRvfSk7RWwuZm9yRWFjaChmdW5jdGlvbihuLHQpe3Qua2V5PW4sdC5jbG9zZWQ9Ly1jbG9zZWQkLy50ZXN0KG4pfSk7dmFyIEFsPVswLDIvMywxLzMsMF0sTmw9WzAsMS8zLDIvMywwXSxDbD1bMCwxLzYsMi8zLDEvNl07dGEuc3ZnLmxpbmUucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49aG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmFuZ2xlPW4ueSxkZWxldGUgbi55LG59LG1vLnJldmVyc2U9eW8seW8ucmV2ZXJzZT1tbyx0YS5zdmcuYXJlYT1mdW5jdGlvbigpe3JldHVybiBEbyh5KX0sdGEuc3ZnLmFyZWEucmFkaWFsPWZ1bmN0aW9uKCl7dmFyIG49RG8oUm8pO3JldHVybiBuLnJhZGl1cz1uLngsZGVsZXRlIG4ueCxuLmlubmVyUmFkaXVzPW4ueDAsZGVsZXRlIG4ueDAsbi5vdXRlclJhZGl1cz1uLngxLGRlbGV0ZSBuLngxLG4uYW5nbGU9bi55LGRlbGV0ZSBuLnksbi5zdGFydEFuZ2xlPW4ueTAsZGVsZXRlIG4ueTAsbi5lbmRBbmdsZT1uLnkxLGRlbGV0ZSBuLnkxLG59LHRhLnN2Zy5jaG9yZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4obixhKXt2YXIgYz10KHRoaXMsaSxuLGEpLGw9dCh0aGlzLG8sbixhKTtyZXR1cm4iTSIrYy5wMCtyKGMucixjLnAxLGMuYTEtYy5hMCkrKGUoYyxsKT91KGMucixjLnAxLGMucixjLnAwKTp1KGMucixjLnAxLGwucixsLnAwKStyKGwucixsLnAxLGwuYTEtbC5hMCkrdShsLnIsbC5wMSxjLnIsYy5wMCkpKyJaIn1mdW5jdGlvbiB0KG4sdCxlLHIpe3ZhciB1PXQuY2FsbChuLGUsciksaT1hLmNhbGwobix1LHIpLG89Yy5jYWxsKG4sdSxyKS1SYSxzPWwuY2FsbChuLHUsciktUmE7cmV0dXJue3I6aSxhMDpvLGExOnMscDA6W2kqTWF0aC5jb3MobyksaSpNYXRoLnNpbihvKV0scDE6W2kqTWF0aC5jb3MocyksaSpNYXRoLnNpbihzKV19fWZ1bmN0aW9uIGUobix0KXtyZXR1cm4gbi5hMD09dC5hMCYmbi5hMT09dC5hMX1mdW5jdGlvbiByKG4sdCxlKXtyZXR1cm4iQSIrbisiLCIrbisiIDAgIisgKyhlPnFhKSsiLDEgIit0fWZ1bmN0aW9uIHUobix0LGUscil7cmV0dXJuIlEgMCwwICIrcn12YXIgaT1tcixvPXlyLGE9UG8sYz1hbyxsPWNvO3JldHVybiBuLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1FdCh0KSxuKTphfSxuLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1FdCh0KSxuKTppfSxuLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1FdCh0KSxuKTpvfSxuLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9RXQodCksbik6Y30sbi5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1FdCh0KSxuKTpsfSxufSx0YS5zdmcuZGlhZ29uYWw9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4sdSl7dmFyIGk9dC5jYWxsKHRoaXMsbix1KSxvPWUuY2FsbCh0aGlzLG4sdSksYT0oaS55K28ueSkvMixjPVtpLHt4OmkueCx5OmF9LHt4Om8ueCx5OmF9LG9dO3JldHVybiBjPWMubWFwKHIpLCJNIitjWzBdKyJDIitjWzFdKyIgIitjWzJdKyIgIitjWzNdfXZhciB0PW1yLGU9eXIscj1VbztyZXR1cm4gbi5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9RXQoZSksbik6dH0sbi50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbi5wcm9qZWN0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbik6cn0sbn0sdGEuc3ZnLmRpYWdvbmFsLnJhZGlhbD1mdW5jdGlvbigpe3ZhciBuPXRhLnN2Zy5kaWFnb25hbCgpLHQ9VW8sZT1uLnByb2plY3Rpb247cmV0dXJuIG4ucHJvamVjdGlvbj1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGpvKHQ9bikpOnR9LG59LHRhLnN2Zy5zeW1ib2w9ZnVuY3Rpb24oKXtmdW5jdGlvbiBuKG4scil7cmV0dXJuKHpsLmdldCh0LmNhbGwodGhpcyxuLHIpKXx8T28pKGUuY2FsbCh0aGlzLG4scikpfXZhciB0PUhvLGU9Rm87cmV0dXJuIG4udHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1FdChlKSxuKTp0fSxuLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9RXQodCksbik6ZX0sbn07dmFyIHpsPXRhLm1hcCh7Y2lyY2xlOk9vLGNyb3NzOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuLzUpLzI7cmV0dXJuIk0iKy0zKnQrIiwiKy10KyJIIistdCsiViIrLTMqdCsiSCIrdCsiViIrLXQrIkgiKzMqdCsiViIrdCsiSCIrdCsiViIrMyp0KyJIIistdCsiViIrdCsiSCIrLTMqdCsiWiJ9LGRpYW1vbmQ6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vKDIqTGwpKSxlPXQqTGw7cmV0dXJuIk0wLCIrLXQrIkwiK2UrIiwwIDAsIit0KyIgIistZSsiLDBaIn0sc3F1YXJlOmZ1bmN0aW9uKG4pe3ZhciB0PU1hdGguc3FydChuKS8yO3JldHVybiJNIistdCsiLCIrLXQrIkwiK3QrIiwiKy10KyIgIit0KyIsIit0KyIgIistdCsiLCIrdCsiWiJ9LCJ0cmlhbmdsZS1kb3duIjpmdW5jdGlvbihuKXt2YXIgdD1NYXRoLnNxcnQobi9xbCksZT10KnFsLzI7cmV0dXJuIk0wLCIrZSsiTCIrdCsiLCIrLWUrIiAiKy10KyIsIistZSsiWiJ9LCJ0cmlhbmdsZS11cCI6ZnVuY3Rpb24obil7dmFyIHQ9TWF0aC5zcXJ0KG4vcWwpLGU9dCpxbC8yO3JldHVybiJNMCwiKy1lKyJMIit0KyIsIitlKyIgIistdCsiLCIrZSsiWiJ9fSk7dGEuc3ZnLnN5bWJvbFR5cGVzPXpsLmtleXMoKTt2YXIgcWw9TWF0aC5zcXJ0KDMpLExsPU1hdGgudGFuKDMwKkRhKTtfYS50cmFuc2l0aW9uPWZ1bmN0aW9uKG4pe2Zvcih2YXIgdCxlLHI9VGx8fCsrVWwsdT1YbyhuKSxpPVtdLG89Umx8fHt0aW1lOkRhdGUubm93KCksZWFzZTpTdSxkZWxheTowLGR1cmF0aW9uOjI1MH0sYT0tMSxjPXRoaXMubGVuZ3RoOysrYTxjOyl7aS5wdXNoKHQ9W10pO2Zvcih2YXIgbD10aGlzW2FdLHM9LTEsZj1sLmxlbmd0aDsrK3M8ZjspKGU9bFtzXSkmJiRvKGUscyx1LHIsbyksdC5wdXNoKGUpfXJldHVybiBZbyhpLHUscil9LF9hLmludGVycnVwdD1mdW5jdGlvbihuKXtyZXR1cm4gdGhpcy5lYWNoKG51bGw9PW4/RGw6SW8oWG8obikpKX07dmFyIFRsLFJsLERsPUlvKFhvKCkpLFBsPVtdLFVsPTA7UGwuY2FsbD1fYS5jYWxsLFBsLmVtcHR5PV9hLmVtcHR5LFBsLm5vZGU9X2Eubm9kZSxQbC5zaXplPV9hLnNpemUsdGEudHJhbnNpdGlvbj1mdW5jdGlvbihuLHQpe3JldHVybiBuJiZuLnRyYW5zaXRpb24/VGw/bi50cmFuc2l0aW9uKHQpOm46dGEuc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuKX0sdGEudHJhbnNpdGlvbi5wcm90b3R5cGU9UGwsUGwuc2VsZWN0PWZ1bmN0aW9uKG4pe3ZhciB0LGUscix1PXRoaXMuaWQsaT10aGlzLm5hbWVzcGFjZSxvPVtdO249TihuKTtmb3IodmFyIGE9LTEsYz10aGlzLmxlbmd0aDsrK2E8Yzspe28ucHVzaCh0PVtdKTtmb3IodmFyIGw9dGhpc1thXSxzPS0xLGY9bC5sZW5ndGg7KytzPGY7KShyPWxbc10pJiYoZT1uLmNhbGwocixyLl9fZGF0YV9fLHMsYSkpPygiX19kYXRhX18iaW4gciYmKGUuX19kYXRhX189ci5fX2RhdGFfXyksJG8oZSxzLGksdSxyW2ldW3VdKSx0LnB1c2goZSkpOnQucHVzaChudWxsKX1yZXR1cm4gWW8obyxpLHUpfSxQbC5zZWxlY3RBbGw9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHUsaSxvPXRoaXMuaWQsYT10aGlzLm5hbWVzcGFjZSxjPVtdO249QyhuKTtmb3IodmFyIGw9LTEscz10aGlzLmxlbmd0aDsrK2w8czspZm9yKHZhciBmPXRoaXNbbF0saD0tMSxnPWYubGVuZ3RoOysraDxnOylpZihyPWZbaF0pe2k9clthXVtvXSxlPW4uY2FsbChyLHIuX19kYXRhX18saCxsKSxjLnB1c2godD1bXSk7Zm9yKHZhciBwPS0xLHY9ZS5sZW5ndGg7KytwPHY7KSh1PWVbcF0pJiYkbyh1LHAsYSxvLGkpLHQucHVzaCh1KX1yZXR1cm4gWW8oYyxhLG8pfSxQbC5maWx0ZXI9ZnVuY3Rpb24obil7dmFyIHQsZSxyLHU9W107ImZ1bmN0aW9uIiE9dHlwZW9mIG4mJihuPU8obikpO2Zvcih2YXIgaT0wLG89dGhpcy5sZW5ndGg7bz5pO2krKyl7dS5wdXNoKHQ9W10pO2Zvcih2YXIgZT10aGlzW2ldLGE9MCxjPWUubGVuZ3RoO2M+YTthKyspKHI9ZVthXSkmJm4uY2FsbChyLHIuX19kYXRhX18sYSxpKSYmdC5wdXNoKHIpfXJldHVybiBZbyh1LHRoaXMubmFtZXNwYWNlLHRoaXMuaWQpfSxQbC50d2Vlbj1mdW5jdGlvbihuLHQpe3ZhciBlPXRoaXMuaWQscj10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwyP3RoaXMubm9kZSgpW3JdW2VdLnR3ZWVuLmdldChuKTpZKHRoaXMsbnVsbD09dD9mdW5jdGlvbih0KXt0W3JdW2VdLnR3ZWVuLnJlbW92ZShuKX06ZnVuY3Rpb24odSl7dVtyXVtlXS50d2Vlbi5zZXQobix0KX0pfSxQbC5hdHRyPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZSgpe3RoaXMucmVtb3ZlQXR0cmlidXRlKGEpfWZ1bmN0aW9uIHIoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGEuc3BhY2UsYS5sb2NhbCl9ZnVuY3Rpb24gdShuKXtyZXR1cm4gbnVsbD09bj9lOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGUoYSk7cmV0dXJuIGUhPT1uJiYodD1vKGUsbiksZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUoYSx0KG4pKX0pfSl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbnVsbD09bj9yOihuKz0iIixmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5nZXRBdHRyaWJ1dGVOUyhhLnNwYWNlLGEubG9jYWwpO3JldHVybiBlIT09biYmKHQ9byhlLG4pLGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlMoYS5zcGFjZSxhLmxvY2FsLHQobikpfSl9KX1pZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih0IGluIG4pdGhpcy5hdHRyKHQsblt0XSk7cmV0dXJuIHRoaXN9dmFyIG89InRyYW5zZm9ybSI9PW4/SHU6bXUsYT10YS5ucy5xdWFsaWZ5KG4pO3JldHVybiBabyh0aGlzLCJhdHRyLiIrbix0LGEubG9jYWw/aTp1KX0sUGwuYXR0clR3ZWVuPWZ1bmN0aW9uKG4sdCl7ZnVuY3Rpb24gZShuLGUpe3ZhciByPXQuY2FsbCh0aGlzLG4sZSx0aGlzLmdldEF0dHJpYnV0ZSh1KSk7cmV0dXJuIHImJmZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlKHUscihuKSl9fWZ1bmN0aW9uIHIobixlKXt2YXIgcj10LmNhbGwodGhpcyxuLGUsdGhpcy5nZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwpKTtyZXR1cm4gciYmZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh1LnNwYWNlLHUubG9jYWwscihuKSl9fXZhciB1PXRhLm5zLnF1YWxpZnkobik7cmV0dXJuIHRoaXMudHdlZW4oImF0dHIuIituLHUubG9jYWw/cjplKX0sUGwuc3R5bGU9ZnVuY3Rpb24obixlLHIpe2Z1bmN0aW9uIHUoKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG4pfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG51bGw9PWU/dTooZSs9IiIsZnVuY3Rpb24oKXt2YXIgdSxpPXQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobik7cmV0dXJuIGkhPT1lJiYodT1tdShpLGUpLGZ1bmN0aW9uKHQpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkobix1KHQpLHIpfSl9KX12YXIgbz1hcmd1bWVudHMubGVuZ3RoO2lmKDM+byl7aWYoInN0cmluZyIhPXR5cGVvZiBuKXsyPm8mJihlPSIiKTtmb3IociBpbiBuKXRoaXMuc3R5bGUocixuW3JdLGUpO3JldHVybiB0aGlzfXI9IiJ9cmV0dXJuIFpvKHRoaXMsInN0eWxlLiIrbixlLGkpfSxQbC5zdHlsZVR3ZWVuPWZ1bmN0aW9uKG4sZSxyKXtmdW5jdGlvbiB1KHUsaSl7dmFyIG89ZS5jYWxsKHRoaXMsdSxpLHQodGhpcykuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLG51bGwpLmdldFByb3BlcnR5VmFsdWUobikpO3JldHVybiBvJiZmdW5jdGlvbih0KXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KG4sbyh0KSxyKX19cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MyYmKHI9IiIpLHRoaXMudHdlZW4oInN0eWxlLiIrbix1KX0sUGwudGV4dD1mdW5jdGlvbihuKXtyZXR1cm4gWm8odGhpcywidGV4dCIsbixWbyl9LFBsLnJlbW92ZT1mdW5jdGlvbigpe3ZhciBuPXRoaXMubmFtZXNwYWNlO3JldHVybiB0aGlzLmVhY2goImVuZC50cmFuc2l0aW9uIixmdW5jdGlvbigpe3ZhciB0O3RoaXNbbl0uY291bnQ8MiYmKHQ9dGhpcy5wYXJlbnROb2RlKSYmdC5yZW1vdmVDaGlsZCh0aGlzKX0pfSxQbC5lYXNlPWZ1bmN0aW9uKG4pe3ZhciB0PXRoaXMuaWQsZT10aGlzLm5hbWVzcGFjZTtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aDwxP3RoaXMubm9kZSgpW2VdW3RdLmVhc2U6KCJmdW5jdGlvbiIhPXR5cGVvZiBuJiYobj10YS5lYXNlLmFwcGx5KHRhLGFyZ3VtZW50cykpLFkodGhpcyxmdW5jdGlvbihyKXtyW2VdW3RdLmVhc2U9bn0pKX0sUGwuZGVsYXk9ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZGVsYXk6WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmRlbGF5PStuLmNhbGwocixyLl9fZGF0YV9fLHUsaSl9OihuPStuLGZ1bmN0aW9uKHIpe3JbZV1bdF0uZGVsYXk9bn0pKX0sUGwuZHVyYXRpb249ZnVuY3Rpb24obil7dmFyIHQ9dGhpcy5pZCxlPXRoaXMubmFtZXNwYWNlO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/dGhpcy5ub2RlKClbZV1bdF0uZHVyYXRpb246WSh0aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHIsdSxpKXtyW2VdW3RdLmR1cmF0aW9uPU1hdGgubWF4KDEsbi5jYWxsKHIsci5fX2RhdGFfXyx1LGkpKX06KG49TWF0aC5tYXgoMSxuKSxmdW5jdGlvbihyKXtyW2VdW3RdLmR1cmF0aW9uPW59KSl9LFBsLmVhY2g9ZnVuY3Rpb24obix0KXt2YXIgZT10aGlzLmlkLHI9dGhpcy5uYW1lc3BhY2U7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgdT1SbCxpPVRsO3RyeXtUbD1lLFkodGhpcyxmdW5jdGlvbih0LHUsaSl7Umw9dFtyXVtlXSxuLmNhbGwodCx0Ll9fZGF0YV9fLHUsaSl9KX1maW5hbGx5e1JsPXUsVGw9aX19ZWxzZSBZKHRoaXMsZnVuY3Rpb24odSl7dmFyIGk9dVtyXVtlXTsoaS5ldmVudHx8KGkuZXZlbnQ9dGEuZGlzcGF0Y2goInN0YXJ0IiwiZW5kIiwiaW50ZXJydXB0IikpKS5vbihuLHQpfSk7cmV0dXJuIHRoaXN9LFBsLnRyYW5zaXRpb249ZnVuY3Rpb24oKXtmb3IodmFyIG4sdCxlLHIsdT10aGlzLmlkLGk9KytVbCxvPXRoaXMubmFtZXNwYWNlLGE9W10sYz0wLGw9dGhpcy5sZW5ndGg7bD5jO2MrKyl7YS5wdXNoKG49W10pO2Zvcih2YXIgdD10aGlzW2NdLHM9MCxmPXQubGVuZ3RoO2Y+cztzKyspKGU9dFtzXSkmJihyPWVbb11bdV0sJG8oZSxzLG8saSx7dGltZTpyLnRpbWUsZWFzZTpyLmVhc2UsZGVsYXk6ci5kZWxheStyLmR1cmF0aW9uLGR1cmF0aW9uOnIuZHVyYXRpb259KSksbi5wdXNoKGUpfXJldHVybiBZbyhhLG8saSl9LHRhLnN2Zy5heGlzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbixsPXRhLnNlbGVjdCh0aGlzKSxzPXRoaXMuX19jaGFydF9ffHxlLGY9dGhpcy5fX2NoYXJ0X189ZS5jb3B5KCksaD1udWxsPT1jP2YudGlja3M/Zi50aWNrcy5hcHBseShmLGEpOmYuZG9tYWluKCk6YyxnPW51bGw9PXQ/Zi50aWNrRm9ybWF0P2YudGlja0Zvcm1hdC5hcHBseShmLGEpOnk6dCxwPWwuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoaCxmKSx2PXAuZW50ZXIoKS5pbnNlcnQoImciLCIuZG9tYWluIikuYXR0cigiY2xhc3MiLCJ0aWNrIikuc3R5bGUoIm9wYWNpdHkiLENhKSxkPXRhLnRyYW5zaXRpb24ocC5leGl0KCkpLnN0eWxlKCJvcGFjaXR5IixDYSkucmVtb3ZlKCksbT10YS50cmFuc2l0aW9uKHAub3JkZXIoKSkuc3R5bGUoIm9wYWNpdHkiLDEpLE09TWF0aC5tYXgodSwwKStvLHg9VWkoZiksYj1sLnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoWzBdKSxfPShiLmVudGVyKCkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJkb21haW4iKSx0YS50cmFuc2l0aW9uKGIpKTt2LmFwcGVuZCgibGluZSIpLHYuYXBwZW5kKCJ0ZXh0Iik7dmFyIHcsUyxrLEUsQT12LnNlbGVjdCgibGluZSIpLE49bS5zZWxlY3QoImxpbmUiKSxDPXAuc2VsZWN0KCJ0ZXh0IikudGV4dChnKSx6PXYuc2VsZWN0KCJ0ZXh0IikscT1tLnNlbGVjdCgidGV4dCIpLEw9InRvcCI9PT1yfHwibGVmdCI9PT1yPy0xOjE7aWYoImJvdHRvbSI9PT1yfHwidG9wIj09PXI/KG49Qm8sdz0ieCIsaz0ieSIsUz0ieDIiLEU9InkyIixDLmF0dHIoImR5IiwwPkw/IjBlbSI6Ii43MWVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwibWlkZGxlIiksXy5hdHRyKCJkIiwiTSIreFswXSsiLCIrTCppKyJWMEgiK3hbMV0rIlYiK0wqaSkpOihuPVdvLHc9InkiLGs9IngiLFM9InkyIixFPSJ4MiIsQy5hdHRyKCJkeSIsIi4zMmVtIikuc3R5bGUoInRleHQtYW5jaG9yIiwwPkw/ImVuZCI6InN0YXJ0IiksXy5hdHRyKCJkIiwiTSIrTCppKyIsIit4WzBdKyJIMFYiK3hbMV0rIkgiK0wqaSkpLEEuYXR0cihFLEwqdSksei5hdHRyKGssTCpNKSxOLmF0dHIoUywwKS5hdHRyKEUsTCp1KSxxLmF0dHIodywwKS5hdHRyKGssTCpNKSxmLnJhbmdlQmFuZCl7dmFyIFQ9ZixSPVQucmFuZ2VCYW5kKCkvMjtzPWY9ZnVuY3Rpb24obil7cmV0dXJuIFQobikrUn19ZWxzZSBzLnJhbmdlQmFuZD9zPWY6ZC5jYWxsKG4sZixzKTt2LmNhbGwobixzLGYpLG0uY2FsbChuLGYsZil9KX12YXIgdCxlPXRhLnNjYWxlLmxpbmVhcigpLHI9amwsdT02LGk9NixvPTMsYT1bMTBdLGM9bnVsbDtyZXR1cm4gbi5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG4pOmV9LG4ub3JpZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQgaW4gRmw/dCsiIjpqbCxuKTpyfSxuLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9YXJndW1lbnRzLG4pOmF9LG4udGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10LG4pOmN9LG4udGlja0Zvcm1hdD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLG4pOnR9LG4udGlja1NpemU9ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aDtyZXR1cm4gZT8odT0rdCxpPSthcmd1bWVudHNbZS0xXSxuKTp1fSxuLmlubmVyVGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3Qsbik6dX0sbi5vdXRlclRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOml9LG4udGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3Qsbik6b30sbi50aWNrU3ViZGl2aWRlPWZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgmJm59LG59O3ZhciBqbD0iYm90dG9tIixGbD17dG9wOjEscmlnaHQ6MSxib3R0b206MSxsZWZ0OjF9O3RhLnN2Zy5icnVzaD1mdW5jdGlvbigpe2Z1bmN0aW9uIG4odCl7dC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9dGEuc2VsZWN0KHRoaXMpLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIikub24oIm1vdXNlZG93bi5icnVzaCIsaSkub24oInRvdWNoc3RhcnQuYnJ1c2giLGkpLG89dC5zZWxlY3RBbGwoIi5iYWNrZ3JvdW5kIikuZGF0YShbMF0pO28uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsImJhY2tncm91bmQiKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpLnN0eWxlKCJjdXJzb3IiLCJjcm9zc2hhaXIiKSx0LnNlbGVjdEFsbCgiLmV4dGVudCIpLmRhdGEoWzBdKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwiZXh0ZW50Iikuc3R5bGUoImN1cnNvciIsIm1vdmUiKTt2YXIgYT10LnNlbGVjdEFsbCgiLnJlc2l6ZSIpLmRhdGEodix5KTthLmV4aXQoKS5yZW1vdmUoKSxhLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLGZ1bmN0aW9uKG4pe3JldHVybiJyZXNpemUgIitufSkuc3R5bGUoImN1cnNvciIsZnVuY3Rpb24obil7cmV0dXJuIEhsW25dfSkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsZnVuY3Rpb24obil7cmV0dXJuL1tld10kLy50ZXN0KG4pPy0zOm51bGx9KS5hdHRyKCJ5IixmdW5jdGlvbihuKXtyZXR1cm4vXltuc10vLnRlc3Qobik/LTM6bnVsbH0pLmF0dHIoIndpZHRoIiw2KS5hdHRyKCJoZWlnaHQiLDYpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIiksYS5zdHlsZSgiZGlzcGxheSIsbi5lbXB0eSgpPyJub25lIjpudWxsKTt2YXIgYyxmPXRhLnRyYW5zaXRpb24odCksaD10YS50cmFuc2l0aW9uKG8pO2wmJihjPVVpKGwpLGguYXR0cigieCIsY1swXSkuYXR0cigid2lkdGgiLGNbMV0tY1swXSkscihmKSkscyYmKGM9VWkocyksaC5hdHRyKCJ5IixjWzBdKS5hdHRyKCJoZWlnaHQiLGNbMV0tY1swXSksdShmKSksZShmKX0pfWZ1bmN0aW9uIGUobil7bi5zZWxlY3RBbGwoIi5yZXNpemUiKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKG4pe3JldHVybiJ0cmFuc2xhdGUoIitmWysvZSQvLnRlc3QobildKyIsIitoWysvXnMvLnRlc3QobildKyIpIn0pfWZ1bmN0aW9uIHIobil7bi5zZWxlY3QoIi5leHRlbnQiKS5hdHRyKCJ4IixmWzBdKSxuLnNlbGVjdEFsbCgiLmV4dGVudCwubj5yZWN0LC5zPnJlY3QiKS5hdHRyKCJ3aWR0aCIsZlsxXS1mWzBdKX1mdW5jdGlvbiB1KG4pe24uc2VsZWN0KCIuZXh0ZW50IikuYXR0cigieSIsaFswXSksbi5zZWxlY3RBbGwoIi5leHRlbnQsLmU+cmVjdCwudz5yZWN0IikuYXR0cigiaGVpZ2h0IixoWzFdLWhbMF0pfWZ1bmN0aW9uIGkoKXtmdW5jdGlvbiBpKCl7MzI9PXRhLmV2ZW50LmtleUNvZGUmJihDfHwoTT1udWxsLHFbMF0tPWZbMV0scVsxXS09aFsxXSxDPTIpLFMoKSl9ZnVuY3Rpb24gdigpezMyPT10YS5ldmVudC5rZXlDb2RlJiYyPT1DJiYocVswXSs9ZlsxXSxxWzFdKz1oWzFdLEM9MCxTKCkpfWZ1bmN0aW9uIGQoKXt2YXIgbj10YS5tb3VzZShiKSx0PSExO3gmJihuWzBdKz14WzBdLG5bMV0rPXhbMV0pLEN8fCh0YS5ldmVudC5hbHRLZXk/KE18fChNPVsoZlswXStmWzFdKS8yLChoWzBdK2hbMV0pLzJdKSxxWzBdPWZbKyhuWzBdPE1bMF0pXSxxWzFdPWhbKyhuWzFdPE1bMV0pXSk6TT1udWxsKSxBJiZtKG4sbCwwKSYmKHIoayksdD0hMCksTiYmbShuLHMsMSkmJih1KGspLHQ9ITApLHQmJihlKGspLHcoe3R5cGU6ImJydXNoIixtb2RlOkM/Im1vdmUiOiJyZXNpemUifSkpfWZ1bmN0aW9uIG0obix0LGUpe3ZhciByLHUsaT1VaSh0KSxjPWlbMF0sbD1pWzFdLHM9cVtlXSx2PWU/aDpmLGQ9dlsxXS12WzBdO3JldHVybiBDJiYoYy09cyxsLT1kK3MpLHI9KGU/cDpnKT9NYXRoLm1heChjLE1hdGgubWluKGwsbltlXSkpOm5bZV0sQz91PShyKz1zKStkOihNJiYocz1NYXRoLm1heChjLE1hdGgubWluKGwsMipNW2VdLXIpKSkscj5zPyh1PXIscj1zKTp1PXMpLHZbMF0hPXJ8fHZbMV0hPXU/KGU/YT1udWxsOm89bnVsbCx2WzBdPXIsdlsxXT11LCEwKTp2b2lkIDB9ZnVuY3Rpb24geSgpe2QoKSxrLnN0eWxlKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixuLmVtcHR5KCk/Im5vbmUiOm51bGwpLHRhLnNlbGVjdCgiYm9keSIpLnN0eWxlKCJjdXJzb3IiLG51bGwpLEwub24oIm1vdXNlbW92ZS5icnVzaCIsbnVsbCkub24oIm1vdXNldXAuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLG51bGwpLm9uKCJ0b3VjaGVuZC5icnVzaCIsbnVsbCkub24oImtleWRvd24uYnJ1c2giLG51bGwpLm9uKCJrZXl1cC5icnVzaCIsbnVsbCkseigpLHcoe3R5cGU6ImJydXNoZW5kIn0pfXZhciBNLHgsYj10aGlzLF89dGEuc2VsZWN0KHRhLmV2ZW50LnRhcmdldCksdz1jLm9mKGIsYXJndW1lbnRzKSxrPXRhLnNlbGVjdChiKSxFPV8uZGF0dW0oKSxBPSEvXihufHMpJC8udGVzdChFKSYmbCxOPSEvXihlfHcpJC8udGVzdChFKSYmcyxDPV8uY2xhc3NlZCgiZXh0ZW50Iiksej1XKGIpLHE9dGEubW91c2UoYiksTD10YS5zZWxlY3QodChiKSkub24oImtleWRvd24uYnJ1c2giLGkpLm9uKCJrZXl1cC5icnVzaCIsdik7aWYodGEuZXZlbnQuY2hhbmdlZFRvdWNoZXM/TC5vbigidG91Y2htb3ZlLmJydXNoIixkKS5vbigidG91Y2hlbmQuYnJ1c2giLHkpOkwub24oIm1vdXNlbW92ZS5icnVzaCIsZCkub24oIm1vdXNldXAuYnJ1c2giLHkpLGsuaW50ZXJydXB0KCkuc2VsZWN0QWxsKCIqIikuaW50ZXJydXB0KCksQylxWzBdPWZbMF0tcVswXSxxWzFdPWhbMF0tcVsxXTtlbHNlIGlmKEUpe3ZhciBUPSsvdyQvLnRlc3QoRSksUj0rL15uLy50ZXN0KEUpO3g9W2ZbMS1UXS1xWzBdLGhbMS1SXS1xWzFdXSxxWzBdPWZbVF0scVsxXT1oW1JdfWVsc2UgdGEuZXZlbnQuYWx0S2V5JiYoTT1xLnNsaWNlKCkpO2suc3R5bGUoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpLnNlbGVjdEFsbCgiLnJlc2l6ZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKSx0YS5zZWxlY3QoImJvZHkiKS5zdHlsZSgiY3Vyc29yIixfLnN0eWxlKCJjdXJzb3IiKSksdyh7dHlwZToiYnJ1c2hzdGFydCJ9KSxkKCl9dmFyIG8sYSxjPUUobiwiYnJ1c2hzdGFydCIsImJydXNoIiwiYnJ1c2hlbmQiKSxsPW51bGwscz1udWxsLGY9WzAsMF0saD1bMCwwXSxnPSEwLHA9ITAsdj1PbFswXTtyZXR1cm4gbi5ldmVudD1mdW5jdGlvbihuKXtuLmVhY2goZnVuY3Rpb24oKXt2YXIgbj1jLm9mKHRoaXMsYXJndW1lbnRzKSx0PXt4OmYseTpoLGk6byxqOmF9LGU9dGhpcy5fX2NoYXJ0X198fHQ7dGhpcy5fX2NoYXJ0X189dCxUbD90YS5zZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmVhY2goInN0YXJ0LmJydXNoIixmdW5jdGlvbigpe289ZS5pLGE9ZS5qLGY9ZS54LGg9ZS55LG4oe3R5cGU6ImJydXNoc3RhcnQifSl9KS50d2VlbigiYnJ1c2g6YnJ1c2giLGZ1bmN0aW9uKCl7dmFyIGU9eXUoZix0LngpLHI9eXUoaCx0LnkpO3JldHVybiBvPWE9bnVsbCxmdW5jdGlvbih1KXtmPXQueD1lKHUpLGg9dC55PXIodSksbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KX19KS5lYWNoKCJlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7bz10LmksYT10Lmosbih7dHlwZToiYnJ1c2giLG1vZGU6InJlc2l6ZSJ9KSxuKHt0eXBlOiJicnVzaGVuZCJ9KX0pOihuKHt0eXBlOiJicnVzaHN0YXJ0In0pLG4oe3R5cGU6ImJydXNoIixtb2RlOiJyZXNpemUifSksbih7dHlwZToiYnJ1c2hlbmQifSkpfSl9LG4ueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHY9T2xbIWw8PDF8IXNdLG4pOmx9LG4ueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LHY9T2xbIWw8PDF8IXNdLG4pOnN9LG4uY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGwmJnM/KGc9ISF0WzBdLHA9ISF0WzFdKTpsP2c9ISF0OnMmJihwPSEhdCksbik6bCYmcz9bZyxwXTpsP2c6cz9wOm51bGx9LG4uZXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlLHIsdSxpLGM7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGwmJihlPXRbMF0scj10WzFdLHMmJihlPWVbMF0scj1yWzBdKSxvPVtlLHJdLGwuaW52ZXJ0JiYoZT1sKGUpLHI9bChyKSksZT5yJiYoYz1lLGU9cixyPWMpLChlIT1mWzBdfHxyIT1mWzFdKSYmKGY9W2Uscl0pKSxzJiYodT10WzBdLGk9dFsxXSxsJiYodT11WzFdLGk9aVsxXSksYT1bdSxpXSxzLmludmVydCYmKHU9cyh1KSxpPXMoaSkpLHU+aSYmKGM9dSx1PWksaT1jKSwodSE9aFswXXx8aSE9aFsxXSkmJihoPVt1LGldKSksbik6KGwmJihvPyhlPW9bMF0scj1vWzFdKTooZT1mWzBdLHI9ZlsxXSxsLmludmVydCYmKGU9bC5pbnZlcnQoZSkscj1sLmludmVydChyKSksZT5yJiYoYz1lLGU9cixyPWMpKSkscyYmKGE/KHU9YVswXSxpPWFbMV0pOih1PWhbMF0saT1oWzFdLHMuaW52ZXJ0JiYodT1zLmludmVydCh1KSxpPXMuaW52ZXJ0KGkpKSx1PmkmJihjPXUsdT1pLGk9YykpKSxsJiZzP1tbZSx1XSxbcixpXV06bD9bZSxyXTpzJiZbdSxpXSl9LG4uY2xlYXI9ZnVuY3Rpb24oKXtyZXR1cm4gbi5lbXB0eSgpfHwoZj1bMCwwXSxoPVswLDBdLG89YT1udWxsKSxufSxuLmVtcHR5PWZ1bmN0aW9uKCl7cmV0dXJuISFsJiZmWzBdPT1mWzFdfHwhIXMmJmhbMF09PWhbMV19LHRhLnJlYmluZChuLGMsIm9uIil9O3ZhciBIbD17bjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxPbD1bWyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXSxbImUiLCJ3Il0sWyJuIiwicyJdLFtdXSxJbD1hYy5mb3JtYXQ9Z2MudGltZUZvcm1hdCxZbD1JbC51dGMsWmw9WWwoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO0lsLmlzbz1EYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZyYmK25ldyBEYXRlKCIyMDAwLTAxLTAxVDAwOjAwOjAwLjAwMFoiKT9KbzpabCxKby5wYXJzZT1mdW5jdGlvbihuKXt2YXIgdD1uZXcgRGF0ZShuKTtyZXR1cm4gaXNOYU4odCk/bnVsbDp0fSxKby50b1N0cmluZz1abC50b1N0cmluZyxhYy5zZWNvbmQ9RnQoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBjYygxZTMqTWF0aC5mbG9vcihuLzFlMykpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSsxZTMqTWF0aC5mbG9vcih0KSl9LGZ1bmN0aW9uKG4pe3JldHVybiBuLmdldFNlY29uZHMoKX0pLGFjLnNlY29uZHM9YWMuc2Vjb25kLnJhbmdlLGFjLnNlY29uZHMudXRjPWFjLnNlY29uZC51dGMucmFuZ2UsYWMubWludXRlPUZ0KGZ1bmN0aW9uKG4pe3JldHVybiBuZXcgY2MoNmU0Kk1hdGguZmxvb3Iobi82ZTQpKX0sZnVuY3Rpb24obix0KXtuLnNldFRpbWUobi5nZXRUaW1lKCkrNmU0Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9KSxhYy5taW51dGVzPWFjLm1pbnV0ZS5yYW5nZSxhYy5taW51dGVzLnV0Yz1hYy5taW51dGUudXRjLnJhbmdlLGFjLmhvdXI9RnQoZnVuY3Rpb24obil7dmFyIHQ9bi5nZXRUaW1lem9uZU9mZnNldCgpLzYwO3JldHVybiBuZXcgY2MoMzZlNSooTWF0aC5mbG9vcihuLzM2ZTUtdCkrdCkpfSxmdW5jdGlvbihuLHQpe24uc2V0VGltZShuLmdldFRpbWUoKSszNmU1Kk1hdGguZmxvb3IodCkpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfSksYWMuaG91cnM9YWMuaG91ci5yYW5nZSxhYy5ob3Vycy51dGM9YWMuaG91ci51dGMucmFuZ2UsYWMubW9udGg9RnQoZnVuY3Rpb24obil7cmV0dXJuIG49YWMuZGF5KG4pLG4uc2V0RGF0ZSgxKSxufSxmdW5jdGlvbihuLHQpe24uc2V0TW9udGgobi5nZXRNb250aCgpK3QpfSxmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNb250aCgpfSksYWMubW9udGhzPWFjLm1vbnRoLnJhbmdlLGFjLm1vbnRocy51dGM9YWMubW9udGgudXRjLnJhbmdlO3ZhciBWbD1bMWUzLDVlMywxNWUzLDNlNCw2ZTQsM2U1LDllNSwxOGU1LDM2ZTUsMTA4ZTUsMjE2ZTUsNDMyZTUsODY0ZTUsMTcyOGU1LDYwNDhlNSwyNTkyZTYsNzc3NmU2LDMxNTM2ZTZdLFhsPVtbYWMuc2Vjb25kLDFdLFthYy5zZWNvbmQsNV0sW2FjLnNlY29uZCwxNV0sW2FjLnNlY29uZCwzMF0sW2FjLm1pbnV0ZSwxXSxbYWMubWludXRlLDVdLFthYy5taW51dGUsMTVdLFthYy5taW51dGUsMzBdLFthYy5ob3VyLDFdLFthYy5ob3VyLDNdLFthYy5ob3VyLDZdLFthYy5ob3VyLDEyXSxbYWMuZGF5LDFdLFthYy5kYXksMl0sW2FjLndlZWssMV0sW2FjLm1vbnRoLDFdLFthYy5tb250aCwzXSxbYWMueWVhciwxXV0sJGw9SWwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0RGF5KCkmJjEhPW4uZ2V0RGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0RGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0TW9udGgoKX1dLFsiJVkiLE5lXV0pLEJsPXtyYW5nZTpmdW5jdGlvbihuLHQsZSl7cmV0dXJuIHRhLnJhbmdlKE1hdGguY2VpbChuL2UpKmUsK3QsZSkubWFwKEtvKX0sZmxvb3I6eSxjZWlsOnl9O1hsLnllYXI9YWMueWVhcixhYy5zY2FsZT1mdW5jdGlvbigpe3JldHVybiBHbyh0YS5zY2FsZS5saW5lYXIoKSxYbCwkbCl9O3ZhciBXbD1YbC5tYXAoZnVuY3Rpb24obil7cmV0dXJuW25bMF0udXRjLG5bMV1dfSksSmw9WWwubXVsdGkoW1siLiVMIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaWxsaXNlY29uZHMoKX1dLFsiOiVTIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENTZWNvbmRzKCl9XSxbIiVJOiVNIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENNaW51dGVzKCl9XSxbIiVJICVwIixmdW5jdGlvbihuKXtyZXR1cm4gbi5nZXRVVENIb3VycygpfV0sWyIlYSAlZCIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDRGF5KCkmJjEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlYiAlZCIsZnVuY3Rpb24obil7cmV0dXJuIDEhPW4uZ2V0VVRDRGF0ZSgpfV0sWyIlQiIsZnVuY3Rpb24obil7cmV0dXJuIG4uZ2V0VVRDTW9udGgoKX1dLFsiJVkiLE5lXV0pO1dsLnllYXI9YWMueWVhci51dGMsYWMuc2NhbGUudXRjPWZ1bmN0aW9uKCl7cmV0dXJuIEdvKHRhLnNjYWxlLmxpbmVhcigpLFdsLEpsKX0sdGEudGV4dD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVRleHR9KSx0YS5qc29uPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIE50KG4sImFwcGxpY2F0aW9uL2pzb24iLFFvLHQpfSx0YS5odG1sPWZ1bmN0aW9uKG4sdCl7cmV0dXJuIE50KG4sInRleHQvaHRtbCIsbmEsdCl9LHRhLnhtbD1BdChmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXNwb25zZVhNTH0pLCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHRhKToib2JqZWN0Ij09dHlwZW9mIG1vZHVsZSYmbW9kdWxlLmV4cG9ydHMmJihtb2R1bGUuZXhwb3J0cz10YSksdGhpcy5kMz10YX0oKTs="></script>
<link href="data:text/css;charset=utf-8,%2Ed3%2Dtip%20%7B%0Aline%2Dheight%3A%201%3B%0Afont%2Dweight%3A%20bold%3B%0Apadding%3A%2012px%3B%0Abackground%3A%20rgba%280%2C%200%2C%200%2C%200%2E8%29%3B%0Acolor%3A%20%23fff%3B%0Aborder%2Dradius%3A%202px%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%0A%2Ed3%2Dtip%3Aafter%20%7B%0Abox%2Dsizing%3A%20border%2Dbox%3B%0Adisplay%3A%20inline%3B%0Afont%2Dsize%3A%2010px%3B%0Awidth%3A%20100%25%3B%0Aline%2Dheight%3A%201%3B%0Acolor%3A%20rgba%280%2C%200%2C%200%2C%200%2E8%29%3B%0Aposition%3A%20absolute%3B%0Apointer%2Devents%3A%20none%3B%0A%7D%0A%0A%2Ed3%2Dtip%2En%3Aafter%20%7B%0Acontent%3A%20%22%5C25BC%22%3B%0Amargin%3A%20%2D1px%200%200%200%3B%0Atop%3A%20100%25%3B%0Aleft%3A%200%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%0A%2Ed3%2Dtip%2Ee%3Aafter%20%7B%0Acontent%3A%20%22%5C25C0%22%3B%0Amargin%3A%20%2D4px%200%200%200%3B%0Atop%3A%2050%25%3B%0Aleft%3A%20%2D8px%3B%0A%7D%0A%0A%2Ed3%2Dtip%2Es%3Aafter%20%7B%0Acontent%3A%20%22%5C25B2%22%3B%0Amargin%3A%200%200%201px%200%3B%0Atop%3A%20%2D8px%3B%0Aleft%3A%200%3B%0Atext%2Dalign%3A%20center%3B%0A%7D%0A%0A%2Ed3%2Dtip%2Ew%3Aafter%20%7B%0Acontent%3A%20%22%5C25B6%22%3B%0Amargin%3A%20%2D4px%200%200%20%2D1px%3B%0Atop%3A%2050%25%3B%0Aleft%3A%20100%25%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,Ly8gZDMudGlwCi8vIENvcHlyaWdodCAoYykgMjAxMyBKdXN0aW4gUGFsbWVyCi8vCi8vIFRvb2x0aXBzIGZvciBkMy5qcyBTVkcgdmlzdWFsaXphdGlvbnMKCihmdW5jdGlvbiAocm9vdCwgZmFjdG9yeSkgewogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIC8vIEFNRC4gUmVnaXN0ZXIgYXMgYW4gYW5vbnltb3VzIG1vZHVsZSB3aXRoIGQzIGFzIGEgZGVwZW5kZW5jeS4KICAgIGRlZmluZShbJ2QzJ10sIGZhY3RvcnkpCiAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cykgewogICAgLy8gQ29tbW9uSlMKICAgIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZDMpIHsKICAgICAgZDMudGlwID0gZmFjdG9yeShkMykKICAgICAgcmV0dXJuIGQzLnRpcAogICAgfQogIH0gZWxzZSB7CiAgICAvLyBCcm93c2VyIGdsb2JhbC4KICAgIHJvb3QuZDMudGlwID0gZmFjdG9yeShyb290LmQzKQogIH0KfSh0aGlzLCBmdW5jdGlvbiAoZDMpIHsKCiAgLy8gUHVibGljIC0gY29udHJ1Y3RzIGEgbmV3IHRvb2x0aXAKICAvLwogIC8vIFJldHVybnMgYSB0aXAKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICB2YXIgZGlyZWN0aW9uID0gZDNfdGlwX2RpcmVjdGlvbiwKICAgICAgICBvZmZzZXQgICAgPSBkM190aXBfb2Zmc2V0LAogICAgICAgIGh0bWwgICAgICA9IGQzX3RpcF9odG1sLAogICAgICAgIG5vZGUgICAgICA9IGluaXROb2RlKCksCiAgICAgICAgc3ZnICAgICAgID0gbnVsbCwKICAgICAgICBwb2ludCAgICAgPSBudWxsLAogICAgICAgIHRhcmdldCAgICA9IG51bGwKCiAgICBmdW5jdGlvbiB0aXAodmlzKSB7CiAgICAgIHN2ZyA9IGdldFNWR05vZGUodmlzKQogICAgICBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpCiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9kZSkKICAgIH0KCiAgICAvLyBQdWJsaWMgLSBzaG93IHRoZSB0b29sdGlwIG9uIHRoZSBzY3JlZW4KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuc2hvdyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgaWYoYXJnc1thcmdzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgdGFyZ2V0ID0gYXJncy5wb3AoKQoKICAgICAgdmFyIGNvbnRlbnQgPSBodG1sLmFwcGx5KHRoaXMsIGFyZ3MpLAogICAgICAgICAgcG9mZnNldCA9IG9mZnNldC5hcHBseSh0aGlzLCBhcmdzKSwKICAgICAgICAgIGRpciAgICAgPSBkaXJlY3Rpb24uYXBwbHkodGhpcywgYXJncyksCiAgICAgICAgICBub2RlbCAgID0gZ2V0Tm9kZUVsKCksCiAgICAgICAgICBpICAgICAgID0gZGlyZWN0aW9ucy5sZW5ndGgsCiAgICAgICAgICBjb29yZHMsCiAgICAgICAgICBzY3JvbGxUb3AgID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCwKICAgICAgICAgIHNjcm9sbExlZnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQKCiAgICAgIG5vZGVsLmh0bWwoY29udGVudCkKICAgICAgICAuc3R5bGUoeyBvcGFjaXR5OiAxLCAncG9pbnRlci1ldmVudHMnOiAnYWxsJyB9KQoKICAgICAgd2hpbGUoaS0tKSBub2RlbC5jbGFzc2VkKGRpcmVjdGlvbnNbaV0sIGZhbHNlKQogICAgICBjb29yZHMgPSBkaXJlY3Rpb25fY2FsbGJhY2tzLmdldChkaXIpLmFwcGx5KHRoaXMpCiAgICAgIG5vZGVsLmNsYXNzZWQoZGlyLCB0cnVlKS5zdHlsZSh7CiAgICAgICAgdG9wOiAoY29vcmRzLnRvcCArICBwb2Zmc2V0WzBdKSArIHNjcm9sbFRvcCArICdweCcsCiAgICAgICAgbGVmdDogKGNvb3Jkcy5sZWZ0ICsgcG9mZnNldFsxXSkgKyBzY3JvbGxMZWZ0ICsgJ3B4JwogICAgICB9KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYyAtIGhpZGUgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuaGlkZSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgbm9kZWwgPSBnZXROb2RlRWwoKQogICAgICBub2RlbC5zdHlsZSh7IG9wYWNpdHk6IDAsICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyB9KQogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBQcm94eSBhdHRyIGNhbGxzIHRvIHRoZSBkMyB0aXAgY29udGFpbmVyLiAgU2V0cyBvciBnZXRzIGF0dHJpYnV0ZSB2YWx1ZS4KICAgIC8vCiAgICAvLyBuIC0gbmFtZSBvZiB0aGUgYXR0cmlidXRlCiAgICAvLyB2IC0gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZQogICAgLy8KICAgIC8vIFJldHVybnMgdGlwIG9yIGF0dHJpYnV0ZSB2YWx1ZQogICAgdGlwLmF0dHIgPSBmdW5jdGlvbihuLCB2KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMiAmJiB0eXBlb2YgbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICByZXR1cm4gZ2V0Tm9kZUVsKCkuYXR0cihuKQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBhcmdzID0gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgICBkMy5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHIuYXBwbHkoZ2V0Tm9kZUVsKCksIGFyZ3MpCiAgICAgIH0KCiAgICAgIHJldHVybiB0aXAKICAgIH0KCiAgICAvLyBQdWJsaWM6IFByb3h5IHN0eWxlIGNhbGxzIHRvIHRoZSBkMyB0aXAgY29udGFpbmVyLiAgU2V0cyBvciBnZXRzIGEgc3R5bGUgdmFsdWUuCiAgICAvLwogICAgLy8gbiAtIG5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAvLyB2IC0gdmFsdWUgb2YgdGhlIHByb3BlcnR5CiAgICAvLwogICAgLy8gUmV0dXJucyB0aXAgb3Igc3R5bGUgcHJvcGVydHkgdmFsdWUKICAgIHRpcC5zdHlsZSA9IGZ1bmN0aW9uKG4sIHYpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyICYmIHR5cGVvZiBuID09PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiBnZXROb2RlRWwoKS5zdHlsZShuKQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBhcmdzID0gIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cykKICAgICAgICBkMy5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlLmFwcGx5KGdldE5vZGVFbCgpLCBhcmdzKQogICAgICB9CgogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBTZXQgb3IgZ2V0IHRoZSBkaXJlY3Rpb24gb2YgdGhlIHRvb2x0aXAKICAgIC8vCiAgICAvLyB2IC0gT25lIG9mIG4obm9ydGgpLCBzKHNvdXRoKSwgZShlYXN0KSwgb3Igdyh3ZXN0KSwgbncobm9ydGh3ZXN0KSwKICAgIC8vICAgICBzdyhzb3V0aHdlc3QpLCBuZShub3J0aGVhc3QpIG9yIHNlKHNvdXRoZWFzdCkKICAgIC8vCiAgICAvLyBSZXR1cm5zIHRpcCBvciBkaXJlY3Rpb24KICAgIHRpcC5kaXJlY3Rpb24gPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRpcmVjdGlvbgogICAgICBkaXJlY3Rpb24gPSB2ID09IG51bGwgPyB2IDogZDMuZnVuY3Rvcih2KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYzogU2V0cyBvciBnZXRzIHRoZSBvZmZzZXQgb2YgdGhlIHRpcAogICAgLy8KICAgIC8vIHYgLSBBcnJheSBvZiBbeCwgeV0gb2Zmc2V0CiAgICAvLwogICAgLy8gUmV0dXJucyBvZmZzZXQgb3IKICAgIHRpcC5vZmZzZXQgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIG9mZnNldAogICAgICBvZmZzZXQgPSB2ID09IG51bGwgPyB2IDogZDMuZnVuY3Rvcih2KQoKICAgICAgcmV0dXJuIHRpcAogICAgfQoKICAgIC8vIFB1YmxpYzogc2V0cyBvciBnZXRzIHRoZSBodG1sIHZhbHVlIG9mIHRoZSB0b29sdGlwCiAgICAvLwogICAgLy8gdiAtIFN0cmluZyB2YWx1ZSBvZiB0aGUgdGlwCiAgICAvLwogICAgLy8gUmV0dXJucyBodG1sIHZhbHVlIG9yIHRpcAogICAgdGlwLmh0bWwgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGh0bWwKICAgICAgaHRtbCA9IHYgPT0gbnVsbCA/IHYgOiBkMy5mdW5jdG9yKHYpCgogICAgICByZXR1cm4gdGlwCiAgICB9CgogICAgLy8gUHVibGljOiBkZXN0cm95cyB0aGUgdG9vbHRpcCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBET00KICAgIC8vCiAgICAvLyBSZXR1cm5zIGEgdGlwCiAgICB0aXAuZGVzdHJveSA9IGZ1bmN0aW9uKCkgewogICAgICBpZihub2RlKSB7CiAgICAgICAgZ2V0Tm9kZUVsKCkucmVtb3ZlKCk7CiAgICAgICAgbm9kZSA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHRpcDsKICAgIH0KCiAgICBmdW5jdGlvbiBkM190aXBfZGlyZWN0aW9uKCkgeyByZXR1cm4gJ24nIH0KICAgIGZ1bmN0aW9uIGQzX3RpcF9vZmZzZXQoKSB7IHJldHVybiBbMCwgMF0gfQogICAgZnVuY3Rpb24gZDNfdGlwX2h0bWwoKSB7IHJldHVybiAnICcgfQoKICAgIHZhciBkaXJlY3Rpb25fY2FsbGJhY2tzID0gZDMubWFwKHsKICAgICAgbjogIGRpcmVjdGlvbl9uLAogICAgICBzOiAgZGlyZWN0aW9uX3MsCiAgICAgIGU6ICBkaXJlY3Rpb25fZSwKICAgICAgdzogIGRpcmVjdGlvbl93LAogICAgICBudzogZGlyZWN0aW9uX253LAogICAgICBuZTogZGlyZWN0aW9uX25lLAogICAgICBzdzogZGlyZWN0aW9uX3N3LAogICAgICBzZTogZGlyZWN0aW9uX3NlCiAgICB9KSwKCiAgICBkaXJlY3Rpb25zID0gZGlyZWN0aW9uX2NhbGxiYWNrcy5rZXlzKCkKCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbigpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm4ueSAtIG5vZGUub2Zmc2V0SGVpZ2h0LAogICAgICAgIGxlZnQ6IGJib3gubi54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9zKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKQogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3gucy55LAogICAgICAgIGxlZnQ6IGJib3gucy54IC0gbm9kZS5vZmZzZXRXaWR0aCAvIDIKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9lKCkgewogICAgICB2YXIgYmJveCA9IGdldFNjcmVlbkJCb3goKQogICAgICByZXR1cm4gewogICAgICAgIHRvcDogIGJib3guZS55IC0gbm9kZS5vZmZzZXRIZWlnaHQgLyAyLAogICAgICAgIGxlZnQ6IGJib3guZS54CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fdygpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LncueSAtIG5vZGUub2Zmc2V0SGVpZ2h0IC8gMiwKICAgICAgICBsZWZ0OiBiYm94LncueCAtIG5vZGUub2Zmc2V0V2lkdGgKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9udygpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94Lm53LnkgLSBub2RlLm9mZnNldEhlaWdodCwKICAgICAgICBsZWZ0OiBiYm94Lm53LnggLSBub2RlLm9mZnNldFdpZHRoCiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fbmUoKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpCiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5uZS55IC0gbm9kZS5vZmZzZXRIZWlnaHQsCiAgICAgICAgbGVmdDogYmJveC5uZS54CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXJlY3Rpb25fc3coKSB7CiAgICAgIHZhciBiYm94ID0gZ2V0U2NyZWVuQkJveCgpCiAgICAgIHJldHVybiB7CiAgICAgICAgdG9wOiAgYmJveC5zdy55LAogICAgICAgIGxlZnQ6IGJib3guc3cueCAtIG5vZGUub2Zmc2V0V2lkdGgKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpcmVjdGlvbl9zZSgpIHsKICAgICAgdmFyIGJib3ggPSBnZXRTY3JlZW5CQm94KCkKICAgICAgcmV0dXJuIHsKICAgICAgICB0b3A6ICBiYm94LnNlLnksCiAgICAgICAgbGVmdDogYmJveC5lLngKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGluaXROb2RlKCkgewogICAgICB2YXIgbm9kZSA9IGQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSkKICAgICAgbm9kZS5zdHlsZSh7CiAgICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsCiAgICAgICAgdG9wOiAwLAogICAgICAgIG9wYWNpdHk6IDAsCiAgICAgICAgJ3BvaW50ZXItZXZlbnRzJzogJ25vbmUnLAogICAgICAgICdib3gtc2l6aW5nJzogJ2JvcmRlci1ib3gnCiAgICAgIH0pCgogICAgICByZXR1cm4gbm9kZS5ub2RlKCkKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRTVkdOb2RlKGVsKSB7CiAgICAgIGVsID0gZWwubm9kZSgpCiAgICAgIGlmKGVsLnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycpCiAgICAgICAgcmV0dXJuIGVsCgogICAgICByZXR1cm4gZWwub3duZXJTVkdFbGVtZW50CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0Tm9kZUVsKCkgewogICAgICBpZihub2RlID09PSBudWxsKSB7CiAgICAgICAgbm9kZSA9IGluaXROb2RlKCk7CiAgICAgICAgLy8gcmUtYWRkIG5vZGUgdG8gRE9NCiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgfTsKICAgICAgcmV0dXJuIGQzLnNlbGVjdChub2RlKTsKICAgIH0KCiAgICAvLyBQcml2YXRlIC0gZ2V0cyB0aGUgc2NyZWVuIGNvb3JkaW5hdGVzIG9mIGEgc2hhcGUKICAgIC8vCiAgICAvLyBHaXZlbiBhIHNoYXBlIG9uIHRoZSBzY3JlZW4sIHdpbGwgcmV0dXJuIGFuIFNWR1BvaW50IGZvciB0aGUgZGlyZWN0aW9ucwogICAgLy8gbihub3J0aCksIHMoc291dGgpLCBlKGVhc3QpLCB3KHdlc3QpLCBuZShub3J0aGVhc3QpLCBzZShzb3V0aGVhc3QpLCBudyhub3J0aHdlc3QpLAogICAgLy8gc3coc291dGh3ZXN0KS4KICAgIC8vCiAgICAvLyAgICArLSstKwogICAgLy8gICAgfCAgIHwKICAgIC8vICAgICsgICArCiAgICAvLyAgICB8ICAgfAogICAgLy8gICAgKy0rLSsKICAgIC8vCiAgICAvLyBSZXR1cm5zIGFuIE9iamVjdCB7biwgcywgZSwgdywgbncsIHN3LCBuZSwgc2V9CiAgICBmdW5jdGlvbiBnZXRTY3JlZW5CQm94KCkgewogICAgICB2YXIgdGFyZ2V0ZWwgICA9IHRhcmdldCB8fCBkMy5ldmVudC50YXJnZXQ7CgogICAgICB3aGlsZSAoJ3VuZGVmaW5lZCcgPT09IHR5cGVvZiB0YXJnZXRlbC5nZXRTY3JlZW5DVE0gJiYgJ3VuZGVmaW5lZCcgPT09IHRhcmdldGVsLnBhcmVudE5vZGUpIHsKICAgICAgICAgIHRhcmdldGVsID0gdGFyZ2V0ZWwucGFyZW50Tm9kZTsKICAgICAgfQoKICAgICAgdmFyIGJib3ggICAgICAgPSB7fSwKICAgICAgICAgIG1hdHJpeCAgICAgPSB0YXJnZXRlbC5nZXRTY3JlZW5DVE0oKSwKICAgICAgICAgIHRiYm94ICAgICAgPSB0YXJnZXRlbC5nZXRCQm94KCksCiAgICAgICAgICB3aWR0aCAgICAgID0gdGJib3gud2lkdGgsCiAgICAgICAgICBoZWlnaHQgICAgID0gdGJib3guaGVpZ2h0LAogICAgICAgICAgeCAgICAgICAgICA9IHRiYm94LngsCiAgICAgICAgICB5ICAgICAgICAgID0gdGJib3gueQoKICAgICAgcG9pbnQueCA9IHgKICAgICAgcG9pbnQueSA9IHkKICAgICAgYmJveC5udyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnggKz0gd2lkdGgKICAgICAgYmJveC5uZSA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnkgKz0gaGVpZ2h0CiAgICAgIGJib3guc2UgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KQogICAgICBwb2ludC54IC09IHdpZHRoCiAgICAgIGJib3guc3cgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obWF0cml4KQogICAgICBwb2ludC55IC09IGhlaWdodCAvIDIKICAgICAgYmJveC53ICA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnggKz0gd2lkdGgKICAgICAgYmJveC5lID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG1hdHJpeCkKICAgICAgcG9pbnQueCAtPSB3aWR0aCAvIDIKICAgICAgcG9pbnQueSAtPSBoZWlnaHQgLyAyCiAgICAgIGJib3gubiA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCiAgICAgIHBvaW50LnkgKz0gaGVpZ2h0CiAgICAgIGJib3gucyA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShtYXRyaXgpCgogICAgICByZXR1cm4gYmJveAogICAgfQoKICAgIHJldHVybiB0aXAKICB9OwoKfSkpOwo="></script>
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCl7CiAgJ3VzZSBzdHJpY3QnOwogIHZhciBlcCA9IDFlLTE1OwoKICBmdW5jdGlvbiBUcmVlQ29sb3JzKHByZXNldCkgewogICAgdmFyIGNoaWxkcmVuID0gJ2NoaWxkcmVuJywKICAgICAgICBjb2xvciA9ICdjb2xvcicsCiAgICAgICAgcmFuZ2UgPSBbMCwgMzYwXSwKICAgICAgICBmcmFjdGlvbiA9IDAuNzUsCiAgICAgICAgcGVybXV0YXRlID0gdHJ1ZSwKICAgICAgICByZXZlcnNlID0gdHJ1ZSwKICAgICAgICBsdW1pbmFuY2VTdGFydCA9IDcwLAogICAgICAgIGx1bWluYW5jZURlbHRhID0gLTEwLAogICAgICAgIGNocm9tYVN0YXJ0ID0gNjAsCiAgICAgICAgY2hyb21hRGVsdGEgPSA1LAogICAgICAgIHJvb3RDb2xvciA9IHtoOiAwLCBjOiAwLCBsOiA3MH0KICAgICAgICA7CgogICAgZnVuY3Rpb24gZ2V0Q2hpbGRyZW4obm9kZSkgewogICAgICBpZih0eXBlb2YgY2hpbGRyZW4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgcmV0dXJuIG5vZGVbY2hpbGRyZW5dOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBjaGlsZHJlbi5jYWxsKG5vZGUpOwogICAgICB9CiAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGdldCB0aGUgY2hpbGRyZW4gb2YgYSBub2RlISBQbGVhc2Ugc2V0IHRoZSBcJ2NoaWxkcmVuXCcgcHJvcGVydHkgcHJvcGVybHkuJyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0Q29sb3Iobm9kZSwgYykgewogICAgICBpZih0eXBlb2YgY29sb3IgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgbm9kZVtjb2xvcl0gPSBjOwogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2xvci5jYWxsKG5vZGUsIGMpOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBzZXQgdGhlIGNvbG9yIG9mIGEgbm9kZSEgUGxlYXNlIHNldCB0aGUgXCdjb2xvclwnIHByb3BlcnR5IHByb3Blcmx5LicpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvUGVybXV0YXRpb24ocikgewogICAgICB2YXIgbiA9IHIubGVuZ3RoLAogICAgICAgICAgc2VxdWVuY2UgPSBUcmVlQ29sb3JzLmdldFBlcm11dGF0aW9uU2VxdWVuY2UobiksCiAgICAgICAgICBwZXJtdXRhdGVkID0gbmV3IEFycmF5KG4pOwoKICAgICAgci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkgewogICAgICAgIHBlcm11dGF0ZWRbc2VxdWVuY2VbaW5kZXhdXSA9IHZhbHVlOwogICAgICB9KTsKCiAgICAgIHJldHVybiBwZXJtdXRhdGVkOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2lnbkh1ZShub2RlLCByYW5nZSwgbGV2ZWwpIHsKICAgICAgLy8gc2VsZWN0IHRoZSBtaWRkbGUgaHVlIHZhbHVlIGluIHJhbmdlIGFzIHRoZSBodWUgdmFsdWUgb2Ygbm9kZQogICAgICBpZihsZXZlbCA9PT0gMCkgeyAvLyBub2RlIGlzIHRoZSByb290CiAgICAgICAgc2V0Q29sb3Iobm9kZSwgcm9vdENvbG9yKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRDb2xvcihub2RlLCB7aDogKHJhbmdlWzBdICsgcmFuZ2VbMV0pIC8gMiwgYzogY2hyb21hU3RhcnQgKyBjaHJvbWFEZWx0YSAqIGxldmVsLCBsOiBsdW1pbmFuY2VTdGFydCArIGx1bWluYW5jZURlbHRhICogbGV2ZWx9KTsKICAgICAgfQoKICAgICAgLy8gTGV0IE4gYmUgdGhlIG51bWJlciBvZiBjaGlsZCBub2RlcyBvZiB2LiBJZiBOID4gMCA6CiAgICAgIHZhciBuID0gZ2V0Q2hpbGRyZW4obm9kZSkgPyBnZXRDaGlsZHJlbihub2RlKS5sZW5ndGggOiAwOwoKICAgICAgaWYobiA9PT0gMCkgcmV0dXJuOwoKICAgICAgdmFyIGRlbHRhID0gKHJhbmdlWzFdIC0gcmFuZ2VbMF0pIC8gbjsKCiAgICAgIC8vMS4gZGl2aWRlIHJhbmdlIGluIE4gZXF1YWwgcGFydHMgcmkgd2l0aCBpID0gMSwgLi4uICxOOwogICAgICAvLyAgIEZvciBjb252ZW5pZW5jZSwgd2Ugd2lsbCB1c2UgaSA9IDAsIC4uLiAsIG4gLSAxIGluc3RlYWQgb2YgaSA9IDEsIC4uLiwgbgogICAgICB2YXIgciA9IGQzLnJhbmdlKG4pOwoKICAgICAgLy8yLiBpZiBwZXJtIHRoZW4gcGVybXV0ZSB0aGUgcmnigJlzOwogICAgICBpZihwZXJtdXRhdGUpIHsKICAgICAgICByID0gZG9QZXJtdXRhdGlvbihyKTsKICAgICAgfQoKICAgICAgLy8zLiBjb252ZXJ0IGVhY2ggcmkgdG8gYSBodWUgcmFuZ2UgKGUuZy4gWzMwLCA1MF0pCgogICAgICByID0gci5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gWwogICAgICAgIHJhbmdlWzBdICsgaSAqIGRlbHRhLAogICAgICAgIHJhbmdlWzBdICsgKGkgKyAxKSAqIGRlbHRhCiAgICAgIF07IH0pOwoKCiAgICAgIC8vNC4gcmVkdWNlIGVhY2ggcmkgYnkga2VlcGluZyBpdHMgbWlkZGxlIGZyYWN0aW9uIDsKICAgICAgLy8gICBJbiB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIsIHdlIHJldmVyc2UgZWFjaCByaSBmaXJzdC4KICAgICAgLy8gICBIb3dldmVyLCBub3csIHdlIHJldmVyc2UgdGhlbSBsYXRlci4KCiAgICAgIHIgPSByLm1hcChmdW5jdGlvbihyYW5nZSkgeyByZXR1cm4gWwogICAgICAgIHJhbmdlWzBdICsgKHJhbmdlWzFdIC0gcmFuZ2VbMF0pICogKCgxIC0gZnJhY3Rpb24pIC8gMiksCiAgICAgICAgcmFuZ2VbMV0gLSAocmFuZ2VbMV0gLSByYW5nZVswXSkgKiAoKDEgLSBmcmFjdGlvbikgLyAyKQogICAgICBdOyB9KTsKCiAgICAgIC8vNS4gaWYgcmV2IHRoZW4gcmV2ZXJzZSB0aGUgZXZlbi1udW1iZXJlZCByaeKAmXM7CiAgICAgIGlmKHJldmVyc2UpIHsKICAgICAgICByID0gci5tYXAoZnVuY3Rpb24ocmFuZ2UsIGkpIHsKICAgICAgICAgIGlmKGkgJSAyID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiBbcmFuZ2VbMV0sIHJhbmdlWzBdXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLy82LiBmb3IgZWFjaCBjaGlsZCBub2RlIHZpIGNhbGwgYXNzaWduSHVlIHJlY3Vyc2l2ZWx5LgoKICAgICAgZ2V0Q2hpbGRyZW4obm9kZSkuZm9yRWFjaChmdW5jdGlvbihjaGlsZCwgaSl7CiAgICAgICAgYXNzaWduSHVlKGNoaWxkLCByW2ldLCBsZXZlbCArIDEpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlQ29sb3Iocm9vdCkgewogICAgICBhc3NpZ25IdWUocm9vdCwgcmFuZ2UsIDApOwogICAgfQoKICAgIHRyZWVDb2xvci5jaGlsZHJlbiA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY2hpbGRyZW47CiAgICAgIGNoaWxkcmVuID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5jb2xvciA9IGZ1bmN0aW9uKHZhbHVlKXsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBjb2xvcjsKICAgICAgY29sb3IgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnJhbmdlID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByYW5nZTsKICAgICAgcmFuZ2UgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLmZyYWN0aW9uID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBmcmFjdGlvbjsKICAgICAgZnJhY3Rpb24gPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnBlcm11dGF0ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gcGVybXV0YXRlOwogICAgICBwZXJtdXRhdGUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLnJldmVyc2UgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJldmVyc2U7CiAgICAgIHJldmVyc2UgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHRyZWVDb2xvcjsKICAgIH07CgogICAgdHJlZUNvbG9yLmx1bWluYW5jZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2x1bWluYW5jZVN0YXJ0LCBsdW1pbmFuY2VEZWx0YV07CiAgICAgIGx1bWluYW5jZVN0YXJ0ID0gdmFsdWVbMF07CiAgICAgIGx1bWluYW5jZURlbHRhID0gdmFsdWVbMV07CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5sdW1pbmFuY2VTdGFydCA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbHVtaW5hbmNlU3RhcnQ7CiAgICAgIGx1bWluYW5jZVN0YXJ0ID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5sdW1pbmFuY2VEZWx0YSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbHVtaW5hbmNlRGVsdGE7CiAgICAgIGx1bWluYW5jZURlbHRhID0gdmFsdWU7CiAgICAgIHJldHVybiB0cmVlQ29sb3I7CiAgICB9OwoKICAgIHRyZWVDb2xvci5jaHJvbWEgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtjaHJvbWFTdGFydCwgY2hyb21hRGVsdGFdOwogICAgICBjaHJvbWFTdGFydCA9IHZhbHVlWzBdOwogICAgICBjaHJvbWFEZWx0YSA9IHZhbHVlWzFdOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3IuY2hyb21hU3RhcnQgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNocm9tYVN0YXJ0OwogICAgICBjaHJvbWFTdGFydCA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3IuY2hyb21hRGVsdGEgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZighYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNocm9tYURlbHRhOwogICAgICBjaHJvbWFEZWx0YSA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICB0cmVlQ29sb3Iucm9vdENvbG9yID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiByb290Q29sb3I7CiAgICAgIHJvb3RDb2xvciA9IHZhbHVlOwogICAgICByZXR1cm4gdHJlZUNvbG9yOwogICAgfTsKCiAgICBzd2l0Y2gocHJlc2V0KSB7CiAgICAgIGNhc2UgJ2FkZCc6CiAgICAgIGNhc2UgJ2FkZGl0aXZlJzoKICAgICAgICAvLyBub3RoaW5nIHRvIGRvLiBhZGRpdGl2ZSBpcyB0aGUgZGVmYXVsdAogICAgICAgIGJyZWFrOwogICAgICBjYXNlICdzdWInOgogICAgICBjYXNlICdzdWJ0cmFjdGl2ZSc6CiAgICAgICAgbHVtaW5hbmNlU3RhcnQgPSA0MDsKICAgICAgICBsdW1pbmFuY2VEZWx0YSA9IDEwOwogICAgICAgIGNocm9tYVN0YXJ0ID0gNzU7CiAgICAgICAgY2hyb21hRGVsdGEgPSAtNTsKICAgICAgICBicmVhazsKICAgIH0KCiAgICByZXR1cm4gdHJlZUNvbG9yOwogIH0KCiAgVHJlZUNvbG9ycy5nZXRQZXJtdXRhdGlvblNlcXVlbmNlID0gZnVuY3Rpb24obil7CiAgICBpZihuID09PSAwKSByZXR1cm4gW107CiAgICBpZihuID09PSAxKSByZXR1cm4gWzBdOwogICAgaWYobiA9PT0gMikgcmV0dXJuIFswLCAxXTsKICAgIGlmKG4gPT09IDMpIHJldHVybiBbMCwgMiwgMV07CiAgICBpZihuID09PSA0KSByZXR1cm4gWzAsIDIsIDEsIDNdOwoKICAgIC8vIDE0NCBpcyBub3QgYSBtYWdpYyBudW1iZXIuIEl0IGlzIGJlY2F1c2UgdGhlIHVzZWQgcGVybXV0YXRpb24gb3JkZXIgaXMgYmFzZWQgb24gZml2ZS1lbGVtZW50cy1wZXJtdXRhdGlvbi4KICAgIHZhciB1bml0QW5nbGUgPSAzNjAgLyBuLAogICAgICAgIHBpY2tpbmdBbmdsZSA9IE1hdGguZmxvb3IoMTQ0IC8gdW5pdEFuZ2xlKSAqIHVuaXRBbmdsZSwKICAgICAgICBzZXF1ZW5jZSA9IG5ldyBBcnJheShuKSwKICAgICAgICBwaWNrZWQgPSBuZXcgQXJyYXkobiksCiAgICAgICAgYW5nbGUgPSAwCiAgICAgICAgOwoKICAgIGZvcih2YXIgaSA9IDA7IGkgPCBuOyArK2kpewogICAgICB2YXIgaW5kZXggPSBNYXRoLmZsb29yKGFuZ2xlIC8gdW5pdEFuZ2xlICsgZXApOwoKICAgICAgc2VxdWVuY2VbaV0gPSBpbmRleDsKICAgICAgcGlja2VkW2luZGV4XSA9IHRydWU7CgogICAgICBhbmdsZSA9IChhbmdsZSArIHBpY2tpbmdBbmdsZSkgJSAzNjA7CgogICAgICBpZihpIDwgbiAtIDEpIHsKICAgICAgICB3aGlsZShwaWNrZWRbTWF0aC5mbG9vcihhbmdsZSAvIHVuaXRBbmdsZSArIGVwKV0pIHsKICAgICAgICAgIGFuZ2xlID0gKGFuZ2xlICsgdW5pdEFuZ2xlKSAlIDM2MDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc2VxdWVuY2U7CiAgfTsKCgogIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHsKICAgIGRlZmluZShmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIFRyZWVDb2xvcnM7CiAgICB9KTsKICB9IGVsc2UgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnKSB7CiAgICBtb2R1bGUuZXhwb3J0cyA9IFRyZWVDb2xvcnM7CiAgfSBlbHNlIHsKICAgIHdpbmRvdy5UcmVlQ29sb3JzID0gVHJlZUNvbG9yczsKICB9Cn0pKCk7Cg=="></script>
<link href="data:text/css;charset=utf-8,%2Enode%20%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2Eoverlay%7B%0Abackground%2Dcolor%3A%23EEE%3B%0A%7D%0A%2Enode%20circle%20%7B%0Afill%3A%20%23fff%3B%0Astroke%3A%20steelblue%3B%0Astroke%2Dwidth%3A%201%2E5px%3B%0A%7D%0A%2Enode%20text%20%7B%0Afont%2Dsize%3A10px%3B%20font%2Dfamily%3Asans%2Dserif%3B%0A%7D%0A%2Elink%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20%23ccc%3B%0Astroke%2Dwidth%3A%201%2E5px%3B%0A%7D%0A%2Etemplink%20%7B%0Afill%3A%20none%3B%0Astroke%3A%20red%3B%0Astroke%2Dwidth%3A%203px%3B%0A%7D%0A%2Esvg%2Dcontainer%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20relative%3B%0Abackground%2Dcolor%3A%20%23eee%3B%0Awidth%3A%20100%25%3B%0Aheight%3A%20100%25%3B%20%0Avertical%2Dalign%3A%20top%3B%0Aoverflow%3A%20hidden%3B%0A%7D%0A%2Esvg%2Dcontent%2Dresponsive%20%7B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20absolute%3B%0Atop%3A%200%3B%0Aleft%3A%200%3B%0A%7D%0A%2EghostCircle%2Eshow%7B%0Adisplay%3Ablock%3B%0A%7D%0A%2EghostCircle%2C%20%2EactiveDrag%20%2EghostCircle%7B%0Adisplay%3A%20none%3B%0A%7D" rel="stylesheet" />
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsKCiAgbmFtZTogJ3NhbmtleXRyZWUnLAoKICB0eXBlOiAnb3V0cHV0JywKICAKICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgCiAgICBkMy5zZWxlY3QoZWwpCiAgICAgICAgICAgIC5hcHBlbmQoImRpdiIpCiAgICAgICAgICAgIC5jbGFzc2VkKCJzdmctY29udGFpbmVyIiwgdHJ1ZSkKICAgICAgICAgICAgLmFwcGVuZCgic3ZnIikKICAgICAgICAgICAgLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCAieE1pbllNaW4gbWVldCIpCiAgICAgICAgICAgIC5hdHRyKCJ2aWV3Qm94IiwgIjAgMCAiICsgd2lkdGggKyAiICIgKyBoZWlnaHQpCiAgICAgICAgICAgIC5jbGFzc2VkKCJzdmctY29udGVudC1yZXNwb25zaXZlIiwgdHJ1ZSkKICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgIjEwMCUiKQogICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgIjEwMCUiKTsKICAgICAgICAgICAgCiAgICB2YXIgaW5zdGFuY2UgPSB7fTsKCiAgICByZXR1cm4gaW5zdGFuY2U7CgogIH0sCgogIHJlbmRlclZhbHVlOiBmdW5jdGlvbihlbCwgeCwgaW5zdGFuY2UpIHsKICAgIC8vIEFUVFJJQlVUSU9OOiAgbXVjaCBvZiB0aGlzIEphdmFTY3JpcHQgY29kZQogICAgLy8gIGNhbWUgZnJvbSBodHRwOi8vYmwub2Nrcy5vcmcvcm9ic2NobXVlY2tlci8wZjI5YTJjODY3ZGNiMWI0NGQxOAoKICAgICAgdmFyIGRpc3BhdGNoID0gZDMuZGlzcGF0Y2goInVwZGF0ZSIsImNsaWNrIiwibW91c2VvdmVyIiwibW91c2VvdXQiKTsKICAgICAgZDMucmViaW5kKGluc3RhbmNlLCBkaXNwYXRjaCwgJ29uJyk7CgogICAgICB2YXIgb3B0cyA9IHgub3B0czsKICAgICAgdmFyIHRyZWVEYXRhID0geC5kYXRhOyAKICAgIAogICAgICAgIC8vIENhbGN1bGF0ZSB0b3RhbCBub2RlcywgbWF4IGxhYmVsIGxlbmd0aAogICAgICAgIHZhciB0b3RhbE5vZGVzID0gMDsKICAgICAgICB2YXIgbWF4TGFiZWxMZW5ndGggPSAwOwogICAgICAgIC8vIHZhcmlhYmxlcyBmb3IgZHJhZy9kcm9wCiAgICAgICAgdmFyIHNlbGVjdGVkTm9kZSA9IG51bGw7CiAgICAgICAgdmFyIGRyYWdnaW5nTm9kZSA9IG51bGw7CiAgICAgICAgLy8gcGFubmluZyB2YXJpYWJsZXMKICAgICAgICB2YXIgcGFuU3BlZWQgPSAyMDA7CiAgICAgICAgdmFyIHBhbkJvdW5kYXJ5ID0gMjA7IC8vIFdpdGhpbiAyMHB4IGZyb20gZWRnZXMgd2lsbCBwYW4gd2hlbiBkcmFnZ2luZy4KICAgICAgICAvLyBNaXNjLiB2YXJpYWJsZXMKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgdmFyIGR1cmF0aW9uID0gNzUwOwogICAgICAgIHZhciByb290OwogICAgICAgIHZhciBweFBlckNoYXIgPSA2OwogICAgICAgIHZhciBuZXdXaWR0aDsKICAgICAgICB2YXIgbmV3SGVpZ2h0OwogICAgICAgIAogICAgICAgIC8vIGFkZCB0cmVlQ29sb3JzIGlmIHRvbGQgeWVzCiAgICAgICAgaWYoeC5vcHRzLnRyZWVDb2xvcnMpewogICAgICAgICAgdmFyIHRjID0gVHJlZUNvbG9ycygiYWRkIik7CiAgICAgICAgICB0Yy5jaGlsZHJlbihvcHRzLmNoaWxkcmVuTmFtZSk7CiAgICAgICAgICB0Yyh0cmVlRGF0YSk7CiAgICAgICAgfQogICAgICAgIAogICAgICAgIC8vIHdvcmsgb24gdG9vbHRpcAogICAgICAgIHZhciB0aXAgPSB7fTsKICAgICAgICAgICAgICAgICAgICAKICAgICAgICBpZihvcHRzLnRvb2x0aXApewogICAgICAgICAgdGlwID0gZDMudGlwKCkKICAgICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2QzLXRpcCcpCiAgICAgICAgICAgICAgICAgIC5odG1sKGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0pOwogICAgICAgICAgICAgICAgICAKICAgICAgICAgIGlmKEFycmF5LmlzQXJyYXkob3B0cy50b29sdGlwKSl7CiAgICAgICAgICAgIHRpcC5odG1sKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHZhciBodG1sdGlwID0gW107CiAgICAgICAgICAgICAgb3B0cy50b29sdGlwLmZvckVhY2goZnVuY3Rpb24oa3kpewogICAgICAgICAgICAgICAgaHRtbHRpcC5wdXNoKCBreSArICI6ICIgKyBkW2t5XSApOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgIHJldHVybiBodG1sdGlwLmpvaW4oIjxici8+Iik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmKHR5cGVvZihvcHRzLnRvb2x0aXApID09PSAiZnVuY3Rpb24iKXsKICAgICAgICAgICAgdGlwLmh0bWwob3B0cy50b29sdGlwKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgCiAgICAgICAgLy8gZGVmaW5lIHRoZSBiYXNlU3ZnLCBhdHRhY2hpbmcgYSBjbGFzcyBmb3Igc3R5bGluZyBhbmQgdGhlIHpvb21MaXN0ZW5lcgogICAgICAgIHZhciBiYXNlU3ZnID0gZDMuc2VsZWN0KGVsKQogICAgICAgICAgICAuc2VsZWN0KCJkaXYiKQogICAgICAgICAgICAuc2VsZWN0KCJzdmciKTsKCiAgICAgICAgICAgIAoKICAgICAgICAvLyBzaXplIG9mIHRoZSBkaWFncmFtCiAgICAgICAgdmFyIHZpZXdlcldpZHRoID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgdmFyIHZpZXdlckhlaWdodCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDsKICAgIAogICAgICAgIHZhciB0cmVlID0gZDMubGF5b3V0LnRyZWUoKQogICAgICAgICAgICAuc2l6ZShbdmlld2VySGVpZ2h0LCB2aWV3ZXJXaWR0aF0pCiAgICAgICAgICAgIC5jaGlsZHJlbihmdW5jdGlvbihkKXtyZXR1cm4gZFtvcHRzLmNoaWxkcmVuTmFtZV19KQogICAgICAgICAgICAudmFsdWUoZnVuY3Rpb24oZCl7cmV0dXJuIGRbb3B0cy52YWx1ZV19KTsKICAgIAogICAgICAgIC8vIGRlZmluZSBhIGQzIGRpYWdvbmFsIHByb2plY3Rpb24gZm9yIHVzZSBieSB0aGUgbm9kZSBwYXRocyBsYXRlciBvbi4KICAgICAgICB2YXIgZGlhZ29uYWwgPSBkMy5zdmcuZGlhZ29uYWwoKQogICAgICAgICAgICAucHJvamVjdGlvbihmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW2QueSwgZC54XTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLnNvdXJjZShmdW5jdGlvbihkKXsKICAgICAgICAgICAgICBpZihkLnlzdGFja3kpIHJldHVybiBkCiAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgICAgICAgICB9KTsKICAgIAogICAgICAgIC8vIEEgcmVjdXJzaXZlIGhlbHBlciBmdW5jdGlvbiBmb3IgcGVyZm9ybWluZyBzb21lIHNldHVwIGJ5IHdhbGtpbmcgdGhyb3VnaCBhbGwgbm9kZXMKICAgIAogICAgICAgIGZ1bmN0aW9uIHZpc2l0KHBhcmVudCwgdmlzaXRGbiwgY2hpbGRyZW5GbikgewogICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuOwogICAgCiAgICAgICAgICAgIHZpc2l0Rm4ocGFyZW50KTsKICAgIAogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBjaGlsZHJlbkZuKHBhcmVudCk7CiAgICAgICAgICAgIGlmIChjaGlsZHJlbikgewogICAgICAgICAgICAgICAgdmFyIGNvdW50ID0gY2hpbGRyZW4ubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmlzaXQoY2hpbGRyZW5baV0sIHZpc2l0Rm4sIGNoaWxkcmVuRm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgCiAgICAgICAgLy8gQ2FsbCB2aXNpdCBmdW5jdGlvbiB0byBlc3RhYmxpc2ggbWF4TGFiZWxMZW5ndGgKICAgICAgICB2YXIgbWVhbkxhYmVsTGVuZ3RoID0gMC4wOwogICAgICAgIHZpc2l0KHRyZWVEYXRhLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHRvdGFsTm9kZXMrKzsKICAgICAgICAgICAgbWF4TGFiZWxMZW5ndGggPSBvcHRzLm1heExhYmVsTGVuZ3RoIHx8IE1hdGgubWF4KGRbb3B0cy5uYW1lXS5sZW5ndGgsIG1heExhYmVsTGVuZ3RoKTsKICAgICAgICAgICAgbWVhbkxhYmVsTGVuZ3RoID0gbWVhbkxhYmVsTGVuZ3RoICsgZFtvcHRzLm5hbWVdLmxlbmd0aDsKICAgICAgICB9LCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSAmJiBkW29wdHMuY2hpbGRyZW5OYW1lXS5sZW5ndGggPiAwID8gZFtvcHRzLmNoaWxkcmVuTmFtZV0gOiBudWxsOwogICAgICAgIH0pOwogICAgICAgIG1lYW5MYWJlbExlbmd0aCA9IChtZWFuTGFiZWxMZW5ndGgvdG90YWxOb2RlcykgfCAwICsgMTsKICAgIAogICAgICAgIC8vIHNvcnQgdGhlIHRyZWUgYWNjb3JkaW5nIHRvIHRoZSBub2RlIG5hbWVzCiAgICAKICAgICAgICBmdW5jdGlvbiBzb3J0VHJlZSgpIHsKICAgICAgICAgICAgdHJlZS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBiW29wdHMubmFtZV0udG9Mb3dlckNhc2UoKSA8IGFbb3B0cy5uYW1lXS50b0xvd2VyQ2FzZSgpID8gMSA6IC0xOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gU29ydCB0aGUgdHJlZSBpbml0aWFsbHkgaW4gY2FzZSB0aGUgSlNPTiBpc24ndCBpbiBhIHNvcnRlZCBvcmRlci4KICAgICAgICBzb3J0VHJlZSgpOwogICAgCiAgICAgICAgLy8gVE9ETzogUGFuIGZ1bmN0aW9uLCBjYW4gYmUgYmV0dGVyIGltcGxlbWVudGVkLgogICAgCiAgICAgICAgZnVuY3Rpb24gcGFuKGRvbU5vZGUsIGRpcmVjdGlvbikgewogICAgICAgICAgICB2YXIgc3BlZWQgPSBwYW5TcGVlZDsKICAgICAgICAgICAgaWYgKHBhblRpbWVyKSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQocGFuVGltZXIpOwogICAgICAgICAgICAgICAgdHJhbnNsYXRlQ29vcmRzID0gZDMudHJhbnNmb3JtKHN2Z0dyb3VwLmF0dHIoInRyYW5zZm9ybSIpKTsKICAgICAgICAgICAgICAgIGlmIChkaXJlY3Rpb24gPT0gJ2xlZnQnIHx8IGRpcmVjdGlvbiA9PSAncmlnaHQnKSB7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlWCA9IGRpcmVjdGlvbiA9PSAnbGVmdCcgPyB0cmFuc2xhdGVDb29yZHMudHJhbnNsYXRlWzBdICsgc3BlZWQgOiB0cmFuc2xhdGVDb29yZHMudHJhbnNsYXRlWzBdIC0gc3BlZWQ7CiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlWSA9IHRyYW5zbGF0ZUNvb3Jkcy50cmFuc2xhdGVbMV07CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PSAndXAnIHx8IGRpcmVjdGlvbiA9PSAnZG93bicpIHsKICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVYID0gdHJhbnNsYXRlQ29vcmRzLnRyYW5zbGF0ZVswXTsKICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGVZID0gZGlyZWN0aW9uID09ICd1cCcgPyB0cmFuc2xhdGVDb29yZHMudHJhbnNsYXRlWzFdICsgc3BlZWQgOiB0cmFuc2xhdGVDb29yZHMudHJhbnNsYXRlWzFdIC0gc3BlZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzY2FsZVggPSB0cmFuc2xhdGVDb29yZHMuc2NhbGVbMF07CiAgICAgICAgICAgICAgICBzY2FsZVkgPSB0cmFuc2xhdGVDb29yZHMuc2NhbGVbMV07CiAgICAgICAgICAgICAgICBzY2FsZSA9IHpvb21MaXN0ZW5lci5zY2FsZSgpOwogICAgICAgICAgICAgICAgc3ZnR3JvdXAudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHRyYW5zbGF0ZVggKyAiLCIgKyB0cmFuc2xhdGVZICsgIilzY2FsZSgiICsgc2NhbGUgKyAiKSIpOwogICAgICAgICAgICAgICAgZDMuc2VsZWN0KGRvbU5vZGUpLnNlbGVjdCgnZy5ub2RlJykuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgdHJhbnNsYXRlWCArICIsIiArIHRyYW5zbGF0ZVkgKyAiKSIpOwogICAgICAgICAgICAgICAgem9vbUxpc3RlbmVyLnNjYWxlKHpvb21MaXN0ZW5lci5zY2FsZSgpKTsKICAgICAgICAgICAgICAgIHpvb21MaXN0ZW5lci50cmFuc2xhdGUoW3RyYW5zbGF0ZVgsIHRyYW5zbGF0ZVldKTsKICAgICAgICAgICAgICAgIHBhblRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICBwYW4oZG9tTm9kZSwgc3BlZWQsIGRpcmVjdGlvbik7CiAgICAgICAgICAgICAgICB9LCA1MCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICAvLyBEZWZpbmUgdGhlIHpvb20gZnVuY3Rpb24gZm9yIHRoZSB6b29tYWJsZSB0cmVlCiAgICAKICAgICAgICBmdW5jdGlvbiB6b29tKCkgewogICAgICAgICAgICBzdmdHcm91cC5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBkMy5ldmVudC50cmFuc2xhdGUgKyAiKXNjYWxlKCIgKyBkMy5ldmVudC5zY2FsZSArICIpIik7CiAgICAgICAgfQogICAgCiAgICAKICAgICAgICAvLyBkZWZpbmUgdGhlIHpvb21MaXN0ZW5lciB3aGljaCBjYWxscyB0aGUgem9vbSBmdW5jdGlvbiBvbiB0aGUgInpvb20iIGV2ZW50IGNvbnN0cmFpbmVkIHdpdGhpbiB0aGUgc2NhbGVFeHRlbnRzCiAgICAgICAgdmFyIHpvb21MaXN0ZW5lciA9IGQzLmJlaGF2aW9yLnpvb20oKS5zY2FsZUV4dGVudChbMC4xLCAzXSkub24oInpvb20iLCB6b29tKTsKICAgIAogICAgICAgIGZ1bmN0aW9uIGluaXRpYXRlRHJhZyhkLCBkb21Ob2RlKSB7CiAgICAgICAgICAgIGRyYWdnaW5nTm9kZSA9IGQ7CiAgICAgICAgICAgIGQzLnNlbGVjdChkb21Ob2RlKS5zZWxlY3QoJy5naG9zdENpcmNsZScpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKICAgICAgICAgICAgZDMuc2VsZWN0QWxsKCcuZ2hvc3RDaXJjbGUnKS5hdHRyKCdjbGFzcycsICdnaG9zdENpcmNsZSBzaG93Jyk7CiAgICAgICAgICAgIGQzLnNlbGVjdChkb21Ob2RlKS5hdHRyKCdjbGFzcycsICdub2RlIGFjdGl2ZURyYWcnKTsKICAgIAogICAgICAgICAgICBzdmdHcm91cC5zZWxlY3RBbGwoImcubm9kZSIpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyAvLyBzZWxlY3QgdGhlIHBhcmVudCBhbmQgc29ydCB0aGUgcGF0aCdzCiAgICAgICAgICAgICAgICBpZiAoYVtvcHRzLmlkXSAhPSBkcmFnZ2luZ05vZGVbb3B0cy5pZF0pIHJldHVybiAxOyAvLyBhIGlzIG5vdCB0aGUgaG92ZXJlZCBlbGVtZW50LCBzZW5kICJhIiB0byB0aGUgYmFjawogICAgICAgICAgICAgICAgZWxzZSByZXR1cm4gLTE7IC8vIGEgaXMgdGhlIGhvdmVyZWQgZWxlbWVudCwgYnJpbmcgImEiIHRvIHRoZSBmcm9udAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gaWYgbm9kZXMgaGFzIGNoaWxkcmVuLCByZW1vdmUgdGhlIGxpbmtzIGFuZCBub2RlcwogICAgICAgICAgICBpZiAobm9kZXMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxpbmsgcGF0aHMKICAgICAgICAgICAgICAgIGxpbmtzID0gdHJlZS5saW5rcyhub2Rlcyk7CiAgICAgICAgICAgICAgICBub2RlUGF0aHMgPSBzdmdHcm91cC5zZWxlY3RBbGwoInBhdGgubGluayIpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEobGlua3MsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQudGFyZ2V0W29wdHMuaWRdOwogICAgICAgICAgICAgICAgICAgIH0pLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGNoaWxkIG5vZGVzCiAgICAgICAgICAgICAgICBub2Rlc0V4aXQgPSBzdmdHcm91cC5zZWxlY3RBbGwoImcubm9kZSIpCiAgICAgICAgICAgICAgICAgICAgLmRhdGEobm9kZXMsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5pZF07CiAgICAgICAgICAgICAgICAgICAgfSkuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRbb3B0cy5pZF0gPT0gZHJhZ2dpbmdOb2RlW29wdHMuaWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSkucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAvLyByZW1vdmUgcGFyZW50IGxpbmsKICAgICAgICAgICAgcGFyZW50TGluayA9IHRyZWUubGlua3ModHJlZS5ub2RlcyhkcmFnZ2luZ05vZGUucGFyZW50KSk7CiAgICAgICAgICAgIHN2Z0dyb3VwLnNlbGVjdEFsbCgncGF0aC5saW5rJykuZmlsdGVyKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgICAgICAgIGlmIChkLnRhcmdldFtvcHRzLmlkXSA9PSBkcmFnZ2luZ05vZGVbb3B0cy5pZF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSkucmVtb3ZlKCk7CiAgICAKICAgICAgICAgICAgZHJhZ1N0YXJ0ZWQgPSBudWxsOwogICAgICAgIH0KICAgIAogICAgICAgIGJhc2VTdmcKICAgICAgICAgICAgLmNhbGwoem9vbUxpc3RlbmVyKTsKICAgIAogIC8qICAKICAgICAgICAvLyBEZWZpbmUgdGhlIGRyYWcgbGlzdGVuZXJzIGZvciBkcmFnL2Ryb3AgYmVoYXZpb3VyIG9mIG5vZGVzLgogICAgICAgIGRyYWdMaXN0ZW5lciA9IGQzLmJlaGF2aW9yLmRyYWcoKQogICAgICAgICAgICAub24oImRyYWdzdGFydCIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGlmIChkID09IHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkcmFnU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICBub2RlcyA9IHRyZWUubm9kZXMoZCk7CiAgICAgICAgICAgICAgICBkMy5ldmVudC5zb3VyY2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgIC8vIGl0J3MgaW1wb3J0YW50IHRoYXQgd2Ugc3VwcHJlc3MgdGhlIG1vdXNlb3ZlciBldmVudCBvbiB0aGUgbm9kZSBiZWluZyBkcmFnZ2VkLiBPdGhlcndpc2UgaXQgd2lsbCBhYnNvcmIgdGhlIG1vdXNlb3ZlciBldmVudCBhbmQgdGhlIHVuZGVybHlpbmcgbm9kZSB3aWxsIG5vdCBkZXRlY3QgaXQgZDMuc2VsZWN0KHRoaXMpLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLm9uKCJkcmFnIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGQgPT0gcm9vdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkcmFnU3RhcnRlZCkgewogICAgICAgICAgICAgICAgICAgIGRvbU5vZGUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIGluaXRpYXRlRHJhZyhkLCBkb21Ob2RlKTsKICAgICAgICAgICAgICAgIH0KICAgIAogICAgICAgICAgICAgICAgLy8gZ2V0IGNvb3JkcyBvZiBtb3VzZUV2ZW50IHJlbGF0aXZlIHRvIHN2ZyBjb250YWluZXIgdG8gYWxsb3cgZm9yIHBhbm5pbmcKICAgICAgICAgICAgICAgIHJlbENvb3JkcyA9IGQzLm1vdXNlKHN2Z0dyb3VwWzBdWzBdKTsKICAgICAgICAgICAgICAgIGlmIChyZWxDb29yZHNbMF0gPCBwYW5Cb3VuZGFyeSkgewogICAgICAgICAgICAgICAgICAgIHBhblRpbWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBwYW4odGhpcywgJ2xlZnQnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVsQ29vcmRzWzBdID4gKHZpZXdlcldpZHRoIC0gcGFuQm91bmRhcnkpKSB7CiAgICAKICAgICAgICAgICAgICAgICAgICBwYW5UaW1lciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcGFuKHRoaXMsICdyaWdodCcpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxDb29yZHNbMV0gPCBwYW5Cb3VuZGFyeSkgewogICAgICAgICAgICAgICAgICAgIHBhblRpbWVyID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBwYW4odGhpcywgJ3VwJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlbENvb3Jkc1sxXSA+ICh2aWV3ZXJIZWlnaHQgLSBwYW5Cb3VuZGFyeSkpIHsKICAgICAgICAgICAgICAgICAgICBwYW5UaW1lciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcGFuKHRoaXMsICdkb3duJyk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChwYW5UaW1lcik7CiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgCiAgICAgICAgICAgICAgICBkLngwICs9IGQzLmV2ZW50LmR5OwogICAgICAgICAgICAgICAgZC55MCArPSBkMy5ldmVudC5keDsKICAgICAgICAgICAgICAgIHZhciBub2RlID0gZDMuc2VsZWN0KHRoaXMpOwogICAgICAgICAgICAgICAgbm9kZS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBkLnkwICsgIiwiICsgZC54MCArICIpIik7CiAgICAgICAgICAgICAgICB1cGRhdGVUZW1wQ29ubmVjdG9yKCk7CiAgICAgICAgICAgIH0pLm9uKCJkcmFnZW5kIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgaWYgKGQgPT0gcm9vdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRvbU5vZGUgPSB0aGlzOwogICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSkgewogICAgICAgICAgICAgICAgICAgIC8vIG5vdyByZW1vdmUgdGhlIGVsZW1lbnQgZnJvbSB0aGUgcGFyZW50LCBhbmQgaW5zZXJ0IGl0IGludG8gdGhlIG5ldyBlbGVtZW50cyBjaGlsZHJlbgogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGRyYWdnaW5nTm9kZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkcmFnZ2luZ05vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nTm9kZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZWxlY3RlZE5vZGUuY2hpbGRyZW4gIT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBzZWxlY3RlZE5vZGUuX2NoaWxkcmVuICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdGVkTm9kZS5jaGlsZHJlbiAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZS5jaGlsZHJlbi5wdXNoKGRyYWdnaW5nTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUuX2NoaWxkcmVuLnB1c2goZHJhZ2dpbmdOb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTm9kZS5jaGlsZHJlbiA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE5vZGUuY2hpbGRyZW4ucHVzaChkcmFnZ2luZ05vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbm9kZSBiZWluZyBhZGRlZCB0byBpcyBleHBhbmRlZCBzbyB1c2VyIGNhbiBzZWUgYWRkZWQgbm9kZSBpcyBjb3JyZWN0bHkgbW92ZWQKICAgICAgICAgICAgICAgICAgICBleHBhbmQoc2VsZWN0ZWROb2RlKTsKICAgICAgICAgICAgICAgICAgICBzb3J0VHJlZSgpOwogICAgICAgICAgICAgICAgICAgIGVuZERyYWcoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW5kRHJhZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgIAogICAgICAgIGZ1bmN0aW9uIGVuZERyYWcoKSB7CiAgICAgICAgICAgIHNlbGVjdGVkTm9kZSA9IG51bGw7CiAgICAgICAgICAgIGQzLnNlbGVjdEFsbCgnLmdob3N0Q2lyY2xlJykuYXR0cignY2xhc3MnLCAnZ2hvc3RDaXJjbGUnKTsKICAgICAgICAgICAgZDMuc2VsZWN0KGRvbU5vZGUpLmF0dHIoJ2NsYXNzJywgJ25vZGUnKTsKICAgICAgICAgICAgLy8gbm93IHJlc3RvcmUgdGhlIG1vdXNlb3ZlciBldmVudCBvciB3ZSB3b24ndCBiZSBhYmxlIHRvIGRyYWcgYSAybmQgdGltZQogICAgICAgICAgICBkMy5zZWxlY3QoZG9tTm9kZSkuc2VsZWN0KCcuZ2hvc3RDaXJjbGUnKS5hdHRyKCdwb2ludGVyLWV2ZW50cycsICcnKTsKICAgICAgICAgICAgdXBkYXRlVGVtcENvbm5lY3RvcigpOwogICAgICAgICAgICBpZiAoZHJhZ2dpbmdOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB1cGRhdGUocm9vdCk7CiAgICAgICAgICAgICAgICBjZW50ZXJOb2RlKGRyYWdnaW5nTm9kZSk7CiAgICAgICAgICAgICAgICBkcmFnZ2luZ05vZGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICovCiAgICAgICAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29sbGFwc2luZyBhbmQgZXhwYW5kaW5nIG5vZGVzLgogICAgCiAgICAgICAgZnVuY3Rpb24gY29sbGFwc2UoZCkgewogICAgICAgICAgICBpZiAoZFtvcHRzLmNoaWxkcmVuTmFtZV0pIHsKICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gZFtvcHRzLmNoaWxkcmVuTmFtZV07CiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbi5mb3JFYWNoKGNvbGxhcHNlKTsKICAgICAgICAgICAgICAgIGRbb3B0cy5jaGlsZHJlbk5hbWVdID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIGZ1bmN0aW9uIGV4cGFuZChkKSB7CiAgICAgICAgICAgIGlmIChkLl9jaGlsZHJlbikgewogICAgICAgICAgICAgICAgZFtvcHRzLmNoaWxkcmVuTmFtZV0gPSBkLl9jaGlsZHJlbjsKICAgICAgICAgICAgICAgIGRbb3B0cy5jaGlsZHJlbk5hbWVdLmZvckVhY2goZXhwYW5kKTsKICAgICAgICAgICAgICAgIGQuX2NoaWxkcmVuID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIHZhciBvdmVyQ2lyY2xlID0gZnVuY3Rpb24oZCkgewogICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSBkOwogICAgICAgICAgICB1cGRhdGVUZW1wQ29ubmVjdG9yKCk7CiAgICAgICAgfTsKICAgICAgICB2YXIgb3V0Q2lyY2xlID0gZnVuY3Rpb24oZCkgewogICAgICAgICAgICBzZWxlY3RlZE5vZGUgPSBudWxsOwogICAgICAgICAgICB1cGRhdGVUZW1wQ29ubmVjdG9yKCk7CiAgICAgICAgfTsKICAgIAogICAgICAgIC8vIEZ1bmN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcG9yYXJ5IGNvbm5lY3RvciBpbmRpY2F0aW5nIGRyYWdnaW5nIGFmZmlsaWF0aW9uCiAgICAgICAgdmFyIHVwZGF0ZVRlbXBDb25uZWN0b3IgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgICAgICAgaWYgKGRyYWdnaW5nTm9kZSAhPT0gbnVsbCAmJiBzZWxlY3RlZE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gZmxpcCB0aGUgc291cmNlIGNvb3JkaW5hdGVzIHNpbmNlIHdlIGRpZCB0aGlzIGZvciB0aGUgZXhpc3RpbmcgY29ubmVjdG9ycyBvbiB0aGUgb3JpZ2luYWwgdHJlZQogICAgICAgICAgICAgICAgZGF0YSA9IFt7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHNlbGVjdGVkTm9kZS55MCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogc2VsZWN0ZWROb2RlLngwCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgeDogZHJhZ2dpbmdOb2RlLnkwLAogICAgICAgICAgICAgICAgICAgICAgICB5OiBkcmFnZ2luZ05vZGUueDAKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9XTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbGluayA9IHN2Z0dyb3VwLnNlbGVjdEFsbCgiLnRlbXBsaW5rIikuZGF0YShkYXRhKTsKICAgIAogICAgICAgICAgICBsaW5rLmVudGVyKCkuYXBwZW5kKCJwYXRoIikKICAgICAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJ0ZW1wbGluayIpCiAgICAgICAgICAgICAgICAuYXR0cigiZCIsIGQzLnN2Zy5kaWFnb25hbCgpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKICAgIAogICAgICAgICAgICBsaW5rLmF0dHIoImQiLCBkMy5zdmcuZGlhZ29uYWwoKSk7CiAgICAKICAgICAgICAgICAgbGluay5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfTsKICAgIAogICAgICAgIC8vIEZ1bmN0aW9uIHRvIGNlbnRlciBub2RlIHdoZW4gY2xpY2tlZC9kcm9wcGVkIHNvIG5vZGUgZG9lc24ndCBnZXQgbG9zdCB3aGVuIGNvbGxhcHNpbmcvbW92aW5nIHdpdGggbGFyZ2UgYW1vdW50IG9mIGNoaWxkcmVuLgogICAgCiAgICAgICAgZnVuY3Rpb24gY2VudGVyTm9kZShzb3VyY2UpIHsKICAgICAgICAgICAgc2NhbGUgPSB6b29tTGlzdGVuZXIuc2NhbGUoKTsKICAgICAgICAgICAgeCA9IC1zb3VyY2UueTA7CiAgICAgICAgICAgIHkgPSAtc291cmNlLngwOwogICAgICAgICAgICB4ID0geCAqIHNjYWxlICsgKCBzb3VyY2Vbb3B0cy5uYW1lXSAhPT0gcm9vdFtvcHRzLm5hbWVdID8gIHZpZXdlcldpZHRoIC8gMiA6IHZpZXdlcldpZHRoIC8gNCApOwogICAgICAgICAgICB5ID0geSAqIHNjYWxlICsgdmlld2VySGVpZ2h0IC8gMjsKICAgICAgICAgICAgZDMuc2VsZWN0KCdnJykudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgeCArICIsIiArIHkgKyAiKXNjYWxlKCIgKyBzY2FsZSArICIpIik7CiAgICAgICAgICAgIHpvb21MaXN0ZW5lci5zY2FsZShzY2FsZSk7CiAgICAgICAgICAgIHpvb21MaXN0ZW5lci50cmFuc2xhdGUoW3gsIHldKTsKICAgICAgICB9CiAgICAKICAgICAgICAvLyBUb2dnbGUgY2hpbGRyZW4gZnVuY3Rpb24KICAgIAogICAgICAgIGZ1bmN0aW9uIHRvZ2dsZUNoaWxkcmVuKGQpIHsKICAgICAgICAgICAgaWYgKGRbb3B0cy5jaGlsZHJlbk5hbWVdKSB7CiAgICAgICAgICAgICAgICBkLl9jaGlsZHJlbiA9IGRbb3B0cy5jaGlsZHJlbk5hbWVdOwogICAgICAgICAgICAgICAgZFtvcHRzLmNoaWxkcmVuTmFtZV0gPSBudWxsOwogICAgICAgICAgICB9IGVsc2UgaWYgKGQuX2NoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICBkW29wdHMuY2hpbGRyZW5OYW1lXSA9IGQuX2NoaWxkcmVuOwogICAgICAgICAgICAgICAgZC5fY2hpbGRyZW4gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgIH0KICAgIAogICAgICAgIC8vIFRvZ2dsZSBjaGlsZHJlbiBvbiBjbGljay4KICAgIAogICAgICAgIGZ1bmN0aW9uIGNsaWNrKGQpIHsKICAgICAgICAgICAgaWYgKGQzLmV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHJldHVybjsgLy8gY2xpY2sgc3VwcHJlc3NlZAogICAgICAgICAgICBkID0gdG9nZ2xlQ2hpbGRyZW4oZCk7CiAgICAgICAgICAgIHVwZGF0ZShkKTsKICAgICAgICAgICAgY2VudGVyTm9kZShkKTsKICAgICAgICB9CiAgICAgICAgCgogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShzb3VyY2UpIHsKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IGhlaWdodCwgZnVuY3Rpb24gY291bnRzIHRvdGFsIGNoaWxkcmVuIG9mIHJvb3Qgbm9kZSBhbmQgc2V0cyB0cmVlIGhlaWdodCBhY2NvcmRpbmdseS4KICAgICAgICAgICAgLy8gVGhpcyBwcmV2ZW50cyB0aGUgbGF5b3V0IGxvb2tpbmcgc3F1YXNoZWQgd2hlbiBuZXcgbm9kZXMgYXJlIG1hZGUgdmlzaWJsZSBvciBsb29raW5nIHNwYXJzZSB3aGVuIG5vZGVzIGFyZSByZW1vdmVkCiAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgdGhlIGxheW91dCBtb3JlIGNvbnNpc3RlbnQuCiAgICAgICAgICAgIHZhciBsZXZlbFdpZHRoID0gWzFdOwogICAgICAgICAgICB2YXIgY2hpbGRDb3VudCA9IGZ1bmN0aW9uKGxldmVsLCBuKSB7CiAgICAKICAgICAgICAgICAgICAgIGlmIChuW29wdHMuY2hpbGRyZW5OYW1lXSAmJiBuW29wdHMuY2hpbGRyZW5OYW1lXS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsV2lkdGgubGVuZ3RoIDw9IGxldmVsICsgMSkgbGV2ZWxXaWR0aC5wdXNoKDApOwogICAgCiAgICAgICAgICAgICAgICAgICAgbGV2ZWxXaWR0aFtsZXZlbCArIDFdICs9IG5bb3B0cy5jaGlsZHJlbk5hbWVdLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBuW29wdHMuY2hpbGRyZW5OYW1lXS5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRDb3VudChsZXZlbCArIDEsIGQpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBjaGlsZENvdW50KDAsIHJvb3QpOwogICAgICAgICAgICBuZXdIZWlnaHQgPSBkMy5tYXgobGV2ZWxXaWR0aCkgKiAoIG9wdHMubm9kZUhlaWdodCB8fCAyNSApOyAvLyAyNSBwaXhlbHMgcGVyIGxpbmUKICAgICAgICAgICAgCiAgICAgICAgICAgIGlmIChvcHRzLm1heExhYmVsTGVuZ3RoKSB7CiAgICAgICAgICAgICAgbmV3V2lkdGggPSAobGV2ZWxXaWR0aC5sZW5ndGggKyAyKSAqIChtYXhMYWJlbExlbmd0aCAqIDEwKSArIAogICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFdpZHRoLmxlbmd0aCAqIDEwOyAvLyBub2RlIGxpbmsgc2l6ZSArIG5vZGUgcmVjdCBzaXplICAgICAgICAgICAgICAKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBuZXdXaWR0aCA9IChsZXZlbFdpZHRoLmxlbmd0aCArIDIpICogKG1lYW5MYWJlbExlbmd0aCAqIHB4UGVyQ2hhcikgKyAKICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxXaWR0aC5sZW5ndGggKiAxMDsgLy8gbm9kZSBsaW5rIHNpemUgKyBub2RlIHJlY3Qgc2l6ZQogICAgICAgICAgICB9CiAgICAgICAgICAgIAogICAgICAgICAgICB0cmVlID0gdHJlZS5zaXplKFtuZXdIZWlnaHQsIG5ld1dpZHRoXSk7CiAgICAKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgbmV3IHRyZWUgbGF5b3V0LgogICAgICAgICAgICB2YXIgbm9kZXMgPSB0cmVlLm5vZGVzKHJvb3QpLnJldmVyc2UoKSwKICAgICAgICAgICAgICAgIGxpbmtzID0gdHJlZS5saW5rcyhub2Rlcyk7CiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFNpemUgbGluayB3aWR0aCBhY2NvcmRpbmcgdG8gbiBiYXNlZCBvbiB0b3RhbCBuCiAgICAgICAgICAgIHdzY2FsZSA9IGQzLnNjYWxlLmxpbmVhcigpCiAgICAgICAgICAgICAgICAucmFuZ2UoWzAsb3B0cy5ub2RlSGVpZ2h0IHx8IDI1XSkKICAgICAgICAgICAgICAgIC5kb21haW4oWzAsdHJlZURhdGFbb3B0cy52YWx1ZV1dKTsKICAgIAogICAgICAgICAgICAvLyBTZXQgd2lkdGhzIGJldHdlZW4gbGV2ZWxzIGJhc2VkIG9uIG1heExhYmVsTGVuZ3RoLgogICAgICAgICAgICBpZiAob3B0cy5tYXhMYWJlbExlbmd0aCkgewogICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgZC55ID0gKGQuZGVwdGggKiAobWF4TGFiZWxMZW5ndGggKiAxMCkpOyAgLy9tYXhMYWJlbExlbmd0aCAqIDEwcHgKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgZC55ID0gKGQuZGVwdGggKiAobWVhbkxhYmVsTGVuZ3RoICogcHhQZXJDaGFyKSk7IC8vbWVhbkxhYmVsTGVuZ3RoICogNXB4CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKCiAgICAKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBub2Rlc+KApgogICAgICAgICAgICBub2RlID0gc3ZnR3JvdXAuc2VsZWN0QWxsKCJnLm5vZGUiKQogICAgICAgICAgICAgICAgLmRhdGEobm9kZXMsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZFtvcHRzLmlkXSB8fCAoZFtvcHRzLmlkXSA9ICsraSk7CiAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAvLyBFbnRlciBhbnkgbmV3IG5vZGVzIGF0IHRoZSBwYXJlbnQncyBwcmV2aW91cyBwb3NpdGlvbi4KICAgICAgICAgICAgdmFyIG5vZGVFbnRlciA9IG5vZGUuZW50ZXIoKS5hcHBlbmQoImciKQogICAgICAgICAgICAgICAvLyAuY2FsbChkcmFnTGlzdGVuZXIpCiAgICAgICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAibm9kZSIpCiAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyBzb3VyY2UueTAgKyAiLCIgKyBzb3VyY2UueDAgKyAiKSI7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIGNsaWNrKTsKICAgIAogICAgICAgICAgICAvKgogICAgICAgICAgICBub2RlRW50ZXIuYXBwZW5kKCJjaXJjbGUiKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ25vZGVDaXJjbGUnKQogICAgICAgICAgICAgICAgLmF0dHIoInIiLCAwKQogICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkLl9jaGlsZHJlbiA/ICJsaWdodHN0ZWVsYmx1ZSIgOiAiI2ZmZiI7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCB0aXAuc2hvdykKICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aXAuaGlkZSk7CiAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgbm9kZUVudGVyLmFwcGVuZCgicmVjdCIpCiAgICAgICAgICAgICAgICAuYXR0cigiY2xhc3MiLCAibm9kZVJlY3QiKQogICAgICAgICAgICAgICAgLmF0dHIoIngiLCAtMi41KQogICAgICAgICAgICAgICAgLmF0dHIoInkiLCBmdW5jdGlvbihkKXtyZXR1cm4gLXdzY2FsZShkLnZhbHVlKS8yfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKXtyZXR1cm4gd3NjYWxlKGQudmFsdWUpfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIDUpCiAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwiLCJ3aGl0ZSIpCiAgICAgICAgICAgICAgICAuc3R5bGUoInN0cm9rZSIsIndoaXRlIikKICAgICAgICAgICAgICAgIC5zdHlsZSgicG9pbnRlci1ldmVudHMiLCJhbGwiKQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCBvcHRzLnRvb2x0aXAgPyB0aXAuc2hvdyA6IG51bGwpCiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3V0Jywgb3B0cy50b29sdGlwID8gdGlwLmhpZGUgOiBudWxsKTsKICAgIAogICAgICAgICAgICBub2RlRW50ZXIuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSB8fCBkLl9jaGlsZHJlbiA/IC0xMCA6IDEwOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hdHRyKCJkeSIsICIuMzVlbSIpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnbm9kZVRleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSB8fCBkLl9jaGlsZHJlbiA/ICJlbmQiIDogInN0YXJ0IjsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5uYW1lXTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDApOwogICAgCiAgICAgICAgICAgIC8vIHBoYW50b20gbm9kZSB0byBnaXZlIHVzIG1vdXNlb3ZlciBpbiBhIHJhZGl1cyBhcm91bmQgaXQKICAgICAgICAgICAgbm9kZUVudGVyLmFwcGVuZCgiY2lyY2xlIikKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdnaG9zdENpcmNsZScpCiAgICAgICAgICAgICAgICAuYXR0cigiciIsIDMwKQogICAgICAgICAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCAwLjIpIC8vIGNoYW5nZSB0aGlzIHRvIHplcm8gdG8gaGlkZSB0aGUgdGFyZ2V0IGFyZWEKICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgInJlZCIpCiAgICAgICAgICAgICAgICAuYXR0cigncG9pbnRlci1ldmVudHMnLCAnbW91c2VvdmVyJykKICAgICAgICAgICAgICAgIC5vbigibW91c2VvdmVyIiwgZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgICAgICAgICAgIG92ZXJDaXJjbGUobm9kZSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCJtb3VzZW91dCIsIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBvdXRDaXJjbGUobm9kZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHRleHQgdG8gcmVmbGVjdCB3aGV0aGVyIG5vZGUgaGFzIGNoaWxkcmVuIG9yIG5vdC4KICAgICAgICAgICAgbm9kZS5zZWxlY3QoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoIngiLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5jaGlsZHJlbk5hbWVdIHx8IGQuX2NoaWxkcmVuID8gLTEwIDogMTA7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkW29wdHMuY2hpbGRyZW5OYW1lXSB8fCBkLl9jaGlsZHJlbiA/ICJlbmQiIDogInN0YXJ0IjsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbb3B0cy5uYW1lXTsKICAgICAgICAgICAgICAgIH0pOwogICAgCiAgICAgICAgICAgIC8vIENoYW5nZSB0aGUgY2lyY2xlIGZpbGwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgaGFzIGNoaWxkcmVuIGFuZCBpcyBjb2xsYXBzZWQKICAgICAgICAgICAgbm9kZS5zZWxlY3QoImNpcmNsZS5ub2RlQ2lyY2xlIikKICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwgNC41KQogICAgICAgICAgICAgICAgLnN0eWxlKCJmaWxsIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkLl9jaGlsZHJlbiA/ICJsaWdodHN0ZWVsYmx1ZSIgOiAiI2ZmZiI7CiAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAvLyBUcmFuc2l0aW9uIG5vZGVzIHRvIHRoZWlyIG5ldyBwb3NpdGlvbi4KICAgICAgICAgICAgdmFyIG5vZGVVcGRhdGUgPSBub2RlLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKGR1cmF0aW9uKQogICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgZC55ICsgIiwiICsgZC54ICsgIikiOwogICAgICAgICAgICAgICAgfSk7CiAgICAKICAgICAgICAgICAgLy8gRmFkZSB0aGUgdGV4dCBpbgogICAgICAgICAgICBub2RlVXBkYXRlLnNlbGVjdCgidGV4dCIpCiAgICAgICAgICAgICAgICAuc3R5bGUoImZpbGwtb3BhY2l0eSIsIDEpOwogICAgCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZXhpdGluZyBub2RlcyB0byB0aGUgcGFyZW50J3MgbmV3IHBvc2l0aW9uLgogICAgICAgICAgICB2YXIgbm9kZUV4aXQgPSBub2RlLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHNvdXJjZS55ICsgIiwiICsgc291cmNlLnggKyAiKSI7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgCiAgICAgICAgICAgIG5vZGVFeGl0LnNlbGVjdCgiY2lyY2xlIikKICAgICAgICAgICAgICAgIC5hdHRyKCJyIiwgMCk7CiAgICAKICAgICAgICAgICAgbm9kZUV4aXQuc2VsZWN0KCJ0ZXh0IikKICAgICAgICAgICAgICAgIC5zdHlsZSgiZmlsbC1vcGFjaXR5IiwgMCk7CiAgICAKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsaW5rc+KApgogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIHByb2JhYmx5IG5vdCB0aGUgYmVzdCB3YXkgb3IgcGxhY2UgdG8gZG8gdGhpcwogICAgICAgICAgICAvLyAgIGJ1dCBzdGFydCBoZXJlIHdpdGggYWRqdXN0aW5nIHBhdGhzIGhpZ2hlcgogICAgICAgICAgICAvLyAgIG9yIGxvd2VyIHRvIGRvIGxpa2UgYSBzdGFja2VkIGJhcgogICAgICAgICAgICAvLyAgIHNpbmNlIG91ciBzdHJva2Utd2lkdGggd2lsbCByZWZsZWN0IHNpemUKICAgICAgICAgICAgLy8gICBzaW1pbGFyIHRvIGEgU2Fua2V5CiAgICAgICAgICAgIAogICAgICAgICAgICAvLyAxLiBzdGFydCBieSBuZXN0aW5nIG91ciBsaW5rIHBhdGhzIGJ5IHNvdXJjZQogICAgICAgICAgICB2YXIgbGlua19uZXN0ZWQgPSBkMy5uZXN0KCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAua2V5KGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQuc291cmNlW29wdHMuaWRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50cmllcyhsaW5rcyk7CiAgICAgICAgICAgIC8vIDIuIG1hbnVhbCBtZXRob2QgZm9yIHN0YWNraW5nIHNpbmNlIGQzLmxheW91dC5zdGFjawogICAgICAgICAgICAvLyAgICAgIGRpZCBub3Qgd29yawogICAgICAgICAgICBsaW5rX25lc3RlZC5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHZhciB5c3RhY2t5ID0gMDsKICAgICAgICAgICAgICBkLnZhbHVlcy5yZXZlcnNlKCkuZm9yRWFjaChmdW5jdGlvbihkZCl7CiAgICAgICAgICAgICAgICB2YXIgeXdpZHRoID0gd3NjYWxlKGRkLnRhcmdldC52YWx1ZSkKICAgICAgICAgICAgICAgIHZhciBzcmN3aWR0aCA9IHdzY2FsZShkZC5zb3VyY2UudmFsdWUpCiAgICAgICAgICAgICAgICBzcmN3aWR0aCA9IGlzTmFOKHNyY3dpZHRoKSA/IHdzY2FsZS5yYW5nZSgpWzFdLzIgOiBzcmN3aWR0aDsKICAgICAgICAgICAgICAgIHlzdGFja3kgPSB5c3RhY2t5ICsgeXdpZHRoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIGRkLnggPSBkZC5zb3VyY2UueCArIHNyY3dpZHRoLzIgLSB5c3RhY2t5ICsgeXdpZHRoLzI7CiAgICAgICAgICAgICAgICBkZC55ID0gZGQuc291cmNlLnk7CiAgICAgICAgICAgICAgICBkZC55c3RhY2t5ID0geXN0YWNreTsKICAgICAgICAgICAgICB9KQogICAgICAgICAgICB9KQogICAgICAgICAgICAvKiAgCiAgICAgICAgICAgIC8vIHVzZSBkMyBzdGFjayBsYXlvdXQKICAgICAgICAgICAgdmFyIHN0YWNrID0gZDMubGF5b3V0LnN0YWNrKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVzKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQudmFsdWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgLngoZnVuY3Rpb24oZCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZC5zb3VyY2UueDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgICAgICAgIC55KGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdzY2FsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBkLnRhcmdldFtvcHRzLm5hbWVdLnJlcGxhY2UoLy4qbiA9IChbMC05XSopLywiJDEiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgLm91dChmdW5jdGlvbihkLHkwLHkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC54ID0gZC5zb3VyY2UueCAtIHkgKyA1MCA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnkgPSBkLnNvdXJjZS55OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC55c3RhY2swID0geTA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkLnlzdGFja3kgPSB5OwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICBsaW5rX25lc3RlZC5mb3JFYWNoKGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgIHN0YWNrKGQpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAqLwogICAgICAgICAgICAKICAgICAgICAgICAgdmFyIGxpbmsgPSBzdmdHcm91cC5zZWxlY3RBbGwoInBhdGgubGluayIpCiAgICAgICAgICAgICAgICAuZGF0YShsaW5rcywgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZC50YXJnZXRbb3B0cy5pZF07CiAgICAgICAgICAgICAgICB9KTsKICAgIAogICAgICAgICAgICAvLyBFbnRlciBhbnkgbmV3IGxpbmtzIGF0IHRoZSBwYXJlbnQncyBwcmV2aW91cyBwb3NpdGlvbi4KICAgICAgICAgICAgbGluay5lbnRlcigpLmluc2VydCgicGF0aCIsICJnIikKICAgICAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJsaW5rIikKICAgICAgICAgICAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICB4OiBzb3VyY2UueDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHk6IHNvdXJjZS55MAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpYWdvbmFsKHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlOiBvLAogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG8KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgbGluay5zdHlsZSgic3Ryb2tlLXdpZHRoIixmdW5jdGlvbihkKXsKICAgICAgICAgICAgICByZXR1cm4gd3NjYWxlKCBkLnRhcmdldC52YWx1ZSApCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAKICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiBsaW5rcyB0byB0aGVpciBuZXcgcG9zaXRpb24uCiAgICAgICAgICAgIGxpbmsudHJhbnNpdGlvbigpCiAgICAgICAgICAgICAgICAuZHVyYXRpb24oZHVyYXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cigiZCIsIGRpYWdvbmFsKQogICAgICAgICAgICAgICAgLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKGQpewogICAgICAgICAgICAgICAgICBpZihkLnRhcmdldC5jb2xvcil7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkLnRhcmdldC5jb2xvciA9PT0gJ3N0cmluZycpewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQzLmxhYihkLnRhcmdldC5jb2xvcikKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQzLmhjbCgKICAgICAgICAgICAgICAgICAgICAgICAgZC50YXJnZXQuY29sb3IuaCwKICAgICAgICAgICAgICAgICAgICAgICAgZC50YXJnZXQuY29sb3IuYywKICAgICAgICAgICAgICAgICAgICAgICAgZC50YXJnZXQuY29sb3IubAogICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gIiNjY2MiCiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gZXhpdGluZyBub2RlcyB0byB0aGUgcGFyZW50J3MgbmV3IHBvc2l0aW9uLgogICAgICAgICAgICBsaW5rLmV4aXQoKS50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbihkdXJhdGlvbikKICAgICAgICAgICAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24oZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBvID0gewogICAgICAgICAgICAgICAgICAgICAgICB4OiBzb3VyY2UueCwKICAgICAgICAgICAgICAgICAgICAgICAgeTogc291cmNlLnkKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkaWFnb25hbCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogbywKICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBvCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgCiAgICAgICAgICAgIC8vIFN0YXNoIHRoZSBvbGQgcG9zaXRpb25zIGZvciB0cmFuc2l0aW9uLgogICAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpIHsKICAgICAgICAgICAgICAgIGQueDAgPSBkLng7CiAgICAgICAgICAgICAgICBkLnkwID0gZC55OwogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGRpc3BhdGNoLnVwZGF0ZSh7cm9vdDogcm9vdCwgc291cmNlOiBzb3VyY2V9KTsKICAgICAgICB9CiAgICAKICAgICAgICAvLyBBcHBlbmQgYSBncm91cCB3aGljaCBob2xkcyBhbGwgbm9kZXMgYW5kIHdoaWNoIHRoZSB6b29tIExpc3RlbmVyIGNhbiBhY3QgdXBvbi4KICAgICAgICB2YXIgc3ZnR3JvdXAgPSBiYXNlU3ZnLmFwcGVuZCgiZyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAKICAgICAgICAvLyBpZiB0b29sdGlwIHRoZW4gc2V0IGl0IHVwCiAgICAgICAgaWYob3B0cy50b29sdGlwKXsKICAgICAgICAgIHN2Z0dyb3VwLmNhbGwodGlwKTsKICAgICAgICB9CiAgICAKICAgICAgICAvLyBEZWZpbmUgdGhlIHJvb3QKICAgICAgICByb290ID0gdHJlZURhdGE7CiAgICAgICAgcm9vdC54MCA9IHZpZXdlckhlaWdodCAvIDI7CiAgICAgICAgcm9vdC55MCA9IDA7CiAgICAKICAgICAgICAvLyBMYXlvdXQgdGhlIHRyZWUgaW5pdGlhbGx5IGFuZCBjZW50ZXIgb24gdGhlIHJvb3Qgbm9kZS4KICAgICAgICB1cGRhdGUocm9vdCk7CiAgICAgICAgLy8gc2luY2Ugd2UgY2FuIG92ZXJyaWRlIG5vZGUgaGVpZ2h0IGFuZCBsYWJlbCBsZW5ndGggKHdpZHRoKQogICAgICAgIC8vIGlmIHpvb20gc2NhbGUgPT0gMSB0aGVuIGF1dG8gc2NhbGUgdG8gZml0IHRyZWUgaW4gY29udGFpbmVyCiAgICAgICAgaWYgKHpvb21MaXN0ZW5lci5zY2FsZSgpID09IDEpIHsKICAgICAgICAgIHZhciB4c2NhbGUgPSB2aWV3ZXJIZWlnaHQvdHJlZS5zaXplKClbMF0qMC44NSwKICAgICAgICAgICAgICB5c2NhbGUgPSB2aWV3ZXJXaWR0aC90cmVlLnNpemUoKVsxXSowLjg1OwogICAgICAgICAgaWYgKHhzY2FsZSA8IHlzY2FsZSkgewogICAgICAgICAgICB6b29tTGlzdGVuZXIuc2NhbGUoIHhzY2FsZSApOyAKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHpvb21MaXN0ZW5lci5zY2FsZSggeXNjYWxlICk7IAogICAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgfQogICAgICAgICAgCiAgICAgICAgY2VudGVyTm9kZShyb290KTsKCiAgfSwKCiAgcmVzaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCwgaW5zdGFuY2UpIHsKCiAgfQoKfSk7Cg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-b90f1762a335f77610ab" class="sankeytree html-widget" style="width:960px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-b90f1762a335f77610ab">{"x":{"data":{"children":[{"name":"1st","children":[{"name":"Female","children":[{"name":"No","size":4,"color":"red","colname":"Survived"},{"name":"Yes","size":141,"color":"green","colname":"Survived"}],"size":145,"color":"pink","colname":"Sex"},{"name":"Male","children":[{"name":"No","size":118,"color":"red","colname":"Survived"},{"name":"Yes","size":62,"color":"green","colname":"Survived"}],"size":180,"color":"cadetblue","colname":"Sex"}],"size":325,"color":"gray","colname":"Class"},{"name":"2nd","children":[{"name":"Female","children":[{"name":"No","size":13,"color":"red","colname":"Survived"},{"name":"Yes","size":93,"color":"green","colname":"Survived"}],"size":106,"color":"pink","colname":"Sex"},{"name":"Male","children":[{"name":"No","size":154,"color":"red","colname":"Survived"},{"name":"Yes","size":25,"color":"green","colname":"Survived"}],"size":179,"color":"cadetblue","colname":"Sex"}],"size":285,"color":"gray","colname":"Class"},{"name":"3rd","children":[{"name":"Female","children":[{"name":"No","size":106,"color":"red","colname":"Survived"},{"name":"Yes","size":90,"color":"green","colname":"Survived"}],"size":196,"color":"pink","colname":"Sex"},{"name":"Male","children":[{"name":"No","size":422,"color":"red","colname":"Survived"},{"name":"Yes","size":88,"color":"green","colname":"Survived"}],"size":510,"color":"cadetblue","colname":"Sex"}],"size":706,"color":"gray","colname":"Class"},{"name":"Crew","children":[{"name":"Female","children":[{"name":"No","size":3,"color":"red","colname":"Survived"},{"name":"Yes","size":20,"color":"green","colname":"Survived"}],"size":23,"color":"pink","colname":"Sex"},{"name":"Male","children":[{"name":"No","size":670,"color":"red","colname":"Survived"},{"name":"Yes","size":192,"color":"green","colname":"Survived"}],"size":862,"color":"cadetblue","colname":"Sex"}],"size":885,"color":"gray","colname":"Class"}],"name":"Titanic","size":2201,"color":"#F0F"},"opts":{"name":"name","id":"id","value":"size","childrenName":"children","treeColors":false,"maxLabelLength":15,"nodeHeight":null,"tooltip":null}},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-b90f1762a335f77610ab">{"viewer":{"width":450,"height":350,"padding":5,"fill":true},"browser":{"width":960,"height":500,"padding":5,"fill":true}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment