Skip to content

Instantly share code, notes, and snippets.

@timelyportfolio
Created July 8, 2016 12:44
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/6a026c1901301373415ad3eb9674a6f8 to your computer and use it in GitHub Desktop.
Save timelyportfolio/6a026c1901301373415ad3eb9674a6f8 to your computer and use it in GitHub Desktop.
R listviewer minimal implementation of react-json

I have been experimenting with React in R. Here is a quick illustration of making a htmlwidget out of react-json.

# requires dev version of listviewer
# devtools::install_github("timelyportfolio/listviewer@feature/react-json")
library(listviewer)

# use reactR for React dependencies
# devtools::install_github("timelyportfolio/reactR")
library(reactR)

reactjson()

reactjson(head(mtcars,4))
reactjson(I(jsonlite::toJSON(head(mtcars,5))))

library(shiny)

shinyApp(
  ui = reactjson(
    list(x=1,msg="react+r+shiny",opts=list(use_react=FALSE)),
    elementId = "json1"
  ),
  server = function(input, output, session){
    observeEvent(
      input$json1_change,
      str(input$json1_change)
    )
  }
)

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncmVhY3Rqc29uJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgLy8gVE9ETzogZGVmaW5lIHNoYXJlZCB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UNCg0KICAgIHJldHVybiB7DQoNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbih4KSB7DQoNCiAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoDQogICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KA0KICAgICAgICAgICAgICBKc29uLA0KICAgICAgICAgICAgICB7IHZhbHVlOiB4Lmpzb24sIG9uQ2hhbmdlOiBsb2dDaGFuZ2UgfQ0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkNCiAgICAgICAgICApOw0KDQogICAgICAgICAgZnVuY3Rpb24gbG9nQ2hhbmdlKCB2YWx1ZSApew0KICAgICAgICAgICAgY29uc29sZS5sb2coIHZhbHVlICk7DQogICAgICAgICAgICBpZih0eXBlb2YoU2hpbnkpICE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZWwuaWQgKyAiX2NoYW5nZSIsIHt2YWx1ZTp2YWx1ZX0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCg0KICAgICAgfSwNCg0KICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAgICAgLy8gVE9ETzogY29kZSB0byByZS1yZW5kZXIgdGhlIHdpZGdldCB3aXRoIGEgbmV3IHNpemUNCg0KICAgICAgfQ0KDQogICAgfTsNCiAgfQ0KfSk7DQo="></script>
<script src="data:application/x-javascript;base64,LyoqCiAqIFJlYWN0IHYxNS4xLjAKICoKICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAogKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICoKICovCiFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLGUpO2Vsc2V7dmFyIHQ7dD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsdC5SZWFjdD1lKCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKGEsdSl7aWYoIW5bYV0pe2lmKCF0W2FdKXt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighdSYmcylyZXR1cm4gcyhhLCEwKTtpZihpKXJldHVybiBpKGEsITApO3ZhciBsPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2ErIiciKTt0aHJvdyBsLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGx9dmFyIGM9blthXT17ZXhwb3J0czp7fX07dFthXVswXS5jYWxsKGMuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W2FdWzFdW2VdO3JldHVybiBvKG4/bjplKX0sYyxjLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bYV0uZXhwb3J0c31mb3IodmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ci5sZW5ndGg7YSsrKW8oclthXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNDApLG89ZSgxNDgpLGk9e2ZvY3VzRE9NQ29tcG9uZW50OmZ1bmN0aW9uKCl7byhyLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpfX07dC5leHBvcnRzPWl9LHsxNDg6MTQ4LDQwOjQwfV0sMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dmFyIGU9d2luZG93Lm9wZXJhO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudmVyc2lvbiYmcGFyc2VJbnQoZS52ZXJzaW9uKCksMTApPD0xMn1mdW5jdGlvbiBvKGUpe3JldHVybihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiYhKGUuY3RybEtleSYmZS5hbHRLZXkpfWZ1bmN0aW9uIGkoZSl7c3dpdGNoKGUpe2Nhc2UgUy50b3BDb21wb3NpdGlvblN0YXJ0OnJldHVybiBNLmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSBTLnRvcENvbXBvc2l0aW9uRW5kOnJldHVybiBNLmNvbXBvc2l0aW9uRW5kO2Nhc2UgUy50b3BDb21wb3NpdGlvblVwZGF0ZTpyZXR1cm4gTS5jb21wb3NpdGlvblVwZGF0ZX19ZnVuY3Rpb24gYShlLHQpe3JldHVybiBlPT09Uy50b3BLZXlEb3duJiZ0LmtleUNvZGU9PT1ffWZ1bmN0aW9uIHUoZSx0KXtzd2l0Y2goZSl7Y2FzZSBTLnRvcEtleVVwOnJldHVybi0xIT09Yi5pbmRleE9mKHQua2V5Q29kZSk7Y2FzZSBTLnRvcEtleURvd246cmV0dXJuIHQua2V5Q29kZSE9PV87Y2FzZSBTLnRvcEtleVByZXNzOmNhc2UgUy50b3BNb3VzZURvd246Y2FzZSBTLnRvcEJsdXI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmRldGFpbDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJkYXRhImluIHQ/dC5kYXRhOm51bGx9ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgbyxsO2lmKEU/bz1pKGUpOlI/dShlLG4pJiYobz1NLmNvbXBvc2l0aW9uRW5kKTphKGUsbikmJihvPU0uY29tcG9zaXRpb25TdGFydCksIW8pcmV0dXJuIG51bGw7VCYmKFJ8fG8hPT1NLmNvbXBvc2l0aW9uU3RhcnQ/bz09PU0uY29tcG9zaXRpb25FbmQmJlImJihsPVIuZ2V0RGF0YSgpKTpSPW0uZ2V0UG9vbGVkKHIpKTt2YXIgYz1nLmdldFBvb2xlZChvLHQsbixyKTtpZihsKWMuZGF0YT1sO2Vsc2V7dmFyIHA9cyhuKTtudWxsIT09cCYmKGMuZGF0YT1wKX1yZXR1cm4gaC5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGMpLGN9ZnVuY3Rpb24gYyhlLHQpe3N3aXRjaChlKXtjYXNlIFMudG9wQ29tcG9zaXRpb25FbmQ6cmV0dXJuIHModCk7Y2FzZSBTLnRvcEtleVByZXNzOnZhciBuPXQud2hpY2g7cmV0dXJuIG4hPT1QP251bGw6KGs9ITAsdyk7Y2FzZSBTLnRvcFRleHRJbnB1dDp2YXIgcj10LmRhdGE7cmV0dXJuIHI9PT13JiZrP251bGw6cjtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBwKGUsdCl7aWYoUil7aWYoZT09PVMudG9wQ29tcG9zaXRpb25FbmR8fHUoZSx0KSl7dmFyIG49Ui5nZXREYXRhKCk7cmV0dXJuIG0ucmVsZWFzZShSKSxSPW51bGwsbn1yZXR1cm4gbnVsbH1zd2l0Y2goZSl7Y2FzZSBTLnRvcFBhc3RlOnJldHVybiBudWxsO2Nhc2UgUy50b3BLZXlQcmVzczpyZXR1cm4gdC53aGljaCYmIW8odCk/U3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKTpudWxsO2Nhc2UgUy50b3BDb21wb3NpdGlvbkVuZDpyZXR1cm4gVD9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBkKGUsdCxuLHIpe3ZhciBvO2lmKG89Tj9jKGUsbik6cChlLG4pLCFvKXJldHVybiBudWxsO3ZhciBpPXkuZ2V0UG9vbGVkKE0uYmVmb3JlSW5wdXQsdCxuLHIpO3JldHVybiBpLmRhdGE9byxoLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoaSksaX12YXIgZj1lKDE2KSxoPWUoMjApLHY9ZSgxNDApLG09ZSgyMSksZz1lKDk3KSx5PWUoMTAxKSxDPWUoMTU4KSxiPVs5LDEzLDI3LDMyXSxfPTIyOSxFPXYuY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3cseD1udWxsO3YuY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYoeD1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBOPXYuY2FuVXNlRE9NJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIXgmJiFyKCksVD12LmNhblVzZURPTSYmKCFFfHx4JiZ4PjgmJjExPj14KSxQPTMyLHc9U3RyaW5nLmZyb21DaGFyQ29kZShQKSxTPWYudG9wTGV2ZWxUeXBlcyxNPXtiZWZvcmVJbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25CZWZvcmVJbnB1dDpudWxsfSksY2FwdHVyZWQ6Qyh7b25CZWZvcmVJbnB1dENhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W1MudG9wQ29tcG9zaXRpb25FbmQsUy50b3BLZXlQcmVzcyxTLnRvcFRleHRJbnB1dCxTLnRvcFBhc3RlXX0sY29tcG9zaXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOkMoe29uQ29tcG9zaXRpb25FbmQ6bnVsbH0pLGNhcHR1cmVkOkMoe29uQ29tcG9zaXRpb25FbmRDYXB0dXJlOm51bGx9KX0sZGVwZW5kZW5jaWVzOltTLnRvcEJsdXIsUy50b3BDb21wb3NpdGlvbkVuZCxTLnRvcEtleURvd24sUy50b3BLZXlQcmVzcyxTLnRvcEtleVVwLFMudG9wTW91c2VEb3duXX0sY29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25Db21wb3NpdGlvblN0YXJ0Om51bGx9KSxjYXB0dXJlZDpDKHtvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlOm51bGx9KX0sZGVwZW5kZW5jaWVzOltTLnRvcEJsdXIsUy50b3BDb21wb3NpdGlvblN0YXJ0LFMudG9wS2V5RG93bixTLnRvcEtleVByZXNzLFMudG9wS2V5VXAsUy50b3BNb3VzZURvd25dfSxjb21wb3NpdGlvblVwZGF0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25Db21wb3NpdGlvblVwZGF0ZTpudWxsfSksY2FwdHVyZWQ6Qyh7b25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W1MudG9wQmx1cixTLnRvcENvbXBvc2l0aW9uVXBkYXRlLFMudG9wS2V5RG93bixTLnRvcEtleVByZXNzLFMudG9wS2V5VXAsUy50b3BNb3VzZURvd25dfX0saz0hMSxSPW51bGwsRD17ZXZlbnRUeXBlczpNLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuW2woZSx0LG4sciksZChlLHQsbixyKV19fTt0LmV4cG9ydHM9RH0sezEwMToxMDEsMTQwOjE0MCwxNTg6MTU4LDE2OjE2LDIwOjIwLDIxOjIxLDk3Ojk3fV0sMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUrdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cmluZygxKX12YXIgbz17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZFJvdzohMCxncmlkQ29sdW1uOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LGk9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kuZm9yRWFjaChmdW5jdGlvbih0KXtvW3IodCxlKV09b1tlXX0pfSk7dmFyIGE9e2JhY2tncm91bmQ6e2JhY2tncm91bmRBdHRhY2htZW50OiEwLGJhY2tncm91bmRDb2xvcjohMCxiYWNrZ3JvdW5kSW1hZ2U6ITAsYmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwLGJhY2tncm91bmRSZXBlYXQ6ITB9LGJhY2tncm91bmRQb3NpdGlvbjp7YmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwfSxib3JkZXI6e2JvcmRlcldpZHRoOiEwLGJvcmRlclN0eWxlOiEwLGJvcmRlckNvbG9yOiEwfSxib3JkZXJCb3R0b206e2JvcmRlckJvdHRvbVdpZHRoOiEwLGJvcmRlckJvdHRvbVN0eWxlOiEwLGJvcmRlckJvdHRvbUNvbG9yOiEwfSxib3JkZXJMZWZ0Ontib3JkZXJMZWZ0V2lkdGg6ITAsYm9yZGVyTGVmdFN0eWxlOiEwLGJvcmRlckxlZnRDb2xvcjohMH0sYm9yZGVyUmlnaHQ6e2JvcmRlclJpZ2h0V2lkdGg6ITAsYm9yZGVyUmlnaHRTdHlsZTohMCxib3JkZXJSaWdodENvbG9yOiEwfSxib3JkZXJUb3A6e2JvcmRlclRvcFdpZHRoOiEwLGJvcmRlclRvcFN0eWxlOiEwLGJvcmRlclRvcENvbG9yOiEwfSxmb250Ontmb250U3R5bGU6ITAsZm9udFZhcmlhbnQ6ITAsZm9udFdlaWdodDohMCxmb250U2l6ZTohMCxsaW5lSGVpZ2h0OiEwLGZvbnRGYW1pbHk6ITB9LG91dGxpbmU6e291dGxpbmVXaWR0aDohMCxvdXRsaW5lU3R5bGU6ITAsb3V0bGluZUNvbG9yOiEwfX0sdT17aXNVbml0bGVzc051bWJlcjpvLHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uczphfTt0LmV4cG9ydHM9dX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzKSxvPWUoMTQwKSxpPShlKDcwKSxlKDE0MiksZSgxMTQpKSxhPWUoMTUzKSx1PWUoMTYwKSxzPShlKDE2NCksdShmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0pKSxsPSExLGM9ImNzc0Zsb2F0IjtpZihvLmNhblVzZURPTSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5e3AuZm9udD0iIn1jYXRjaChkKXtsPSEwfXZvaWQgMD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCYmKGM9InN0eWxlRmxvYXQiKX12YXIgZj17Y3JlYXRlTWFya3VwRm9yU3R5bGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89ZVtyXTtudWxsIT1vJiYobis9cyhyKSsiOiIsbis9aShyLG8sdCkrIjsiKX1yZXR1cm4gbnx8bnVsbH0sc2V0VmFsdWVGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWUuc3R5bGU7Zm9yKHZhciBhIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIHU9aShhLHRbYV0sbik7aWYoImZsb2F0IiE9PWEmJiJjc3NGbG9hdCIhPT1hfHwoYT1jKSx1KW9bYV09dTtlbHNle3ZhciBzPWwmJnIuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW2FdO2lmKHMpZm9yKHZhciBwIGluIHMpb1twXT0iIjtlbHNlIG9bYV09IiJ9fX19O3QuZXhwb3J0cz1mfSx7MTE0OjExNCwxNDA6MTQwLDE0MjoxNDIsMTUzOjE1MywxNjA6MTYwLDE2NDoxNjQsMzozLDcwOjcwfV0sNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbH12YXIgbz1lKDE2NSksaT1lKDI1KSxhPWUoMTU0KTtvKHIucHJvdG90eXBlLHtlbnF1ZXVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8W10sdGhpcy5fY29udGV4dHM9dGhpcy5fY29udGV4dHN8fFtdLHRoaXMuX2NhbGxiYWNrcy5wdXNoKGUpLHRoaXMuX2NvbnRleHRzLnB1c2godCl9LG5vdGlmeUFsbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NhbGxiYWNrcyx0PXRoaXMuX2NvbnRleHRzO2lmKGUpe2UubGVuZ3RoIT09dC5sZW5ndGg/YSghMSk6dm9pZCAwLHRoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGw7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jYWxsKHRbbl0pO2UubGVuZ3RoPTAsdC5sZW5ndGg9MH19LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzP3RoaXMuX2NhbGxiYWNrcy5sZW5ndGg6MH0scm9sbGJhY2s6ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzJiYodGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1lLHRoaXMuX2NvbnRleHRzLmxlbmd0aD1lKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfX0pLGkuYWRkUG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1yfSx7MTU0OjE1NCwxNjU6MTY1LDI1OjI1fV0sNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4ic2VsZWN0Ij09PXR8fCJpbnB1dCI9PT10JiYiZmlsZSI9PT1lLnR5cGV9ZnVuY3Rpb24gbyhlKXt2YXIgdD1OLmdldFBvb2xlZChrLmNoYW5nZSxELGUsVChlKSk7Yi5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHQpLHguYmF0Y2hlZFVwZGF0ZXMoaSx0KX1mdW5jdGlvbiBpKGUpe0MuZW5xdWV1ZUV2ZW50cyhlKSxDLnByb2Nlc3NFdmVudFF1ZXVlKCExKX1mdW5jdGlvbiBhKGUsdCl7Uj1lLEQ9dCxSLmF0dGFjaEV2ZW50KCJvbmNoYW5nZSIsbyl9ZnVuY3Rpb24gdSgpe1ImJihSLmRldGFjaEV2ZW50KCJvbmNoYW5nZSIsbyksUj1udWxsLEQ9bnVsbCl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlPT09TS50b3BDaGFuZ2U/dDp2b2lkIDB9ZnVuY3Rpb24gbChlLHQsbil7ZT09PU0udG9wRm9jdXM/KHUoKSxhKHQsbikpOmU9PT1NLnRvcEJsdXImJnUoKX1mdW5jdGlvbiBjKGUsdCl7Uj1lLEQ9dCxJPWUudmFsdWUsTz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJ2YWx1ZSIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSLCJ2YWx1ZSIsVSksUi5hdHRhY2hFdmVudD9SLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixkKTpSLmFkZEV2ZW50TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixkLCExKX1mdW5jdGlvbiBwKCl7UiYmKGRlbGV0ZSBSLnZhbHVlLFIuZGV0YWNoRXZlbnQ/Ui5kZXRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZCk6Ui5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9wZXJ0eWNoYW5nZSIsZCwhMSksUj1udWxsLEQ9bnVsbCxJPW51bGwsTz1udWxsKX1mdW5jdGlvbiBkKGUpe2lmKCJ2YWx1ZSI9PT1lLnByb3BlcnR5TmFtZSl7dmFyIHQ9ZS5zcmNFbGVtZW50LnZhbHVlO3QhPT1JJiYoST10LG8oZSkpfX1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuIGU9PT1NLnRvcElucHV0P3Q6dm9pZCAwfWZ1bmN0aW9uIGgoZSx0LG4pe2U9PT1NLnRvcEZvY3VzPyhwKCksYyh0LG4pKTplPT09TS50b3BCbHVyJiZwKCl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBlIT09TS50b3BTZWxlY3Rpb25DaGFuZ2UmJmUhPT1NLnRvcEtleVVwJiZlIT09TS50b3BLZXlEb3dufHwhUnx8Ui52YWx1ZT09PUk/dm9pZCAwOihJPVIudmFsdWUsRCl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT1lLnR5cGV8fCJyYWRpbyI9PT1lLnR5cGUpfWZ1bmN0aW9uIGcoZSx0KXtyZXR1cm4gZT09PU0udG9wQ2xpY2s/dDp2b2lkIDB9dmFyIHk9ZSgxNiksQz1lKDE3KSxiPWUoMjApLF89ZSgxNDApLEU9ZSg0MCkseD1lKDkwKSxOPWUoOTkpLFQ9ZSgxMjIpLFA9ZSgxMjkpLHc9ZSgxMzApLFM9ZSgxNTgpLE09eS50b3BMZXZlbFR5cGVzLGs9e2NoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Uyh7b25DaGFuZ2U6bnVsbH0pLGNhcHR1cmVkOlMoe29uQ2hhbmdlQ2FwdHVyZTpudWxsfSl9LGRlcGVuZGVuY2llczpbTS50b3BCbHVyLE0udG9wQ2hhbmdlLE0udG9wQ2xpY2ssTS50b3BGb2N1cyxNLnRvcElucHV0LE0udG9wS2V5RG93bixNLnRvcEtleVVwLE0udG9wU2VsZWN0aW9uQ2hhbmdlXX19LFI9bnVsbCxEPW51bGwsST1udWxsLE89bnVsbCxBPSExO18uY2FuVXNlRE9NJiYoQT1QKCJjaGFuZ2UiKSYmKCEoImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCl8fGRvY3VtZW50LmRvY3VtZW50TW9kZT44KSk7dmFyIEw9ITE7Xy5jYW5Vc2VET00mJihMPVAoImlucHV0IikmJighKCJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+MTEpKTt2YXIgVT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE8uZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihlKXtJPSIiK2UsTy5zZXQuY2FsbCh0aGlzLGUpfX0sRj17ZXZlbnRUeXBlczprLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGksYSx1PXQ/RS5nZXROb2RlRnJvbUluc3RhbmNlKHQpOndpbmRvdztpZihyKHUpP0E/aT1zOmE9bDp3KHUpP0w/aT1mOihpPXYsYT1oKTptKHUpJiYoaT1nKSxpKXt2YXIgYz1pKGUsdCk7aWYoYyl7dmFyIHA9Ti5nZXRQb29sZWQoay5jaGFuZ2UsYyxuLG8pO3JldHVybiBwLnR5cGU9ImNoYW5nZSIsYi5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHApLHB9fWEmJmEoZSx1LHQpfX07dC5leHBvcnRzPUZ9LHsxMjI6MTIyLDEyOToxMjksMTMwOjEzMCwxNDA6MTQwLDE1ODoxNTgsMTY6MTYsMTc6MTcsMjA6MjAsNDA6NDAsOTA6OTAsOTk6OTl9XSw3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dFsxXSksdD90Lm5leHRTaWJsaW5nOmUuZmlyc3RDaGlsZH1mdW5jdGlvbiBvKGUsdCxuKXtjLmluc2VydFRyZWVCZWZvcmUoZSx0LG4pfWZ1bmN0aW9uIGkoZSx0LG4pe0FycmF5LmlzQXJyYXkodCk/dShlLHRbMF0sdFsxXSxuKTptKGUsdCxuKX1mdW5jdGlvbiBhKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49dFsxXTt0PXRbMF0scyhlLHQsbiksZS5yZW1vdmVDaGlsZChuKX1lLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHUoZSx0LG4scil7Zm9yKHZhciBvPXQ7Oyl7dmFyIGk9by5uZXh0U2libGluZztpZihtKGUsbyxyKSxvPT09bilicmVhaztvPWl9fWZ1bmN0aW9uIHMoZSx0LG4pe2Zvcig7Oyl7dmFyIHI9dC5uZXh0U2libGluZztpZihyPT09bilicmVhaztlLnJlbW92ZUNoaWxkKHIpfX1mdW5jdGlvbiBsKGUsdCxuKXt2YXIgcj1lLnBhcmVudE5vZGUsbz1lLm5leHRTaWJsaW5nO289PT10P24mJm0ocixkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSxvKTpuPyh2KG8sbikscyhyLG8sdCkpOnMocixlLHQpfXZhciBjPWUoOCkscD1lKDEyKSxkPWUoNzQpLGY9KGUoNDApLGUoNzApLGUoMTEzKSksaD1lKDEzNCksdj1lKDEzNSksbT1mKGZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSksZz1wLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLHk9e2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOmcscmVwbGFjZURlbGltaXRlZFRleHQ6bCxwcm9jZXNzVXBkYXRlczpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgdT10W25dO3N3aXRjaCh1LnR5cGUpe2Nhc2UgZC5JTlNFUlRfTUFSS1VQOm8oZSx1LmNvbnRlbnQscihlLHUuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSBkLk1PVkVfRVhJU1RJTkc6aShlLHUuZnJvbU5vZGUscihlLHUuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSBkLlNFVF9NQVJLVVA6aChlLHUuY29udGVudCk7YnJlYWs7Y2FzZSBkLlRFWFRfQ09OVEVOVDp2KGUsdS5jb250ZW50KTticmVhaztjYXNlIGQuUkVNT1ZFX05PREU6YShlLHUuZnJvbU5vZGUpfX19fTt0LmV4cG9ydHM9eX0sezExMzoxMTMsMTI6MTIsMTM0OjEzNCwxMzU6MTM1LDQwOjQwLDcwOjcwLDc0Ojc0LDg6OH1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZih2KXt2YXIgdD1lLm5vZGUsbj1lLmNoaWxkcmVuO2lmKG4ubGVuZ3RoKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKW0odCxuW3JdLG51bGwpO2Vsc2UgbnVsbCE9ZS5odG1sP3QuaW5uZXJIVE1MPWUuaHRtbDpudWxsIT1lLnRleHQmJmQodCxlLnRleHQpfX1mdW5jdGlvbiBvKGUsdCl7ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSkscih0KX1mdW5jdGlvbiBpKGUsdCl7dj9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSl9ZnVuY3Rpb24gYShlLHQpe3Y/ZS5odG1sPXQ6ZS5ub2RlLmlubmVySFRNTD10fWZ1bmN0aW9uIHUoZSx0KXt2P2UudGV4dD10OmQoZS5ub2RlLHQpfWZ1bmN0aW9uIHMoKXtyZXR1cm4gdGhpcy5ub2RlLm5vZGVOYW1lfWZ1bmN0aW9uIGwoZSl7cmV0dXJue25vZGU6ZSxjaGlsZHJlbjpbXSxodG1sOm51bGwsdGV4dDpudWxsLHRvU3RyaW5nOnN9fXZhciBjPWUoOSkscD1lKDExMyksZD1lKDEzNSksZj0xLGg9MTEsdj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYibnVtYmVyIj09dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJiJzdHJpbmciPT10eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCYmL1xiRWRnZVwvXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbT1wKGZ1bmN0aW9uKGUsdCxuKXt0Lm5vZGUubm9kZVR5cGU9PT1ofHx0Lm5vZGUubm9kZVR5cGU9PT1mJiYib2JqZWN0Ij09PXQubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYobnVsbD09dC5ub2RlLm5hbWVzcGFjZVVSSXx8dC5ub2RlLm5hbWVzcGFjZVVSST09PWMuaHRtbCk/KHIodCksZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pKTooZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pLHIodCkpfSk7bC5pbnNlcnRUcmVlQmVmb3JlPW0sbC5yZXBsYWNlQ2hpbGRXaXRoVHJlZT1vLGwucXVldWVDaGlsZD1pLGwucXVldWVIVE1MPWEsbC5xdWV1ZVRleHQ9dSx0LmV4cG9ydHM9bH0sezExMzoxMTMsMTM1OjEzNSw5Ojl9XSw5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixtYXRobWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLHN2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifTt0LmV4cG9ydHM9cn0se31dLDEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4oZSZ0KT09PXR9dmFyIG89ZSgxNTQpLGk9e01VU1RfVVNFX1BST1BFUlRZOjEsSEFTX1NJREVfRUZGRUNUUzoyLEhBU19CT09MRUFOX1ZBTFVFOjQsSEFTX05VTUVSSUNfVkFMVUU6OCxIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRToyNCxIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFOjMyLGluamVjdERPTVByb3BlcnR5Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWksbj1lLlByb3BlcnRpZXN8fHt9LGE9ZS5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzfHx7fSxzPWUuRE9NQXR0cmlidXRlTmFtZXN8fHt9LGw9ZS5ET01Qcm9wZXJ0eU5hbWVzfHx7fSxjPWUuRE9NTXV0YXRpb25NZXRob2RzfHx7fTtlLmlzQ3VzdG9tQXR0cmlidXRlJiZ1Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGUuaXNDdXN0b21BdHRyaWJ1dGUpO2Zvcih2YXIgcCBpbiBuKXt1LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocCk/byghMSk6dm9pZCAwO3ZhciBkPXAudG9Mb3dlckNhc2UoKSxmPW5bcF0saD17YXR0cmlidXRlTmFtZTpkLGF0dHJpYnV0ZU5hbWVzcGFjZTpudWxsLHByb3BlcnR5TmFtZTpwLG11dGF0aW9uTWV0aG9kOm51bGwsbXVzdFVzZVByb3BlcnR5OnIoZix0Lk1VU1RfVVNFX1BST1BFUlRZKSxoYXNTaWRlRWZmZWN0czpyKGYsdC5IQVNfU0lERV9FRkZFQ1RTKSxoYXNCb29sZWFuVmFsdWU6cihmLHQuSEFTX0JPT0xFQU5fVkFMVUUpLGhhc051bWVyaWNWYWx1ZTpyKGYsdC5IQVNfTlVNRVJJQ19WQUxVRSksaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6cihmLHQuSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6cihmLHQuSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSl9O2lmKCFoLm11c3RVc2VQcm9wZXJ0eSYmaC5oYXNTaWRlRWZmZWN0cz9vKCExKTp2b2lkIDAsaC5oYXNCb29sZWFuVmFsdWUraC5oYXNOdW1lcmljVmFsdWUraC5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlPD0xP3ZvaWQgMDpvKCExKSxzLmhhc093blByb3BlcnR5KHApKXt2YXIgdj1zW3BdO2guYXR0cmlidXRlTmFtZT12fWEuaGFzT3duUHJvcGVydHkocCkmJihoLmF0dHJpYnV0ZU5hbWVzcGFjZT1hW3BdKSxsLmhhc093blByb3BlcnR5KHApJiYoaC5wcm9wZXJ0eU5hbWU9bFtwXSksYy5oYXNPd25Qcm9wZXJ0eShwKSYmKGgubXV0YXRpb25NZXRob2Q9Y1twXSksdS5wcm9wZXJ0aWVzW3BdPWh9fX0sYT0iOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQiLHU9e0lEX0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0aWQiLFJPT1RfQVRUUklCVVRFX05BTUU6ImRhdGEtcmVhY3Ryb290IixBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOmEsQVRUUklCVVRFX05BTUVfQ0hBUjphKyJcXC0uMC05XFx1QjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9zc2libGVTdGFuZGFyZE5hbWU6bnVsbCxfaXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnM6W10saXNDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx1Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5sZW5ndGg7dCsrKXt2YXIgbj11Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XTtpZihuKGUpKXJldHVybiEwfXJldHVybiExfSxpbmplY3Rpb246aX07dC5leHBvcnRzPXV9LHsxNTQ6MTU0fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbC5oYXNPd25Qcm9wZXJ0eShlKT8hMDpzLmhhc093blByb3BlcnR5KGUpPyExOnUudGVzdChlKT8obFtlXT0hMCwhMCk6KHNbZV09ITAsITEpfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gbnVsbD09dHx8ZS5oYXNCb29sZWFuVmFsdWUmJiF0fHxlLmhhc051bWVyaWNWYWx1ZSYmaXNOYU4odCl8fGUuaGFzUG9zaXRpdmVOdW1lcmljVmFsdWUmJjE+dHx8ZS5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ0PT09ITF9dmFyIGk9ZSgxMCksYT0oZSg0MCksZSg0OCksZSg3MCksZSgxMzIpKSx1PShlKDE2NCksbmV3IFJlZ0V4cCgiXlsiK2kuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUisiXVsiK2kuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikpLHM9e30sbD17fSxjPXtjcmVhdGVNYXJrdXBGb3JJRDpmdW5jdGlvbihlKXtyZXR1cm4gaS5JRF9BVFRSSUJVVEVfTkFNRSsiPSIrYShlKX0sc2V0QXR0cmlidXRlRm9ySUQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZShpLklEX0FUVFJJQlVURV9OQU1FLHQpfSxjcmVhdGVNYXJrdXBGb3JSb290OmZ1bmN0aW9uKCl7cmV0dXJuIGkuUk9PVF9BVFRSSUJVVEVfTkFNRSsnPSIiJ30sc2V0QXR0cmlidXRlRm9yUm9vdDpmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShpLlJPT1RfQVRUUklCVVRFX05BTUUsIiIpfSxjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBuPWkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShlKT9pLnByb3BlcnRpZXNbZV06bnVsbDtpZihuKXtpZihvKG4sdCkpcmV0dXJuIiI7dmFyIHI9bi5hdHRyaWJ1dGVOYW1lO3JldHVybiBuLmhhc0Jvb2xlYW5WYWx1ZXx8bi5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ0PT09ITA/cisnPSIiJzpyKyI9IithKHQpfXJldHVybiBpLmlzQ3VzdG9tQXR0cmlidXRlKGUpP251bGw9PXQ/IiI6ZSsiPSIrYSh0KTpudWxsfSxjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcihlKSYmbnVsbCE9dD9lKyI9IithKHQpOiIifSxzZXRWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYocil7dmFyIGE9ci5tdXRhdGlvbk1ldGhvZDtpZihhKWEoZSxuKTtlbHNle2lmKG8ocixuKSlyZXR1cm4gdm9pZCB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoZSx0KTtpZihyLm11c3RVc2VQcm9wZXJ0eSl7dmFyIHU9ci5wcm9wZXJ0eU5hbWU7ci5oYXNTaWRlRWZmZWN0cyYmIiIrZVt1XT09IiIrbnx8KGVbdV09bil9ZWxzZXt2YXIgcz1yLmF0dHJpYnV0ZU5hbWUsbD1yLmF0dHJpYnV0ZU5hbWVzcGFjZTtsP2Uuc2V0QXR0cmlidXRlTlMobCxzLCIiK24pOnIuaGFzQm9vbGVhblZhbHVlfHxyLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJm49PT0hMD9lLnNldEF0dHJpYnV0ZShzLCIiKTplLnNldEF0dHJpYnV0ZShzLCIiK24pfX19ZWxzZSBpZihpLmlzQ3VzdG9tQXR0cmlidXRlKHQpKXJldHVybiB2b2lkIGMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZSx0LG4pfSxzZXRWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7cih0KSYmKG51bGw9PW4/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6ZS5zZXRBdHRyaWJ1dGUodCwiIituKSl9LGRlbGV0ZVZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYobil7dmFyIHI9bi5tdXRhdGlvbk1ldGhvZDtpZihyKXIoZSx2b2lkIDApO2Vsc2UgaWYobi5tdXN0VXNlUHJvcGVydHkpe3ZhciBvPW4ucHJvcGVydHlOYW1lO24uaGFzQm9vbGVhblZhbHVlP2Vbb109ITE6bi5oYXNTaWRlRWZmZWN0cyYmIiIrZVtvXT09IiJ8fChlW29dPSIiKX1lbHNlIGUucmVtb3ZlQXR0cmlidXRlKG4uYXR0cmlidXRlTmFtZSl9ZWxzZSBpLmlzQ3VzdG9tQXR0cmlidXRlKHQpJiZlLnJlbW92ZUF0dHJpYnV0ZSh0KX19O3QuZXhwb3J0cz1jfSx7MTA6MTAsMTMyOjEzMiwxNjQ6MTY0LDQwOjQwLDQ4OjQ4LDcwOjcwfV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5zdWJzdHJpbmcoMSxlLmluZGV4T2YoIiAiKSl9dmFyIG89ZSg4KSxpPWUoMTQwKSxhPWUoMTQ1KSx1PWUoMTQ2KSxzPWUoMTUwKSxsPWUoMTU0KSxjPS9eKDxbXiBcLz5dKykvLHA9ImRhdGEtZGFuZ2VyLWluZGV4IixkPXtkYW5nZXJvdXNseVJlbmRlck1hcmt1cDpmdW5jdGlvbihlKXtpLmNhblVzZURPTT92b2lkIDA6bCghMSk7Zm9yKHZhciB0LG49e30sbz0wO288ZS5sZW5ndGg7bysrKWVbb10/dm9pZCAwOmwoITEpLHQ9cihlW29dKSx0PXModCk/dDoiKiIsblt0XT1uW3RdfHxbXSxuW3RdW29dPWVbb107dmFyIGQ9W10sZj0wO2Zvcih0IGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGgsdj1uW3RdO2ZvcihoIGluIHYpaWYodi5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIG09dltoXTt2W2hdPW0ucmVwbGFjZShjLCIkMSAiK3ArJz0iJytoKyciICcpfWZvcih2YXIgZz1hKHYuam9pbigiIiksdSkseT0wO3k8Zy5sZW5ndGg7Kyt5KXt2YXIgQz1nW3ldO0MuaGFzQXR0cmlidXRlJiZDLmhhc0F0dHJpYnV0ZShwKSYmKGg9K0MuZ2V0QXR0cmlidXRlKHApLEMucmVtb3ZlQXR0cmlidXRlKHApLGQuaGFzT3duUHJvcGVydHkoaCk/bCghMSk6dm9pZCAwLGRbaF09QyxmKz0xKX19cmV0dXJuIGYhPT1kLmxlbmd0aD9sKCExKTp2b2lkIDAsZC5sZW5ndGghPT1lLmxlbmd0aD9sKCExKTp2b2lkIDAsZH0sZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0KXtpZihpLmNhblVzZURPTT92b2lkIDA6bCghMSksdD92b2lkIDA6bCghMSksIkhUTUwiPT09ZS5ub2RlTmFtZT9sKCExKTp2b2lkIDAsInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgbj1hKHQsdSlbMF07ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLGUpfWVsc2Ugby5yZXBsYWNlQ2hpbGRXaXRoVHJlZShlLHQpfX07dC5leHBvcnRzPWR9LHsxNDA6MTQwLDE0NToxNDUsMTQ2OjE0NiwxNTA6MTUwLDE1NDoxNTQsODo4fV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTgpLG89W3Ioe1Jlc3BvbmRlckV2ZW50UGx1Z2luOm51bGx9KSxyKHtTaW1wbGVFdmVudFBsdWdpbjpudWxsfSkscih7VGFwRXZlbnRQbHVnaW46bnVsbH0pLHIoe0VudGVyTGVhdmVFdmVudFBsdWdpbjpudWxsfSkscih7Q2hhbmdlRXZlbnRQbHVnaW46bnVsbH0pLHIoe1NlbGVjdEV2ZW50UGx1Z2luOm51bGx9KSxyKHtCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOm51bGx9KV07dC5leHBvcnRzPW99LHsxNTg6MTU4fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e29uQ2xpY2s6ITAsb25Eb3VibGVDbGljazohMCxvbk1vdXNlRG93bjohMCxvbk1vdXNlTW92ZTohMCxvbk1vdXNlVXA6ITAsb25DbGlja0NhcHR1cmU6ITAsb25Eb3VibGVDbGlja0NhcHR1cmU6ITAsb25Nb3VzZURvd25DYXB0dXJlOiEwLG9uTW91c2VNb3ZlQ2FwdHVyZTohMCxvbk1vdXNlVXBDYXB0dXJlOiEwfSxvPXtnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe2lmKCF0LmRpc2FibGVkKXJldHVybiB0O3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KSFyW29dJiZ0Lmhhc093blByb3BlcnR5KG8pJiYobltvXT10W29dKTtyZXR1cm4gbn19O3QuZXhwb3J0cz1vfSx7fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNiksbz1lKDIwKSxpPWUoNDApLGE9ZSgxMDMpLHU9ZSgxNTgpLHM9ci50b3BMZXZlbFR5cGVzLGw9e21vdXNlRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6dSh7b25Nb3VzZUVudGVyOm51bGx9KSxkZXBlbmRlbmNpZXM6W3MudG9wTW91c2VPdXQscy50b3BNb3VzZU92ZXJdfSxtb3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOnUoe29uTW91c2VMZWF2ZTpudWxsfSksZGVwZW5kZW5jaWVzOltzLnRvcE1vdXNlT3V0LHMudG9wTW91c2VPdmVyXX19LGM9e2V2ZW50VHlwZXM6bCxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1zLnRvcE1vdXNlT3ZlciYmKG4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkpcmV0dXJuIG51bGw7aWYoZSE9PXMudG9wTW91c2VPdXQmJmUhPT1zLnRvcE1vdXNlT3ZlcilyZXR1cm4gbnVsbDt2YXIgdTtpZihyLndpbmRvdz09PXIpdT1yO2Vsc2V7dmFyIGM9ci5vd25lckRvY3VtZW50O3U9Yz9jLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvdzp3aW5kb3d9dmFyIHAsZDtpZihlPT09cy50b3BNb3VzZU91dCl7cD10O3ZhciBmPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQ7ZD1mP2kuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoZik6bnVsbH1lbHNlIHA9bnVsbCxkPXQ7aWYocD09PWQpcmV0dXJuIG51bGw7dmFyIGg9bnVsbD09cD91OmkuZ2V0Tm9kZUZyb21JbnN0YW5jZShwKSx2PW51bGw9PWQ/dTppLmdldE5vZGVGcm9tSW5zdGFuY2UoZCksbT1hLmdldFBvb2xlZChsLm1vdXNlTGVhdmUscCxuLHIpO20udHlwZT0ibW91c2VsZWF2ZSIsbS50YXJnZXQ9aCxtLnJlbGF0ZWRUYXJnZXQ9djt2YXIgZz1hLmdldFBvb2xlZChsLm1vdXNlRW50ZXIsZCxuLHIpO3JldHVybiBnLnR5cGU9Im1vdXNlZW50ZXIiLGcudGFyZ2V0PXYsZy5yZWxhdGVkVGFyZ2V0PWgsby5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobSxnLHAsZCksW20sZ119fTt0LmV4cG9ydHM9Y30sezEwMzoxMDMsMTU4OjE1OCwxNjoxNiwyMDoyMCw0MDo0MH1dLDE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU3KSxvPXIoe2J1YmJsZWQ6bnVsbCxjYXB0dXJlZDpudWxsfSksaT1yKHt0b3BBYm9ydDpudWxsLHRvcEFuaW1hdGlvbkVuZDpudWxsLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpudWxsLHRvcEFuaW1hdGlvblN0YXJ0Om51bGwsdG9wQmx1cjpudWxsLHRvcENhblBsYXk6bnVsbCx0b3BDYW5QbGF5VGhyb3VnaDpudWxsLHRvcENoYW5nZTpudWxsLHRvcENsaWNrOm51bGwsdG9wQ29tcG9zaXRpb25FbmQ6bnVsbCx0b3BDb21wb3NpdGlvblN0YXJ0Om51bGwsdG9wQ29tcG9zaXRpb25VcGRhdGU6bnVsbCx0b3BDb250ZXh0TWVudTpudWxsLHRvcENvcHk6bnVsbCx0b3BDdXQ6bnVsbCx0b3BEb3VibGVDbGljazpudWxsLHRvcERyYWc6bnVsbCx0b3BEcmFnRW5kOm51bGwsdG9wRHJhZ0VudGVyOm51bGwsdG9wRHJhZ0V4aXQ6bnVsbCx0b3BEcmFnTGVhdmU6bnVsbCx0b3BEcmFnT3ZlcjpudWxsLHRvcERyYWdTdGFydDpudWxsLHRvcERyb3A6bnVsbCx0b3BEdXJhdGlvbkNoYW5nZTpudWxsLHRvcEVtcHRpZWQ6bnVsbCx0b3BFbmNyeXB0ZWQ6bnVsbCx0b3BFbmRlZDpudWxsLHRvcEVycm9yOm51bGwsdG9wRm9jdXM6bnVsbCx0b3BJbnB1dDpudWxsLHRvcEludmFsaWQ6bnVsbCx0b3BLZXlEb3duOm51bGwsdG9wS2V5UHJlc3M6bnVsbCx0b3BLZXlVcDpudWxsLHRvcExvYWQ6bnVsbCx0b3BMb2FkZWREYXRhOm51bGwsdG9wTG9hZGVkTWV0YWRhdGE6bnVsbCx0b3BMb2FkU3RhcnQ6bnVsbCx0b3BNb3VzZURvd246bnVsbCx0b3BNb3VzZU1vdmU6bnVsbCx0b3BNb3VzZU91dDpudWxsLHRvcE1vdXNlT3ZlcjpudWxsLHRvcE1vdXNlVXA6bnVsbCx0b3BQYXN0ZTpudWxsLHRvcFBhdXNlOm51bGwsdG9wUGxheTpudWxsLHRvcFBsYXlpbmc6bnVsbCx0b3BQcm9ncmVzczpudWxsLHRvcFJhdGVDaGFuZ2U6bnVsbCx0b3BSZXNldDpudWxsLHRvcFNjcm9sbDpudWxsLHRvcFNlZWtlZDpudWxsLHRvcFNlZWtpbmc6bnVsbCx0b3BTZWxlY3Rpb25DaGFuZ2U6bnVsbCx0b3BTdGFsbGVkOm51bGwsdG9wU3VibWl0Om51bGwsdG9wU3VzcGVuZDpudWxsLHRvcFRleHRJbnB1dDpudWxsLHRvcFRpbWVVcGRhdGU6bnVsbCx0b3BUb3VjaENhbmNlbDpudWxsLHRvcFRvdWNoRW5kOm51bGwsdG9wVG91Y2hNb3ZlOm51bGwsdG9wVG91Y2hTdGFydDpudWxsLHRvcFRyYW5zaXRpb25FbmQ6bnVsbCx0b3BWb2x1bWVDaGFuZ2U6bnVsbCx0b3BXYWl0aW5nOm51bGwsdG9wV2hlZWw6bnVsbH0pLGE9e3RvcExldmVsVHlwZXM6aSxQcm9wYWdhdGlvblBoYXNlczpvfTt0LmV4cG9ydHM9YX0sezE1NzoxNTd9XSwxNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE4KSxvPWUoMTkpLGk9ZSg2MyksYT1lKDExMCksdT1lKDExOCkscz1lKDE1NCksbD17fSxjPW51bGwscD1mdW5jdGlvbihlLHQpe2UmJihvLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihlLHQpLGUuaXNQZXJzaXN0ZW50KCl8fGUuY29uc3RydWN0b3IucmVsZWFzZShlKSl9LGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSwhMCl9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSwhMSl9LGg9e2luamVjdGlvbjp7aW5qZWN0RXZlbnRQbHVnaW5PcmRlcjpyLmluamVjdEV2ZW50UGx1Z2luT3JkZXIsaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOnIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfSxwdXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIiE9dHlwZW9mIG4/cyghMSk6dm9pZCAwO3ZhciBvPWxbdF18fChsW3RdPXt9KTtvW2UuX3Jvb3ROb2RlSURdPW47dmFyIGk9ci5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtpJiZpLmRpZFB1dExpc3RlbmVyJiZpLmRpZFB1dExpc3RlbmVyKGUsdCxuKX0sZ2V0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1sW3RdO3JldHVybiBuJiZuW2UuX3Jvb3ROb2RlSURdfSxkZWxldGVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXIucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdF07biYmbi53aWxsRGVsZXRlTGlzdGVuZXImJm4ud2lsbERlbGV0ZUxpc3RlbmVyKGUsdCk7dmFyIG89bFt0XTtvJiZkZWxldGUgb1tlLl9yb290Tm9kZUlEXX0sZGVsZXRlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBsKWlmKGxbdF1bZS5fcm9vdE5vZGVJRF0pe3ZhciBuPXIucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdF07biYmbi53aWxsRGVsZXRlTGlzdGVuZXImJm4ud2lsbERlbGV0ZUxpc3RlbmVyKGUsdCksZGVsZXRlIGxbdF1bZS5fcm9vdE5vZGVJRF19fSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLG8pe2Zvcih2YXIgaSx1PXIucGx1Z2lucyxzPTA7czx1Lmxlbmd0aDtzKyspe3ZhciBsPXVbc107aWYobCl7dmFyIGM9bC5leHRyYWN0RXZlbnRzKGUsdCxuLG8pO2MmJihpPWEoaSxjKSl9fXJldHVybiBpfSxlbnF1ZXVlRXZlbnRzOmZ1bmN0aW9uKGUpe2UmJihjPWEoYyxlKSl9LHByb2Nlc3NFdmVudFF1ZXVlOmZ1bmN0aW9uKGUpe3ZhciB0PWM7Yz1udWxsLGU/dSh0LGQpOnUodCxmKSxjP3MoITEpOnZvaWQgMCxpLnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1cmdlOmZ1bmN0aW9uKCl7bD17fX0sX19nZXRMaXN0ZW5lckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4gbH19O3QuZXhwb3J0cz1ofSx7MTEwOjExMCwxMTg6MTE4LDE1NDoxNTQsMTg6MTgsMTk6MTksNjM6NjN9XSwxODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYodSlmb3IodmFyIGUgaW4gcyl7dmFyIHQ9c1tlXSxuPXUuaW5kZXhPZihlKTtpZihuPi0xP3ZvaWQgMDphKCExKSwhbC5wbHVnaW5zW25dKXt0LmV4dHJhY3RFdmVudHM/dm9pZCAwOmEoITEpLGwucGx1Z2luc1tuXT10O3ZhciByPXQuZXZlbnRUeXBlcztmb3IodmFyIGkgaW4gcilvKHJbaV0sdCxpKT92b2lkIDA6YSghMSl9fX1mdW5jdGlvbiBvKGUsdCxuKXtsLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShuKT9hKCExKTp2b2lkIDAsbC5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3Nbbl09ZTt2YXIgcj1lLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO2lmKHIpe2Zvcih2YXIgbyBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkobykpe3ZhciB1PXJbb107aSh1LHQsbil9cmV0dXJuITB9cmV0dXJuIGUucmVnaXN0cmF0aW9uTmFtZT8oaShlLnJlZ2lzdHJhdGlvbk5hbWUsdCxuKSwhMCk6ITF9ZnVuY3Rpb24gaShlLHQsbil7bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXT9hKCExKTp2b2lkIDAsbC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXT10LGwucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXT10LmV2ZW50VHlwZXNbbl0uZGVwZW5kZW5jaWVzfXZhciBhPWUoMTU0KSx1PW51bGwscz17fSxsPXtwbHVnaW5zOltdLGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczp7fSxyZWdpc3RyYXRpb25OYW1lTW9kdWxlczp7fSxyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOnt9LHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6bnVsbCxpbmplY3RFdmVudFBsdWdpbk9yZGVyOmZ1bmN0aW9uKGUpe3U/YSghMSk6dm9pZCAwLHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkscigpfSxpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIG89ZVtuXTtzLmhhc093blByb3BlcnR5KG4pJiZzW25dPT09b3x8KHNbbl0/YSghMSk6dm9pZCAwLHNbbl09byx0PSEwKX10JiZyKCl9LGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlzcGF0Y2hDb25maWc7aWYodC5yZWdpc3RyYXRpb25OYW1lKXJldHVybiBsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3QucmVnaXN0cmF0aW9uTmFtZV18fG51bGw7Zm9yKHZhciBuIGluIHQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpaWYodC5waGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0LnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW25dXTtpZihyKXJldHVybiByfXJldHVybiBudWxsfSxfcmVzZXRFdmVudFBsdWdpbnM6ZnVuY3Rpb24oKXt1PW51bGw7Zm9yKHZhciBlIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShlKSYmZGVsZXRlIHNbZV07bC5wbHVnaW5zLmxlbmd0aD0wO3ZhciB0PWwuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSB0W25dO3ZhciByPWwucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7Zm9yKHZhciBvIGluIHIpci5oYXNPd25Qcm9wZXJ0eShvKSYmZGVsZXRlIHJbb119fTt0LmV4cG9ydHM9bH0sezE1NDoxNTR9XSwxOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlPT09eS50b3BNb3VzZVVwfHxlPT09eS50b3BUb3VjaEVuZHx8ZT09PXkudG9wVG91Y2hDYW5jZWx9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT09PXkudG9wTW91c2VNb3ZlfHxlPT09eS50b3BUb3VjaE1vdmV9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZT09PXkudG9wTW91c2VEb3dufHxlPT09eS50b3BUb3VjaFN0YXJ0fWZ1bmN0aW9uIGEoZSx0LG4scil7dmFyIG89ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PUMuZ2V0Tm9kZUZyb21JbnN0YW5jZShyKSx0P3YuaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoKG8sbixlKTp2Lmludm9rZUd1YXJkZWRDYWxsYmFjayhvLG4sZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPWUuX2Rpc3BhdGNoTGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO28rKylhKGUsdCxuW29dLHJbb10pO2Vsc2UgbiYmYShlLHQsbixyKTtlLl9kaXNwYXRjaExpc3RlbmVycz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLl9kaXNwYXRjaExpc3RlbmVycyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKWlmKHRbcl0oZSxuW3JdKSlyZXR1cm4gbltyXX1lbHNlIGlmKHQmJnQoZSxuKSlyZXR1cm4gbjtyZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGUpe3ZhciB0PXMoZSk7cmV0dXJuIGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCx0fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztBcnJheS5pc0FycmF5KHQpP20oITEpOnZvaWQgMCxlLmN1cnJlbnRUYXJnZXQ9dD9DLmdldE5vZGVGcm9tSW5zdGFuY2Uobik6bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0PW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLHJ9ZnVuY3Rpb24gcChlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBkLGYsaD1lKDE2KSx2PWUoNjMpLG09ZSgxNTQpLGc9KGUoMTY0KSx7aW5qZWN0Q29tcG9uZW50VHJlZTpmdW5jdGlvbihlKXtkPWV9LGluamVjdFRyZWVUcmF2ZXJzYWw6ZnVuY3Rpb24oZSl7Zj1lfX0pLHk9aC50b3BMZXZlbFR5cGVzLEM9e2lzRW5kaXNoOnIsaXNNb3ZlaXNoOm8saXNTdGFydGlzaDppLGV4ZWN1dGVEaXJlY3REaXNwYXRjaDpjLGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjp1LGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6bCxoYXNEaXNwYXRjaGVzOnAsZ2V0SW5zdGFuY2VGcm9tTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZC5nZXRJbnN0YW5jZUZyb21Ob2RlKGUpfSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldE5vZGVGcm9tSW5zdGFuY2UoZSl9LGlzQW5jZXN0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5pc0FuY2VzdG9yKGUsdCl9LGdldExvd2VzdENvbW1vbkFuY2VzdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZSx0KX0sZ2V0UGFyZW50SW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGYuZ2V0UGFyZW50SW5zdGFuY2UoZSl9LHRyYXZlcnNlVHdvUGhhc2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLnRyYXZlcnNlVHdvUGhhc2UoZSx0LG4pfSx0cmF2ZXJzZUVudGVyTGVhdmU6ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gZi50cmF2ZXJzZUVudGVyTGVhdmUoZSx0LG4scixvKX0saW5qZWN0aW9uOmd9O3QuZXhwb3J0cz1DfSx7MTU0OjE1NCwxNjoxNiwxNjQ6MTY0LDYzOjYzfV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9dC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1tuXTtyZXR1cm4gQyhlLHIpfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPXQ/eS5idWJibGVkOnkuY2FwdHVyZWQsaT1yKGUsbixvKTtpJiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9bShuLl9kaXNwYXRjaExpc3RlbmVycyxpKSxuLl9kaXNwYXRjaEluc3RhbmNlcz1tKG4uX2Rpc3BhdGNoSW5zdGFuY2VzLGUpKX1mdW5jdGlvbiBpKGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMmJnYudHJhdmVyc2VUd29QaGFzZShlLl90YXJnZXRJbnN0LG8sZSl9ZnVuY3Rpb24gYShlKXtpZihlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdD1lLl90YXJnZXRJbnN0LG49dD92LmdldFBhcmVudEluc3RhbmNlKHQpOm51bGw7di50cmF2ZXJzZVR3b1BoYXNlKG4sbyxlKX19ZnVuY3Rpb24gdShlLHQsbil7aWYobiYmbi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKXt2YXIgcj1uLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsbz1DKGUscik7byYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPW0obi5fZGlzcGF0Y2hMaXN0ZW5lcnMsbyksbi5fZGlzcGF0Y2hJbnN0YW5jZXM9bShuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9fWZ1bmN0aW9uIHMoZSl7ZSYmZS5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiZ1KGUuX3RhcmdldEluc3QsbnVsbCxlKX1mdW5jdGlvbiBsKGUpe2coZSxpKX1mdW5jdGlvbiBjKGUpe2coZSxhKX1mdW5jdGlvbiBwKGUsdCxuLHIpe3YudHJhdmVyc2VFbnRlckxlYXZlKG4scix1LGUsdCl9ZnVuY3Rpb24gZChlKXtnKGUscyl9dmFyIGY9ZSgxNiksaD1lKDE3KSx2PWUoMTkpLG09ZSgxMTApLGc9ZSgxMTgpLHk9KGUoMTY0KSxmLlByb3BhZ2F0aW9uUGhhc2VzKSxDPWguZ2V0TGlzdGVuZXIsYj17YWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlczpsLGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OmMsYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6ZCxhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6cH07dC5leHBvcnRzPWJ9LHsxMTA6MTEwLDExODoxMTgsMTY6MTYsMTY0OjE2NCwxNzoxNywxOToxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKSx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH12YXIgbz1lKDE2NSksaT1lKDI1KSxhPWUoMTI2KTtvKHIucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxsLHRoaXMuX3N0YXJ0VGV4dD1udWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuInZhbHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlzLl9yb290W2EoKV19LGdldERhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5ndGgsbz10aGlzLmdldFRleHQoKSxpPW8ubGVuZ3RoO2ZvcihlPTA7cj5lJiZuW2VdPT09b1tlXTtlKyspO3ZhciBhPXItZTtmb3IodD0xO2E+PXQmJm5bci10XT09PW9baS10XTt0KyspO3ZhciB1PXQ+MT8xLXQ6dm9pZCAwO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHUpLHRoaXMuX2ZhbGxiYWNrVGV4dH19KSxpLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEyNjoxMjYsMTY1OjE2NSwyNToyNX1dLDIyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTApLG89ci5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFksaT1yLmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSxhPXIuaW5qZWN0aW9uLkhBU19TSURFX0VGRkVDVFMsdT1yLmluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSxzPXIuaW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLGw9ci5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSxjPXtpc0N1c3RvbUF0dHJpYnV0ZTpSZWdFeHAucHJvdG90eXBlLnRlc3QuYmluZChuZXcgUmVnRXhwKCJeKGRhdGF8YXJpYSktWyIrci5BVFRSSUJVVEVfTkFNRV9DSEFSKyJdKiQiKSksUHJvcGVydGllczp7YWNjZXB0OjAsYWNjZXB0Q2hhcnNldDowLGFjY2Vzc0tleTowLGFjdGlvbjowLGFsbG93RnVsbFNjcmVlbjppLGFsbG93VHJhbnNwYXJlbmN5OjAsYWx0OjAsYXN5bmM6aSxhdXRvQ29tcGxldGU6MCxhdXRvUGxheTppLGNhcHR1cmU6aSxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjAsY2hhclNldDowLGNoYWxsZW5nZTowLGNoZWNrZWQ6b3xpLGNpdGU6MCxjbGFzc0lEOjAsY2xhc3NOYW1lOjAsY29sczpzLGNvbFNwYW46MCxjb250ZW50OjAsY29udGVudEVkaXRhYmxlOjAsY29udGV4dE1lbnU6MCxjb250cm9sczppLGNvb3JkczowLGNyb3NzT3JpZ2luOjAsZGF0YTowLGRhdGVUaW1lOjAsImRlZmF1bHQiOmksZGVmZXI6aSxkaXI6MCxkaXNhYmxlZDppLGRvd25sb2FkOmwsZHJhZ2dhYmxlOjAsZW5jVHlwZTowLGZvcm06MCxmb3JtQWN0aW9uOjAsZm9ybUVuY1R5cGU6MCxmb3JtTWV0aG9kOjAsZm9ybU5vVmFsaWRhdGU6aSxmb3JtVGFyZ2V0OjAsZnJhbWVCb3JkZXI6MCxoZWFkZXJzOjAsaGVpZ2h0OjAsaGlkZGVuOmksaGlnaDowLGhyZWY6MCxocmVmTGFuZzowLGh0bWxGb3I6MCxodHRwRXF1aXY6MCxpY29uOjAsaWQ6MCxpbnB1dE1vZGU6MCxpbnRlZ3JpdHk6MCxpczowLGtleVBhcmFtczowLGtleVR5cGU6MCxraW5kOjAsbGFiZWw6MCxsYW5nOjAsbGlzdDowLGxvb3A6aSxsb3c6MCxtYW5pZmVzdDowLG1hcmdpbkhlaWdodDowLG1hcmdpbldpZHRoOjAsbWF4OjAsbWF4TGVuZ3RoOjAsbWVkaWE6MCxtZWRpYUdyb3VwOjAsbWV0aG9kOjAsbWluOjAsbWluTGVuZ3RoOjAsbXVsdGlwbGU6b3xpLG11dGVkOm98aSxuYW1lOjAsbm9uY2U6MCxub1ZhbGlkYXRlOmksb3BlbjppLG9wdGltdW06MCxwYXR0ZXJuOjAscGxhY2Vob2xkZXI6MCxwb3N0ZXI6MCxwcmVsb2FkOjAscHJvZmlsZTowLHJhZGlvR3JvdXA6MCxyZWFkT25seTppLHJlbDowLHJlcXVpcmVkOmkscmV2ZXJzZWQ6aSxyb2xlOjAscm93czpzLHJvd1NwYW46dSxzYW5kYm94OjAsc2NvcGU6MCxzY29wZWQ6aSxzY3JvbGxpbmc6MCxzZWFtbGVzczppLHNlbGVjdGVkOm98aSxzaGFwZTowLHNpemU6cyxzaXplczowLHNwYW46cyxzcGVsbENoZWNrOjAsc3JjOjAsc3JjRG9jOjAsc3JjTGFuZzowLHNyY1NldDowLHN0YXJ0OnUsc3RlcDowLHN0eWxlOjAsc3VtbWFyeTowLHRhYkluZGV4OjAsdGFyZ2V0OjAsdGl0bGU6MCx0eXBlOjAsdXNlTWFwOjAsdmFsdWU6b3xhLHdpZHRoOjAsd21vZGU6MCx3cmFwOjAsYWJvdXQ6MCxkYXRhdHlwZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAscmVzb3VyY2U6MCwidHlwZW9mIjowLHZvY2FiOjAsYXV0b0NhcGl0YWxpemU6MCxhdXRvQ29ycmVjdDowLGF1dG9TYXZlOjAsY29sb3I6MCxpdGVtUHJvcDowLGl0ZW1TY29wZTppLGl0ZW1UeXBlOjAsaXRlbUlEOjAsaXRlbVJlZjowLHJlc3VsdHM6MCxzZWN1cml0eTowLHVuc2VsZWN0YWJsZTowfSxET01BdHRyaWJ1dGVOYW1lczp7YWNjZXB0Q2hhcnNldDoiYWNjZXB0LWNoYXJzZXQiLGNsYXNzTmFtZToiY2xhc3MiLGh0bWxGb3I6ImZvciIsaHR0cEVxdWl2OiJodHRwLWVxdWl2In0sRE9NUHJvcGVydHlOYW1lczp7fX07dC5leHBvcnRzPWN9LHsxMDoxMH1dLDIzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9L1s9Ol0vZyxuPXsiPSI6Ij0wIiwiOiI6Ij0yIn0scj0oIiIrZSkucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSk7cmV0dXJuIiQiK3J9ZnVuY3Rpb24gbyhlKXt2YXIgdD0vKD0wfD0yKS9nLG49eyI9MCI6Ij0iLCI9MiI6IjoifSxyPSIuIj09PWVbMF0mJiIkIj09PWVbMV0/ZS5zdWJzdHJpbmcoMik6ZS5zdWJzdHJpbmcoMSk7cmV0dXJuKCIiK3IpLnJlcGxhY2UodCxmdW5jdGlvbihlKXtyZXR1cm4gbltlXX0pfXZhciBpPXtlc2NhcGU6cix1bmVzY2FwZTpvfTt0LmV4cG9ydHM9aX0se31dLDI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7bnVsbCE9ZS5jaGVja2VkTGluayYmbnVsbCE9ZS52YWx1ZUxpbms/bCghMSk6dm9pZCAwfWZ1bmN0aW9uIG8oZSl7cihlKSxudWxsIT1lLnZhbHVlfHxudWxsIT1lLm9uQ2hhbmdlP2woITEpOnZvaWQgMH1mdW5jdGlvbiBpKGUpe3IoZSksbnVsbCE9ZS5jaGVja2VkfHxudWxsIT1lLm9uQ2hhbmdlP2woITEpOnZvaWQgMH1mdW5jdGlvbiBhKGUpe2lmKGUpe3ZhciB0PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIit0KyJgLiJ9cmV0dXJuIiJ9dmFyIHU9ZSg4MSkscz1lKDgwKSxsPWUoMTU0KSxjPShlKDE2NCkse2J1dHRvbjohMCxjaGVja2JveDohMCxpbWFnZTohMCxoaWRkZW46ITAscmFkaW86ITAscmVzZXQ6ITAsc3VibWl0OiEwfSkscD17dmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiFlW3RdfHxjW2UudHlwZV18fGUub25DaGFuZ2V8fGUucmVhZE9ubHl8fGUuZGlzYWJsZWQ/bnVsbDpuZXcgRXJyb3IoIllvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LGNoZWNrZWQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiFlW3RdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5fHxlLmRpc2FibGVkP251bGw6bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4iKX0sb25DaGFuZ2U6dS5mdW5jfSxkPXt9LGY9e2NoZWNrUHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShyKSl2YXIgbz1wW3JdKHQscixlLHMucHJvcCk7byBpbnN0YW5jZW9mIEVycm9yJiYhKG8ubWVzc2FnZSBpbiBkKSYmKGRbby5tZXNzYWdlXT0hMCxhKG4pKX19LGdldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay52YWx1ZSk6ZS52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVPbkNoYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5vbkNoYW5nZS5jYWxsKHZvaWQgMCx0KTp2b2lkIDB9fTt0LmV4cG9ydHM9Zn0sezE1NDoxNTQsMTY0OjE2NCw4MDo4MCw4MTo4MX1dLDI1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodC5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbj10Lmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gdC5jYWxsKG4sZSksbn1yZXR1cm4gbmV3IHQoZSl9LGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKG4uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIHI9bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChyLGUsdCkscn1yZXR1cm4gbmV3IG4oZSx0KX0sYT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihyLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBvPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiByLmNhbGwobyxlLHQsbiksb31yZXR1cm4gbmV3IHIoZSx0LG4pfSx1PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXM7aWYoby5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaT1vLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gby5jYWxsKGksZSx0LG4sciksaX1yZXR1cm4gbmV3IG8oZSx0LG4scil9LHM9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT10aGlzO2lmKGkuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIGE9aS5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIGkuY2FsbChhLGUsdCxuLHIsbyksYX1yZXR1cm4gbmV3IGkoZSx0LG4scixvKX0sbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2UgaW5zdGFuY2VvZiB0P3ZvaWQgMDpyKCExKSxlLmRlc3RydWN0b3IoKSx0Lmluc3RhbmNlUG9vbC5sZW5ndGg8dC5wb29sU2l6ZSYmdC5pbnN0YW5jZVBvb2wucHVzaChlKX0sYz0xMCxwPW8sZD1mdW5jdGlvbihlLHQpe3ZhciBuPWU7cmV0dXJuIG4uaW5zdGFuY2VQb29sPVtdLG4uZ2V0UG9vbGVkPXR8fHAsbi5wb29sU2l6ZXx8KG4ucG9vbFNpemU9Yyksbi5yZWxlYXNlPWwsbn0sZj17YWRkUG9vbGluZ1RvOmQsb25lQXJndW1lbnRQb29sZXI6byx0d29Bcmd1bWVudFBvb2xlcjppLHRocmVlQXJndW1lbnRQb29sZXI6YSxmb3VyQXJndW1lbnRQb29sZXI6dSxmaXZlQXJndW1lbnRQb29sZXI6c307dC5leHBvcnRzPWZ9LHsxNTQ6MTU0fV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgyOSksaT1lKDMxKSxhPWUoMzApLHU9ZSg0NCkscz1lKDYwKSxsPShlKDYxKSxlKDgxKSksYz1lKDkxKSxwPWUoMTMxKSxkPShlKDE2NCkscy5jcmVhdGVFbGVtZW50KSxmPXMuY3JlYXRlRmFjdG9yeSxoPXMuY2xvbmVFbGVtZW50LHY9cixtPXsKQ2hpbGRyZW46e21hcDpvLm1hcCxmb3JFYWNoOm8uZm9yRWFjaCxjb3VudDpvLmNvdW50LHRvQXJyYXk6by50b0FycmF5LG9ubHk6cH0sQ29tcG9uZW50OmksY3JlYXRlRWxlbWVudDpkLGNsb25lRWxlbWVudDpoLGlzVmFsaWRFbGVtZW50OnMuaXNWYWxpZEVsZW1lbnQsUHJvcFR5cGVzOmwsY3JlYXRlQ2xhc3M6YS5jcmVhdGVDbGFzcyxjcmVhdGVGYWN0b3J5OmYsY3JlYXRlTWl4aW46ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LERPTTp1LHZlcnNpb246YyxfX3NwcmVhZDp2fTt0LmV4cG9ydHM9bX0sezEzMToxMzEsMTY0OjE2NCwxNjU6MTY1LDI5OjI5LDMwOjMwLDMxOjMxLDQ0OjQ0LDYwOjYwLDYxOjYxLDgxOjgxLDkxOjkxfV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbSl8fChlW21dPWgrKyxkW2VbbV1dPXt9KSxkW2VbbV1dfXZhciBvLGk9ZSgxNjUpLGE9ZSgxNiksdT1lKDE4KSxzPWUoNjQpLGw9ZSgxMDkpLGM9ZSgxMjcpLHA9ZSgxMjkpLGQ9e30sZj0hMSxoPTAsdj17dG9wQWJvcnQ6ImFib3J0Iix0b3BBbmltYXRpb25FbmQ6YygiYW5pbWF0aW9uZW5kIil8fCJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpjKCJhbmltYXRpb25pdGVyYXRpb24iKXx8ImFuaW1hdGlvbml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9uU3RhcnQ6YygiYW5pbWF0aW9uc3RhcnQiKXx8ImFuaW1hdGlvbnN0YXJ0Iix0b3BCbHVyOiJibHVyIix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcENoYW5nZToiY2hhbmdlIix0b3BDbGljazoiY2xpY2siLHRvcENvbXBvc2l0aW9uRW5kOiJjb21wb3NpdGlvbmVuZCIsdG9wQ29tcG9zaXRpb25TdGFydDoiY29tcG9zaXRpb25zdGFydCIsdG9wQ29tcG9zaXRpb25VcGRhdGU6ImNvbXBvc2l0aW9udXBkYXRlIix0b3BDb250ZXh0TWVudToiY29udGV4dG1lbnUiLHRvcENvcHk6ImNvcHkiLHRvcEN1dDoiY3V0Iix0b3BEb3VibGVDbGljazoiZGJsY2xpY2siLHRvcERyYWc6ImRyYWciLHRvcERyYWdFbmQ6ImRyYWdlbmQiLHRvcERyYWdFbnRlcjoiZHJhZ2VudGVyIix0b3BEcmFnRXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZlIix0b3BEcmFnT3ZlcjoiZHJhZ292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9wOiJkcm9wIix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQiLHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJvciIsdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92ZXIiLHRvcE1vdXNlVXA6Im1vdXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNlIix0b3BQbGF5OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoicHJvZ3Jlc3MiLHRvcFJhdGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNjcm9sbDoic2Nyb2xsIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU2VsZWN0aW9uQ2hhbmdlOiJzZWxlY3Rpb25jaGFuZ2UiLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRleHRJbnB1dDoidGV4dElucHV0Iix0b3BUaW1lVXBkYXRlOiJ0aW1ldXBkYXRlIix0b3BUb3VjaENhbmNlbDoidG91Y2hjYW5jZWwiLHRvcFRvdWNoRW5kOiJ0b3VjaGVuZCIsdG9wVG91Y2hNb3ZlOiJ0b3VjaG1vdmUiLHRvcFRvdWNoU3RhcnQ6InRvdWNoc3RhcnQiLHRvcFRyYW5zaXRpb25FbmQ6YygidHJhbnNpdGlvbmVuZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9LG09Il9yZWFjdExpc3RlbmVyc0lEIitTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMiksZz1pKHt9LHMse1JlYWN0RXZlbnRMaXN0ZW5lcjpudWxsLGluamVjdGlvbjp7aW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUpe2Uuc2V0SGFuZGxlVG9wTGV2ZWwoZy5oYW5kbGVUb3BMZXZlbCksZy5SZWFjdEV2ZW50TGlzdGVuZXI9ZX19LHNldEVuYWJsZWQ6ZnVuY3Rpb24oZSl7Zy5SZWFjdEV2ZW50TGlzdGVuZXImJmcuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZSl9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEoIWcuUmVhY3RFdmVudExpc3RlbmVyfHwhZy5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpfSxsaXN0ZW5UbzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10LG89cihuKSxpPXUucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXSxzPWEudG9wTGV2ZWxUeXBlcyxsPTA7bDxpLmxlbmd0aDtsKyspe3ZhciBjPWlbbF07by5oYXNPd25Qcm9wZXJ0eShjKSYmb1tjXXx8KGM9PT1zLnRvcFdoZWVsP3AoIndoZWVsIik/Zy5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChzLnRvcFdoZWVsLCJ3aGVlbCIsbik6cCgibW91c2V3aGVlbCIpP2cuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BXaGVlbCwibW91c2V3aGVlbCIsbik6Zy5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChzLnRvcFdoZWVsLCJET01Nb3VzZVNjcm9sbCIsbik6Yz09PXMudG9wU2Nyb2xsP3AoInNjcm9sbCIsITApP2cuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHMudG9wU2Nyb2xsLCJzY3JvbGwiLG4pOmcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BTY3JvbGwsInNjcm9sbCIsZy5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk6Yz09PXMudG9wRm9jdXN8fGM9PT1zLnRvcEJsdXI/KHAoImZvY3VzIiwhMCk/KGcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHMudG9wRm9jdXMsImZvY3VzIixuKSxnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChzLnRvcEJsdXIsImJsdXIiLG4pKTpwKCJmb2N1c2luIikmJihnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHMudG9wRm9jdXMsImZvY3VzaW4iLG4pLGcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BCbHVyLCJmb2N1c291dCIsbikpLG9bcy50b3BCbHVyXT0hMCxvW3MudG9wRm9jdXNdPSEwKTp2Lmhhc093blByb3BlcnR5KGMpJiZnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGMsdltjXSxuKSxvW2NdPSEwKX19LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGUsdCxuKX0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChlLHQsbil9LGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzpmdW5jdGlvbigpe2lmKHZvaWQgMD09PW8mJihvPWRvY3VtZW50LmNyZWF0ZUV2ZW50JiYicGFnZVgiaW4gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKSksIW8mJiFmKXt2YXIgZT1sLnJlZnJlc2hTY3JvbGxWYWx1ZXM7Zy5SZWFjdEV2ZW50TGlzdGVuZXIubW9uaXRvclNjcm9sbFZhbHVlKGUpLGY9ITB9fX0pO3QuZXhwb3J0cz1nfSx7MTA5OjEwOSwxMjc6MTI3LDEyOToxMjksMTY6MTYsMTY1OjE2NSwxODoxOCw2NDo2NH1dLDI4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPXZvaWQgMD09PWVbbl07bnVsbCE9dCYmciYmKGVbbl09aSh0KSl9dmFyIG89ZSg4MyksaT1lKDEyOCksYT0oZSgyMyksZSgxMzYpKSx1PWUoMTM3KSxzPShlKDE2NCkse2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7dmFyIG89e307cmV0dXJuIHUoZSxyLG8pLG99LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIsdSl7aWYodHx8ZSl7dmFyIHMsbDtmb3IocyBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocykpe2w9ZSYmZVtzXTt2YXIgYz1sJiZsLl9jdXJyZW50RWxlbWVudCxwPXRbc107aWYobnVsbCE9bCYmYShjLHApKW8ucmVjZWl2ZUNvbXBvbmVudChsLHAscix1KSx0W3NdPWw7ZWxzZXtsJiYobltzXT1vLmdldE5hdGl2ZU5vZGUobCksby51bm1vdW50Q29tcG9uZW50KGwsITEpKTt2YXIgZD1pKHApO3Rbc109ZH19Zm9yKHMgaW4gZSkhZS5oYXNPd25Qcm9wZXJ0eShzKXx8dCYmdC5oYXNPd25Qcm9wZXJ0eShzKXx8KGw9ZVtzXSxuW3NdPW8uZ2V0TmF0aXZlTm9kZShsKSxvLnVubW91bnRDb21wb25lbnQobCwhMSkpfX0sdW5tb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9ZVtuXTtvLnVubW91bnRDb21wb25lbnQocix0KX19fSk7dC5leHBvcnRzPXN9LHsxMjg6MTI4LDEzNjoxMzYsMTM3OjEzNywxNjQ6MTY0LDIzOjIzLDgzOjgzfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShiLCIkJi8iKX1mdW5jdGlvbiBvKGUsdCl7dGhpcy5mdW5jPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGkoZSx0LG4pe3ZhciByPWUuZnVuYyxvPWUuY29udGV4dDtyLmNhbGwobyx0LGUuY291bnQrKyl9ZnVuY3Rpb24gYShlLHQsbil7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgcj1vLmdldFBvb2xlZCh0LG4pO2coZSxpLHIpLG8ucmVsZWFzZShyKX1mdW5jdGlvbiB1KGUsdCxuLHIpe3RoaXMucmVzdWx0PWUsdGhpcy5rZXlQcmVmaXg9dCx0aGlzLmZ1bmM9bix0aGlzLmNvbnRleHQ9cix0aGlzLmNvdW50PTB9ZnVuY3Rpb24gcyhlLHQsbil7dmFyIG89ZS5yZXN1bHQsaT1lLmtleVByZWZpeCxhPWUuZnVuYyx1PWUuY29udGV4dCxzPWEuY2FsbCh1LHQsZS5jb3VudCsrKTtBcnJheS5pc0FycmF5KHMpP2wocyxvLG4sbS50aGF0UmV0dXJuc0FyZ3VtZW50KTpudWxsIT1zJiYodi5pc1ZhbGlkRWxlbWVudChzKSYmKHM9di5jbG9uZUFuZFJlcGxhY2VLZXkocyxpKyghcy5rZXl8fHQmJnQua2V5PT09cy5rZXk/IiI6cihzLmtleSkrIi8iKStuKSksby5wdXNoKHMpKX1mdW5jdGlvbiBsKGUsdCxuLG8saSl7dmFyIGE9IiI7bnVsbCE9biYmKGE9cihuKSsiLyIpO3ZhciBsPXUuZ2V0UG9vbGVkKHQsYSxvLGkpO2coZSxzLGwpLHUucmVsZWFzZShsKX1mdW5jdGlvbiBjKGUsdCxuKXtpZihudWxsPT1lKXJldHVybiBlO3ZhciByPVtdO3JldHVybiBsKGUscixudWxsLHQsbikscn1mdW5jdGlvbiBwKGUsdCxuKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGcoZSxwLG51bGwpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9W107cmV0dXJuIGwoZSx0LG51bGwsbS50aGF0UmV0dXJuc0FyZ3VtZW50KSx0fXZhciBoPWUoMjUpLHY9ZSg2MCksbT1lKDE0NiksZz1lKDEzNykseT1oLnR3b0FyZ3VtZW50UG9vbGVyLEM9aC5mb3VyQXJndW1lbnRQb29sZXIsYj0vXC8rL2c7by5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1mdW5jdGlvbigpe3RoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0saC5hZGRQb29saW5nVG8obyx5KSx1LnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQ9bnVsbCx0aGlzLmtleVByZWZpeD1udWxsLHRoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0saC5hZGRQb29saW5nVG8odSxDKTt2YXIgXz17Zm9yRWFjaDphLG1hcDpjLG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWw6bCxjb3VudDpkLHRvQXJyYXk6Zn07dC5leHBvcnRzPV99LHsxMzc6MTM3LDE0NjoxNDYsMjU6MjUsNjA6NjB9XSwzMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49RS5oYXNPd25Qcm9wZXJ0eSh0KT9FW3RdOm51bGw7Ti5oYXNPd25Qcm9wZXJ0eSh0KSYmKG4hPT1iLk9WRVJSSURFX0JBU0U/bSghMSk6dm9pZCAwKSxlJiYobiE9PWIuREVGSU5FX01BTlkmJm4hPT1iLkRFRklORV9NQU5ZX01FUkdFRD9tKCExKTp2b2lkIDApfWZ1bmN0aW9uIG8oZSx0KXtpZih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdD9tKCExKTp2b2lkIDAsZi5pc1ZhbGlkRWxlbWVudCh0KT9tKCExKTp2b2lkIDA7dmFyIG49ZS5wcm90b3R5cGUsbz1uLl9fcmVhY3RBdXRvQmluZFBhaXJzO3QuaGFzT3duUHJvcGVydHkoQykmJngubWl4aW5zKGUsdC5taXhpbnMpO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkmJmkhPT1DKXt2YXIgYT10W2ldLGw9bi5oYXNPd25Qcm9wZXJ0eShpKTtpZihyKGwsaSkseC5oYXNPd25Qcm9wZXJ0eShpKSl4W2ldKGUsYSk7ZWxzZXt2YXIgYz1FLmhhc093blByb3BlcnR5KGkpLHA9ImZ1bmN0aW9uIj09dHlwZW9mIGEsZD1wJiYhYyYmIWwmJnQuYXV0b2JpbmQhPT0hMTtpZihkKW8ucHVzaChpLGEpLG5baV09YTtlbHNlIGlmKGwpe3ZhciBoPUVbaV07IWN8fGghPT1iLkRFRklORV9NQU5ZX01FUkdFRCYmaCE9PWIuREVGSU5FX01BTlk/bSghMSk6dm9pZCAwLGg9PT1iLkRFRklORV9NQU5ZX01FUkdFRD9uW2ldPXUobltpXSxhKTpoPT09Yi5ERUZJTkVfTUFOWSYmKG5baV09cyhuW2ldLGEpKX1lbHNlIG5baV09YX19fX1mdW5jdGlvbiBpKGUsdCl7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1uIGluIHg7bz9tKCExKTp2b2lkIDA7dmFyIGk9biBpbiBlO2k/bSghMSk6dm9pZCAwLGVbbl09cn19fWZ1bmN0aW9uIGEoZSx0KXtlJiZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJiJvYmplY3QiPT10eXBlb2YgdD92b2lkIDA6bSghMSk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHZvaWQgMCE9PWVbbl0/bSghMSk6dm9pZCAwLGVbbl09dFtuXSk7cmV0dXJuIGV9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYobnVsbD09bilyZXR1cm4gcjtpZihudWxsPT1yKXJldHVybiBuO3ZhciBvPXt9O3JldHVybiBhKG8sbiksYShvLHIpLG99fWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQuYmluZChlKTtyZXR1cm4gbn1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1lLl9fcmVhY3RBdXRvQmluZFBhaXJzLG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl0sbz10W24rMV07ZVtyXT1sKGUsbyl9fXZhciBwPWUoMTY1KSxkPWUoMzEpLGY9ZSg2MCksaD0oZSg4MCksZSg3OSksZSg3NykpLHY9ZSgxNDcpLG09ZSgxNTQpLGc9ZSgxNTcpLHk9ZSgxNTgpLEM9KGUoMTY0KSx5KHttaXhpbnM6bnVsbH0pKSxiPWcoe0RFRklORV9PTkNFOm51bGwsREVGSU5FX01BTlk6bnVsbCxPVkVSUklERV9CQVNFOm51bGwsREVGSU5FX01BTllfTUVSR0VEOm51bGx9KSxfPVtdLEU9e21peGluczpiLkRFRklORV9NQU5ZLHN0YXRpY3M6Yi5ERUZJTkVfTUFOWSxwcm9wVHlwZXM6Yi5ERUZJTkVfTUFOWSxjb250ZXh0VHlwZXM6Yi5ERUZJTkVfTUFOWSxjaGlsZENvbnRleHRUeXBlczpiLkRFRklORV9NQU5ZLGdldERlZmF1bHRQcm9wczpiLkRFRklORV9NQU5ZX01FUkdFRCxnZXRJbml0aWFsU3RhdGU6Yi5ERUZJTkVfTUFOWV9NRVJHRUQsZ2V0Q2hpbGRDb250ZXh0OmIuREVGSU5FX01BTllfTUVSR0VELHJlbmRlcjpiLkRFRklORV9PTkNFLGNvbXBvbmVudFdpbGxNb3VudDpiLkRFRklORV9NQU5ZLGNvbXBvbmVudERpZE1vdW50OmIuREVGSU5FX01BTlksY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczpiLkRFRklORV9NQU5ZLHNob3VsZENvbXBvbmVudFVwZGF0ZTpiLkRFRklORV9PTkNFLGNvbXBvbmVudFdpbGxVcGRhdGU6Yi5ERUZJTkVfTUFOWSxjb21wb25lbnREaWRVcGRhdGU6Yi5ERUZJTkVfTUFOWSxjb21wb25lbnRXaWxsVW5tb3VudDpiLkRFRklORV9NQU5ZLHVwZGF0ZUNvbXBvbmVudDpiLk9WRVJSSURFX0JBU0V9LHg9e2Rpc3BsYXlOYW1lOmZ1bmN0aW9uKGUsdCl7ZS5kaXNwbGF5TmFtZT10fSxtaXhpbnM6ZnVuY3Rpb24oZSx0KXtpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKW8oZSx0W25dKX0sY2hpbGRDb250ZXh0VHlwZXM6ZnVuY3Rpb24oZSx0KXtlLmNoaWxkQ29udGV4dFR5cGVzPXAoe30sZS5jaGlsZENvbnRleHRUeXBlcyx0KX0sY29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCl7ZS5jb250ZXh0VHlwZXM9cCh7fSxlLmNvbnRleHRUeXBlcyx0KX0sZ2V0RGVmYXVsdFByb3BzOmZ1bmN0aW9uKGUsdCl7ZS5nZXREZWZhdWx0UHJvcHM/ZS5nZXREZWZhdWx0UHJvcHM9dShlLmdldERlZmF1bHRQcm9wcyx0KTplLmdldERlZmF1bHRQcm9wcz10fSxwcm9wVHlwZXM6ZnVuY3Rpb24oZSx0KXtlLnByb3BUeXBlcz1wKHt9LGUucHJvcFR5cGVzLHQpfSxzdGF0aWNzOmZ1bmN0aW9uKGUsdCl7aShlLHQpfSxhdXRvYmluZDpmdW5jdGlvbigpe319LE49e3JlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKHRoaXMsZSksdCYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLHQsInJlcGxhY2VTdGF0ZSIpfSxpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91bnRlZCh0aGlzKX19LFQ9ZnVuY3Rpb24oKXt9O3AoVC5wcm90b3R5cGUsZC5wcm90b3R5cGUsTik7dmFyIFA9e2NyZWF0ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCYmYyh0aGlzKSx0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPXYsdGhpcy51cGRhdGVyPW58fGgsdGhpcy5zdGF0ZT1udWxsO3ZhciByPXRoaXMuZ2V0SW5pdGlhbFN0YXRlP3RoaXMuZ2V0SW5pdGlhbFN0YXRlKCk6bnVsbDsib2JqZWN0IiE9dHlwZW9mIHJ8fEFycmF5LmlzQXJyYXkocik/bSghMSk6dm9pZCAwLHRoaXMuc3RhdGU9cn07dC5wcm90b3R5cGU9bmV3IFQsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycz1bXSxfLmZvckVhY2goby5iaW5kKG51bGwsdCkpLG8odCxlKSx0LmdldERlZmF1bHRQcm9wcyYmKHQuZGVmYXVsdFByb3BzPXQuZ2V0RGVmYXVsdFByb3BzKCkpLHQucHJvdG90eXBlLnJlbmRlcj92b2lkIDA6bSghMSk7Zm9yKHZhciBuIGluIEUpdC5wcm90b3R5cGVbbl18fCh0LnByb3RvdHlwZVtuXT1udWxsKTtyZXR1cm4gdH0saW5qZWN0aW9uOntpbmplY3RNaXhpbjpmdW5jdGlvbihlKXtfLnB1c2goZSl9fX07dC5leHBvcnRzPVB9LHsxNDc6MTQ3LDE1NDoxNTQsMTU3OjE1NywxNTg6MTU4LDE2NDoxNjQsMTY1OjE2NSwzMTozMSw2MDo2MCw3Nzo3Nyw3OTo3OSw4MDo4MH1dLDMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9aSx0aGlzLnVwZGF0ZXI9bnx8b312YXIgbz1lKDc3KSxpPShlKDcwKSxlKDExMiksZSgxNDcpKSxhPWUoMTU0KTtlKDE2NCk7ci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpeyJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPWU/YSghMSk6dm9pZCAwLHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlKSx0JiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsdCwic2V0U3RhdGUiKX0sci5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKSxlJiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07dC5leHBvcnRzPXJ9LHsxMTI6MTEyLDE0NzoxNDcsMTU0OjE1NCwxNjQ6MTY0LDcwOjcwLDc3Ojc3fV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg3KSxvPWUoNDYpLGk9e3Byb2Nlc3NDaGlsZHJlblVwZGF0ZXM6by5kYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMscmVwbGFjZU5vZGVXaXRoTWFya3VwOnIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsdW5tb3VudElERnJvbUVudmlyb25tZW50OmZ1bmN0aW9uKGUpe319O3QuZXhwb3J0cz1pfSx7NDY6NDYsNzo3fV0sMzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTQpLG89ITEsaT17dW5tb3VudElERnJvbUVudmlyb25tZW50Om51bGwscmVwbGFjZU5vZGVXaXRoTWFya3VwOm51bGwscHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpudWxsLGluamVjdGlvbjp7aW5qZWN0RW52aXJvbm1lbnQ6ZnVuY3Rpb24oZSl7bz9yKCExKTp2b2lkIDAsaS51bm1vdW50SURGcm9tRW52aXJvbm1lbnQ9ZS51bm1vdW50SURGcm9tRW52aXJvbm1lbnQsaS5yZXBsYWNlTm9kZVdpdGhNYXJrdXA9ZS5yZXBsYWNlTm9kZVdpdGhNYXJrdXAsaS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzPWUucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxvPSEwfX19O3QuZXhwb3J0cz1pfSx7MTU0OjE1NH1dLDM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQuX293bmVyfHxudWxsO2lmKHQpe3ZhciBuPXQuZ2V0TmFtZSgpO2lmKG4pcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIituKyJgLiJ9cmV0dXJuIiJ9ZnVuY3Rpb24gbyhlKXt9ZnVuY3Rpb24gaShlLHQpe31mdW5jdGlvbiBhKGUpe3JldHVybiBlLnByb3RvdHlwZSYmZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudH12YXIgdT1lKDE2NSkscz1lKDMzKSxsPWUoMzUpLGM9ZSg2MCkscD1lKDYzKSxkPWUoNjkpLGY9KGUoNzApLGUoNzYpKSxoPWUoODApLHY9KGUoNzkpLGUoODMpKSxtPWUoODkpLGc9ZSgxNDcpLHk9ZSgxNTQpLEM9ZSgxMzYpO2UoMTY0KTtvLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT1kLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZSx0PWUodGhpcy5wcm9wcyx0aGlzLmNvbnRleHQsdGhpcy51cGRhdGVyKTtyZXR1cm4gaShlLHQpLHR9O3ZhciBiPTEsXz17Y29uc3RydWN0OmZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fcm9vdE5vZGVJRD1udWxsLHRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fbmF0aXZlUGFyZW50PW51bGwsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1udWxsLHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGwsdGhpcy5fcGVuZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRoaXMuX3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9tb3VudE9yZGVyPTAsdGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51bGwsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50PSExfSxtb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt0aGlzLl9jb250ZXh0PXIsdGhpcy5fbW91bnRPcmRlcj1iKyssdGhpcy5fbmF0aXZlUGFyZW50PXQsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1uO3ZhciB1LHM9dGhpcy5fcHJvY2Vzc1Byb3BzKHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzKSxsPXRoaXMuX3Byb2Nlc3NDb250ZXh0KHIpLHA9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxmPXRoaXMuX2NvbnN0cnVjdENvbXBvbmVudChzLGwpO2EocCl8fG51bGwhPWYmJm51bGwhPWYucmVuZGVyfHwodT1mLGkocCx1KSxudWxsPT09Znx8Zj09PSExfHxjLmlzVmFsaWRFbGVtZW50KGYpP3ZvaWQgMDp5KCExKSxmPW5ldyBvKHApKSxmLnByb3BzPXMsZi5jb250ZXh0PWwsZi5yZWZzPWcsZi51cGRhdGVyPW0sdGhpcy5faW5zdGFuY2U9ZixkLnNldChmLHRoaXMpO3ZhciBoPWYuc3RhdGU7dm9pZCAwPT09aCYmKGYuc3RhdGU9aD1udWxsKSwib2JqZWN0IiE9dHlwZW9mIGh8fEFycmF5LmlzQXJyYXkoaCk/eSghMSk6dm9pZCAwLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITE7dmFyIHY7cmV0dXJuIHY9Zi51bnN0YWJsZV9oYW5kbGVFcnJvcj90aGlzLnBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyh1LHQsbixlLHIpOnRoaXMucGVyZm9ybUluaXRpYWxNb3VudCh1LHQsbixlLHIpLGYuY29tcG9uZW50RGlkTW91bnQmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShmLmNvbXBvbmVudERpZE1vdW50LGYpLHZ9LF9jb25zdHJ1Y3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGUsdCl9LF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7cmV0dXJuIG49YShyKT9uZXcgcihlLHQsbSk6cihlLHQsbSl9LHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGE9ci5jaGVja3BvaW50KCk7dHJ5e2k9dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGUsdCxuLHIsbyl9Y2F0Y2godSl7ci5yb2xsYmFjayhhKSx0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcih1KSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSYmKHRoaXMuX2luc3RhbmNlLnN0YXRlPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5faW5zdGFuY2UucHJvcHMsdGhpcy5faW5zdGFuY2UuY29udGV4dCkpLGE9ci5jaGVja3BvaW50KCksdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCghMCksci5yb2xsYmFjayhhKSxpPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfXJldHVybiBpfSxwZXJmb3JtSW5pdGlhbE1vdW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9dGhpcy5faW5zdGFuY2U7aS5jb21wb25lbnRXaWxsTW91bnQmJihpLmNvbXBvbmVudFdpbGxNb3VudCgpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYoaS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGkucHJvcHMsaS5jb250ZXh0KSkpLHZvaWQgMD09PWUmJihlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPWYuZ2V0VHlwZShlKSx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGUpO3ZhciBhPXYubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQscix0LG4sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChvKSk7cmV0dXJuIGF9LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5nZXROYXRpdmVOb2RlKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtpZih0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl7dmFyIHQ9dGhpcy5faW5zdGFuY2U7aWYodC5jb21wb25lbnRXaWxsVW5tb3VudCYmIXQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KWlmKHQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50PSEwLGUpe3ZhciBuPXRoaXMuZ2V0TmFtZSgpKyIuY29tcG9uZW50V2lsbFVubW91bnQoKSI7cC5pbnZva2VHdWFyZGVkQ2FsbGJhY2sobix0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQodCkpfWVsc2UgdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50JiYodi51bm1vdW50Q29tcG9uZW50KHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LGUpLHRoaXMuX3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2luc3RhbmNlPW51bGwpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX3Jvb3ROb2RlSUQ9bnVsbCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCxkLnJlbW92ZSh0KX19LF9tYXNrQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLG49dC5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIGc7dmFyIHI9e307Zm9yKHZhciBvIGluIG4pcltvXT1lW29dO3JldHVybiByfSxfcHJvY2Vzc0NvbnRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbWFza0NvbnRleHQoZSk7cmV0dXJuIHR9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsbj10aGlzLl9pbnN0YW5jZSxyPW4uZ2V0Q2hpbGRDb250ZXh0JiZuLmdldENoaWxkQ29udGV4dCgpO2lmKHIpeyJvYmplY3QiIT10eXBlb2YgdC5jaGlsZENvbnRleHRUeXBlcz95KCExKTp2b2lkIDA7Zm9yKHZhciBvIGluIHIpbyBpbiB0LmNoaWxkQ29udGV4dFR5cGVzP3ZvaWQgMDp5KCExKTtyZXR1cm4gdSh7fSxlLHIpfXJldHVybiBlfSxfcHJvY2Vzc1Byb3BzOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxfY2hlY2tQcm9wVHlwZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXMuZ2V0TmFtZSgpO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgZVtpXT95KCExKTp2b2lkIDAsYT1lW2ldKHQsaSxvLG4pfWNhdGNoKHUpe2E9dX1hIGluc3RhbmNlb2YgRXJyb3ImJihyKHRoaXMpLG49PT1oLnByb3ApfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbyxuKX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuX3BlbmRpbmdFbGVtZW50P3YucmVjZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LGUsdGhpcy5fY29udGV4dCk6bnVsbCE9PXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlfHx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU/dGhpcy51cGRhdGVDb21wb25lbnQoZSx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpOnRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGx9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEsdT10aGlzLl9pbnN0YW5jZSxzPSExO3RoaXMuX2NvbnRleHQ9PT1vP2k9dS5jb250ZXh0OihpPXRoaXMuX3Byb2Nlc3NDb250ZXh0KG8pLHM9ITApLHQ9PT1uP2E9bi5wcm9wczooYT10aGlzLl9wcm9jZXNzUHJvcHMobi5wcm9wcykscz0hMCkscyYmdS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZ1LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYSxpKTt2YXIgbD10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGEsaSksYz0hMDshdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlJiZ1LnNob3VsZENvbXBvbmVudFVwZGF0ZSYmKGM9dS5zaG91bGRDb21wb25lbnRVcGRhdGUoYSxsLGkpKSx0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLGM/KHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG4sYSxsLGksZSxvKSk6KHRoaXMuX2N1cnJlbnRFbGVtZW50PW4sdGhpcy5fY29udGV4dD1vLHUucHJvcHM9YSx1LnN0YXRlPWwsdS5jb250ZXh0PWkpfSxfcHJvY2Vzc1BlbmRpbmdTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2luc3RhbmNlLHI9dGhpcy5fcGVuZGluZ1N0YXRlUXVldWUsbz10aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlO2lmKHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCwhcilyZXR1cm4gbi5zdGF0ZTtpZihvJiYxPT09ci5sZW5ndGgpcmV0dXJuIHJbMF07Zm9yKHZhciBpPXUoe30sbz9yWzBdOm4uc3RhdGUpLGE9bz8xOjA7YTxyLmxlbmd0aDthKyspe3ZhciBzPXJbYV07dShpLCJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuY2FsbChuLGksZSx0KTpzKX1yZXR1cm4gaX0sX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhLHUscyxsPXRoaXMuX2luc3RhbmNlLGM9Qm9vbGVhbihsLmNvbXBvbmVudERpZFVwZGF0ZSk7YyYmKGE9bC5wcm9wcyx1PWwuc3RhdGUscz1sLmNvbnRleHQpLGwuY29tcG9uZW50V2lsbFVwZGF0ZSYmbC5jb21wb25lbnRXaWxsVXBkYXRlKHQsbixyKSx0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX2NvbnRleHQ9aSxsLnByb3BzPXQsbC5zdGF0ZT1uLGwuY29udGV4dD1yLHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KG8saSksYyYmby5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGwuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQobCxhLHUscyksbCl9LF91cGRhdGVSZW5kZXJlZENvbXBvbmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LHI9bi5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTtpZihDKHIsbykpdi5yZWNlaXZlQ29tcG9uZW50KG4sbyxlLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQodCkpO2Vsc2V7dmFyIGk9di5nZXROYXRpdmVOb2RlKG4pO3YudW5tb3VudENvbXBvbmVudChuLCExKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPWYuZ2V0VHlwZShvKSx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG8pO3ZhciBhPXYubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsZSx0aGlzLl9uYXRpdmVQYXJlbnQsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbyx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KHQpKTt0aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAoaSxhLG4pfX0sX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5jdGlvbihlLHQsbil7cy5yZXBsYWNlTm9kZVdpdGhNYXJrdXAoZSx0LG4pfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5zdGFuY2UsdD1lLnJlbmRlcigpO3JldHVybiB0fSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIGU7bC5jdXJyZW50PXRoaXM7dHJ5e2U9dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCl9ZmluYWxseXtsLmN1cnJlbnQ9bnVsbH1yZXR1cm4gbnVsbD09PWV8fGU9PT0hMXx8Yy5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6eSghMSksZX0sYXR0YWNoUmVmOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO251bGw9PW4/eSghMSk6dm9pZCAwO3ZhciByPXQuZ2V0UHVibGljSW5zdGFuY2UoKSxvPW4ucmVmcz09PWc/bi5yZWZzPXt9Om4ucmVmcztvW2VdPXJ9LGRldGFjaFJlZjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztkZWxldGUgdFtlXX0sZ2V0TmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD10aGlzLl9pbnN0YW5jZSYmdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7cmV0dXJuIGUuZGlzcGxheU5hbWV8fHQmJnQuZGlzcGxheU5hbWV8fGUubmFtZXx8dCYmdC5uYW1lfHxudWxsfSxnZXRQdWJsaWNJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2luc3RhbmNlO3JldHVybiBlIGluc3RhbmNlb2Ygbz9udWxsOmV9LF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Om51bGx9LEU9e01peGluOl99O3QuZXhwb3J0cz1FfSx7MTM2OjEzNiwxNDc6MTQ3LDE1NDoxNTQsMTY0OjE2NCwxNjU6MTY1LDMzOjMzLDM1OjM1LDYwOjYwLDYzOjYzLDY5OjY5LDcwOjcwLDc2Ojc2LDc5Ojc5LDgwOjgwLDgzOjgzLDg5Ojg5fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJlbnQ6bnVsbH07dC5leHBvcnRzPXJ9LHt9XSwzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQwKSxvPWUoNTkpLGk9ZSg3MiksYT1lKDgzKSx1PWUoOTApLHM9ZSg5MSksbD1lKDExNiksYz1lKDEyNCkscD1lKDEzMyk7ZSgxNjQpO28uaW5qZWN0KCk7dmFyIGQ9e2ZpbmRET01Ob2RlOmwscmVuZGVyOmkucmVuZGVyLHVubW91bnRDb21wb25lbnRBdE5vZGU6aS51bm1vdW50Q29tcG9uZW50QXROb2RlLHZlcnNpb246cyx1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczp1LmJhdGNoZWRVcGRhdGVzLHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOnB9OyJ1bmRlZmluZWQiIT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fJiYiZnVuY3Rpb24iPT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCYmX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7Q29tcG9uZW50VHJlZTp7Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6ci5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9yZW5kZXJlZENvbXBvbmVudCYmKGU9YyhlKSksZT9yLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk6bnVsbH19LE1vdW50OmksUmVjb25jaWxlcjphfSk7dC5leHBvcnRzPWR9LHsxMTY6MTE2LDEyNDoxMjQsMTMzOjEzMywxNjQ6MTY0LDQwOjQwLDU5OjU5LDcyOjcyLDgzOjgzLDkwOjkwLDkxOjkxfV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNCksbz17Z2V0TmF0aXZlUHJvcHM6ci5nZXROYXRpdmVQcm9wc307dC5leHBvcnRzPW99LHsxNDoxNH1dLDM4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt0JiYoWFtlLl90YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTD9PKCExKTp2b2lkIDApLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVuP08oITEpOnZvaWQgMCwib2JqZWN0Ij09dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJksgaW4gdC5kYW5nZXJvdXNseVNldElubmVySFRNTD92b2lkIDA6TyghMSkpLG51bGwhPXQuc3R5bGUmJiJvYmplY3QiIT10eXBlb2YgdC5zdHlsZT9PKCExKTp2b2lkIDApfWZ1bmN0aW9uIG8oZSx0LG4scil7aWYoIShyIGluc3RhbmNlb2YgRCkpe3ZhciBvPWUuX25hdGl2ZUNvbnRhaW5lckluZm8sYT1vLl9ub2RlJiZvLl9ub2RlLm5vZGVUeXBlPT09cSx1PWE/by5fbm9kZTpvLl9vd25lckRvY3VtZW50O1YodCx1KSxyLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaSx7aW5zdDplLHJlZ2lzdHJhdGlvbk5hbWU6dCxsaXN0ZW5lcjpufSl9fWZ1bmN0aW9uIGkoKXt2YXIgZT10aGlzO2IucHV0TGlzdGVuZXIoZS5pbnN0LGUucmVnaXN0cmF0aW9uTmFtZSxlLmxpc3RlbmVyKX1mdW5jdGlvbiBhKCl7dmFyIGU9dGhpcztTLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gdSgpe3ZhciBlPXRoaXM7ZS5fcm9vdE5vZGVJRD92b2lkIDA6TyghMSk7dmFyIHQ9RihlKTtzd2l0Y2godD92b2lkIDA6TyghMSksZS5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wTG9hZCwibG9hZCIsdCldO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W107Zm9yKHZhciBuIGluIFkpWS5oYXNPd25Qcm9wZXJ0eShuKSYmZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKEUudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXNbbl0sWVtuXSx0KSk7YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wRXJyb3IsImVycm9yIix0KSxFLnRyYXBCdWJibGVkRXZlbnQoQy50b3BMZXZlbFR5cGVzLnRvcExvYWQsImxvYWQiLHQpXTticmVhaztjYXNlImZvcm0iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wUmVzZXQsInJlc2V0Iix0KSxFLnRyYXBCdWJibGVkRXZlbnQoQy50b3BMZXZlbFR5cGVzLnRvcFN1Ym1pdCwic3VibWl0Iix0KV07YnJlYWs7Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wSW52YWxpZCwiaW52YWxpZCIsdCldfX1mdW5jdGlvbiBzKCl7TS5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKX1mdW5jdGlvbiBsKGUpe1ouY2FsbCgkLGUpfHwoUS50ZXN0KGUpP3ZvaWQgMDpPKCExKSwkW2VdPSEwKX1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPj0wfHxudWxsIT10LmlzfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9ZS50eXBlO2wodCksdGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl90YWc9dC50b0xvd2VyQ2FzZSgpLHRoaXMuX25hbWVzcGFjZVVSST1udWxsLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlPW51bGwsdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCx0aGlzLl9uYXRpdmVOb2RlPW51bGwsdGhpcy5fbmF0aXZlUGFyZW50PW51bGwsdGhpcy5fcm9vdE5vZGVJRD1udWxsLHRoaXMuX2RvbUlEPW51bGwsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1udWxsLHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX2ZsYWdzPTB9dmFyIGQ9ZSgxNjUpLGY9ZSgxKSxoPWUoNCksdj1lKDgpLG09ZSg5KSxnPWUoMTApLHk9ZSgxMSksQz1lKDE2KSxiPWUoMTcpLF89ZSgxOCksRT1lKDI3KSx4PWUoMzIpLE49ZSgzNyksVD1lKDM5KSxQPWUoNDApLHc9ZSg0NyksUz1lKDQ5KSxNPWUoNTApLGs9ZSg1NCksUj0oZSg3MCksZSg3MykpLEQ9ZSg4NyksST0oZSgxNDYpLGUoMTE1KSksTz1lKDE1NCksQT0oZSgxMjkpLGUoMTU4KSksTD0oZSgxNjMpLGUoMTM4KSxlKDE2NCksVCksVT1iLmRlbGV0ZUxpc3RlbmVyLEY9UC5nZXROb2RlRnJvbUluc3RhbmNlLFY9RS5saXN0ZW5UbyxCPV8ucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMsaj17c3RyaW5nOiEwLG51bWJlcjohMH0sVz1BKHtzdHlsZTpudWxsfSksSz1BKHtfX2h0bWw6bnVsbH0pLEg9e2NoaWxkcmVuOm51bGwsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6bnVsbCxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6bnVsbH0scT0xMSxZPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifSx6PXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9LEc9e2xpc3Rpbmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxYPWQoe21lbnVpdGVtOiEwfSx6KSxRPS9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvLCQ9e30sWj17fS5oYXNPd25Qcm9wZXJ0eSxKPTE7cC5kaXNwbGF5TmFtZT0iUmVhY3RET01Db21wb25lbnQiLHAuTWl4aW49e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8pe3RoaXMuX3Jvb3ROb2RlSUQ9SisrLHRoaXMuX2RvbUlEPW4uX2lkQ291bnRlcisrLHRoaXMuX25hdGl2ZVBhcmVudD10LHRoaXMuX25hdGl2ZUNvbnRhaW5lckluZm89bjt2YXIgaT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiaW1nIjpjYXNlImZvcm0iOmNhc2UidmlkZW8iOmNhc2UiYXVkaW8iOnRoaXMuX3dyYXBwZXJTdGF0ZT17bGlzdGVuZXJzOm51bGx9LGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh1LHRoaXMpO2JyZWFrO2Nhc2UiYnV0dG9uIjppPU4uZ2V0TmF0aXZlUHJvcHModGhpcyxpLHQpO2JyZWFrO2Nhc2UiaW5wdXQiOncubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPXcuZ2V0TmF0aXZlUHJvcHModGhpcyxpKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodSx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6Uy5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Uy5nZXROYXRpdmVQcm9wcyh0aGlzLGkpO2JyZWFrO2Nhc2Uic2VsZWN0IjpNLm1vdW50V3JhcHBlcih0aGlzLGksdCksaT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHUsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ay5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh1LHRoaXMpfXIodGhpcyxpKTt2YXIgcyxsO251bGwhPXQ/KHM9dC5fbmFtZXNwYWNlVVJJLGw9dC5fdGFnKTpuLl90YWcmJihzPW4uX25hbWVzcGFjZVVSSSxsPW4uX3RhZyksKG51bGw9PXN8fHM9PT1tLnN2ZyYmImZvcmVpZ25vYmplY3QiPT09bCkmJihzPW0uaHRtbCkscz09PW0uaHRtbCYmKCJzdmciPT09dGhpcy5fdGFnP3M9bS5zdmc6Im1hdGgiPT09dGhpcy5fdGFnJiYocz1tLm1hdGhtbCkpLHRoaXMuX25hbWVzcGFjZVVSST1zO3ZhciBjO2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIHAsZD1uLl9vd25lckRvY3VtZW50O2lmKHM9PT1tLmh0bWwpaWYoInNjcmlwdCI9PT10aGlzLl90YWcpe3ZhciBoPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZz10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2guaW5uZXJIVE1MPSI8IitnKyI+PC8iK2crIj4iLHA9aC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpfWVsc2UgcD1kLmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxpLmlzfHxudWxsKTtlbHNlIHA9ZC5jcmVhdGVFbGVtZW50TlMocyx0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtQLnByZWNhY2hlTm9kZSh0aGlzLHApLHRoaXMuX2ZsYWdzfD1MLmhhc0NhY2hlZENoaWxkTm9kZXMsdGhpcy5fbmF0aXZlUGFyZW50fHx5LnNldEF0dHJpYnV0ZUZvclJvb3QocCksdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhudWxsLGksZSk7dmFyIEM9dihwKTt0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4oZSxpLG8sQyksYz1DfWVsc2V7dmFyIGI9dGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyhlLGkpLF89dGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cChlLGksbyk7Yz0hXyYmelt0aGlzLl90YWddP2IrIi8+IjpiKyI+IitfKyI8LyIrdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSsiPiJ9c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjppLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGYuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24iOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhLHRoaXMpfXJldHVybiBjfSxfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczpmdW5jdGlvbihlLHQpe3ZhciBuPSI8Iit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2Zvcih2YXIgciBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikpe3ZhciBpPXRbcl07aWYobnVsbCE9aSlpZihCLmhhc093blByb3BlcnR5KHIpKWkmJm8odGhpcyxyLGksZSk7ZWxzZXtyPT09VyYmKGkmJihpPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PWQoe30sdC5zdHlsZSkpLGk9aC5jcmVhdGVNYXJrdXBGb3JTdHlsZXMoaSx0aGlzKSk7dmFyIGE9bnVsbDtudWxsIT10aGlzLl90YWcmJmModGhpcy5fdGFnLHQpP0guaGFzT3duUHJvcGVydHkocil8fChhPXkuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHIsaSkpOmE9eS5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eShyLGkpLGEmJihuKz0iICIrYSl9fXJldHVybiBlLnJlbmRlclRvU3RhdGljTWFya3VwP246KHRoaXMuX25hdGl2ZVBhcmVudHx8KG4rPSIgIit5LmNyZWF0ZU1hcmt1cEZvclJvb3QoKSksbis9IiAiK3kuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpKX0sX2NyZWF0ZUNvbnRlbnRNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIiLG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiYocj1vLl9faHRtbCk7ZWxzZXt2YXIgaT1qW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsYT1udWxsIT1pP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1pKXI9SShpKTtlbHNlIGlmKG51bGwhPWEpe3ZhciB1PXRoaXMubW91bnRDaGlsZHJlbihhLGUsbik7cj11LmpvaW4oIiIpfX1yZXR1cm4gR1t0aGlzLl90YWddJiYiXG4iPT09ci5jaGFyQXQoMCk/IlxuIityOnJ9LF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiZ2LnF1ZXVlSFRNTChyLG8uX19odG1sKTtlbHNle3ZhciBpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51bGwhPWkpdi5xdWV1ZVRleHQocixpKTtlbHNlIGlmKG51bGwhPWEpZm9yKHZhciB1PXRoaXMubW91bnRDaGlsZHJlbihhLGUsbikscz0wO3M8dS5sZW5ndGg7cysrKXYucXVldWVDaGlsZChyLHVbc10pfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQ7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLnVwZGF0ZUNvbXBvbmVudCh0LHIsZSxuKX0sdXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXQucHJvcHMsYT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImJ1dHRvbiI6aT1OLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksYT1OLmdldE5hdGl2ZVByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJpbnB1dCI6dy51cGRhdGVXcmFwcGVyKHRoaXMpLGk9dy5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGE9dy5nZXROYXRpdmVQcm9wcyh0aGlzLGEpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPVMuZ2V0TmF0aXZlUHJvcHModGhpcyxpKSxhPVMuZ2V0TmF0aXZlUHJvcHModGhpcyxhKTticmVhaztjYXNlInNlbGVjdCI6aT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksYT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ay51cGRhdGVXcmFwcGVyKHRoaXMpLGk9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGE9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGEpfXIodGhpcyxhKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKGksYSxlKSx0aGlzLl91cGRhdGVET01DaGlsZHJlbihpLGEsZSxvKSwic2VsZWN0Ij09PXRoaXMuX3RhZyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHMsdGhpcyl9LF91cGRhdGVET01Qcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLGE7Zm9yKHIgaW4gZSlpZighdC5oYXNPd25Qcm9wZXJ0eShyKSYmZS5oYXNPd25Qcm9wZXJ0eShyKSYmbnVsbCE9ZVtyXSlpZihyPT09Vyl7dmFyIHU9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk7Zm9yKGkgaW4gdSl1Lmhhc093blByb3BlcnR5KGkpJiYoYT1hfHx7fSxhW2ldPSIiKTt0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsfWVsc2UgQi5oYXNPd25Qcm9wZXJ0eShyKT9lW3JdJiZVKHRoaXMscik6KGcucHJvcGVydGllc1tyXXx8Zy5pc0N1c3RvbUF0dHJpYnV0ZShyKSkmJnkuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShGKHRoaXMpLHIpO2ZvcihyIGluIHQpe3ZhciBzPXRbcl0sbD1yPT09Vz90aGlzLl9wcmV2aW91c1N0eWxlQ29weTpudWxsIT1lP2Vbcl06dm9pZCAwO2lmKHQuaGFzT3duUHJvcGVydHkocikmJnMhPT1sJiYobnVsbCE9c3x8bnVsbCE9bCkpaWYocj09PVcpaWYocz9zPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PWQoe30scyk6dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCxsKXtmb3IoaSBpbiBsKSFsLmhhc093blByb3BlcnR5KGkpfHxzJiZzLmhhc093blByb3BlcnR5KGkpfHwoYT1hfHx7fSxhW2ldPSIiKTtmb3IoaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJmxbaV0hPT1zW2ldJiYoYT1hfHx7fSxhW2ldPXNbaV0pfWVsc2UgYT1zO2Vsc2UgaWYoQi5oYXNPd25Qcm9wZXJ0eShyKSlzP28odGhpcyxyLHMsbik6bCYmVSh0aGlzLHIpO2Vsc2UgaWYoYyh0aGlzLl90YWcsdCkpSC5oYXNPd25Qcm9wZXJ0eShyKXx8eS5zZXRWYWx1ZUZvckF0dHJpYnV0ZShGKHRoaXMpLHIscyk7ZWxzZSBpZihnLnByb3BlcnRpZXNbcl18fGcuaXNDdXN0b21BdHRyaWJ1dGUocikpe3ZhciBwPUYodGhpcyk7bnVsbCE9cz95LnNldFZhbHVlRm9yUHJvcGVydHkocCxyLHMpOnkuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShwLHIpfX1hJiZoLnNldFZhbHVlRm9yU3R5bGVzKEYodGhpcyksYSx0aGlzKX0sX3VwZGF0ZURPTUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWpbdHlwZW9mIGUuY2hpbGRyZW5dP2UuY2hpbGRyZW46bnVsbCxpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPWUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJmUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sLHU9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwscz1udWxsIT1vP251bGw6ZS5jaGlsZHJlbixsPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuLGM9bnVsbCE9b3x8bnVsbCE9YSxwPW51bGwhPWl8fG51bGwhPXU7bnVsbCE9cyYmbnVsbD09bD90aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsbixyKTpjJiYhcCYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIiksbnVsbCE9aT9vIT09aSYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIitpKTpudWxsIT11P2EhPT11JiZ0aGlzLnVwZGF0ZU1hcmt1cCgiIit1KTpudWxsIT1sJiZ0aGlzLnVwZGF0ZUNoaWxkcmVuKGwsbixyKX0sZ2V0TmF0aXZlTm9kZTpmdW5jdGlvbigpe3JldHVybiBGKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJpbWciOmNhc2UiZm9ybSI6Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6dmFyIHQ9dGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0ucmVtb3ZlKCk7YnJlYWs7Y2FzZSJodG1sIjpjYXNlImhlYWQiOmNhc2UiYm9keSI6TyghMSl9dGhpcy51bm1vdW50Q2hpbGRyZW4oZSksUC51bmNhY2hlTm9kZSh0aGlzKSxiLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKSx4LnVubW91bnRJREZyb21FbnZpcm9ubWVudCh0aGlzLl9yb290Tm9kZUlEKSx0aGlzLl9yb290Tm9kZUlEPW51bGwsdGhpcy5fZG9tSUQ9bnVsbCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbH0sZ2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gRih0aGlzKX19LGQocC5wcm90b3R5cGUscC5NaXhpbixSLk1peGluKSx0LmV4cG9ydHM9cH0sezE6MSwxMDoxMCwxMToxMSwxMTU6MTE1LDEyOToxMjksMTM4OjEzOCwxNDY6MTQ2LDE1NDoxNTQsMTU4OjE1OCwxNjoxNiwxNjM6MTYzLDE2NDoxNjQsMTY1OjE2NSwxNzoxNywxODoxOCwyNzoyNywzMjozMiwzNzozNywzOTozOSw0OjQsNDA6NDAsNDc6NDcsNDk6NDksNTA6NTAsNTQ6NTQsNzA6NzAsNzM6NzMsODo4LDg3Ojg3LDk6OX1dLDM5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtoYXNDYWNoZWRDaGlsZE5vZGVzOjF9O3QuZXhwb3J0cz1yfSx7fV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ7dD1lLl9yZW5kZXJlZENvbXBvbmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1yKGUpO24uX25hdGl2ZU5vZGU9dCx0W3ZdPW59ZnVuY3Rpb24gaShlKXt2YXIgdD1lLl9uYXRpdmVOb2RlO3QmJihkZWxldGUgdFt2XSxlLl9uYXRpdmVOb2RlPW51bGwpfWZ1bmN0aW9uIGEoZSx0KXtpZighKGUuX2ZsYWdzJmguaGFzQ2FjaGVkQ2hpbGROb2Rlcykpe3ZhciBuPWUuX3JlbmRlcmVkQ2hpbGRyZW4saT10LmZpcnN0Q2hpbGQ7ZTpmb3IodmFyIGEgaW4gbilpZihuLmhhc093blByb3BlcnR5KGEpKXt2YXIgdT1uW2FdLHM9cih1KS5fZG9tSUQ7aWYobnVsbCE9cyl7Zm9yKDtudWxsIT09aTtpPWkubmV4dFNpYmxpbmcpaWYoMT09PWkubm9kZVR5cGUmJmkuZ2V0QXR0cmlidXRlKGYpPT09U3RyaW5nKHMpfHw4PT09aS5ub2RlVHlwZSYmaS5ub2RlVmFsdWU9PT0iIHJlYWN0LXRleHQ6ICIrcysiICJ8fDg9PT1pLm5vZGVUeXBlJiZpLm5vZGVWYWx1ZT09PSIgcmVhY3QtZW1wdHk6ICIrcysiICIpe28odSxpKTtjb250aW51ZSBlfWQoITEpfX1lLl9mbGFnc3w9aC5oYXNDYWNoZWRDaGlsZE5vZGVzfX1mdW5jdGlvbiB1KGUpe2lmKGVbdl0pcmV0dXJuIGVbdl07Zm9yKHZhciB0PVtdOyFlW3ZdOyl7aWYodC5wdXNoKGUpLCFlLnBhcmVudE5vZGUpcmV0dXJuIG51bGw7ZT1lLnBhcmVudE5vZGV9Zm9yKHZhciBuLHI7ZSYmKHI9ZVt2XSk7ZT10LnBvcCgpKW49cix0Lmxlbmd0aCYmYShyLGUpO3JldHVybiBufWZ1bmN0aW9uIHMoZSl7dmFyIHQ9dShlKTtyZXR1cm4gbnVsbCE9dCYmdC5fbmF0aXZlTm9kZT09PWU/dDpudWxsfWZ1bmN0aW9uIGwoZSl7aWYodm9pZCAwPT09ZS5fbmF0aXZlTm9kZT9kKCExKTp2b2lkIDAsZS5fbmF0aXZlTm9kZSlyZXR1cm4gZS5fbmF0aXZlTm9kZTtmb3IodmFyIHQ9W107IWUuX25hdGl2ZU5vZGU7KXQucHVzaChlKSxlLl9uYXRpdmVQYXJlbnQ/dm9pZCAwOmQoITEpLGU9ZS5fbmF0aXZlUGFyZW50O2Zvcig7dC5sZW5ndGg7ZT10LnBvcCgpKWEoZSxlLl9uYXRpdmVOb2RlKTtyZXR1cm4gZS5fbmF0aXZlTm9kZX12YXIgYz1lKDEwKSxwPWUoMzkpLGQ9ZSgxNTQpLGY9Yy5JRF9BVFRSSUJVVEVfTkFNRSxoPXAsdj0iX19yZWFjdEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxtPXtnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTp1LGdldEluc3RhbmNlRnJvbU5vZGU6cyxnZXROb2RlRnJvbUluc3RhbmNlOmwscHJlY2FjaGVDaGlsZE5vZGVzOmEscHJlY2FjaGVOb2RlOm8sdW5jYWNoZU5vZGU6aX07dC5leHBvcnRzPW19LHsxMDoxMCwxNTQ6MTU0LDM5OjM5fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXtfdG9wTGV2ZWxXcmFwcGVyOmUsX2lkQ291bnRlcjoxLF9vd25lckRvY3VtZW50OnQ/dC5ub2RlVHlwZT09PW8/dDp0Lm93bmVyRG9jdW1lbnQ6bnVsbCxfbm9kZTp0LF90YWc6dD90Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6bnVsbCxfbmFtZXNwYWNlVVJJOnQ/dC5uYW1lc3BhY2VVUkk6bnVsbH07cmV0dXJuIG59dmFyIG89KGUoMTM4KSw5KTt0LmV4cG9ydHM9cn0sezEzODoxMzh9XSw0MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIsbyxpKXt9dmFyIG89ZSg1NiksaT0oZSgxNjQpLFtdKSxhPXthZGREZXZ0b29sOmZ1bmN0aW9uKGUpe2kucHVzaChlKX0scmVtb3ZlRGV2dG9vbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGkubGVuZ3RoO3QrKylpW3RdPT09ZSYmKGkuc3BsaWNlKHQsMSksdC0tKX0sb25DcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IoIm9uQ3JlYXRlTWFya3VwRm9yUHJvcGVydHkiLGUsdCl9LG9uU2V0VmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7cigib25TZXRWYWx1ZUZvclByb3BlcnR5IixlLHQsbil9LG9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IoIm9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eSIsZSx0KX19O2EuYWRkRGV2dG9vbChvKSx0LmV4cG9ydHM9YX0sezE2NDoxNjQsNTY6NTZ9XSw0MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2NSksbz1lKDgpLGk9ZSg0MCksYT1mdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX25hdGl2ZU5vZGU9bnVsbCx0aGlzLl9uYXRpdmVQYXJlbnQ9bnVsbCx0aGlzLl9uYXRpdmVDb250YWluZXJJbmZvPW51bGwsdGhpcy5fZG9tSUQ9bnVsbH07cihhLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGE9bi5faWRDb3VudGVyKys7dGhpcy5fZG9tSUQ9YSx0aGlzLl9uYXRpdmVQYXJlbnQ9dCx0aGlzLl9uYXRpdmVDb250YWluZXJJbmZvPW47dmFyIHU9IiByZWFjdC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYoZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgcz1uLl9vd25lckRvY3VtZW50LGw9cy5jcmVhdGVDb21tZW50KHUpO3JldHVybiBpLnByZWNhY2hlTm9kZSh0aGlzLGwpLG8obCl9cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/IiI6IjwhLS0iK3UrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oKXt9LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7aS51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9YX0sezE2NToxNjUsNDA6NDAsODo4fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gby5jcmVhdGVGYWN0b3J5KGUpfXZhciBvPWUoNjApLGk9KGUoNjEpLGUoMTU5KSksYT1pKHthOiJhIixhYmJyOiJhYmJyIixhZGRyZXNzOiJhZGRyZXNzIixhcmVhOiJhcmVhIixhcnRpY2xlOiJhcnRpY2xlIixhc2lkZToiYXNpZGUiLGF1ZGlvOiJhdWRpbyIsCmI6ImIiLGJhc2U6ImJhc2UiLGJkaToiYmRpIixiZG86ImJkbyIsYmlnOiJiaWciLGJsb2NrcXVvdGU6ImJsb2NrcXVvdGUiLGJvZHk6ImJvZHkiLGJyOiJiciIsYnV0dG9uOiJidXR0b24iLGNhbnZhczoiY2FudmFzIixjYXB0aW9uOiJjYXB0aW9uIixjaXRlOiJjaXRlIixjb2RlOiJjb2RlIixjb2w6ImNvbCIsY29sZ3JvdXA6ImNvbGdyb3VwIixkYXRhOiJkYXRhIixkYXRhbGlzdDoiZGF0YWxpc3QiLGRkOiJkZCIsZGVsOiJkZWwiLGRldGFpbHM6ImRldGFpbHMiLGRmbjoiZGZuIixkaWFsb2c6ImRpYWxvZyIsZGl2OiJkaXYiLGRsOiJkbCIsZHQ6ImR0IixlbToiZW0iLGVtYmVkOiJlbWJlZCIsZmllbGRzZXQ6ImZpZWxkc2V0IixmaWdjYXB0aW9uOiJmaWdjYXB0aW9uIixmaWd1cmU6ImZpZ3VyZSIsZm9vdGVyOiJmb290ZXIiLGZvcm06ImZvcm0iLGgxOiJoMSIsaDI6ImgyIixoMzoiaDMiLGg0OiJoNCIsaDU6Img1IixoNjoiaDYiLGhlYWQ6ImhlYWQiLGhlYWRlcjoiaGVhZGVyIixoZ3JvdXA6Imhncm91cCIsaHI6ImhyIixodG1sOiJodG1sIixpOiJpIixpZnJhbWU6ImlmcmFtZSIsaW1nOiJpbWciLGlucHV0OiJpbnB1dCIsaW5zOiJpbnMiLGtiZDoia2JkIixrZXlnZW46ImtleWdlbiIsbGFiZWw6ImxhYmVsIixsZWdlbmQ6ImxlZ2VuZCIsbGk6ImxpIixsaW5rOiJsaW5rIixtYWluOiJtYWluIixtYXA6Im1hcCIsbWFyazoibWFyayIsbWVudToibWVudSIsbWVudWl0ZW06Im1lbnVpdGVtIixtZXRhOiJtZXRhIixtZXRlcjoibWV0ZXIiLG5hdjoibmF2Iixub3NjcmlwdDoibm9zY3JpcHQiLG9iamVjdDoib2JqZWN0IixvbDoib2wiLG9wdGdyb3VwOiJvcHRncm91cCIsb3B0aW9uOiJvcHRpb24iLG91dHB1dDoib3V0cHV0IixwOiJwIixwYXJhbToicGFyYW0iLHBpY3R1cmU6InBpY3R1cmUiLHByZToicHJlIixwcm9ncmVzczoicHJvZ3Jlc3MiLHE6InEiLHJwOiJycCIscnQ6InJ0IixydWJ5OiJydWJ5IixzOiJzIixzYW1wOiJzYW1wIixzY3JpcHQ6InNjcmlwdCIsc2VjdGlvbjoic2VjdGlvbiIsc2VsZWN0OiJzZWxlY3QiLHNtYWxsOiJzbWFsbCIsc291cmNlOiJzb3VyY2UiLHNwYW46InNwYW4iLHN0cm9uZzoic3Ryb25nIixzdHlsZToic3R5bGUiLHN1Yjoic3ViIixzdW1tYXJ5OiJzdW1tYXJ5IixzdXA6InN1cCIsdGFibGU6InRhYmxlIix0Ym9keToidGJvZHkiLHRkOiJ0ZCIsdGV4dGFyZWE6InRleHRhcmVhIix0Zm9vdDoidGZvb3QiLHRoOiJ0aCIsdGhlYWQ6InRoZWFkIix0aW1lOiJ0aW1lIix0aXRsZToidGl0bGUiLHRyOiJ0ciIsdHJhY2s6InRyYWNrIix1OiJ1Iix1bDoidWwiLCJ2YXIiOiJ2YXIiLHZpZGVvOiJ2aWRlbyIsd2JyOiJ3YnIiLGNpcmNsZToiY2lyY2xlIixjbGlwUGF0aDoiY2xpcFBhdGgiLGRlZnM6ImRlZnMiLGVsbGlwc2U6ImVsbGlwc2UiLGc6ImciLGltYWdlOiJpbWFnZSIsbGluZToibGluZSIsbGluZWFyR3JhZGllbnQ6ImxpbmVhckdyYWRpZW50IixtYXNrOiJtYXNrIixwYXRoOiJwYXRoIixwYXR0ZXJuOiJwYXR0ZXJuIixwb2x5Z29uOiJwb2x5Z29uIixwb2x5bGluZToicG9seWxpbmUiLHJhZGlhbEdyYWRpZW50OiJyYWRpYWxHcmFkaWVudCIscmVjdDoicmVjdCIsc3RvcDoic3RvcCIsc3ZnOiJzdmciLHRleHQ6InRleHQiLHRzcGFuOiJ0c3BhbiJ9LHIpO3QuZXhwb3J0cz1hfSx7MTU5OjE1OSw2MDo2MCw2MTo2MX1dLDQ1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt1c2VDcmVhdGVFbGVtZW50OiEwfTt0LmV4cG9ydHM9cn0se31dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNyksbz1lKDQwKSxpPXtkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7ci5wcm9jZXNzVXBkYXRlcyhuLHQpfX07dC5leHBvcnRzPWl9LHs0MDo0MCw3Ojd9XSw0NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fcm9vdE5vZGVJRCYmZC51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1zLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO2MuYXNhcChyLHRoaXMpO3ZhciBvPXQubmFtZTtpZigicmFkaW8iPT09dC50eXBlJiZudWxsIT1vKXtmb3IodmFyIGk9bC5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpLGE9aTthLnBhcmVudE5vZGU7KWE9YS5wYXJlbnROb2RlO2Zvcih2YXIgdT1hLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIitvKSsnXVt0eXBlPSJyYWRpbyJdJyksZD0wO2Q8dS5sZW5ndGg7ZCsrKXt2YXIgZj11W2RdO2lmKGYhPT1pJiZmLmZvcm09PT1pLmZvcm0pe3ZhciBoPWwuZ2V0SW5zdGFuY2VGcm9tTm9kZShmKTtoP3ZvaWQgMDpwKCExKSxjLmFzYXAocixoKX19fXJldHVybiBufXZhciBpPWUoMTY1KSxhPWUoMTQpLHU9ZSgxMSkscz1lKDI0KSxsPWUoNDApLGM9ZSg5MCkscD1lKDE1NCksZD0oZSgxNjQpLHtnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCkscj1zLmdldENoZWNrZWQodCksbz1pKHt0eXBlOnZvaWQgMH0sYS5nZXROYXRpdmVQcm9wcyhlLHQpLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTpudWxsIT1uP246ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxjaGVja2VkOm51bGwhPXI/cjplLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSk7cmV0dXJuIG99LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlO2UuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZHx8ITEsaW5pdGlhbFZhbHVlOm51bGwhPW4/bjpudWxsLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdlOm8uYmluZChlKX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj10LmNoZWNrZWQ7bnVsbCE9biYmdS5zZXRWYWx1ZUZvclByb3BlcnR5KGwuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwiY2hlY2tlZCIsbnx8ITEpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9ciYmdS5zZXRWYWx1ZUZvclByb3BlcnR5KGwuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwidmFsdWUiLCIiK3IpfX0pO3QuZXhwb3J0cz1kfSx7MTE6MTEsMTQ6MTQsMTU0OjE1NCwxNjQ6MTY0LDE2NToxNjUsMjQ6MjQsNDA6NDAsOTA6OTB9XSw0ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQyKTt0LmV4cG9ydHM9e2RlYnVnVG9vbDpyfX0sezQyOjQyfV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgyOSksaT1lKDQwKSxhPWUoNTApLHU9KGUoMTY0KSx7bW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsO2lmKG51bGwhPW4pe3ZhciBvPW47Im9wdGdyb3VwIj09PW8uX3RhZyYmKG89by5fbmF0aXZlUGFyZW50KSxudWxsIT1vJiYic2VsZWN0Ij09PW8uX3RhZyYmKHI9YS5nZXRTZWxlY3RWYWx1ZUNvbnRleHQobykpfXZhciBpPW51bGw7aWYobnVsbCE9cilpZihpPSExLEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgdT0wO3U8ci5sZW5ndGg7dSsrKWlmKCIiK3JbdV09PSIiK3QudmFsdWUpe2k9ITA7YnJlYWt9fWVsc2UgaT0iIityPT0iIit0LnZhbHVlO2UuX3dyYXBwZXJTdGF0ZT17c2VsZWN0ZWQ6aX19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7aWYobnVsbCE9dC52YWx1ZSl7dmFyIG49aS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO24uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsdC52YWx1ZSl9fSxnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPXIoe3NlbGVjdGVkOnZvaWQgMCxjaGlsZHJlbjp2b2lkIDB9LHQpO251bGwhPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCYmKG4uc2VsZWN0ZWQ9ZS5fd3JhcHBlclN0YXRlLnNlbGVjdGVkKTt2YXIgaT0iIjtyZXR1cm4gby5mb3JFYWNoKHQuY2hpbGRyZW4sZnVuY3Rpb24oZSl7bnVsbCE9ZSYmKCJzdHJpbmciIT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlfHwoaSs9ZSkpfSksaSYmKG4uY2hpbGRyZW49aSksbn19KTt0LmV4cG9ydHM9dX0sezE2NDoxNjQsMTY1OjE2NSwyOToyOSw0MDo0MCw1MDo1MH1dLDUwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZih0aGlzLl9yb290Tm9kZUlEJiZ0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSl7dGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITE7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsdD1zLmdldFZhbHVlKGUpO251bGwhPXQmJm8odGhpcyxCb29sZWFuKGUubXVsdGlwbGUpLHQpfX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgcixvLGk9bC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLm9wdGlvbnM7aWYodCl7Zm9yKHI9e30sbz0wO288bi5sZW5ndGg7bysrKXJbIiIrbltvXV09ITA7Zm9yKG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9ci5oYXNPd25Qcm9wZXJ0eShpW29dLnZhbHVlKTtpW29dLnNlbGVjdGVkIT09YSYmKGlbb10uc2VsZWN0ZWQ9YSl9fWVsc2V7Zm9yKHI9IiIrbixvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS52YWx1ZT09PXIpcmV0dXJuIHZvaWQoaVtvXS5zZWxlY3RlZD0hMCk7aS5sZW5ndGgmJihpWzBdLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaShlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIHRoaXMuX3Jvb3ROb2RlSUQmJih0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMCksYy5hc2FwKHIsdGhpcyksbn12YXIgYT1lKDE2NSksdT1lKDE0KSxzPWUoMjQpLGw9ZSg0MCksYz1lKDkwKSxwPShlKDE2NCksITEpLGQ9e2dldE5hdGl2ZVByb3BzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoe30sdS5nZXROYXRpdmVQcm9wcyhlLHQpLHtvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2UsdmFsdWU6dm9pZCAwfSl9LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0YXRlPXtwZW5kaW5nVXBkYXRlOiExLGluaXRpYWxWYWx1ZTpudWxsIT1uP246dC5kZWZhdWx0VmFsdWUsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6aS5iaW5kKGUpLHdhc011bHRpcGxlOkJvb2xlYW4odC5tdWx0aXBsZSl9LHZvaWQgMD09PXQudmFsdWV8fHZvaWQgMD09PXQuZGVmYXVsdFZhbHVlfHxwfHwocD0hMCl9LGdldFNlbGVjdFZhbHVlQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0scG9zdFVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZT12b2lkIDA7dmFyIG49ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2UuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT1Cb29sZWFuKHQubXVsdGlwbGUpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9cj8oZS5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITEsbyhlLEJvb2xlYW4odC5tdWx0aXBsZSkscikpOm4hPT1Cb29sZWFuKHQubXVsdGlwbGUpJiYobnVsbCE9dC5kZWZhdWx0VmFsdWU/byhlLEJvb2xlYW4odC5tdWx0aXBsZSksdC5kZWZhdWx0VmFsdWUpOm8oZSxCb29sZWFuKHQubXVsdGlwbGUpLHQubXVsdGlwbGU/W106IiIpKX19O3QuZXhwb3J0cz1kfSx7MTQ6MTQsMTY0OjE2NCwxNjU6MTY1LDI0OjI0LDQwOjQwLDkwOjkwfV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gZT09PW4mJnQ9PT1yfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZG9jdW1lbnQuc2VsZWN0aW9uLG49dC5jcmVhdGVSYW5nZSgpLHI9bi50ZXh0Lmxlbmd0aCxvPW4uZHVwbGljYXRlKCk7by5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0IixuKTt2YXIgaT1vLnRleHQubGVuZ3RoLGE9aStyO3JldHVybntzdGFydDppLGVuZDphfX1mdW5jdGlvbiBpKGUpe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZighdHx8MD09PXQucmFuZ2VDb3VudClyZXR1cm4gbnVsbDt2YXIgbj10LmFuY2hvck5vZGUsbz10LmFuY2hvck9mZnNldCxpPXQuZm9jdXNOb2RlLGE9dC5mb2N1c09mZnNldCx1PXQuZ2V0UmFuZ2VBdCgwKTt0cnl7dS5zdGFydENvbnRhaW5lci5ub2RlVHlwZSx1LmVuZENvbnRhaW5lci5ub2RlVHlwZX1jYXRjaChzKXtyZXR1cm4gbnVsbH12YXIgbD1yKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNldCx0LmZvY3VzTm9kZSx0LmZvY3VzT2Zmc2V0KSxjPWw/MDp1LnRvU3RyaW5nKCkubGVuZ3RoLHA9dS5jbG9uZVJhbmdlKCk7cC5zZWxlY3ROb2RlQ29udGVudHMoZSkscC5zZXRFbmQodS5zdGFydENvbnRhaW5lcix1LnN0YXJ0T2Zmc2V0KTt2YXIgZD1yKHAuc3RhcnRDb250YWluZXIscC5zdGFydE9mZnNldCxwLmVuZENvbnRhaW5lcixwLmVuZE9mZnNldCksZj1kPzA6cC50b1N0cmluZygpLmxlbmd0aCxoPWYrYyx2PWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7di5zZXRTdGFydChuLG8pLHYuc2V0RW5kKGksYSk7dmFyIG09di5jb2xsYXBzZWQ7cmV0dXJue3N0YXJ0Om0/aDpmLGVuZDptP2Y6aH19ZnVuY3Rpb24gYShlLHQpe3ZhciBuLHIsbz1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5kdXBsaWNhdGUoKTt2b2lkIDA9PT10LmVuZD8obj10LnN0YXJ0LHI9bik6dC5zdGFydD50LmVuZD8obj10LmVuZCxyPXQuc3RhcnQpOihuPXQuc3RhcnQscj10LmVuZCksby5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0IixvKSxvLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxvLnNlbGVjdCgpfWZ1bmN0aW9uIHUoZSx0KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCkscj1lW2MoKV0ubGVuZ3RoLG89TWF0aC5taW4odC5zdGFydCxyKSxpPXZvaWQgMD09PXQuZW5kP286TWF0aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZvPmkpe3ZhciBhPWk7aT1vLG89YX12YXIgdT1sKGUsbykscz1sKGUsaSk7aWYodSYmcyl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KHUubm9kZSx1Lm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxvPmk/KG4uYWRkUmFuZ2UocCksbi5leHRlbmQocy5ub2RlLHMub2Zmc2V0KSk6KHAuc2V0RW5kKHMubm9kZSxzLm9mZnNldCksbi5hZGRSYW5nZShwKSl9fX12YXIgcz1lKDE0MCksbD1lKDEyNSksYz1lKDEyNikscD1zLmNhblVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdpbmRvdyksZD17Z2V0T2Zmc2V0czpwP286aSxzZXRPZmZzZXRzOnA/YTp1fTt0LmV4cG9ydHM9ZH0sezEyNToxMjUsMTI2OjEyNiwxNDA6MTQwfV0sNTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg1OSksbz1lKDg2KSxpPWUoOTEpO3IuaW5qZWN0KCk7dmFyIGE9e3JlbmRlclRvU3RyaW5nOm8ucmVuZGVyVG9TdHJpbmcscmVuZGVyVG9TdGF0aWNNYXJrdXA6by5yZW5kZXJUb1N0YXRpY01hcmt1cCx2ZXJzaW9uOml9O3QuZXhwb3J0cz1hfSx7NTk6NTksODY6ODYsOTE6OTF9XSw1MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2NSksbz1lKDcpLGk9ZSg4KSxhPWUoNDApLHU9KGUoNzApLGUoMTE1KSkscz1lKDE1NCksbD0oZSgxMzgpLGZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fc3RyaW5nVGV4dD0iIitlLHRoaXMuX25hdGl2ZU5vZGU9bnVsbCx0aGlzLl9uYXRpdmVQYXJlbnQ9bnVsbCx0aGlzLl9kb21JRD1udWxsLHRoaXMuX21vdW50SW5kZXg9MCx0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1lbnROb2Rlcz1udWxsfSk7cihsLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bi5faWRDb3VudGVyKysscz0iIHJlYWN0LXRleHQ6ICIrbysiICIsbD0iIC9yZWFjdC10ZXh0ICI7aWYodGhpcy5fZG9tSUQ9byx0aGlzLl9uYXRpdmVQYXJlbnQ9dCxlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBjPW4uX293bmVyRG9jdW1lbnQscD1jLmNyZWF0ZUNvbW1lbnQocyksZD1jLmNyZWF0ZUNvbW1lbnQobCksZj1pKGMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyZXR1cm4gaS5xdWV1ZUNoaWxkKGYsaShwKSksdGhpcy5fc3RyaW5nVGV4dCYmaS5xdWV1ZUNoaWxkKGYsaShjLmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSksaS5xdWV1ZUNoaWxkKGYsaShkKSksYS5wcmVjYWNoZU5vZGUodGhpcyxwKSx0aGlzLl9jbG9zaW5nQ29tbWVudD1kLGZ9dmFyIGg9dSh0aGlzLl9zdHJpbmdUZXh0KTtyZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9oOiI8IS0tIitzKyItLT4iK2grIjwhLS0iK2wrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXtpZihlIT09dGhpcy5fY3VycmVudEVsZW1lbnQpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWU7dmFyIG49IiIrZTtpZihuIT09dGhpcy5fc3RyaW5nVGV4dCl7dGhpcy5fc3RyaW5nVGV4dD1uO3ZhciByPXRoaXMuZ2V0TmF0aXZlTm9kZSgpO28ucmVwbGFjZURlbGltaXRlZFRleHQoclswXSxyWzFdLG4pfX19LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21tZW50Tm9kZXM7aWYoZSlyZXR1cm4gZTtpZighdGhpcy5fY2xvc2luZ0NvbW1lbnQpZm9yKHZhciB0PWEuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxuPXQubmV4dFNpYmxpbmc7Oyl7aWYobnVsbD09bj9zKCExKTp2b2lkIDAsOD09PW4ubm9kZVR5cGUmJiIgL3JlYWN0LXRleHQgIj09PW4ubm9kZVZhbHVlKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1uO2JyZWFrfW49bi5uZXh0U2libGluZ31yZXR1cm4gZT1bdGhpcy5fbmF0aXZlTm9kZSx0aGlzLl9jbG9zaW5nQ29tbWVudF0sdGhpcy5fY29tbWVudE5vZGVzPWUsZX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW51bGwsdGhpcy5fY29tbWVudE5vZGVzPW51bGwsYS51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9bH0sezExNToxMTUsMTM4OjEzOCwxNTQ6MTU0LDE2NToxNjUsNDA6NDAsNzo3LDcwOjcwLDg6OH1dLDU0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt0aGlzLl9yb290Tm9kZUlEJiZkLnVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIGMuYXNhcChyLHRoaXMpLG59dmFyIGk9ZSgxNjUpLGE9ZSgxNCksdT1lKDExKSxzPWUoMjQpLGw9ZSg0MCksYz1lKDkwKSxwPWUoMTU0KSxkPShlKDE2NCkse2dldE5hdGl2ZVByb3BzOmZ1bmN0aW9uKGUsdCl7bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTD9wKCExKTp2b2lkIDA7dmFyIG49aSh7fSxhLmdldE5hdGl2ZVByb3BzKGUsdCkse2RlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoaWxkcmVuOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSk7cmV0dXJuIG59LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlLHI9dC5jaGlsZHJlbjtudWxsIT1yJiYobnVsbCE9bj9wKCExKTp2b2lkIDAsQXJyYXkuaXNBcnJheShyKSYmKHIubGVuZ3RoPD0xP3ZvaWQgMDpwKCExKSxyPXJbMF0pLG49IiIrciksbnVsbD09biYmKG49IiIpO3ZhciBpPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6IiIrKG51bGwhPWk/aTpuKSxsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpvLmJpbmQoZSl9fSx1cGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49cy5nZXRWYWx1ZSh0KTtudWxsIT1uJiZ1LnNldFZhbHVlRm9yUHJvcGVydHkobC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLCJ2YWx1ZSIsIiIrbil9fSk7dC5leHBvcnRzPWR9LHsxMToxMSwxNDoxNCwxNTQ6MTU0LDE2NDoxNjQsMTY1OjE2NSwyNDoyNCw0MDo0MCw5MDo5MH1dLDU1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXsiX25hdGl2ZU5vZGUiaW4gZT92b2lkIDA6cyghMSksIl9uYXRpdmVOb2RlImluIHQ/dm9pZCAwOnMoITEpO2Zvcih2YXIgbj0wLHI9ZTtyO3I9ci5fbmF0aXZlUGFyZW50KW4rKztmb3IodmFyIG89MCxpPXQ7aTtpPWkuX25hdGl2ZVBhcmVudClvKys7Zm9yKDtuLW8+MDspZT1lLl9uYXRpdmVQYXJlbnQsbi0tO2Zvcig7by1uPjA7KXQ9dC5fbmF0aXZlUGFyZW50LG8tLTtmb3IodmFyIGE9bjthLS07KXtpZihlPT09dClyZXR1cm4gZTtlPWUuX25hdGl2ZVBhcmVudCx0PXQuX25hdGl2ZVBhcmVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBvKGUsdCl7Il9uYXRpdmVOb2RlImluIGU/dm9pZCAwOnMoITEpLCJfbmF0aXZlTm9kZSJpbiB0P3ZvaWQgMDpzKCExKTtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQuX25hdGl2ZVBhcmVudH1yZXR1cm4hMX1mdW5jdGlvbiBpKGUpe3JldHVybiJfbmF0aXZlTm9kZSJpbiBlP3ZvaWQgMDpzKCExKSxlLl9uYXRpdmVQYXJlbnR9ZnVuY3Rpb24gYShlLHQsbil7Zm9yKHZhciByPVtdO2U7KXIucHVzaChlKSxlPWUuX25hdGl2ZVBhcmVudDt2YXIgbztmb3Iobz1yLmxlbmd0aDtvLS0gPjA7KXQocltvXSwhMSxuKTtmb3Iobz0wO288ci5sZW5ndGg7bysrKXQocltvXSwhMCxuKX1mdW5jdGlvbiB1KGUsdCxuLG8saSl7Zm9yKHZhciBhPWUmJnQ/cihlLHQpOm51bGwsdT1bXTtlJiZlIT09YTspdS5wdXNoKGUpLGU9ZS5fbmF0aXZlUGFyZW50O2Zvcih2YXIgcz1bXTt0JiZ0IT09YTspcy5wdXNoKHQpLHQ9dC5fbmF0aXZlUGFyZW50O3ZhciBsO2ZvcihsPTA7bDx1Lmxlbmd0aDtsKyspbih1W2xdLCEwLG8pO2ZvcihsPXMubGVuZ3RoO2wtLSA+MDspbihzW2xdLCExLGkpfXZhciBzPWUoMTU0KTt0LmV4cG9ydHM9e2lzQW5jZXN0b3I6byxnZXRMb3dlc3RDb21tb25BbmNlc3RvcjpyLGdldFBhcmVudEluc3RhbmNlOmksdHJhdmVyc2VUd29QaGFzZTphLHRyYXZlcnNlRW50ZXJMZWF2ZTp1fX0sezE1NDoxNTR9XSw1NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPShlKDEwKSxlKDE4KSxlKDE2NCkse29uQ3JlYXRlTWFya3VwRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXtyKGUpfSxvblNldFZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe3IodCl9LG9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IodCl9fSk7dC5leHBvcnRzPW99LHsxMDoxMCwxNjQ6MTY0LDE4OjE4fV0sNTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyLG8saSl7fWZ1bmN0aW9uIG8oZSl7fXZhciBpPShlKDE0MCksZSgxNjIpLGUoMTY0KSxbXSksYT17YWRkRGV2dG9vbDpmdW5jdGlvbihlKXtpLnB1c2goZSl9LHJlbW92ZURldnRvb2w6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxpLmxlbmd0aDt0KyspaVt0XT09PWUmJihpLnNwbGljZSh0LDEpLHQtLSl9LGJlZ2luUHJvZmlsaW5nOmZ1bmN0aW9uKCl7fSxlbmRQcm9maWxpbmc6ZnVuY3Rpb24oKXt9LGdldEZsdXNoSGlzdG9yeTpmdW5jdGlvbigpe30sb25CZWdpbkZsdXNoOmZ1bmN0aW9uKCl7cigib25CZWdpbkZsdXNoIil9LG9uRW5kRmx1c2g6ZnVuY3Rpb24oKXtyKCJvbkVuZEZsdXNoIil9LG9uQmVnaW5MaWZlQ3ljbGVUaW1lcjpmdW5jdGlvbihlLHQpe28oZSkscigib25CZWdpbkxpZmVDeWNsZVRpbWVyIixlLHQpfSxvbkVuZExpZmVDeWNsZVRpbWVyOmZ1bmN0aW9uKGUsdCl7byhlKSxyKCJvbkVuZExpZmVDeWNsZVRpbWVyIixlLHQpfSxvbkJlZ2luUmVjb25jaWxlclRpbWVyOmZ1bmN0aW9uKGUsdCl7byhlKSxyKCJvbkJlZ2luUmVjb25jaWxlclRpbWVyIixlLHQpfSxvbkVuZFJlY29uY2lsZXJUaW1lcjpmdW5jdGlvbihlLHQpe28oZSkscigib25FbmRSZWNvbmNpbGVyVGltZXIiLGUsdCl9LG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKCl7cigib25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQiKX0sb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKCl7cigib25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Iil9LG9uTmF0aXZlT3BlcmF0aW9uOmZ1bmN0aW9uKGUsdCxuKXtvKGUpLHIoIm9uTmF0aXZlT3BlcmF0aW9uIixlLHQsbil9LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXtyKCJvblNldFN0YXRlIil9LG9uU2V0RGlzcGxheU5hbWU6ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0RGlzcGxheU5hbWUiLGUsdCl9LG9uU2V0Q2hpbGRyZW46ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0Q2hpbGRyZW4iLGUsdCl9LG9uU2V0T3duZXI6ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0T3duZXIiLGUsdCl9LG9uU2V0VGV4dDpmdW5jdGlvbihlLHQpe28oZSkscigib25TZXRUZXh0IixlLHQpfSxvbk1vdW50Um9vdENvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uTW91bnRSb290Q29tcG9uZW50IixlKX0sb25Nb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uTW91bnRDb21wb25lbnQiLGUpfSxvblVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uVXBkYXRlQ29tcG9uZW50IixlKX0sb25Vbm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe28oZSkscigib25Vbm1vdW50Q29tcG9uZW50IixlKX19O3QuZXhwb3J0cz1hfSx7MTQwOjE0MCwxNjI6MTYyLDE2NDoxNjR9XSw1ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpfXZhciBvPWUoMTY1KSxpPWUoOTApLGE9ZSgxMDgpLHU9ZSgxNDYpLHM9e2luaXRpYWxpemU6dSxjbG9zZTpmdW5jdGlvbigpe2QuaXNCYXRjaGluZ1VwZGF0ZXM9ITF9fSxsPXtpbml0aWFsaXplOnUsY2xvc2U6aS5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQoaSl9LGM9W2wsc107byhyLnByb3RvdHlwZSxhLk1peGluLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSk7dmFyIHA9bmV3IHIsZD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhPWQuaXNCYXRjaGluZ1VwZGF0ZXM7ZC5pc0JhdGNoaW5nVXBkYXRlcz0hMCxhP2UodCxuLHIsbyxpKTpwLnBlcmZvcm0oZSxudWxsLHQsbixyLG8saSl9fTt0LmV4cG9ydHM9ZH0sezEwODoxMDgsMTQ2OjE0NiwxNjU6MTY1LDkwOjkwfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe0V8fChFPSEwLGcuRXZlbnRFbWl0dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcihtKSxnLkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luT3JkZXIoYSksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUocCksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoZiksZy5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoe1NpbXBsZUV2ZW50UGx1Z2luOl8sRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOnUsQ2hhbmdlRXZlbnRQbHVnaW46aSxTZWxlY3RFdmVudFBsdWdpbjpiLEJlZm9yZUlucHV0RXZlbnRQbHVnaW46b30pLGcuTmF0aXZlQ29tcG9uZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhjKSxnLk5hdGl2ZUNvbXBvbmVudC5pbmplY3RUZXh0Q29tcG9uZW50Q2xhc3MoaCksZy5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhzKSxnLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEMpLGcuRW1wdHlDb21wb25lbnQuaW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZChlKX0pLGcuVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbih5KSxnLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneSh2KSxnLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChsKSl9dmFyIG89ZSgyKSxpPWUoNiksYT1lKDEzKSx1PWUoMTUpLHM9ZSgyMiksbD1lKDMyKSxjPWUoMzgpLHA9ZSg0MCksZD1lKDQzKSxmPWUoNTUpLGg9ZSg1Myksdj1lKDU4KSxtPWUoNjUpLGc9ZSg2NykseT1lKDgyKSxDPWUoOTIpLGI9ZSg5MyksXz1lKDk0KSxFPSExO3QuZXhwb3J0cz17aW5qZWN0OnJ9fSx7MTM6MTMsMTU6MTUsMjoyLDIyOjIyLDMyOjMyLDM4OjM4LDQwOjQwLDQzOjQzLDUzOjUzLDU1OjU1LDU4OjU4LDY6Niw2NTo2NSw2Nzo2Nyw4Mjo4Miw5Mjo5Miw5Mzo5Myw5NDo5NH1dLDYwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTY1KSxvPWUoMzUpLGk9KGUoMTY0KSxlKDExMiksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sWyJmb3IiXSYmU3ltYm9sWyJmb3IiXSgicmVhY3QuZWxlbWVudCIpfHw2MDEwMyksYT17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9LHU9ZnVuY3Rpb24oZSx0LG4scixvLGEsdSl7dmFyIHM9eyQkdHlwZW9mOmksdHlwZTplLGtleTp0LHJlZjpuLHByb3BzOnUsX293bmVyOmF9O3JldHVybiBzfTt1LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9e30scz1udWxsLGw9bnVsbCxjPW51bGwscD1udWxsO2lmKG51bGwhPXQpe2w9dm9pZCAwPT09dC5yZWY/bnVsbDp0LnJlZixzPXZvaWQgMD09PXQua2V5P251bGw6IiIrdC5rZXksYz12b2lkIDA9PT10Ll9fc2VsZj9udWxsOnQuX19zZWxmLHA9dm9pZCAwPT09dC5fX3NvdXJjZT9udWxsOnQuX19zb3VyY2U7Zm9yKHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYhYS5oYXNPd25Qcm9wZXJ0eShyKSYmKGlbcl09dFtyXSl9dmFyIGQ9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1kKWkuY2hpbGRyZW49bjtlbHNlIGlmKGQ+MSl7Zm9yKHZhciBmPUFycmF5KGQpLGg9MDtkPmg7aCsrKWZbaF09YXJndW1lbnRzW2grMl07aS5jaGlsZHJlbj1mfWlmKGUmJmUuZGVmYXVsdFByb3BzKXt2YXIgdj1lLmRlZmF1bHRQcm9wcztmb3IociBpbiB2KXZvaWQgMD09PWlbcl0mJihpW3JdPXZbcl0pfXJldHVybiB1KGUscyxsLGMscCxvLmN1cnJlbnQsaSl9LHUuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD11LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLGUpO3JldHVybiB0LnR5cGU9ZSx0fSx1LmNsb25lQW5kUmVwbGFjZUtleT1mdW5jdGlvbihlLHQpe3ZhciBuPXUoZS50eXBlLHQsZS5yZWYsZS5fc2VsZixlLl9zb3VyY2UsZS5fb3duZXIsZS5wcm9wcyk7cmV0dXJuIG59LHUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzPXIoe30sZS5wcm9wcyksbD1lLmtleSxjPWUucmVmLHA9ZS5fc2VsZixkPWUuX3NvdXJjZSxmPWUuX293bmVyO2lmKG51bGwhPXQpe3ZvaWQgMCE9PXQucmVmJiYoYz10LnJlZixmPW8uY3VycmVudCksdm9pZCAwIT09dC5rZXkmJihsPSIiK3Qua2V5KTt2YXIgaDtlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMmJihoPWUudHlwZS5kZWZhdWx0UHJvcHMpO2ZvcihpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmIWEuaGFzT3duUHJvcGVydHkoaSkmJih2b2lkIDA9PT10W2ldJiZ2b2lkIDAhPT1oP3NbaV09aFtpXTpzW2ldPXRbaV0pfXZhciB2PWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09dilzLmNoaWxkcmVuPW47ZWxzZSBpZih2PjEpe2Zvcih2YXIgbT1BcnJheSh2KSxnPTA7dj5nO2crKyltW2ddPWFyZ3VtZW50c1tnKzJdO3MuY2hpbGRyZW49bX1yZXR1cm4gdShlLnR5cGUsbCxjLHAsZCxmLHMpfSx1LmlzVmFsaWRFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJmUuJCR0eXBlb2Y9PT1pfSx0LmV4cG9ydHM9dX0sezExMjoxMTIsMTY0OjE2NCwxNjU6MTY1LDM1OjM1fV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHAuY3VycmVudCl7dmFyIGU9cC5jdXJyZW50LmdldE5hbWUoKTtpZihlKXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrZSsiYC4ifXJldHVybiIifWZ1bmN0aW9uIG8oZSx0KXtlLl9zdG9yZSYmIWUuX3N0b3JlLnZhbGlkYXRlZCYmbnVsbD09ZS5rZXkmJihlLl9zdG9yZS52YWxpZGF0ZWQ9ITAsaSgidW5pcXVlS2V5IixlLHQpKX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgbz1yKCk7aWYoIW8pe3ZhciBpPSJzdHJpbmciPT10eXBlb2Ygbj9uOm4uZGlzcGxheU5hbWV8fG4ubmFtZTtpJiYobz0iIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCIraSsiPi4iKX12YXIgYT1oW2VdfHwoaFtlXT17fSk7aWYoYVtvXSlyZXR1cm4gbnVsbDthW29dPSEwO3ZhciB1PXtwYXJlbnRPck93bmVyOm8sdXJsOiIgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsY2hpbGRPd25lcjpudWxsfTtyZXR1cm4gdCYmdC5fb3duZXImJnQuX293bmVyIT09cC5jdXJyZW50JiYodS5jaGlsZE93bmVyPSIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gIit0Ll9vd25lci5nZXROYW1lKCkrIi4iKSx1fWZ1bmN0aW9uIGEoZSx0KXtpZigib2JqZWN0Ij09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtsLmlzVmFsaWRFbGVtZW50KHIpJiZvKHIsdCl9ZWxzZSBpZihsLmlzVmFsaWRFbGVtZW50KGUpKWUuX3N0b3JlJiYoZS5fc3RvcmUudmFsaWRhdGVkPSEwKTtlbHNlIGlmKGUpe3ZhciBpPWQoZSk7aWYoaSYmaSE9PWUuZW50cmllcylmb3IodmFyIGEsdT1pLmNhbGwoZSk7IShhPXUubmV4dCgpKS5kb25lOylsLmlzVmFsaWRFbGVtZW50KGEudmFsdWUpJiZvKGEudmFsdWUsdCl9fWZ1bmN0aW9uIHUoZSx0LG4sbyl7Zm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIGE7dHJ5eyJmdW5jdGlvbiIhPXR5cGVvZiB0W2ldP2YoITEpOnZvaWQgMCxhPXRbaV0obixpLGUsbyl9Y2F0Y2godSl7YT11fWEgaW5zdGFuY2VvZiBFcnJvciYmIShhLm1lc3NhZ2UgaW4gdikmJih2W2EubWVzc2FnZV09ITAscigpKX19ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnR5cGU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpe3ZhciBuPXQuZGlzcGxheU5hbWV8fHQubmFtZTt0LnByb3BUeXBlcyYmdShuLHQucHJvcFR5cGVzLGUucHJvcHMsYy5wcm9wKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXREZWZhdWx0UHJvcHN9fXZhciBsPWUoNjApLGM9ZSg4MCkscD0oZSg3OSksZSgzNSkpLGQ9KGUoMTEyKSxlKDEyMykpLGY9ZSgxNTQpLGg9KGUoMTY0KSx7fSksdj17fSxtPXtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLG89bC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihudWxsPT1vKXJldHVybiBvO2lmKHIpZm9yKHZhciBpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2krKylhKGFyZ3VtZW50c1tpXSxlKTtyZXR1cm4gcyhvKSxvfSxjcmVhdGVGYWN0b3J5OmZ1bmN0aW9uKGUpe3ZhciB0PW0uY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9LGNsb25lRWxlbWVudDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPWwuY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPTI7bzxhcmd1bWVudHMubGVuZ3RoO28rKylhKGFyZ3VtZW50c1tvXSxyLnR5cGUpO3JldHVybiBzKHIpLHJ9fTt0LmV4cG9ydHM9bX0sezExMjoxMTIsMTIzOjEyMywxNTQ6MTU0LDE2NDoxNjQsMzU6MzUsNjA6NjAsNzk6NzksODA6ODB9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPXtpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6ZnVuY3Rpb24oZSl7cj1lfX0saT17Y3JlYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByKGUpfX07aS5pbmplY3Rpb249byx0LmV4cG9ydHM9aX0se31dLDYzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7dHJ5e3JldHVybiB0KG4scil9Y2F0Y2goaSl7cmV0dXJuIHZvaWQobnVsbD09PW8mJihvPWkpKX19dmFyIG89bnVsbCxpPXtpbnZva2VHdWFyZGVkQ2FsbGJhY2s6cixpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6cixyZXRocm93Q2F1Z2h0RXJyb3I6ZnVuY3Rpb24oKXtpZihvKXt2YXIgZT1vO3Rocm93IG89bnVsbCxlfX19O3QuZXhwb3J0cz1pfSx7fV0sNjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtvLmVucXVldWVFdmVudHMoZSksby5wcm9jZXNzRXZlbnRRdWV1ZSghMSl9dmFyIG89ZSgxNyksaT17aGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9by5leHRyYWN0RXZlbnRzKGUsdCxuLGkpO3IoYSl9fTt0LmV4cG9ydHM9aX0sezE3OjE3fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UuX25hdGl2ZVBhcmVudDspZT1lLl9uYXRpdmVQYXJlbnQ7dmFyIHQ9cC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLG49dC5wYXJlbnROb2RlO3JldHVybiBwLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG4pfWZ1bmN0aW9uIG8oZSx0KXt0aGlzLnRvcExldmVsVHlwZT1lLHRoaXMubmF0aXZlRXZlbnQ9dCx0aGlzLmFuY2VzdG9ycz1bXX1mdW5jdGlvbiBpKGUpe3ZhciB0PWYoZS5uYXRpdmVFdmVudCksbj1wLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHQpLG89bjtkbyBlLmFuY2VzdG9ycy5wdXNoKG8pLG89byYmcihvKTt3aGlsZShvKTtmb3IodmFyIGk9MDtpPGUuYW5jZXN0b3JzLmxlbmd0aDtpKyspbj1lLmFuY2VzdG9yc1tpXSx2Ll9oYW5kbGVUb3BMZXZlbChlLnRvcExldmVsVHlwZSxuLGUubmF0aXZlRXZlbnQsZihlLm5hdGl2ZUV2ZW50KSl9ZnVuY3Rpb24gYShlKXt2YXIgdD1oKHdpbmRvdyk7ZSh0KX12YXIgdT1lKDE2NSkscz1lKDEzOSksbD1lKDE0MCksYz1lKDI1KSxwPWUoNDApLGQ9ZSg5MCksZj1lKDEyMiksaD1lKDE1MSk7dShvLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMudG9wTGV2ZWxUeXBlPW51bGwsdGhpcy5uYXRpdmVFdmVudD1udWxsLHRoaXMuYW5jZXN0b3JzLmxlbmd0aD0wfX0pLGMuYWRkUG9vbGluZ1RvKG8sYy50d29Bcmd1bWVudFBvb2xlcik7dmFyIHY9e19lbmFibGVkOiEwLF9oYW5kbGVUb3BMZXZlbDpudWxsLFdJTkRPV19IQU5ETEU6bC5jYW5Vc2VET00/d2luZG93Om51bGwsc2V0SGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSl7di5faGFuZGxlVG9wTGV2ZWw9ZX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXt2Ll9lbmFibGVkPSEhZX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHYuX2VuYWJsZWR9LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW47cmV0dXJuIHI/cy5saXN0ZW4ocix0LHYuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsZSkpOm51bGx9LHRyYXBDYXB0dXJlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uO3JldHVybiByP3MuY2FwdHVyZShyLHQsdi5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sbW9uaXRvclNjcm9sbFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWEuYmluZChudWxsLGUpO3MubGlzdGVuKHdpbmRvdywic2Nyb2xsIix0KX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihlLHQpe2lmKHYuX2VuYWJsZWQpe3ZhciBuPW8uZ2V0UG9vbGVkKGUsdCk7dHJ5e2QuYmF0Y2hlZFVwZGF0ZXMoaSxuKX1maW5hbGx5e28ucmVsZWFzZShuKX19fX07dC5leHBvcnRzPXZ9LHsxMjI6MTIyLDEzOToxMzksMTQwOjE0MCwxNTE6MTUxLDE2NToxNjUsMjU6MjUsNDA6NDAsOTA6OTB9XSw2NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17bG9nVG9wTGV2ZWxSZW5kZXJzOiExfTt0LmV4cG9ydHM9cn0se31dLDY3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTApLG89ZSgxNyksaT1lKDE5KSxhPWUoMzMpLHU9ZSgzMCkscz1lKDYyKSxsPWUoMjcpLGM9ZSg3NSkscD1lKDkwKSxkPXtDb21wb25lbnQ6YS5pbmplY3Rpb24sQ2xhc3M6dS5pbmplY3Rpb24sRE9NUHJvcGVydHk6ci5pbmplY3Rpb24sRW1wdHlDb21wb25lbnQ6cy5pbmplY3Rpb24sRXZlbnRQbHVnaW5IdWI6by5pbmplY3Rpb24sRXZlbnRQbHVnaW5VdGlsczppLmluamVjdGlvbixFdmVudEVtaXR0ZXI6bC5pbmplY3Rpb24sTmF0aXZlQ29tcG9uZW50OmMuaW5qZWN0aW9uLFVwZGF0ZXM6cC5pbmplY3Rpb259O3QuZXhwb3J0cz1kfSx7MTA6MTAsMTc6MTcsMTk6MTksMjc6MjcsMzA6MzAsMzM6MzMsNjI6NjIsNzU6NzUsOTA6OTB9XSw2ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBpKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlKX12YXIgbz1lKDUxKSxpPWUoMTQzKSxhPWUoMTQ4KSx1PWUoMTQ5KSxzPXtoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYoImlucHV0Ij09PXQmJiJ0ZXh0Ij09PWUudHlwZXx8InRleHRhcmVhIj09PXR8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxlKX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgZT11KCk7cmV0dXJue2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6cy5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSk/cy5nZXRTZWxlY3Rpb24oZSk6bnVsbH19LHJlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dSgpLG49ZS5mb2N1c2VkRWxlbSxvPWUuc2VsZWN0aW9uUmFuZ2U7dCE9PW4mJnIobikmJihzLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhuKSYmcy5zZXRTZWxlY3Rpb24obixvKSxhKG4pKX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXQ9e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7bi5wYXJlbnRFbGVtZW50KCk9PT1lJiYodD17c3RhcnQ6LW4ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxlbmd0aCksZW5kOi1uLm1vdmVFbmQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKX0pfWVsc2UgdD1vLmdldE9mZnNldHMoZSk7cmV0dXJuIHR8fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zdGFydCxyPXQuZW5kO2lmKHZvaWQgMD09PXImJihyPW4pLCJzZWxlY3Rpb25TdGFydCJpbiBlKWUuc2VsZWN0aW9uU3RhcnQ9bixlLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihyLGUudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGk9ZS5jcmVhdGVUZXh0UmFuZ2UoKTtpLmNvbGxhcHNlKCEwKSxpLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxpLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxpLnNlbGVjdCgpfWVsc2Ugby5zZXRPZmZzZXRzKGUsdCl9fTt0LmV4cG9ydHM9c30sezE0MzoxNDMsMTQ4OjE0OCwxNDk6MTQ5LDUxOjUxfV0sNjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3JlbW92ZTpmdW5jdGlvbihlKXtlLl9yZWFjdEludGVybmFsSW5zdGFuY2U9dm9pZCAwfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lLl9yZWFjdEludGVybmFsSW5zdGFuY2V9LHNldDpmdW5jdGlvbihlLHQpe2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT10fX07dC5leHBvcnRzPXJ9LHt9XSw3MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDU3KTt0LmV4cG9ydHM9e2RlYnVnVG9vbDpyfX0sezU3OjU3fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTEpLG89L1wvPz4vLGk9L148XCFcLVwtLyxhPXtDSEVDS1NVTV9BVFRSX05BTUU6ImRhdGEtcmVhY3QtY2hlY2tzdW0iLGFkZENoZWNrc3VtVG9NYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9cihlKTtyZXR1cm4gaS50ZXN0KGUpP2U6ZS5yZXBsYWNlKG8sIiAiK2EuQ0hFQ0tTVU1fQVRUUl9OQU1FKyc9IicrdCsnIiQmJyl9LGNhblJldXNlTWFya3VwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYS5DSEVDS1NVTV9BVFRSX05BTUUpO249biYmcGFyc2VJbnQobiwxMCk7dmFyIG89cihlKTtyZXR1cm4gbz09PW59fTt0LmV4cG9ydHM9YX0sezExMToxMTF9XSw3MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7bj5yO3IrKylpZihlLmNoYXJBdChyKSE9PXQuY2hhckF0KHIpKXJldHVybiByO3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoPy0xOm59ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT9lLm5vZGVUeXBlPT09RD9lLmRvY3VtZW50RWxlbWVudDplLmZpcnN0Q2hpbGQ6bnVsbH1mdW5jdGlvbiBpKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoTSl8fCIifWZ1bmN0aW9uIGEoZSx0LG4scixvKXt2YXIgaTtpZihDLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIGE9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsdT1hLnR5cGU7aT0iUmVhY3QgbW91bnQ6ICIrKCJzdHJpbmciPT10eXBlb2YgdT91OnUuZGlzcGxheU5hbWV8fHUubmFtZSksY29uc29sZS50aW1lKGkpfXZhciBzPV8ubW91bnRDb21wb25lbnQoZSxuLG51bGwsbShlLHQpLG8pO2kmJmNvbnNvbGUudGltZUVuZChpKSxlLl9yZW5kZXJlZENvbXBvbmVudC5fdG9wTGV2ZWxXcmFwcGVyPWUsVS5fbW91bnRJbWFnZUludG9Ob2RlKHMsdCxlLHIsbil9ZnVuY3Rpb24gdShlLHQsbixyKXt2YXIgbz14LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCFuJiZnLnVzZUNyZWF0ZUVsZW1lbnQpO28ucGVyZm9ybShhLG51bGwsZSx0LG8sbixyKSx4LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZShvKX1mdW5jdGlvbiBzKGUsdCxuKXtmb3IoXy51bm1vdW50Q29tcG9uZW50KGUsbiksdC5ub2RlVHlwZT09PUQmJih0PXQuZG9jdW1lbnRFbGVtZW50KTt0Lmxhc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0Lmxhc3RDaGlsZCl9ZnVuY3Rpb24gbChlKXt2YXIgdD1vKGUpO2lmKHQpe3ZhciBuPXYuZ2V0SW5zdGFuY2VGcm9tTm9kZSh0KTtyZXR1cm4hKCFufHwhbi5fbmF0aXZlUGFyZW50KX19ZnVuY3Rpb24gYyhlKXt2YXIgdD1vKGUpLG49dCYmdi5nZXRJbnN0YW5jZUZyb21Ob2RlKHQpO3JldHVybiBuJiYhbi5fbmF0aXZlUGFyZW50P246bnVsbH1mdW5jdGlvbiBwKGUpe3ZhciB0PWMoZSk7cmV0dXJuIHQ/dC5fbmF0aXZlQ29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyOm51bGx9dmFyIGQ9ZSg4KSxmPWUoMTApLGg9ZSgyNyksdj0oZSgzNSksZSg0MCkpLG09ZSg0MSksZz1lKDQ1KSx5PWUoNjApLEM9ZSg2NiksYj0oZSg3MCksZSg3MSkpLF89ZSg4MyksRT1lKDg5KSx4PWUoOTApLE49ZSgxNDcpLFQ9ZSgxMjgpLFA9ZSgxNTQpLHc9ZSgxMzQpLFM9ZSgxMzYpLE09KGUoMTY0KSxmLklEX0FUVFJJQlVURV9OQU1FKSxrPWYuUk9PVF9BVFRSSUJVVEVfTkFNRSxSPTEsRD05LEk9MTEsTz17fSxBPTEsTD1mdW5jdGlvbigpe3RoaXMucm9vdElEPUErK307TC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxMLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wc307dmFyIFU9e1RvcExldmVsV3JhcHBlcjpMLF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOk8sc2Nyb2xsTW9uaXRvcjpmdW5jdGlvbihlLHQpe3QoKX0sX3VwZGF0ZVJvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFUuc2Nyb2xsTW9uaXRvcihuLGZ1bmN0aW9uKCl7RS5lbnF1ZXVlRWxlbWVudEludGVybmFsKGUsdCksciYmRS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChlLHIpfSksZX0sX3JlbmRlck5ld1Jvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7IXR8fHQubm9kZVR5cGUhPT1SJiZ0Lm5vZGVUeXBlIT09RCYmdC5ub2RlVHlwZSE9PUk/UCghMSk6dm9pZCAwLGguZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nKCk7dmFyIG89VChlKTt4LmJhdGNoZWRVcGRhdGVzKHUsbyx0LG4scik7dmFyIGk9by5faW5zdGFuY2Uucm9vdElEO3JldHVybiBPW2ldPW8sb30scmVuZGVyU3VidHJlZUludG9Db250YWluZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG51bGw9PWV8fG51bGw9PWUuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT9QKCExKTp2b2lkIDAsVS5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoZSx0LG4scil9LF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXtFLnZhbGlkYXRlQ2FsbGJhY2sociwiUmVhY3RET00ucmVuZGVyIikseS5pc1ZhbGlkRWxlbWVudCh0KT92b2lkIDA6UCghMSk7dmFyIGE9eShMLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCx0KSx1PXAobik7aWYodSl7dmFyIHM9dS5fY3VycmVudEVsZW1lbnQsYz1zLnByb3BzO2lmKFMoYyx0KSl7dmFyIGQ9dS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSxmPXImJmZ1bmN0aW9uKCl7ci5jYWxsKGQpfTtyZXR1cm4gVS5fdXBkYXRlUm9vdENvbXBvbmVudCh1LGEsbixmKSxkfVUudW5tb3VudENvbXBvbmVudEF0Tm9kZShuKX12YXIgaD1vKG4pLHY9aCYmISFpKGgpLG09bChuKSxnPXYmJiF1JiYhbSxDPVUuX3JlbmRlck5ld1Jvb3RDb21wb25lbnQoYSxuLGcsbnVsbCE9ZT9lLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX3Byb2Nlc3NDaGlsZENvbnRleHQoZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlLl9jb250ZXh0KTpOKS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtyZXR1cm4gciYmci5jYWxsKEMpLEN9LHJlbmRlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFUuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsZSx0LG4pfSx1bm1vdW50Q29tcG9uZW50QXROb2RlOmZ1bmN0aW9uKGUpeyFlfHxlLm5vZGVUeXBlIT09UiYmZS5ub2RlVHlwZSE9PUQmJmUubm9kZVR5cGUhPT1JP1AoITEpOnZvaWQgMDt2YXIgdD1wKGUpO3JldHVybiB0PyhkZWxldGUgT1t0Ll9pbnN0YW5jZS5yb290SURdLHguYmF0Y2hlZFVwZGF0ZXMocyx0LGUsITEpLCEwKToobChlKSwxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoayksITEpfSxfbW91bnRJbWFnZUludG9Ob2RlOmZ1bmN0aW9uKGUsdCxuLGksYSl7aWYoIXR8fHQubm9kZVR5cGUhPT1SJiZ0Lm5vZGVUeXBlIT09RCYmdC5ub2RlVHlwZSE9PUk/UCghMSk6dm9pZCAwLGkpe3ZhciB1PW8odCk7aWYoYi5jYW5SZXVzZU1hcmt1cChlLHUpKXJldHVybiB2b2lkIHYucHJlY2FjaGVOb2RlKG4sdSk7dmFyIHM9dS5nZXRBdHRyaWJ1dGUoYi5DSEVDS1NVTV9BVFRSX05BTUUpO3UucmVtb3ZlQXR0cmlidXRlKGIuQ0hFQ0tTVU1fQVRUUl9OQU1FKTt2YXIgbD11Lm91dGVySFRNTDt1LnNldEF0dHJpYnV0ZShiLkNIRUNLU1VNX0FUVFJfTkFNRSxzKTt2YXIgYz1lLHA9cihjLGwpOyIgKGNsaWVudCkgIitjLnN1YnN0cmluZyhwLTIwLHArMjApKyJcbiAoc2VydmVyKSAiK2wuc3Vic3RyaW5nKHAtMjAscCsyMCksdC5ub2RlVHlwZT09PUQ/UCghMSk6dm9pZCAwfWlmKHQubm9kZVR5cGU9PT1EP1AoITEpOnZvaWQgMCxhLnVzZUNyZWF0ZUVsZW1lbnQpe2Zvcig7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO2QuaW5zZXJ0VHJlZUJlZm9yZSh0LGUsbnVsbCl9ZWxzZSB3KHQsZSksdi5wcmVjYWNoZU5vZGUobix0LmZpcnN0Q2hpbGQpfX07dC5leHBvcnRzPVV9LHsxMDoxMCwxMjg6MTI4LDEzNDoxMzQsMTM2OjEzNiwxNDc6MTQ3LDE1NDoxNTQsMTY0OjE2NCwyNzoyNywzNTozNSw0MDo0MCw0MTo0MSw0NTo0NSw2MDo2MCw2Njo2Niw3MDo3MCw3MTo3MSw4OjgsODM6ODMsODk6ODksOTA6OTB9XSw3MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtyZXR1cm57dHlwZTpwLklOU0VSVF9NQVJLVVAsY29udGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBvKGUsdCxuKXtyZXR1cm57dHlwZTpwLk1PVkVfRVhJU1RJTkcsY29udGVudDpudWxsLGZyb21JbmRleDplLl9tb3VudEluZGV4LGZyb21Ob2RlOmQuZ2V0TmF0aXZlTm9kZShlKSx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm57dHlwZTpwLlJFTU9WRV9OT0RFLGNvbnRlbnQ6bnVsbCxmcm9tSW5kZXg6ZS5fbW91bnRJbmRleCxmcm9tTm9kZTp0LHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gYShlKXtyZXR1cm57dHlwZTpwLlNFVF9NQVJLVVAsY29udGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlvbiB1KGUpe3JldHVybnt0eXBlOnAuVEVYVF9DT05URU5ULGNvbnRlbnQ6ZSxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gcyhlLHQpe3JldHVybiB0JiYoZT1lfHxbXSxlLnB1c2godCkpLGV9ZnVuY3Rpb24gbChlLHQpe2MucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyhlLHQpfXZhciBjPWUoMzMpLHA9KGUoNzApLGUoNzQpKSxkPShlKDM1KSxlKDgzKSksZj1lKDI4KSxoPShlKDE0NiksZSgxMTcpKSx2PWUoMTU0KSxtPXtNaXhpbjp7X3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZi5pbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKX0sX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpO3JldHVybiBpPWgodCksZi51cGRhdGVDaGlsZHJlbihlLGksbixyLG8pLGl9LG1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKTt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPXI7dmFyIG89W10saT0wO2Zvcih2YXIgYSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciB1PXJbYV0scz1kLm1vdW50Q29tcG9uZW50KHUsdCx0aGlzLHRoaXMuX25hdGl2ZUNvbnRhaW5lckluZm8sbik7dS5fbW91bnRJbmRleD1pKyssby5wdXNoKHMpfXJldHVybiBvfSx1cGRhdGVUZXh0Q29udGVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJnYoITEpO3ZhciByPVt1KGUpXTtsKHRoaXMscil9LHVwZGF0ZU1hcmt1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJnYoITEpO3ZhciByPVthKGUpXTtsKHRoaXMscil9LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLl91cGRhdGVDaGlsZHJlbihlLHQsbil9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbixvPXt9LGk9dGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHIsZSxvLHQsbik7aWYoaXx8cil7dmFyIGEsdT1udWxsLGM9MCxwPTAsZj1udWxsO2ZvcihhIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGg9ciYmclthXSx2PWlbYV07aD09PXY/KHU9cyh1LHRoaXMubW92ZUNoaWxkKGgsZixwLGMpKSxjPU1hdGgubWF4KGguX21vdW50SW5kZXgsYyksaC5fbW91bnRJbmRleD1wKTooaCYmKGM9TWF0aC5tYXgoaC5fbW91bnRJbmRleCxjKSksdT1zKHUsdGhpcy5fbW91bnRDaGlsZEF0SW5kZXgodixmLHAsdCxuKSkpLHArKyxmPWQuZ2V0TmF0aXZlTm9kZSh2KX1mb3IoYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJih1PXModSx0aGlzLl91bm1vdW50Q2hpbGQoclthXSxvW2FdKSkpO3UmJmwodGhpcyx1KSx0aGlzLl9yZW5kZXJlZENoaWxkcmVuPWl9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0LGUpLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbH0sbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlLl9tb3VudEluZGV4PHI/byhlLHQsbik6dm9pZCAwfSxjcmVhdGVDaGlsZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIobix0LGUuX21vdW50SW5kZXgpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe3JldHVybiBpKGUsdCl9LF9tb3VudENoaWxkQXRJbmRleDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPWQubW91bnRDb21wb25lbnQoZSxyLHRoaXMsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbyxvKTtyZXR1cm4gZS5fbW91bnRJbmRleD1uLHRoaXMuY3JlYXRlQ2hpbGQoZSx0LGkpfSxfdW5tb3VudENoaWxkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZW1vdmVDaGlsZChlLHQpO3JldHVybiBlLl9tb3VudEluZGV4PW51bGwsbn19fTt0LmV4cG9ydHM9bX0sezExNzoxMTcsMTQ2OjE0NiwxNTQ6MTU0LDI4OjI4LDMzOjMzLDM1OjM1LDcwOjcwLDc0Ojc0LDgzOjgzfV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTcpLG89cih7SU5TRVJUX01BUktVUDpudWxsLE1PVkVfRVhJU1RJTkc6bnVsbCxSRU1PVkVfTk9ERTpudWxsLFNFVF9NQVJLVVA6bnVsbCxURVhUX0NPTlRFTlQ6bnVsbH0pO3QuZXhwb3J0cz1vfSx7MTU3OjE1N31dLDc1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUudHlwZSlyZXR1cm4gZS50eXBlO3ZhciB0PWUudHlwZSxuPXBbdF07cmV0dXJuIG51bGw9PW4mJihwW3RdPW49bCh0KSksbn1mdW5jdGlvbiBvKGUpe3JldHVybiBjP3ZvaWQgMDpzKCExKSxuZXcgYyhlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBuZXcgZChlKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZH12YXIgdT1lKDE2NSkscz1lKDE1NCksbD1udWxsLGM9bnVsbCxwPXt9LGQ9bnVsbCxmPXtpbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7Yz1lfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7ZD1lfSxpbmplY3RDb21wb25lbnRDbGFzc2VzOmZ1bmN0aW9uKGUpe3UocCxlKX19LGg9e2dldENvbXBvbmVudENsYXNzRm9yRWxlbWVudDpyLGNyZWF0ZUludGVybmFsQ29tcG9uZW50Om8sY3JlYXRlSW5zdGFuY2VGb3JUZXh0OmksaXNUZXh0Q29tcG9uZW50OmEsaW5qZWN0aW9uOmZ9O3QuZXhwb3J0cz1ofSx7MTU0OjE1NCwxNjU6MTY1fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg2MCksbz1lKDE1NCksaT17TkFUSVZFOjAsQ09NUE9TSVRFOjEsRU1QVFk6MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ZT09PSExP2kuRU1QVFk6ci5pc1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2kuQ09NUE9TSVRFOmkuTkFUSVZFOnZvaWQgbyghMSl9fTt0LmV4cG9ydHM9aX0sezE1NDoxNTQsNjA6NjB9XSw3NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7fXZhciBvPShlKDE2NCkse2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4hMX0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7fSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSl7cihlLCJmb3JjZVVwZGF0ZSIpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCl7cihlLCJyZXBsYWNlU3RhdGUiKX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCl7cihlLCJzZXRTdGF0ZSIpfX0pO3QuZXhwb3J0cz1vfSx7MTY0OjE2NH1dLDc4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPXtpc1ZhbGlkT3duZXI6ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUuYXR0YWNoUmVmfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5kZXRhY2hSZWYpfSxhZGRDb21wb25lbnRBc1JlZlRvOmZ1bmN0aW9uKGUsdCxuKXtvLmlzVmFsaWRPd25lcihuKT92b2lkIDA6cighMSksbi5hdHRhY2hSZWYodCxlKX0scmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtvLmlzVmFsaWRPd25lcihuKT92b2lkIDA6cighMSk7dmFyIGk9bi5nZXRQdWJsaWNJbnN0YW5jZSgpO2kmJmkucmVmc1t0XT09PWUuZ2V0UHVibGljSW5zdGFuY2UoKSYmbi5kZXRhY2hSZWYodCl9fTt0LmV4cG9ydHM9b30sezE1NDoxNTR9XSw3OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fTt0LmV4cG9ydHM9cn0se31dLDgwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU3KSxvPXIoe3Byb3A6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRDb250ZXh0Om51bGx9KTt0LmV4cG9ydHM9b30sezE1NzoxNTd9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwxL2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSl7ZnVuY3Rpb24gdCh0LG4scixvLGksYSl7aWYobz1vfHx4LGE9YXx8cixudWxsPT1uW3JdKXt2YXIgdT1iW2ldO3JldHVybiB0P25ldyBFcnJvcigiUmVxdWlyZWQgIit1KyIgYCIrYSsiYCB3YXMgbm90IHNwZWNpZmllZCBpbiAiKygiYCIrbysiYC4iKSk6bnVsbH1yZXR1cm4gZShuLHIsbyxpLGEpfXZhciBuPXQuYmluZChudWxsLCExKTtyZXR1cm4gbi5pc1JlcXVpcmVkPXQuYmluZChudWxsLCEwKSxufWZ1bmN0aW9uIGkoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe3ZhciBhPXRbbl0sdT1tKGEpO2lmKHUhPT1lKXt2YXIgcz1iW29dLGw9ZyhhKTtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkICIrcysiIGAiK2krImAgb2YgdHlwZSAiKygiYCIrbCsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCAiKSsoImAiK2UrImAuIikpfXJldHVybiBudWxsfXJldHVybiBvKHQpfWZ1bmN0aW9uIGEoKXtyZXR1cm4gbyhfLnRoYXRSZXR1cm5zKG51bGwpKX1mdW5jdGlvbiB1KGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4gbmV3IEVycm9yKCJQcm9wZXJ0eSBgIitpKyJgIG9mIGNvbXBvbmVudCBgIityKyJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLiIpO3ZhciBhPXRbbl07aWYoIUFycmF5LmlzQXJyYXkoYSkpe3ZhciB1PWJbb10scz1tKGEpO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIit1KyIgYCIraSsiYCBvZiB0eXBlICIrKCJgIitzKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGFuIGFycmF5LiIpKX1mb3IodmFyIGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9ZShhLGwscixvLGkrIlsiK2wrIl0iKTtpZihjIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGN9cmV0dXJuIG51bGx9cmV0dXJuIG8odCl9ZnVuY3Rpb24gcygpe2Z1bmN0aW9uIGUoZSx0LG4scixvKXsKaWYoIUMuaXNWYWxpZEVsZW1lbnQoZVt0XSkpe3ZhciBpPWJbcl07cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK2krIiBgIitvKyJgIHN1cHBsaWVkIHRvICIrKCJgIituKyJgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuIikpfXJldHVybiBudWxsfXJldHVybiBvKGUpfWZ1bmN0aW9uIGwoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe2lmKCEodFtuXWluc3RhbmNlb2YgZSkpe3ZhciBhPWJbb10sdT1lLm5hbWV8fHgscz15KHRbbl0pO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIithKyIgYCIraSsiYCBvZiB0eXBlICIrKCJgIitzKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiaW5zdGFuY2Ugb2YgYCIrdSsiYC4iKSl9cmV0dXJuIG51bGx9cmV0dXJuIG8odCl9ZnVuY3Rpb24gYyhlKXtmdW5jdGlvbiB0KHQsbixvLGksYSl7Zm9yKHZhciB1PXRbbl0scz0wO3M8ZS5sZW5ndGg7cysrKWlmKHIodSxlW3NdKSlyZXR1cm4gbnVsbDt2YXIgbD1iW2ldLGM9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK2wrIiBgIithKyJgIG9mIHZhbHVlIGAiK3UrImAgIisoInN1cHBsaWVkIHRvIGAiK28rImAsIGV4cGVjdGVkIG9uZSBvZiAiK2MrIi4iKSl9cmV0dXJuIG8oQXJyYXkuaXNBcnJheShlKT90OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuIil9KX1mdW5jdGlvbiBwKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4gbmV3IEVycm9yKCJQcm9wZXJ0eSBgIitpKyJgIG9mIGNvbXBvbmVudCBgIityKyJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4iKTt2YXIgYT10W25dLHU9bShhKTtpZigib2JqZWN0IiE9PXUpe3ZhciBzPWJbb107cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK3MrIiBgIitpKyJgIG9mIHR5cGUgIisoImAiK3UrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpKX1mb3IodmFyIGwgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGwpKXt2YXIgYz1lKGEsbCxyLG8saSsiLiIrbCk7aWYoYyBpbnN0YW5jZW9mIEVycm9yKXJldHVybiBjfXJldHVybiBudWxsfXJldHVybiBvKHQpfWZ1bmN0aW9uIGQoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe2Zvcih2YXIgYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgdT1lW2FdO2lmKG51bGw9PXUodCxuLHIsbyxpKSlyZXR1cm4gbnVsbH12YXIgcz1iW29dO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIitzKyIgYCIraSsiYCBzdXBwbGllZCB0byAiKygiYCIrcisiYC4iKSl9cmV0dXJuIG8oQXJyYXkuaXNBcnJheShlKT90OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LiIpfSl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIGUoZSx0LG4scixvKXtpZighdihlW3RdKSl7dmFyIGk9YltyXTtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkICIraSsiIGAiK28rImAgc3VwcGxpZWQgdG8gIisoImAiK24rImAsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gbyhlKX1mdW5jdGlvbiBoKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXt2YXIgYT10W25dLHU9bShhKTtpZigib2JqZWN0IiE9PXUpe3ZhciBzPWJbb107cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK3MrIiBgIitpKyJgIG9mIHR5cGUgYCIrdSsiYCAiKygic3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYG9iamVjdGAuIikpfWZvcih2YXIgbCBpbiBlKXt2YXIgYz1lW2xdO2lmKGMpe3ZhciBwPWMoYSxsLHIsbyxpKyIuIitsKTtpZihwKXJldHVybiBwfX1yZXR1cm4gbnVsbH1yZXR1cm4gbyh0KX1mdW5jdGlvbiB2KGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4hZTtjYXNlIm9iamVjdCI6aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZS5ldmVyeSh2KTtpZihudWxsPT09ZXx8Qy5pc1ZhbGlkRWxlbWVudChlKSlyZXR1cm4hMDt2YXIgdD1FKGUpO2lmKCF0KXJldHVybiExO3ZhciBuLHI9dC5jYWxsKGUpO2lmKHQhPT1lLmVudHJpZXMpe2Zvcig7IShuPXIubmV4dCgpKS5kb25lOylpZighdihuLnZhbHVlKSlyZXR1cm4hMX1lbHNlIGZvcig7IShuPXIubmV4dCgpKS5kb25lOyl7dmFyIG89bi52YWx1ZTtpZihvJiYhdihvWzFdKSlyZXR1cm4hMX1yZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBtKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBBcnJheS5pc0FycmF5KGUpPyJhcnJheSI6ZSBpbnN0YW5jZW9mIFJlZ0V4cD8ib2JqZWN0Ijp0fWZ1bmN0aW9uIGcoZSl7dmFyIHQ9bShlKTtpZigib2JqZWN0Ij09PXQpe2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiJkYXRlIjtpZihlIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiJyZWdleHAifXJldHVybiB0fWZ1bmN0aW9uIHkoZSl7cmV0dXJuIGUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZT9lLmNvbnN0cnVjdG9yLm5hbWU6eH12YXIgQz1lKDYwKSxiPWUoNzkpLF89ZSgxNDYpLEU9ZSgxMjMpLHg9Ijw8YW5vbnltb3VzPj4iLE49e2FycmF5OmkoImFycmF5IiksYm9vbDppKCJib29sZWFuIiksZnVuYzppKCJmdW5jdGlvbiIpLG51bWJlcjppKCJudW1iZXIiKSxvYmplY3Q6aSgib2JqZWN0Iiksc3RyaW5nOmkoInN0cmluZyIpLGFueTphKCksYXJyYXlPZjp1LGVsZW1lbnQ6cygpLGluc3RhbmNlT2Y6bCxub2RlOmYoKSxvYmplY3RPZjpwLG9uZU9mOmMsb25lT2ZUeXBlOmQsc2hhcGU6aH07dC5leHBvcnRzPU59LHsxMjM6MTIzLDE0NjoxNDYsNjA6NjAsNzk6Nzl9XSw4MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPSExLHRoaXMucmVhY3RNb3VudFJlYWR5PWkuZ2V0UG9vbGVkKG51bGwpLHRoaXMudXNlQ3JlYXRlRWxlbWVudD1lfXZhciBvPWUoMTY1KSxpPWUoNSksYT1lKDI1KSx1PWUoMjcpLHM9ZSg2OCksbD1lKDEwOCksYz17aW5pdGlhbGl6ZTpzLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOnMucmVzdG9yZVNlbGVjdGlvbn0scD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXUuaXNFbmFibGVkKCk7cmV0dXJuIHUuc2V0RW5hYmxlZCghMSksZX0sY2xvc2U6ZnVuY3Rpb24oZSl7dS5zZXRFbmFibGVkKGUpfX0sZD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCl9fSxmPVtjLHAsZF0saD17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBmfSxnZXRSZWFjdE1vdW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHl9LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHkuY2hlY2twb2ludCgpfSxyb2xsYmFjazpmdW5jdGlvbihlKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhlKX0sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe2kucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSksdGhpcy5yZWFjdE1vdW50UmVhZHk9bnVsbH19O28oci5wcm90b3R5cGUsbC5NaXhpbixoKSxhLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEwODoxMDgsMTY1OjE2NSwyNToyNSwyNzoyNyw1OjUsNjg6Njh9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7by5hdHRhY2hSZWZzKHRoaXMsdGhpcy5fY3VycmVudEVsZW1lbnQpfXZhciBvPWUoODQpLGk9KGUoNzApLGUoMTU0KSksYT17bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sbyxpKXt2YXIgYT1lLm1vdW50Q29tcG9uZW50KHQsbixvLGkpO3JldHVybiBlLl9jdXJyZW50RWxlbWVudCYmbnVsbCE9ZS5fY3VycmVudEVsZW1lbnQucmVmJiZ0LmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocixlKSxhfSxnZXROYXRpdmVOb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldE5hdGl2ZU5vZGUoKX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQpe28uZGV0YWNoUmVmcyhlLGUuX2N1cnJlbnRFbGVtZW50KSxlLnVubW91bnRDb21wb25lbnQodCl9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9ZS5fY3VycmVudEVsZW1lbnQ7aWYodCE9PWF8fGkhPT1lLl9jb250ZXh0KXt2YXIgdT1vLnNob3VsZFVwZGF0ZVJlZnMoYSx0KTt1JiZvLmRldGFjaFJlZnMoZSxhKSxlLnJlY2VpdmVDb21wb25lbnQodCxuLGkpLHUmJmUuX2N1cnJlbnRFbGVtZW50JiZudWxsIT1lLl9jdXJyZW50RWxlbWVudC5yZWYmJm4uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShyLGUpfX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5fdXBkYXRlQmF0Y2hOdW1iZXIhPT1uP3ZvaWQobnVsbCE9ZS5fdXBkYXRlQmF0Y2hOdW1iZXImJmUuX3VwZGF0ZUJhdGNoTnVtYmVyIT09bisxP2koITEpOnZvaWQgMCk6dm9pZCBlLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0KX19O3QuZXhwb3J0cz1hfSx7MTU0OjE1NCw3MDo3MCw4NDo4NH1dLDg0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodC5nZXRQdWJsaWNJbnN0YW5jZSgpKTppLmFkZENvbXBvbmVudEFzUmVmVG8odCxlLG4pfWZ1bmN0aW9uIG8oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UobnVsbCk6aS5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20odCxlLG4pfXZhciBpPWUoNzgpLGE9e307YS5hdHRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9PXQmJnQhPT0hMSl7dmFyIG49dC5yZWY7bnVsbCE9biYmcihuLGUsdC5fb3duZXIpfX0sYS5zaG91bGRVcGRhdGVSZWZzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbD09PWV8fGU9PT0hMSxyPW51bGw9PT10fHx0PT09ITE7cmV0dXJuIG58fHJ8fHQuX293bmVyIT09ZS5fb3duZXJ8fHQucmVmIT09ZS5yZWZ9LGEuZGV0YWNoUmVmcz1mdW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiZ0IT09ITEpe3ZhciBuPXQucmVmO251bGwhPW4mJm8obixlLHQuX293bmVyKX19LHQuZXhwb3J0cz1hfSx7Nzg6Nzh9XSw4NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSl7fX07dC5leHBvcnRzPXJ9LHt9XSw4NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG47dHJ5e3JldHVybiBmLmluamVjdGlvbi5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KHApLG49ZC5nZXRQb29sZWQodCksbi5wZXJmb3JtKGZ1bmN0aW9uKCl7dmFyIHI9dihlKSxvPWMubW91bnRDb21wb25lbnQocixuLG51bGwsYSgpLGgpO3JldHVybiB0fHwobz1sLmFkZENoZWNrc3VtVG9NYXJrdXAobykpLG99LG51bGwpfWZpbmFsbHl7ZC5yZWxlYXNlKG4pLGYuaW5qZWN0aW9uLmluamVjdEJhdGNoaW5nU3RyYXRlZ3kodSl9fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIHMuaXNWYWxpZEVsZW1lbnQoZSk/dm9pZCAwOm0oITEpLHIoZSwhMSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gcy5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6bSghMSkscihlLCEwKX12YXIgYT1lKDQxKSx1PWUoNTgpLHM9ZSg2MCksbD0oZSg3MCksZSg3MSkpLGM9ZSg4MykscD1lKDg1KSxkPWUoODcpLGY9ZSg5MCksaD1lKDE0Nyksdj1lKDEyOCksbT1lKDE1NCk7dC5leHBvcnRzPXtyZW5kZXJUb1N0cmluZzpvLHJlbmRlclRvU3RhdGljTWFya3VwOml9fSx7MTI4OjEyOCwxNDc6MTQ3LDE1NDoxNTQsNDE6NDEsNTg6NTgsNjA6NjAsNzA6NzAsNzE6NzEsODM6ODMsODU6ODUsODc6ODcsOTA6OTB9XSw4NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVFbGVtZW50PSExfXZhciBvPWUoMTY1KSxpPWUoMjUpLGE9ZSgxMDgpLHU9W10scz17ZW5xdWV1ZTpmdW5jdGlvbigpe319LGw9e2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXt9LHJvbGxiYWNrOmZ1bmN0aW9uKCl7fX07byhyLnByb3RvdHlwZSxhLk1peGluLGwpLGkuYWRkUG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1yfSx7MTA4OjEwOCwxNjU6MTY1LDI1OjI1fV0sODg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgzNiksaT1lKDUyKSxhPWUoMjYpLHU9cih7X19TRUNSRVRfRE9NX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6byxfX1NFQ1JFVF9ET01fU0VSVkVSX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6aX0sYSk7dC5leHBvcnRzPXV9LHsxNjU6MTY1LDI2OjI2LDM2OjM2LDUyOjUyfV0sODk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXthLmVucXVldWVVcGRhdGUoZSl9ZnVuY3Rpb24gbyhlLHQpe3ZhciBuPWkuZ2V0KGUpO3JldHVybiBuP246bnVsbH12YXIgaT0oZSgzNSksZSg2OSkpLGE9ZSg5MCksdT1lKDE1NCkscz0oZSgxNjQpLHtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5nZXQoZSk7cmV0dXJuIHQ/ISF0Ll9yZW5kZXJlZENvbXBvbmVudDohMX0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCxuKXtzLnZhbGlkYXRlQ2FsbGJhY2sodCxuKTt2YXIgaT1vKGUpO3JldHVybiBpPyhpLl9wZW5kaW5nQ2FsbGJhY2tzP2kuX3BlbmRpbmdDYWxsYmFja3MucHVzaCh0KTppLl9wZW5kaW5nQ2FsbGJhY2tzPVt0XSx2b2lkIHIoaSkpOm51bGx9LGVucXVldWVDYWxsYmFja0ludGVybmFsOmZ1bmN0aW9uKGUsdCl7ZS5fcGVuZGluZ0NhbGxiYWNrcz9lLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6ZS5fcGVuZGluZ0NhbGxiYWNrcz1bdF0scihlKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PW8oZSwiZm9yY2VVcGRhdGUiKTt0JiYodC5fcGVuZGluZ0ZvcmNlVXBkYXRlPSEwLHIodCkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49byhlLCJyZXBsYWNlU3RhdGUiKTtuJiYobi5fcGVuZGluZ1N0YXRlUXVldWU9W3RdLG4uX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITAscihuKSl9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW8oZSwic2V0U3RhdGUiKTtpZihuKXt2YXIgaT1uLl9wZW5kaW5nU3RhdGVRdWV1ZXx8KG4uX3BlbmRpbmdTdGF0ZVF1ZXVlPVtdKTtpLnB1c2godCkscihuKX19LGVucXVldWVFbGVtZW50SW50ZXJuYWw6ZnVuY3Rpb24oZSx0KXtlLl9wZW5kaW5nRWxlbWVudD10LHIoZSl9LHZhbGlkYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT91KCExKTp2b2lkIDB9fSk7dC5leHBvcnRzPXN9LHsxNTQ6MTU0LDE2NDoxNjQsMzU6MzUsNjk6NjksOTA6OTB9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJiZfP3ZvaWQgMDptKCExKX1mdW5jdGlvbiBvKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpLHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGwsdGhpcy5jYWxsYmFja1F1ZXVlPXAuZ2V0UG9vbGVkKCksdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj13LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCEwKX1mdW5jdGlvbiBpKGUsdCxuLG8saSxhKXtyKCksXy5iYXRjaGVkVXBkYXRlcyhlLHQsbixvLGksYSl9ZnVuY3Rpb24gYShlLHQpe3JldHVybiBlLl9tb3VudE9yZGVyLXQuX21vdW50T3JkZXJ9ZnVuY3Rpb24gdShlKXt2YXIgdD1lLmRpcnR5Q29tcG9uZW50c0xlbmd0aDt0IT09Zy5sZW5ndGg/bSghMSk6dm9pZCAwLGcuc29ydChhKSx5Kys7Zm9yKHZhciBuPTA7dD5uO24rKyl7dmFyIHI9Z1tuXSxvPXIuX3BlbmRpbmdDYWxsYmFja3M7ci5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3ZhciBpO2lmKGYubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgdT1yO3IuX2N1cnJlbnRFbGVtZW50LnByb3BzPT09ci5fcmVuZGVyZWRDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50JiYodT1yLl9yZW5kZXJlZENvbXBvbmVudCksaT0iUmVhY3QgdXBkYXRlOiAiK3UuZ2V0TmFtZSgpLGNvbnNvbGUudGltZShpKX1pZihoLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeShyLGUucmVjb25jaWxlVHJhbnNhY3Rpb24seSksaSYmY29uc29sZS50aW1lRW5kKGkpLG8pZm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZS5jYWxsYmFja1F1ZXVlLmVucXVldWUob1tzXSxyLmdldFB1YmxpY0luc3RhbmNlKCkpfX1mdW5jdGlvbiBzKGUpe3JldHVybiByKCksXy5pc0JhdGNoaW5nVXBkYXRlcz8oZy5wdXNoKGUpLHZvaWQobnVsbD09ZS5fdXBkYXRlQmF0Y2hOdW1iZXImJihlLl91cGRhdGVCYXRjaE51bWJlcj15KzEpKSk6dm9pZCBfLmJhdGNoZWRVcGRhdGVzKHMsZSl9ZnVuY3Rpb24gbChlLHQpe18uaXNCYXRjaGluZ1VwZGF0ZXM/dm9pZCAwOm0oITEpLEMuZW5xdWV1ZShlLHQpLGI9ITB9dmFyIGM9ZSgxNjUpLHA9ZSg1KSxkPWUoMjUpLGY9ZSg2NiksaD0oZSg3MCksZSg4MykpLHY9ZSgxMDgpLG09ZSgxNTQpLGc9W10seT0wLEM9cC5nZXRQb29sZWQoKSxiPSExLF89bnVsbCxFPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9Zy5sZW5ndGh9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGghPT1nLmxlbmd0aD8oZy5zcGxpY2UoMCx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCksVCgpKTpnLmxlbmd0aD0wfX0seD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5ub3RpZnlBbGwoKX19LE49W0UseF07YyhvLnByb3RvdHlwZSx2Lk1peGluLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIE59LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aD1udWxsLHAucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpLHRoaXMuY2FsbGJhY2tRdWV1ZT1udWxsLHcuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24pLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb249bnVsbH0scGVyZm9ybTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuTWl4aW4ucGVyZm9ybS5jYWxsKHRoaXMsdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24sZSx0LG4pfX0pLGQuYWRkUG9vbGluZ1RvKG8pO3ZhciBUPWZ1bmN0aW9uKCl7Zm9yKDtnLmxlbmd0aHx8Yjspe2lmKGcubGVuZ3RoKXt2YXIgZT1vLmdldFBvb2xlZCgpO2UucGVyZm9ybSh1LG51bGwsZSksby5yZWxlYXNlKGUpfWlmKGIpe2I9ITE7dmFyIHQ9QztDPXAuZ2V0UG9vbGVkKCksdC5ub3RpZnlBbGwoKSxwLnJlbGVhc2UodCl9fX0sUD17aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oZSl7ZT92b2lkIDA6bSghMSksdy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPWV9LGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6ZnVuY3Rpb24oZSl7ZT92b2lkIDA6bSghMSksImZ1bmN0aW9uIiE9dHlwZW9mIGUuYmF0Y2hlZFVwZGF0ZXM/bSghMSk6dm9pZCAwLCJib29sZWFuIiE9dHlwZW9mIGUuaXNCYXRjaGluZ1VwZGF0ZXM/bSghMSk6dm9pZCAwLF89ZX19LHc9e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246bnVsbCxiYXRjaGVkVXBkYXRlczppLGVucXVldWVVcGRhdGU6cyxmbHVzaEJhdGNoZWRVcGRhdGVzOlQsaW5qZWN0aW9uOlAsYXNhcDpsfTt0LmV4cG9ydHM9d30sezEwODoxMDgsMTU0OjE1NCwxNjU6MTY1LDI1OjI1LDU6NSw2Njo2Niw3MDo3MCw4Mzo4M31dLDkxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0iMTUuMS4wIn0se31dLDkyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UifSxvPXthY2NlbnRIZWlnaHQ6ImFjY2VudC1oZWlnaHQiLGFjY3VtdWxhdGU6MCxhZGRpdGl2ZTowLGFsaWdubWVudEJhc2VsaW5lOiJhbGlnbm1lbnQtYmFzZWxpbmUiLGFsbG93UmVvcmRlcjoiYWxsb3dSZW9yZGVyIixhbHBoYWJldGljOjAsYW1wbGl0dWRlOjAsYXJhYmljRm9ybToiYXJhYmljLWZvcm0iLGFzY2VudDowLGF0dHJpYnV0ZU5hbWU6ImF0dHJpYnV0ZU5hbWUiLGF0dHJpYnV0ZVR5cGU6ImF0dHJpYnV0ZVR5cGUiLGF1dG9SZXZlcnNlOiJhdXRvUmV2ZXJzZSIsYXppbXV0aDowLGJhc2VGcmVxdWVuY3k6ImJhc2VGcmVxdWVuY3kiLGJhc2VQcm9maWxlOiJiYXNlUHJvZmlsZSIsYmFzZWxpbmVTaGlmdDoiYmFzZWxpbmUtc2hpZnQiLGJib3g6MCxiZWdpbjowLGJpYXM6MCxieTowLGNhbGNNb2RlOiJjYWxjTW9kZSIsY2FwSGVpZ2h0OiJjYXAtaGVpZ2h0IixjbGlwOjAsY2xpcFBhdGg6ImNsaXAtcGF0aCIsY2xpcFJ1bGU6ImNsaXAtcnVsZSIsY2xpcFBhdGhVbml0czoiY2xpcFBhdGhVbml0cyIsY29sb3JJbnRlcnBvbGF0aW9uOiJjb2xvci1pbnRlcnBvbGF0aW9uIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLGNvbG9yUHJvZmlsZToiY29sb3ItcHJvZmlsZSIsY29sb3JSZW5kZXJpbmc6ImNvbG9yLXJlbmRlcmluZyIsY29udGVudFNjcmlwdFR5cGU6ImNvbnRlbnRTY3JpcHRUeXBlIixjb250ZW50U3R5bGVUeXBlOiJjb250ZW50U3R5bGVUeXBlIixjdXJzb3I6MCxjeDowLGN5OjAsZDowLGRlY2VsZXJhdGU6MCxkZXNjZW50OjAsZGlmZnVzZUNvbnN0YW50OiJkaWZmdXNlQ29uc3RhbnQiLGRpcmVjdGlvbjowLGRpc3BsYXk6MCxkaXZpc29yOjAsZG9taW5hbnRCYXNlbGluZToiZG9taW5hbnQtYmFzZWxpbmUiLGR1cjowLGR4OjAsZHk6MCxlZGdlTW9kZToiZWRnZU1vZGUiLGVsZXZhdGlvbjowLGVuYWJsZUJhY2tncm91bmQ6ImVuYWJsZS1iYWNrZ3JvdW5kIixlbmQ6MCxleHBvbmVudDowLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLGZpbGw6MCxmaWxsT3BhY2l0eToiZmlsbC1vcGFjaXR5IixmaWxsUnVsZToiZmlsbC1ydWxlIixmaWx0ZXI6MCxmaWx0ZXJSZXM6ImZpbHRlclJlcyIsZmlsdGVyVW5pdHM6ImZpbHRlclVuaXRzIixmbG9vZENvbG9yOiJmbG9vZC1jb2xvciIsZmxvb2RPcGFjaXR5OiJmbG9vZC1vcGFjaXR5Iixmb2N1c2FibGU6MCxmb250RmFtaWx5OiJmb250LWZhbWlseSIsZm9udFNpemU6ImZvbnQtc2l6ZSIsZm9udFNpemVBZGp1c3Q6ImZvbnQtc2l6ZS1hZGp1c3QiLGZvbnRTdHJldGNoOiJmb250LXN0cmV0Y2giLGZvbnRTdHlsZToiZm9udC1zdHlsZSIsZm9udFZhcmlhbnQ6ImZvbnQtdmFyaWFudCIsZm9udFdlaWdodDoiZm9udC13ZWlnaHQiLGZvcm1hdDowLGZyb206MCxmeDowLGZ5OjAsZzE6MCxnMjowLGdseXBoTmFtZToiZ2x5cGgtbmFtZSIsZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDoiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLGdseXBoUmVmOiJnbHlwaFJlZiIsZ3JhZGllbnRUcmFuc2Zvcm06ImdyYWRpZW50VHJhbnNmb3JtIixncmFkaWVudFVuaXRzOiJncmFkaWVudFVuaXRzIixoYW5naW5nOjAsaG9yaXpBZHZYOiJob3Jpei1hZHYteCIsaG9yaXpPcmlnaW5YOiJob3Jpei1vcmlnaW4teCIsaWRlb2dyYXBoaWM6MCxpbWFnZVJlbmRlcmluZzoiaW1hZ2UtcmVuZGVyaW5nIiwiaW4iOjAsaW4yOjAsaW50ZXJjZXB0OjAsazowLGsxOjAsazI6MCxrMzowLGs0OjAsa2VybmVsTWF0cml4OiJrZXJuZWxNYXRyaXgiLGtlcm5lbFVuaXRMZW5ndGg6Imtlcm5lbFVuaXRMZW5ndGgiLGtlcm5pbmc6MCxrZXlQb2ludHM6ImtleVBvaW50cyIsa2V5U3BsaW5lczoia2V5U3BsaW5lcyIsa2V5VGltZXM6ImtleVRpbWVzIixsZW5ndGhBZGp1c3Q6Imxlbmd0aEFkanVzdCIsbGV0dGVyU3BhY2luZzoibGV0dGVyLXNwYWNpbmciLGxpZ2h0aW5nQ29sb3I6ImxpZ2h0aW5nLWNvbG9yIixsaW1pdGluZ0NvbmVBbmdsZToibGltaXRpbmdDb25lQW5nbGUiLGxvY2FsOjAsbWFya2VyRW5kOiJtYXJrZXItZW5kIixtYXJrZXJNaWQ6Im1hcmtlci1taWQiLG1hcmtlclN0YXJ0OiJtYXJrZXItc3RhcnQiLG1hcmtlckhlaWdodDoibWFya2VySGVpZ2h0IixtYXJrZXJVbml0czoibWFya2VyVW5pdHMiLG1hcmtlcldpZHRoOiJtYXJrZXJXaWR0aCIsbWFzazowLG1hc2tDb250ZW50VW5pdHM6Im1hc2tDb250ZW50VW5pdHMiLG1hc2tVbml0czoibWFza1VuaXRzIixtYXRoZW1hdGljYWw6MCxtb2RlOjAsbnVtT2N0YXZlczoibnVtT2N0YXZlcyIsb2Zmc2V0OjAsb3BhY2l0eTowLG9wZXJhdG9yOjAsb3JkZXI6MCxvcmllbnQ6MCxvcmllbnRhdGlvbjowLG9yaWdpbjowLG92ZXJmbG93OjAsb3ZlcmxpbmVQb3NpdGlvbjoib3ZlcmxpbmUtcG9zaXRpb24iLG92ZXJsaW5lVGhpY2tuZXNzOiJvdmVybGluZS10aGlja25lc3MiLHBhaW50T3JkZXI6InBhaW50LW9yZGVyIixwYW5vc2UxOiJwYW5vc2UtMSIscGF0aExlbmd0aDoicGF0aExlbmd0aCIscGF0dGVybkNvbnRlbnRVbml0czoicGF0dGVybkNvbnRlbnRVbml0cyIscGF0dGVyblRyYW5zZm9ybToicGF0dGVyblRyYW5zZm9ybSIscGF0dGVyblVuaXRzOiJwYXR0ZXJuVW5pdHMiLHBvaW50ZXJFdmVudHM6InBvaW50ZXItZXZlbnRzIixwb2ludHM6MCxwb2ludHNBdFg6InBvaW50c0F0WCIscG9pbnRzQXRZOiJwb2ludHNBdFkiLHBvaW50c0F0WjoicG9pbnRzQXRaIixwcmVzZXJ2ZUFscGhhOiJwcmVzZXJ2ZUFscGhhIixwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJwcmVzZXJ2ZUFzcGVjdFJhdGlvIixwcmltaXRpdmVVbml0czoicHJpbWl0aXZlVW5pdHMiLHI6MCxyYWRpdXM6MCxyZWZYOiJyZWZYIixyZWZZOiJyZWZZIixyZW5kZXJpbmdJbnRlbnQ6InJlbmRlcmluZy1pbnRlbnQiLHJlcGVhdENvdW50OiJyZXBlYXRDb3VudCIscmVwZWF0RHVyOiJyZXBlYXREdXIiLHJlcXVpcmVkRXh0ZW5zaW9uczoicmVxdWlyZWRFeHRlbnNpb25zIixyZXF1aXJlZEZlYXR1cmVzOiJyZXF1aXJlZEZlYXR1cmVzIixyZXN0YXJ0OjAscmVzdWx0OjAscm90YXRlOjAscng6MCxyeTowLHNjYWxlOjAsc2VlZDowLHNoYXBlUmVuZGVyaW5nOiJzaGFwZS1yZW5kZXJpbmciLHNsb3BlOjAsc3BhY2luZzowLHNwZWN1bGFyQ29uc3RhbnQ6InNwZWN1bGFyQ29uc3RhbnQiLHNwZWN1bGFyRXhwb25lbnQ6InNwZWN1bGFyRXhwb25lbnQiLHNwZWVkOjAsc3ByZWFkTWV0aG9kOiJzcHJlYWRNZXRob2QiLHN0YXJ0T2Zmc2V0OiJzdGFydE9mZnNldCIsc3RkRGV2aWF0aW9uOiJzdGREZXZpYXRpb24iLHN0ZW1oOjAsc3RlbXY6MCxzdGl0Y2hUaWxlczoic3RpdGNoVGlsZXMiLHN0b3BDb2xvcjoic3RvcC1jb2xvciIsc3RvcE9wYWNpdHk6InN0b3Atb3BhY2l0eSIsc3RyaWtldGhyb3VnaFBvc2l0aW9uOiJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIixzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsc3RyaW5nOjAsc3Ryb2tlOjAsc3Ryb2tlRGFzaGFycmF5OiJzdHJva2UtZGFzaGFycmF5IixzdHJva2VEYXNob2Zmc2V0OiJzdHJva2UtZGFzaG9mZnNldCIsc3Ryb2tlTGluZWNhcDoic3Ryb2tlLWxpbmVjYXAiLHN0cm9rZUxpbmVqb2luOiJzdHJva2UtbGluZWpvaW4iLHN0cm9rZU1pdGVybGltaXQ6InN0cm9rZS1taXRlcmxpbWl0IixzdHJva2VPcGFjaXR5OiJzdHJva2Utb3BhY2l0eSIsc3Ryb2tlV2lkdGg6InN0cm9rZS13aWR0aCIsc3VyZmFjZVNjYWxlOiJzdXJmYWNlU2NhbGUiLHN5c3RlbUxhbmd1YWdlOiJzeXN0ZW1MYW5ndWFnZSIsdGFibGVWYWx1ZXM6InRhYmxlVmFsdWVzIix0YXJnZXRYOiJ0YXJnZXRYIix0YXJnZXRZOiJ0YXJnZXRZIix0ZXh0QW5jaG9yOiJ0ZXh0LWFuY2hvciIsdGV4dERlY29yYXRpb246InRleHQtZGVjb3JhdGlvbiIsdGV4dFJlbmRlcmluZzoidGV4dC1yZW5kZXJpbmciLHRleHRMZW5ndGg6InRleHRMZW5ndGgiLHRvOjAsdHJhbnNmb3JtOjAsdTE6MCx1MjowLHVuZGVybGluZVBvc2l0aW9uOiJ1bmRlcmxpbmUtcG9zaXRpb24iLHVuZGVybGluZVRoaWNrbmVzczoidW5kZXJsaW5lLXRoaWNrbmVzcyIsdW5pY29kZTowLHVuaWNvZGVCaWRpOiJ1bmljb2RlLWJpZGkiLHVuaWNvZGVSYW5nZToidW5pY29kZS1yYW5nZSIsdW5pdHNQZXJFbToidW5pdHMtcGVyLWVtIix2QWxwaGFiZXRpYzoidi1hbHBoYWJldGljIix2SGFuZ2luZzoidi1oYW5naW5nIix2SWRlb2dyYXBoaWM6InYtaWRlb2dyYXBoaWMiLHZNYXRoZW1hdGljYWw6InYtbWF0aGVtYXRpY2FsIix2YWx1ZXM6MCx2ZWN0b3JFZmZlY3Q6InZlY3Rvci1lZmZlY3QiLHZlcnNpb246MCx2ZXJ0QWR2WToidmVydC1hZHYteSIsdmVydE9yaWdpblg6InZlcnQtb3JpZ2luLXgiLHZlcnRPcmlnaW5ZOiJ2ZXJ0LW9yaWdpbi15Iix2aWV3Qm94OiJ2aWV3Qm94Iix2aWV3VGFyZ2V0OiJ2aWV3VGFyZ2V0Iix2aXNpYmlsaXR5OjAsd2lkdGhzOjAsd29yZFNwYWNpbmc6IndvcmQtc3BhY2luZyIsd3JpdGluZ01vZGU6IndyaXRpbmctbW9kZSIseDowLHhIZWlnaHQ6IngtaGVpZ2h0Iix4MTowLHgyOjAseENoYW5uZWxTZWxlY3RvcjoieENoYW5uZWxTZWxlY3RvciIseGxpbmtBY3R1YXRlOiJ4bGluazphY3R1YXRlIix4bGlua0FyY3JvbGU6InhsaW5rOmFyY3JvbGUiLHhsaW5rSHJlZjoieGxpbms6aHJlZiIseGxpbmtSb2xlOiJ4bGluazpyb2xlIix4bGlua1Nob3c6InhsaW5rOnNob3ciLHhsaW5rVGl0bGU6InhsaW5rOnRpdGxlIix4bGlua1R5cGU6InhsaW5rOnR5cGUiLHhtbEJhc2U6InhtbDpiYXNlIix4bWxMYW5nOiJ4bWw6bGFuZyIseG1sU3BhY2U6InhtbDpzcGFjZSIseTowLHkxOjAseTI6MCx5Q2hhbm5lbFNlbGVjdG9yOiJ5Q2hhbm5lbFNlbGVjdG9yIix6OjAsem9vbUFuZFBhbjoiem9vbUFuZFBhbiJ9LGk9e1Byb3BlcnRpZXM6e30sRE9NQXR0cmlidXRlTmFtZXNwYWNlczp7eGxpbmtBY3R1YXRlOnIueGxpbmsseGxpbmtBcmNyb2xlOnIueGxpbmsseGxpbmtIcmVmOnIueGxpbmsseGxpbmtSb2xlOnIueGxpbmsseGxpbmtTaG93OnIueGxpbmsseGxpbmtUaXRsZTpyLnhsaW5rLHhsaW5rVHlwZTpyLnhsaW5rLHhtbEJhc2U6ci54bWwseG1sTGFuZzpyLnhtbCx4bWxTcGFjZTpyLnhtbH0sRE9NQXR0cmlidXRlTmFtZXM6e319O09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7aS5Qcm9wZXJ0aWVzW2VdPTAsb1tlXSYmKGkuRE9NQXR0cmlidXRlTmFtZXNbZV09b1tlXSl9KSx0LmV4cG9ydHM9aX0se31dLDkzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUmJmwuaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGUpKXJldHVybntzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07aWYod2luZG93LmdldFNlbGVjdGlvbil7dmFyIHQ9d2luZG93LmdldFNlbGVjdGlvbigpO3JldHVybnthbmNob3JOb2RlOnQuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6dC5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnQuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnQuZm9jdXNPZmZzZXR9fWlmKGRvY3VtZW50LnNlbGVjdGlvbil7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmV0dXJue3BhcmVudEVsZW1lbnQ6bi5wYXJlbnRFbGVtZW50KCksdGV4dDpuLnRleHQsdG9wOm4uYm91bmRpbmdUb3AsbGVmdDpuLmJvdW5kaW5nTGVmdH19fWZ1bmN0aW9uIG8oZSx0KXtpZihffHxudWxsPT15fHx5IT09cCgpKXJldHVybiBudWxsO3ZhciBuPXIoeSk7aWYoIWJ8fCFoKGIsbikpe2I9bjt2YXIgbz1jLmdldFBvb2xlZChnLnNlbGVjdCxDLGUsdCk7cmV0dXJuIG8udHlwZT0ic2VsZWN0IixvLnRhcmdldD15LGEuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhvKSxvfXJldHVybiBudWxsfXZhciBpPWUoMTYpLGE9ZSgyMCksdT1lKDE0MCkscz1lKDQwKSxsPWUoNjgpLGM9ZSg5OSkscD1lKDE0OSksZD1lKDEzMCksZj1lKDE1OCksaD1lKDE2Myksdj1pLnRvcExldmVsVHlwZXMsbT11LmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPD0xMSxnPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOmYoe29uU2VsZWN0Om51bGx9KSxjYXB0dXJlZDpmKHtvblNlbGVjdENhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W3YudG9wQmx1cix2LnRvcENvbnRleHRNZW51LHYudG9wRm9jdXMsdi50b3BLZXlEb3duLHYudG9wTW91c2VEb3duLHYudG9wTW91c2VVcCx2LnRvcFNlbGVjdGlvbkNoYW5nZV19fSx5PW51bGwsQz1udWxsLGI9bnVsbCxfPSExLEU9ITEseD1mKHtvblNlbGVjdDpudWxsfSksTj17ZXZlbnRUeXBlczpnLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7aWYoIUUpcmV0dXJuIG51bGw7dmFyIGk9dD9zLmdldE5vZGVGcm9tSW5zdGFuY2UodCk6d2luZG93O3N3aXRjaChlKXtjYXNlIHYudG9wRm9jdXM6KGQoaSl8fCJ0cnVlIj09PWkuY29udGVudEVkaXRhYmxlKSYmKHk9aSxDPXQsYj1udWxsKTticmVhaztjYXNlIHYudG9wQmx1cjp5PW51bGwsQz1udWxsLGI9bnVsbDticmVhaztjYXNlIHYudG9wTW91c2VEb3duOl89ITA7YnJlYWs7Y2FzZSB2LnRvcENvbnRleHRNZW51OmNhc2Ugdi50b3BNb3VzZVVwOnJldHVybiBfPSExLG8obixyKTtjYXNlIHYudG9wU2VsZWN0aW9uQ2hhbmdlOmlmKG0pYnJlYWs7Y2FzZSB2LnRvcEtleURvd246Y2FzZSB2LnRvcEtleVVwOnJldHVybiBvKG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXt0PT09eCYmKEU9ITApfX07dC5leHBvcnRzPU59LHsxMzA6MTMwLDE0MDoxNDAsMTQ5OjE0OSwxNTg6MTU4LDE2OjE2LDE2MzoxNjMsMjA6MjAsNDA6NDAsNjg6NjgsOTk6OTl9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2KSxvPWUoMTM5KSxpPWUoMjApLGE9ZSg0MCksdT1lKDk1KSxzPWUoOTYpLGw9ZSg5OSksYz1lKDEwMCkscD1lKDEwMiksZD1lKDEwMyksZj1lKDk4KSxoPWUoMTA0KSx2PWUoMTA1KSxtPWUoMTA2KSxnPWUoMTA3KSx5PWUoMTQ2KSxDPWUoMTE5KSxiPWUoMTU0KSxfPWUoMTU4KSxFPXIudG9wTGV2ZWxUeXBlcyx4PXthYm9ydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25BYm9ydDohMH0pLGNhcHR1cmVkOl8oe29uQWJvcnRDYXB0dXJlOiEwfSl9fSxhbmltYXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQW5pbWF0aW9uRW5kOiEwfSksY2FwdHVyZWQ6Xyh7b25BbmltYXRpb25FbmRDYXB0dXJlOiEwfSl9fSxhbmltYXRpb25JdGVyYXRpb246e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQW5pbWF0aW9uSXRlcmF0aW9uOiEwfSksY2FwdHVyZWQ6Xyh7b25BbmltYXRpb25JdGVyYXRpb25DYXB0dXJlOiEwfSl9fSxhbmltYXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25BbmltYXRpb25TdGFydDohMH0pLGNhcHR1cmVkOl8oe29uQW5pbWF0aW9uU3RhcnRDYXB0dXJlOiEwfSl9fSxibHVyOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkJsdXI6ITB9KSxjYXB0dXJlZDpfKHtvbkJsdXJDYXB0dXJlOiEwfSl9fSxjYW5QbGF5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkNhblBsYXk6ITB9KSxjYXB0dXJlZDpfKHtvbkNhblBsYXlDYXB0dXJlOiEwfSl9fSxjYW5QbGF5VGhyb3VnaDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25DYW5QbGF5VGhyb3VnaDohMH0pLGNhcHR1cmVkOl8oe29uQ2FuUGxheVRocm91Z2hDYXB0dXJlOiEwfSl9fSxjbGljazp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25DbGljazohMH0pLGNhcHR1cmVkOl8oe29uQ2xpY2tDYXB0dXJlOiEwfSl9fSxjb250ZXh0TWVudTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Db250ZXh0TWVudTohMH0pLGNhcHR1cmVkOl8oe29uQ29udGV4dE1lbnVDYXB0dXJlOiEwfSl9fSxjb3B5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkNvcHk6ITB9KSxjYXB0dXJlZDpfKHtvbkNvcHlDYXB0dXJlOiEwfSl9fSxjdXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQ3V0OiEwfSksY2FwdHVyZWQ6Xyh7b25DdXRDYXB0dXJlOiEwfSl9fSxkb3VibGVDbGljazp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Eb3VibGVDbGljazohMH0pLGNhcHR1cmVkOl8oe29uRG91YmxlQ2xpY2tDYXB0dXJlOiEwfSl9fSxkcmFnOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyYWc6ITB9KSxjYXB0dXJlZDpfKHtvbkRyYWdDYXB0dXJlOiEwfSl9fSxkcmFnRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyYWdFbmQ6ITB9KSxjYXB0dXJlZDpfKHtvbkRyYWdFbmRDYXB0dXJlOiEwfSl9fSxkcmFnRW50ZXI6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ0VudGVyOiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnRW50ZXJDYXB0dXJlOiEwfSl9fSxkcmFnRXhpdDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EcmFnRXhpdDohMH0pLGNhcHR1cmVkOl8oe29uRHJhZ0V4aXRDYXB0dXJlOiEwfSl9fSxkcmFnTGVhdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ0xlYXZlOiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnTGVhdmVDYXB0dXJlOiEwfSl9fSxkcmFnT3Zlcjp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EcmFnT3ZlcjohMH0pLGNhcHR1cmVkOl8oe29uRHJhZ092ZXJDYXB0dXJlOiEwfSl9fSxkcmFnU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ1N0YXJ0OiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnU3RhcnRDYXB0dXJlOiEwfSl9fSxkcm9wOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyb3A6ITB9KSxjYXB0dXJlZDpfKHtvbkRyb3BDYXB0dXJlOiEwfSl9fSxkdXJhdGlvbkNoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EdXJhdGlvbkNoYW5nZTohMH0pLGNhcHR1cmVkOl8oe29uRHVyYXRpb25DaGFuZ2VDYXB0dXJlOiEwfSl9fSxlbXB0aWVkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkVtcHRpZWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkVtcHRpZWRDYXB0dXJlOiEwfSl9fSxlbmNyeXB0ZWQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRW5jcnlwdGVkOiEwfSksY2FwdHVyZWQ6Xyh7b25FbmNyeXB0ZWRDYXB0dXJlOiEwfSl9fSxlbmRlZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25FbmRlZDohMH0pLGNhcHR1cmVkOl8oe29uRW5kZWRDYXB0dXJlOiEwfSl9fSxlcnJvcjp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25FcnJvcjohMH0pLGNhcHR1cmVkOl8oe29uRXJyb3JDYXB0dXJlOiEwfSl9fSxmb2N1czp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Gb2N1czohMH0pLGNhcHR1cmVkOl8oe29uRm9jdXNDYXB0dXJlOiEwfSl9fSxpbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25JbnB1dDohMH0pLGNhcHR1cmVkOl8oe29uSW5wdXRDYXB0dXJlOiEwfSl9fSxpbnZhbGlkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkludmFsaWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkludmFsaWRDYXB0dXJlOiEwfSl9fSxrZXlEb3duOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbktleURvd246ITB9KSxjYXB0dXJlZDpfKHtvbktleURvd25DYXB0dXJlOiEwfSl9fSxrZXlQcmVzczp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25LZXlQcmVzczohMH0pLGNhcHR1cmVkOl8oe29uS2V5UHJlc3NDYXB0dXJlOiEwfSl9fSxrZXlVcDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25LZXlVcDohMH0pLGNhcHR1cmVkOl8oe29uS2V5VXBDYXB0dXJlOiEwfSl9fSxsb2FkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkxvYWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkxvYWRDYXB0dXJlOiEwfSl9fSxsb2FkZWREYXRhOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkxvYWRlZERhdGE6ITB9KSxjYXB0dXJlZDpfKHtvbkxvYWRlZERhdGFDYXB0dXJlOiEwfSl9fSxsb2FkZWRNZXRhZGF0YTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Mb2FkZWRNZXRhZGF0YTohMH0pLGNhcHR1cmVkOl8oe29uTG9hZGVkTWV0YWRhdGFDYXB0dXJlOiEwfSl9fSxsb2FkU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTG9hZFN0YXJ0OiEwfSksY2FwdHVyZWQ6Xyh7b25Mb2FkU3RhcnRDYXB0dXJlOiEwfSl9fSxtb3VzZURvd246e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VEb3duOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZURvd25DYXB0dXJlOiEwfSl9fSxtb3VzZU1vdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VNb3ZlOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZU1vdmVDYXB0dXJlOiEwfSl9fSxtb3VzZU91dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Nb3VzZU91dDohMH0pLGNhcHR1cmVkOl8oe29uTW91c2VPdXRDYXB0dXJlOiEwfSl9fSxtb3VzZU92ZXI6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VPdmVyOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZU92ZXJDYXB0dXJlOiEwfSl9fSxtb3VzZVVwOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbk1vdXNlVXA6ITB9KSxjYXB0dXJlZDpfKHtvbk1vdXNlVXBDYXB0dXJlOiEwfSl9fSxwYXN0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25QYXN0ZTohMH0pLGNhcHR1cmVkOl8oe29uUGFzdGVDYXB0dXJlOiEwfSl9fSxwYXVzZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25QYXVzZTohMH0pLGNhcHR1cmVkOl8oe29uUGF1c2VDYXB0dXJlOiEwfSl9fSxwbGF5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblBsYXk6ITB9KSxjYXB0dXJlZDpfKHtvblBsYXlDYXB0dXJlOiEwfSl9fSxwbGF5aW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblBsYXlpbmc6ITB9KSxjYXB0dXJlZDpfKHtvblBsYXlpbmdDYXB0dXJlOiEwfSl9fSxwcm9ncmVzczp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Qcm9ncmVzczohMH0pLGNhcHR1cmVkOl8oe29uUHJvZ3Jlc3NDYXB0dXJlOiEwfSl9fSxyYXRlQ2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblJhdGVDaGFuZ2U6ITB9KSxjYXB0dXJlZDpfKHtvblJhdGVDaGFuZ2VDYXB0dXJlOiEwfSl9fSxyZXNldDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25SZXNldDohMH0pLGNhcHR1cmVkOl8oe29uUmVzZXRDYXB0dXJlOiEwfSl9fSxzY3JvbGw6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU2Nyb2xsOiEwfSksY2FwdHVyZWQ6Xyh7b25TY3JvbGxDYXB0dXJlOiEwfSl9fSxzZWVrZWQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU2Vla2VkOiEwfSksY2FwdHVyZWQ6Xyh7b25TZWVrZWRDYXB0dXJlOiEwfSl9fSxzZWVraW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblNlZWtpbmc6ITB9KSxjYXB0dXJlZDpfKHtvblNlZWtpbmdDYXB0dXJlOiEwfSl9fSxzdGFsbGVkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblN0YWxsZWQ6ITB9KSxjYXB0dXJlZDpfKHtvblN0YWxsZWRDYXB0dXJlOiEwfSl9fSxzdWJtaXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU3VibWl0OiEwfSksY2FwdHVyZWQ6Xyh7b25TdWJtaXRDYXB0dXJlOiEwfSl9fSxzdXNwZW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblN1c3BlbmQ6ITB9KSxjYXB0dXJlZDpfKHtvblN1c3BlbmRDYXB0dXJlOiEwfSl9fSx0aW1lVXBkYXRlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRpbWVVcGRhdGU6ITB9KSxjYXB0dXJlZDpfKHtvblRpbWVVcGRhdGVDYXB0dXJlOiEwfSl9fSx0b3VjaENhbmNlbDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Ub3VjaENhbmNlbDohMH0pLGNhcHR1cmVkOl8oe29uVG91Y2hDYW5jZWxDYXB0dXJlOiEwfSl9fSx0b3VjaEVuZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Ub3VjaEVuZDohMH0pLGNhcHR1cmVkOl8oe29uVG91Y2hFbmRDYXB0dXJlOiEwfSl9fSx0b3VjaE1vdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uVG91Y2hNb3ZlOiEwfSksY2FwdHVyZWQ6Xyh7b25Ub3VjaE1vdmVDYXB0dXJlOiEwfSl9fSx0b3VjaFN0YXJ0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRvdWNoU3RhcnQ6ITB9KSxjYXB0dXJlZDpfKHtvblRvdWNoU3RhcnRDYXB0dXJlOiEwfSl9fSx0cmFuc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRyYW5zaXRpb25FbmQ6ITB9KSxjYXB0dXJlZDpfKHtvblRyYW5zaXRpb25FbmRDYXB0dXJlOiEwfSl9fSx2b2x1bWVDaGFuZ2U6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uVm9sdW1lQ2hhbmdlOiEwfSksY2FwdHVyZWQ6Xyh7b25Wb2x1bWVDaGFuZ2VDYXB0dXJlOiEwfSl9fSx3YWl0aW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbldhaXRpbmc6ITB9KSxjYXB0dXJlZDpfKHtvbldhaXRpbmdDYXB0dXJlOiEwfSl9fSx3aGVlbDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25XaGVlbDohMH0pLGNhcHR1cmVkOl8oe29uV2hlZWxDYXB0dXJlOiEwfSl9fX0sTj17dG9wQWJvcnQ6eC5hYm9ydCx0b3BBbmltYXRpb25FbmQ6eC5hbmltYXRpb25FbmQsdG9wQW5pbWF0aW9uSXRlcmF0aW9uOnguYW5pbWF0aW9uSXRlcmF0aW9uLHRvcEFuaW1hdGlvblN0YXJ0OnguYW5pbWF0aW9uU3RhcnQsdG9wQmx1cjp4LmJsdXIsdG9wQ2FuUGxheTp4LmNhblBsYXksdG9wQ2FuUGxheVRocm91Z2g6eC5jYW5QbGF5VGhyb3VnaCx0b3BDbGljazp4LmNsaWNrLHRvcENvbnRleHRNZW51OnguY29udGV4dE1lbnUsdG9wQ29weTp4LmNvcHksdG9wQ3V0OnguY3V0LHRvcERvdWJsZUNsaWNrOnguZG91YmxlQ2xpY2ssdG9wRHJhZzp4LmRyYWcsdG9wRHJhZ0VuZDp4LmRyYWdFbmQsdG9wRHJhZ0VudGVyOnguZHJhZ0VudGVyLHRvcERyYWdFeGl0OnguZHJhZ0V4aXQsdG9wRHJhZ0xlYXZlOnguZHJhZ0xlYXZlLHRvcERyYWdPdmVyOnguZHJhZ092ZXIsdG9wRHJhZ1N0YXJ0OnguZHJhZ1N0YXJ0LHRvcERyb3A6eC5kcm9wLHRvcER1cmF0aW9uQ2hhbmdlOnguZHVyYXRpb25DaGFuZ2UsdG9wRW1wdGllZDp4LmVtcHRpZWQsdG9wRW5jcnlwdGVkOnguZW5jcnlwdGVkLHRvcEVuZGVkOnguZW5kZWQsdG9wRXJyb3I6eC5lcnJvcix0b3BGb2N1czp4LmZvY3VzLHRvcElucHV0OnguaW5wdXQsdG9wSW52YWxpZDp4LmludmFsaWQsdG9wS2V5RG93bjp4LmtleURvd24sdG9wS2V5UHJlc3M6eC5rZXlQcmVzcyx0b3BLZXlVcDp4LmtleVVwLHRvcExvYWQ6eC5sb2FkLHRvcExvYWRlZERhdGE6eC5sb2FkZWREYXRhLHRvcExvYWRlZE1ldGFkYXRhOngubG9hZGVkTWV0YWRhdGEsdG9wTG9hZFN0YXJ0OngubG9hZFN0YXJ0LHRvcE1vdXNlRG93bjp4Lm1vdXNlRG93bix0b3BNb3VzZU1vdmU6eC5tb3VzZU1vdmUsdG9wTW91c2VPdXQ6eC5tb3VzZU91dCx0b3BNb3VzZU92ZXI6eC5tb3VzZU92ZXIsdG9wTW91c2VVcDp4Lm1vdXNlVXAsdG9wUGFzdGU6eC5wYXN0ZSx0b3BQYXVzZTp4LnBhdXNlLHRvcFBsYXk6eC5wbGF5LHRvcFBsYXlpbmc6eC5wbGF5aW5nLHRvcFByb2dyZXNzOngucHJvZ3Jlc3MsdG9wUmF0ZUNoYW5nZTp4LnJhdGVDaGFuZ2UsdG9wUmVzZXQ6eC5yZXNldCx0b3BTY3JvbGw6eC5zY3JvbGwsdG9wU2Vla2VkOnguc2Vla2VkLHRvcFNlZWtpbmc6eC5zZWVraW5nLHRvcFN0YWxsZWQ6eC5zdGFsbGVkLHRvcFN1Ym1pdDp4LnN1Ym1pdCx0b3BTdXNwZW5kOnguc3VzcGVuZCx0b3BUaW1lVXBkYXRlOngudGltZVVwZGF0ZSx0b3BUb3VjaENhbmNlbDp4LnRvdWNoQ2FuY2VsLHRvcFRvdWNoRW5kOngudG91Y2hFbmQsdG9wVG91Y2hNb3ZlOngudG91Y2hNb3ZlLHRvcFRvdWNoU3RhcnQ6eC50b3VjaFN0YXJ0LHRvcFRyYW5zaXRpb25FbmQ6eC50cmFuc2l0aW9uRW5kLHRvcFZvbHVtZUNoYW5nZTp4LnZvbHVtZUNoYW5nZSx0b3BXYWl0aW5nOngud2FpdGluZyx0b3BXaGVlbDp4LndoZWVsfTtmb3IodmFyIFQgaW4gTilOW1RdLmRlcGVuZGVuY2llcz1bVF07dmFyIFA9Xyh7b25DbGljazpudWxsfSksdz17fSxTPXtldmVudFR5cGVzOngsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1OW2VdO2lmKCFvKXJldHVybiBudWxsO3ZhciBhO3N3aXRjaChlKXtjYXNlIEUudG9wQWJvcnQ6Y2FzZSBFLnRvcENhblBsYXk6Y2FzZSBFLnRvcENhblBsYXlUaHJvdWdoOmNhc2UgRS50b3BEdXJhdGlvbkNoYW5nZTpjYXNlIEUudG9wRW1wdGllZDpjYXNlIEUudG9wRW5jcnlwdGVkOmNhc2UgRS50b3BFbmRlZDpjYXNlIEUudG9wRXJyb3I6Y2FzZSBFLnRvcElucHV0OmNhc2UgRS50b3BJbnZhbGlkOmNhc2UgRS50b3BMb2FkOmNhc2UgRS50b3BMb2FkZWREYXRhOmNhc2UgRS50b3BMb2FkZWRNZXRhZGF0YTpjYXNlIEUudG9wTG9hZFN0YXJ0OmNhc2UgRS50b3BQYXVzZTpjYXNlIEUudG9wUGxheTpjYXNlIEUudG9wUGxheWluZzpjYXNlIEUudG9wUHJvZ3Jlc3M6Y2FzZSBFLnRvcFJhdGVDaGFuZ2U6Y2FzZSBFLnRvcFJlc2V0OmNhc2UgRS50b3BTZWVrZWQ6Y2FzZSBFLnRvcFNlZWtpbmc6Y2FzZSBFLnRvcFN0YWxsZWQ6Y2FzZSBFLnRvcFN1Ym1pdDpjYXNlIEUudG9wU3VzcGVuZDpjYXNlIEUudG9wVGltZVVwZGF0ZTpjYXNlIEUudG9wVm9sdW1lQ2hhbmdlOmNhc2UgRS50b3BXYWl0aW5nOmE9bDticmVhaztjYXNlIEUudG9wS2V5UHJlc3M6aWYoMD09PUMobikpcmV0dXJuIG51bGw7Y2FzZSBFLnRvcEtleURvd246Y2FzZSBFLnRvcEtleVVwOmE9cDticmVhaztjYXNlIEUudG9wQmx1cjpjYXNlIEUudG9wRm9jdXM6YT1jO2JyZWFrO2Nhc2UgRS50b3BDbGljazppZigyPT09bi5idXR0b24pcmV0dXJuIG51bGw7Y2FzZSBFLnRvcENvbnRleHRNZW51OmNhc2UgRS50b3BEb3VibGVDbGljazpjYXNlIEUudG9wTW91c2VEb3duOmNhc2UgRS50b3BNb3VzZU1vdmU6Y2FzZSBFLnRvcE1vdXNlT3V0OmNhc2UgRS50b3BNb3VzZU92ZXI6Y2FzZSBFLnRvcE1vdXNlVXA6YT1kO2JyZWFrO2Nhc2UgRS50b3BEcmFnOmNhc2UgRS50b3BEcmFnRW5kOmNhc2UgRS50b3BEcmFnRW50ZXI6Y2FzZSBFLnRvcERyYWdFeGl0OmNhc2UgRS50b3BEcmFnTGVhdmU6Y2FzZSBFLnRvcERyYWdPdmVyOmNhc2UgRS50b3BEcmFnU3RhcnQ6Y2FzZSBFLnRvcERyb3A6YT1mO2JyZWFrO2Nhc2UgRS50b3BUb3VjaENhbmNlbDpjYXNlIEUudG9wVG91Y2hFbmQ6Y2FzZSBFLnRvcFRvdWNoTW92ZTpjYXNlIEUudG9wVG91Y2hTdGFydDphPWg7YnJlYWs7Y2FzZSBFLnRvcEFuaW1hdGlvbkVuZDpjYXNlIEUudG9wQW5pbWF0aW9uSXRlcmF0aW9uOmNhc2UgRS50b3BBbmltYXRpb25TdGFydDphPXU7YnJlYWs7Y2FzZSBFLnRvcFRyYW5zaXRpb25FbmQ6YT12O2JyZWFrO2Nhc2UgRS50b3BTY3JvbGw6YT1tO2JyZWFrO2Nhc2UgRS50b3BXaGVlbDphPWc7YnJlYWs7Y2FzZSBFLnRvcENvcHk6Y2FzZSBFLnRvcEN1dDpjYXNlIEUudG9wUGFzdGU6YT1zfWE/dm9pZCAwOmIoITEpO3ZhciB5PWEuZ2V0UG9vbGVkKG8sdCxuLHIpO3JldHVybiBpLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoeSkseX0sZGlkUHV0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT1QKXt2YXIgcj1lLl9yb290Tm9kZUlELGk9YS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3dbcl18fCh3W3JdPW8ubGlzdGVuKGksImNsaWNrIix5KSl9fSx3aWxsRGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtpZih0PT09UCl7dmFyIG49ZS5fcm9vdE5vZGVJRDt3W25dLnJlbW92ZSgpLGRlbGV0ZSB3W25dfX19O3QuZXhwb3J0cz1TfSx7MTAwOjEwMCwxMDI6MTAyLDEwMzoxMDMsMTA0OjEwNCwxMDU6MTA1LDEwNjoxMDYsMTA3OjEwNywxMTk6MTE5LDEzOToxMzksMTQ2OjE0NiwxNTQ6MTU0LDE1ODoxNTgsMTY6MTYsMjA6MjAsNDA6NDAsOTU6OTUsOTY6OTYsOTg6OTgsOTk6OTl9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoOTkpLGk9e2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7OTk6OTl9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDk4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoMTAzKSxpPXtkYXRhVHJhbnNmZXI6bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezEwMzoxMDN9XSw5OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3RoaXMuZGlzcGF0Y2hDb25maWc9ZSx0aGlzLl90YXJnZXRJbnN0PXQsdGhpcy5uYXRpdmVFdmVudD1uO3ZhciBvPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgaSBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkoaSkpe3ZhciB1PW9baV07dT90aGlzW2ldPXUobik6InRhcmdldCI9PT1pP3RoaXMudGFyZ2V0PXI6dGhpc1tpXT1uW2ldfXZhciBzPW51bGwhPW4uZGVmYXVsdFByZXZlbnRlZD9uLmRlZmF1bHRQcmV2ZW50ZWQ6bi5yZXR1cm5WYWx1ZT09PSExO3JldHVybiBzP3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNUcnVlOnRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNGYWxzZSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWEudGhhdFJldHVybnNGYWxzZSx0aGlzfXZhciBvPWUoMTY1KSxpPWUoMjUpLGE9ZSgxNDYpLHU9KGUoMTY0KSwiZnVuY3Rpb24iPT10eXBlb2YgUHJveHksWyJkaXNwYXRjaENvbmZpZyIsIl90YXJnZXRJbnN0IiwibmF0aXZlRXZlbnQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsIl9kaXNwYXRjaExpc3RlbmVycyIsIl9kaXNwYXRjaEluc3RhbmNlcyJdKSxzPXt0eXBlOm51bGwsdGFyZ2V0Om51bGwsY3VycmVudFRhcmdldDphLnRoYXRSZXR1cm5zTnVsbCxldmVudFBoYXNlOm51bGwsYnViYmxlczpudWxsLGNhbmNlbGFibGU6bnVsbCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOm51bGwsaXNUcnVzdGVkOm51bGx9O28oci5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITEsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS50aGF0UmV0dXJuc1RydWUpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5hdGl2ZUV2ZW50O2UmJihlLnN0b3BQcm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOmUuY2FuY2VsQnViYmxlPSEwLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50aGF0UmV0dXJuc1RydWUpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7dGhpcy5pc1BlcnNpc3RlbnQ9YS50aGF0UmV0dXJuc1RydWV9LGlzUGVyc2lzdGVudDphLnRoYXRSZXR1cm5zRmFsc2UsZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgdCBpbiBlKXRoaXNbdF09bnVsbDtmb3IodmFyIG49MDtuPHUubGVuZ3RoO24rKyl0aGlzW3Vbbl1dPW51bGx9fSksci5JbnRlcmZhY2U9cyxyLmF1Z21lbnRDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9bi5wcm90b3R5cGU7dmFyIGE9bmV3IHI7byhhLGUucHJvdG90eXBlKSxlLnByb3RvdHlwZT1hLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5JbnRlcmZhY2U9byh7fSxuLkludGVyZmFjZSx0KSxlLmF1Z21lbnRDbGFzcz1uLmF1Z21lbnRDbGFzcyxpLmFkZFBvb2xpbmdUbyhlLGkuZm91ckFyZ3VtZW50UG9vbGVyKX0saS5hZGRQb29saW5nVG8ocixpLmZvdXJBcmd1bWVudFBvb2xlciksdC5leHBvcnRzPXJ9LHsxNDY6MTQ2LDE2NDoxNjQsMTY1OjE2NSwyNToyNX1dLDEwMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT17cmVsYXRlZFRhcmdldDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7MTA2OjEwNn1dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT1lKDExOSksYT1lKDEyMCksdT1lKDEyMSkscz17a2V5OmEsbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTp1LGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/aShlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9pKGUpOiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH19O28uYXVnbWVudENsYXNzKHIscyksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDExOToxMTksMTIwOjEyMCwxMjE6MTIxfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoMTA2KSxpPWUoMTA5KSxhPWUoMTIxKSx1PXtzY3JlZW5YOm51bGwsc2NyZWVuWTpudWxsLGNsaWVudFg6bnVsbCxjbGllbnRZOm51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6YSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIndoaWNoImluIGU/dDoyPT09dD8yOjQ9PT10PzE6MH0sYnV0dG9uczpudWxsLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldHx8KGUuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudCl9LHBhZ2VYOmZ1bmN0aW9uKGUpe3JldHVybiJwYWdlWCJpbiBlP2UucGFnZVg6ZS5jbGllbnRYK2kuY3VycmVudFNjcm9sbExlZnR9LHBhZ2VZOmZ1bmN0aW9uKGUpe3JldHVybiJwYWdlWSJpbiBlP2UucGFnZVk6ZS5jbGllbnRZK2kuY3VycmVudFNjcm9sbFRvcH19O28uYXVnbWVudENsYXNzKHIsdSksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDEwOToxMDksMTIxOjEyMX1dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT1lKDEyMSksYT17dG91Y2hlczpudWxsLHRhcmdldFRvdWNoZXM6bnVsbCxjaGFuZ2VkVG91Y2hlczpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxnZXRNb2RpZmllclN0YXRlOml9O28uYXVnbWVudENsYXNzKHIsYSksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDEyMToxMjF9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg5OSksaT17cHJvcGVydHlOYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDEwNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPWUoMTIyKSxhPXt2aWV3OmZ1bmN0aW9uKGUpe2lmKGUudmlldylyZXR1cm4gZS52aWV3O3ZhciB0PWkoZSk7aWYobnVsbCE9dCYmdC53aW5kb3c9PT10KXJldHVybiB0O3ZhciBuPXQub3duZXJEb2N1bWVudDtyZXR1cm4gbj9uLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvdzp3aW5kb3d9LGRldGFpbDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXRhaWx8fDB9fTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7MTIyOjEyMiw5OTo5OX1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpewpyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSgxMDMpLGk9e2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOm51bGwsZGVsdGFNb2RlOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHsxMDM6MTAzfV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPXtyZWluaXRpYWxpemVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKSx0aGlzLndyYXBwZXJJbml0RGF0YT90aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGg9MDp0aGlzLndyYXBwZXJJbml0RGF0YT1bXSx0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9LF9pc0luVHJhbnNhY3Rpb246ITEsZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5faXNJblRyYW5zYWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuLG8saSxhLHUscyl7dGhpcy5pc0luVHJhbnNhY3Rpb24oKT9yKCExKTp2b2lkIDA7dmFyIGwsYzt0cnl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSEwLGw9ITAsdGhpcy5pbml0aWFsaXplQWxsKDApLGM9ZS5jYWxsKHQsbixvLGksYSx1LHMpLGw9ITF9ZmluYWxseXt0cnl7aWYobCl0cnl7dGhpcy5jbG9zZUFsbCgwKX1jYXRjaChwKXt9ZWxzZSB0aGlzLmNsb3NlQWxsKDApfWZpbmFsbHl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSExfX1yZXR1cm4gY30saW5pdGlhbGl6ZUFsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTt0cnl7dGhpcy53cmFwcGVySW5pdERhdGFbbl09aS5PQlNFUlZFRF9FUlJPUix0aGlzLndyYXBwZXJJbml0RGF0YVtuXT1yLmluaXRpYWxpemU/ci5pbml0aWFsaXplLmNhbGwodGhpcyk6bnVsbH1maW5hbGx5e2lmKHRoaXMud3JhcHBlckluaXREYXRhW25dPT09aS5PQlNFUlZFRF9FUlJPUil0cnl7dGhpcy5pbml0aWFsaXplQWxsKG4rMSl9Y2F0Y2gobyl7fX19fSxjbG9zZUFsbDpmdW5jdGlvbihlKXt0aGlzLmlzSW5UcmFuc2FjdGlvbigpP3ZvaWQgMDpyKCExKTtmb3IodmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIG8sYT10W25dLHU9dGhpcy53cmFwcGVySW5pdERhdGFbbl07dHJ5e289ITAsdSE9PWkuT0JTRVJWRURfRVJST1ImJmEuY2xvc2UmJmEuY2xvc2UuY2FsbCh0aGlzLHUpLG89ITF9ZmluYWxseXtpZihvKXRyeXt0aGlzLmNsb3NlQWxsKG4rMSl9Y2F0Y2gocyl7fX19dGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoPTB9fSxpPXtNaXhpbjpvLE9CU0VSVkVEX0VSUk9SOnt9fTt0LmV4cG9ydHM9aX0sezE1NDoxNTR9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJlbnRTY3JvbGxMZWZ0OjAsY3VycmVudFNjcm9sbFRvcDowLHJlZnJlc2hTY3JvbGxWYWx1ZXM6ZnVuY3Rpb24oZSl7ci5jdXJyZW50U2Nyb2xsTGVmdD1lLngsci5jdXJyZW50U2Nyb2xsVG9wPWUueX19O3QuZXhwb3J0cz1yfSx7fV0sMTEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZihudWxsPT10P28oITEpOnZvaWQgMCxudWxsPT1lKXJldHVybiB0O3ZhciBuPUFycmF5LmlzQXJyYXkoZSkscj1BcnJheS5pc0FycmF5KHQpO3JldHVybiBuJiZyPyhlLnB1c2guYXBwbHkoZSx0KSxlKTpuPyhlLnB1c2godCksZSk6cj9bZV0uY29uY2F0KHQpOltlLHRdfXZhciBvPWUoMTU0KTt0LmV4cG9ydHM9cn0sezE1NDoxNTR9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9MSxuPTAscj0wLGk9ZS5sZW5ndGgsYT0tNCZpO2E+cjspe2Zvcih2YXIgdT1NYXRoLm1pbihyKzQwOTYsYSk7dT5yO3IrPTQpbis9KHQrPWUuY2hhckNvZGVBdChyKSkrKHQrPWUuY2hhckNvZGVBdChyKzEpKSsodCs9ZS5jaGFyQ29kZUF0KHIrMikpKyh0Kz1lLmNoYXJDb2RlQXQociszKSk7dCU9byxuJT1vfWZvcig7aT5yO3IrKyluKz10Kz1lLmNoYXJDb2RlQXQocik7cmV0dXJuIHQlPW8sbiU9byx0fG48PDE2fXZhciBvPTY1NTIxO3QuZXhwb3J0cz1yfSx7fV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSExO3QuZXhwb3J0cz1yfSx7fV0sMTEzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX07dC5leHBvcnRzPXJ9LHt9XSwxMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9bnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8IiI9PT10O2lmKHIpcmV0dXJuIiI7dmFyIG89aXNOYU4odCk7cmV0dXJuIG98fDA9PT10fHxpLmhhc093blByb3BlcnR5KGUpJiZpW2VdPyIiK3Q6KCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50cmltKCkpLHQrInB4Iil9dmFyIG89ZSgzKSxpPShlKDE2NCksby5pc1VuaXRsZXNzTnVtYmVyKTt0LmV4cG9ydHM9cn0sezE2NDoxNjQsMzozfV0sMTE1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGlbZV19ZnVuY3Rpb24gbyhlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShhLHIpfXZhciBpPXsiJiI6IiZhbXA7IiwiPiI6IiZndDsiLCI8IjoiJmx0OyIsJyInOiImcXVvdDsiLCInIjoiJiN4Mjc7In0sYT0vWyY+PCInXS9nO3QuZXhwb3J0cz1vfSx7fV0sMTE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTt2YXIgdD1pLmdldChlKTtyZXR1cm4gdD8odD1hKHQpLHQ/by5nZXROb2RlRnJvbUluc3RhbmNlKHQpOm51bGwpOnZvaWQgdSgoImZ1bmN0aW9uIj09dHlwZW9mIGUucmVuZGVyLCExKSl9dmFyIG89KGUoMzUpLGUoNDApKSxpPWUoNjkpLGE9ZSgxMjQpLHU9ZSgxNTQpO2UoMTY0KTt0LmV4cG9ydHM9cn0sezEyNDoxMjQsMTU0OjE1NCwxNjQ6MTY0LDM1OjM1LDQwOjQwLDY5OjY5fV0sMTE3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPWUsbz12b2lkIDA9PT1yW25dO28mJm51bGwhPXQmJihyW25dPXQpfWZ1bmN0aW9uIG8oZSl7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgdD17fTtyZXR1cm4gaShlLHIsdCksdH12YXIgaT0oZSgyMyksZSgxMzcpKTtlKDE2NCk7dC5leHBvcnRzPW99LHsxMzc6MTM3LDE2NDoxNjQsMjM6MjN9XSwxMTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSx0LG4pe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKHQsbik6ZSYmdC5jYWxsKG4sZSl9O3QuZXhwb3J0cz1yfSx7fV0sMTE5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQsbj1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/KHQ9ZS5jaGFyQ29kZSwwPT09dCYmMTM9PT1uJiYodD0xMykpOnQ9bix0Pj0zMnx8MTM9PT10P3Q6MH10LmV4cG9ydHM9cn0se31dLDEyMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUua2V5KXt2YXIgdD1pW2Uua2V5XXx8ZS5rZXk7aWYoIlVuaWRlbnRpZmllZCIhPT10KXJldHVybiB0fWlmKCJrZXlwcmVzcyI9PT1lLnR5cGUpe3ZhciBuPW8oZSk7cmV0dXJuIDEzPT09bj8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUobil9cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2FbZS5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9dmFyIG89ZSgxMTkpLGk9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGE9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifTt0LmV4cG9ydHM9cn0sezExOToxMTl9XSwxMjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD10aGlzLG49dC5uYXRpdmVFdmVudDtpZihuLmdldE1vZGlmaWVyU3RhdGUpcmV0dXJuIG4uZ2V0TW9kaWZpZXJTdGF0ZShlKTt2YXIgcj1pW2VdO3JldHVybiByPyEhbltyXTohMX1mdW5jdGlvbiBvKGUpe3JldHVybiByfXZhciBpPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07dC5leHBvcnRzPW99LHt9XSwxMjI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3c7cmV0dXJuIHQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJih0PXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLDM9PT10Lm5vZGVUeXBlP3QucGFyZW50Tm9kZTp0fXQuZXhwb3J0cz1yfSx7fV0sMTIzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZSYmKG8mJmVbb118fGVbaV0pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwfXZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixpPSJAQGl0ZXJhdG9yIjt0LmV4cG9ydHM9cn0se31dLDEyNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcih2YXIgdDsodD1lLl9yZW5kZXJlZE5vZGVUeXBlKT09PW8uQ09NUE9TSVRFOyllPWUuX3JlbmRlcmVkQ29tcG9uZW50O3JldHVybiB0PT09by5OQVRJVkU/ZS5fcmVuZGVyZWRDb21wb25lbnQ6dD09PW8uRU1QVFk/bnVsbDp2b2lkIDB9dmFyIG89ZSg3Nik7dC5leHBvcnRzPXJ9LHs3Njo3Nn1dLDEyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBvKGUpe2Zvcig7ZTspe2lmKGUubmV4dFNpYmxpbmcpcmV0dXJuIGUubmV4dFNpYmxpbmc7ZT1lLnBhcmVudE5vZGV9fWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49cihlKSxpPTAsYT0wO247KXtpZigzPT09bi5ub2RlVHlwZSl7aWYoYT1pK24udGV4dENvbnRlbnQubGVuZ3RoLHQ+PWkmJmE+PXQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1pfTtpPWF9bj1yKG8obikpfX10LmV4cG9ydHM9aX0se31dLDEyNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7cmV0dXJuIWkmJm8uY2FuVXNlRE9NJiYoaT0idGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpLGl9dmFyIG89ZSgxNDApLGk9bnVsbDt0LmV4cG9ydHM9cn0sezE0MDoxNDB9XSwxMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3QsblsibXMiK2VdPSJNUyIrdCxuWyJPIitlXT0ibyIrdC50b0xvd2VyQ2FzZSgpLG59ZnVuY3Rpb24gbyhlKXtpZih1W2VdKXJldHVybiB1W2VdO2lmKCFhW2VdKXJldHVybiBlO3ZhciB0PWFbZV07Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBzKXJldHVybiB1W2VdPXRbbl07cmV0dXJuIiJ9dmFyIGk9ZSgxNDApLGE9e2FuaW1hdGlvbmVuZDpyKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOnIoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LHU9e30scz17fTtpLmNhblVzZURPTSYmKHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBhLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgYS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgYS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pLHQuZXhwb3J0cz1vfSx7MTQwOjE0MH1dLDEyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUucHJvdG90eXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5yZWNlaXZlQ29tcG9uZW50fWZ1bmN0aW9uIG8oZSl7dmFyIHQsbj1udWxsPT09ZXx8ZT09PSExO2lmKG4pdD11LmNyZWF0ZShvKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSl7dmFyIGk9ZTshaXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGkudHlwZSYmInN0cmluZyIhPXR5cGVvZiBpLnR5cGU/bCghMSk6dm9pZCAwLHQ9InN0cmluZyI9PXR5cGVvZiBpLnR5cGU/cy5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChpKTpyKGkudHlwZSk/bmV3IGkudHlwZShpKTpuZXcgYyhpKX1lbHNlInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/dD1zLmNyZWF0ZUluc3RhbmNlRm9yVGV4dChlKTpsKCExKTtyZXR1cm4gdC5fbW91bnRJbmRleD0wLHQuX21vdW50SW1hZ2U9bnVsbCx0fXZhciBpPWUoMTY1KSxhPWUoMzQpLHU9ZSg2Mikscz1lKDc1KSxsPShlKDcwKSxlKDE1NCkpLGM9KGUoMTY0KSxmdW5jdGlvbihlKXt0aGlzLmNvbnN0cnVjdChlKX0pO2koYy5wcm90b3R5cGUsYS5NaXhpbix7X2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6b30pO3QuZXhwb3J0cz1vfSx7MTU0OjE1NCwxNjQ6MTY0LDE2NToxNjUsMzQ6MzQsNjI6NjIsNzA6NzAsNzU6NzV9XSwxMjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCFpLmNhblVzZURPTXx8dCYmISgiYWRkRXZlbnRMaXN0ZW5lciJpbiBkb2N1bWVudCkpcmV0dXJuITE7dmFyIG49Im9uIitlLHI9biBpbiBkb2N1bWVudDtpZighcil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zZXRBdHRyaWJ1dGUobiwicmV0dXJuOyIpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGFbbl19cmV0dXJuIXImJm8mJiJ3aGVlbCI9PT1lJiYocj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJFdmVudHMud2hlZWwiLCIzLjAiKSkscn12YXIgbyxpPWUoMTQwKTtpLmNhblVzZURPTSYmKG89ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUmJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIsIiIpIT09ITApLHQuZXhwb3J0cz1yfSx7MTQwOjE0MH1dLDEzMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdCYmKCJpbnB1dCI9PT10JiZvW2UudHlwZV18fCJ0ZXh0YXJlYSI9PT10KX12YXIgbz17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07dC5leHBvcnRzPXJ9LHt9XSwxMzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gby5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6aSghMSksZX12YXIgbz1lKDYwKSxpPWUoMTU0KTt0LmV4cG9ydHM9cn0sezE1NDoxNTQsNjA6NjB9XSwxMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4nIicrbyhlKSsnIid9dmFyIG89ZSgxMTUpO3QuZXhwb3J0cz1yfSx7MTE1OjExNX1dLDEzMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDcyKTt0LmV4cG9ydHM9ci5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcn0sezcyOjcyfV0sMTM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQwKSxvPS9eWyBcclxuXHRcZl0vLGk9LzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0YXxzY3JpcHR8c3R5bGUpWyBcclxuXHRcZlwvPl0vLGE9ZSgxMTMpLHU9YShmdW5jdGlvbihlLHQpe2UuaW5uZXJIVE1MPXR9KTtpZihyLmNhblVzZURPTSl7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5pbm5lckhUTUw9IiAiLCIiPT09cy5pbm5lckhUTUwmJih1PWZ1bmN0aW9uKGUsdCl7aWYoZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsZSksby50ZXN0KHQpfHwiPCI9PT10WzBdJiZpLnRlc3QodCkpe2UuaW5uZXJIVE1MPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUyNzkpK3Q7dmFyIG49ZS5maXJzdENoaWxkOzE9PT1uLmRhdGEubGVuZ3RoP2UucmVtb3ZlQ2hpbGQobik6bi5kZWxldGVEYXRhKDAsMSl9ZWxzZSBlLmlubmVySFRNTD10fSkscz1udWxsfXQuZXhwb3J0cz11fSx7MTEzOjExMywxNDA6MTQwfV0sMTM1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQwKSxvPWUoMTE1KSxpPWUoMTM0KSxhPWZ1bmN0aW9uKGUsdCl7ZS50ZXh0Q29udGVudD10fTtyLmNhblVzZURPTSYmKCJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChhPWZ1bmN0aW9uKGUsdCl7aShlLG8odCkpfSkpLHQuZXhwb3J0cz1hfSx7MTE1OjExNSwxMzQ6MTM0LDE0MDoxNDB9XSwxMzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPW51bGw9PT1lfHxlPT09ITEscj1udWxsPT09dHx8dD09PSExO2lmKG58fHIpcmV0dXJuIG49PT1yO3ZhciBvPXR5cGVvZiBlLGk9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PT1vfHwibnVtYmVyIj09PW8/InN0cmluZyI9PT1pfHwibnVtYmVyIj09PWk6Im9iamVjdCI9PT1pJiZlLnR5cGU9PT10LnR5cGUmJmUua2V5PT09dC5rZXl9dC5leHBvcnRzPXJ9LHt9XSwxMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUua2V5P2wuZXNjYXBlKGUua2V5KTp0LnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBvKGUsdCxuLGkpe3ZhciBkPXR5cGVvZiBlO2lmKCJ1bmRlZmluZWQiIT09ZCYmImJvb2xlYW4iIT09ZHx8KGU9bnVsbCksbnVsbD09PWV8fCJzdHJpbmciPT09ZHx8Im51bWJlciI9PT1kfHxhLmlzVmFsaWRFbGVtZW50KGUpKXJldHVybiBuKGksZSwiIj09PXQ/YytyKGUsMCk6dCksMTt2YXIgZixoLHY9MCxtPSIiPT09dD9jOnQrcDtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKWY9ZVtnXSxoPW0rcihmLGcpLHYrPW8oZixoLG4saSk7ZWxzZXt2YXIgeT11KGUpO2lmKHkpe3ZhciBDLGI9eS5jYWxsKGUpO2lmKHkhPT1lLmVudHJpZXMpZm9yKHZhciBfPTA7IShDPWIubmV4dCgpKS5kb25lOylmPUMudmFsdWUsaD1tK3IoZixfKyspLHYrPW8oZixoLG4saSk7ZWxzZSBmb3IoOyEoQz1iLm5leHQoKSkuZG9uZTspe3ZhciBFPUMudmFsdWU7RSYmKGY9RVsxXSxoPW0rbC5lc2NhcGUoRVswXSkrcCtyKGYsMCksdis9byhmLGgsbixpKSl9fWVsc2Uib2JqZWN0Ij09PWQmJihTdHJpbmcoZSkscyghMSkpfXJldHVybiB2fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiBudWxsPT1lPzA6byhlLCIiLHQsbil9dmFyIGE9KGUoMzUpLGUoNjApKSx1PWUoMTIzKSxzPWUoMTU0KSxsPWUoMjMpLGM9KGUoMTY0KSwiLiIpLHA9IjoiO3QuZXhwb3J0cz1pfSx7MTIzOjEyMywxNTQ6MTU0LDE2NDoxNjQsMjM6MjMsMzU6MzUsNjA6NjB9XSwxMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9KGUoMTY1KSxlKDE0NikpLG89KGUoMTY0KSxyKTt0LmV4cG9ydHM9b30sezE0NjoxNDYsMTY0OjE2NCwxNjU6MTY1fV0sMTM5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQ2KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50PyhlLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVudCgib24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0ZXJEZWZhdWx0OmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPW99LHsxNDY6MTQ2fV0sMTQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17Y2FuVXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5Vc2VFdmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5hdHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6IXJ9O3QuZXhwb3J0cz1vfSx7fV0sMTQxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciBvPS8tKC4pL2c7dC5leHBvcnRzPXJ9LHt9XSwxNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlLnJlcGxhY2UoaSwibXMtIikpfXZhciBvPWUoMTQxKSxpPS9eLW1zLS87dC5leHBvcnRzPXJ9LHsxNDE6MTQxfV0sMTQzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZSYmdD9lPT09dD8hMDpvKGUpPyExOm8odCk/cihlLHQucGFyZW50Tm9kZSk6ZS5jb250YWlucz9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSk6ITE6ITF9dmFyIG89ZSgxNTYpO3QuZXhwb3J0cz1yfSx7MTU2OjE1Nn1dLDE0NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubGVuZ3RoO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/YSghMSk6dm9pZCAwLCJudW1iZXIiIT10eXBlb2YgdD9hKCExKTp2b2lkIDAsMD09PXR8fHQtMSBpbiBlP3ZvaWQgMDphKCExKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jYWxsZWU/YSghMSk6dm9pZCAwLGUuaGFzT3duUHJvcGVydHkpdHJ5e3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKX1jYXRjaChuKXt9Zm9yKHZhciByPUFycmF5KHQpLG89MDt0Pm87bysrKXJbb109ZVtvXTtyZXR1cm4gcn1mdW5jdGlvbiBvKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYibGVuZ3RoImluIGUmJiEoInNldEludGVydmFsImluIGUpJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJihBcnJheS5pc0FycmF5KGUpfHwiY2FsbGVlImluIGV8fCJpdGVtImluIGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG8oZSk/QXJyYXkuaXNBcnJheShlKT9lLnNsaWNlKCk6cihlKTpbZV19dmFyIGE9ZSgxNTQpO3QuZXhwb3J0cz1pfSx7MTU0OjE1NH1dLDE0NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubWF0Y2goYyk7cmV0dXJuIHQmJnRbMV0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49bDtsP3ZvaWQgMDpzKCExKTt2YXIgbz1yKGUpLGk9byYmdShvKTtpZihpKXtuLmlubmVySFRNTD1pWzFdK2UraVsyXTtmb3IodmFyIGM9aVswXTtjLS07KW49bi5sYXN0Q2hpbGR9ZWxzZSBuLmlubmVySFRNTD1lO3ZhciBwPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO3AubGVuZ3RoJiYodD92b2lkIDA6cyghMSksYShwKS5mb3JFYWNoKHQpKTtmb3IodmFyIGQ9QXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpO24ubGFzdENoaWxkOyluLnJlbW92ZUNoaWxkKG4ubGFzdENoaWxkKTtyZXR1cm4gZH12YXIgaT1lKDE0MCksYT1lKDE0NCksdT1lKDE1MCkscz1lKDE1NCksbD1pLmNhblVzZURPTT9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsLGM9L15ccyo8KFx3KykvO3QuZXhwb3J0cz1vfSx7MTQwOjE0MCwxNDQ6MTQ0LDE1MDoxNTAsMTU0OjE1NH1dLDE0NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX1mdW5jdGlvbiBvKCl7fW8udGhhdFJldHVybnM9cixvLnRoYXRSZXR1cm5zRmFsc2U9cighMSksby50aGF0UmV0dXJuc1RydWU9cighMCksby50aGF0UmV0dXJuc051bGw9cihudWxsKSxvLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxvLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZXhwb3J0cz1vfSx7fV0sMTQ3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9O3QuZXhwb3J0cz1yfSx7fV0sMTQ4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dHJ5e2UuZm9jdXMoKX1jYXRjaCh0KXt9fXQuZXhwb3J0cz1yfSx7fV0sMTQ5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRvY3VtZW50KXJldHVybiBudWxsO3RyeXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYm9keX1jYXRjaChlKXtyZXR1cm4gZG9jdW1lbnQuYm9keX19dC5leHBvcnRzPXJ9LHt9XSwxNTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gYT92b2lkIDA6aSghMSksZC5oYXNPd25Qcm9wZXJ0eShlKXx8KGU9IioiKSx1Lmhhc093blByb3BlcnR5KGUpfHwoIioiPT09ZT9hLmlubmVySFRNTD0iPGxpbmsgLz4iOmEuaW5uZXJIVE1MPSI8IitlKyI+PC8iK2UrIj4iLHVbZV09IWEuZmlyc3RDaGlsZCksdVtlXT9kW2VdOm51bGx9dmFyIG89ZSgxNDApLGk9ZSgxNTQpLGE9by5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVsbCx1PXt9LHM9WzEsJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsIjwvc2VsZWN0PiJdLGw9WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGM9WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLHA9WzEsJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4nLCI8L3N2Zz4iXSxkPXsiKiI6WzEsIj88ZGl2PiIsIjwvZGl2PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxvcHRncm91cDpzLG9wdGlvbjpzLGNhcHRpb246bCxjb2xncm91cDpsLHRib2R5OmwsdGZvb3Q6bCx0aGVhZDpsLHRkOmMsdGg6Y30sZj1bImNpcmNsZSIsImNsaXBQYXRoIiwiZGVmcyIsImVsbGlwc2UiLCJnIiwiaW1hZ2UiLCJsaW5lIiwibGluZWFyR3JhZGllbnQiLCJtYXNrIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxHcmFkaWVudCIsInJlY3QiLCJzdG9wIiwidGV4dCIsInRzcGFuIl07Zi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZV09cCx1W2VdPSEwfSksdC5leHBvcnRzPXJ9LHsxNDA6MTQwLDE1NDoxNTR9XSwxNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT09PXdpbmRvdz97eDp3aW5kb3cucGFnZVhPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHk6d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfTp7eDplLnNjcm9sbExlZnQseTplLnNjcm9sbFRvcH19dC5leHBvcnRzPXJ9LHt9XSwxNTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5yZXBsYWNlKG8sIi0kMSIpLnRvTG93ZXJDYXNlKCl9dmFyIG89LyhbQS1aXSkvZzt0LmV4cG9ydHM9cn0se31dLDE1MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBvKGUpLnJlcGxhY2UoaSwiLW1zLSIpfXZhciBvPWUoMTUyKSxpPS9ebXMtLzt0LmV4cG9ydHM9cn0sezE1MjoxNTJ9XSwxNTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyLG8saSxhLHUpe2lmKCFlKXt2YXIgcztpZih2b2lkIDA9PT10KXM9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpO2Vsc2V7dmFyIGw9W24scixvLGksYSx1XSxjPTA7cz1uZXcgRXJyb3IodC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGxbYysrXX0pKSxzLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24ifXRocm93IHMuZnJhbWVzVG9Qb3A9MSxzfX10LmV4cG9ydHM9cn0se31dLDE1NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiEoIWV8fCEoImZ1bmN0aW9uIj09dHlwZW9mIE5vZGU/ZSBpbnN0YW5jZW9mIE5vZGU6Im9iamVjdCI9PXR5cGVvZiBlJiYibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZS5ub2RlTmFtZSkpfXQuZXhwb3J0cz1yfSx7fV0sMTU2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG8oZSkmJjM9PWUubm9kZVR5cGV9dmFyIG89ZSgxNTUpO3QuZXhwb3J0cz1yfSx7MTU1OjE1NX1dLDE1NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE1NCksbz1mdW5jdGlvbihlKXt2YXIgdCxuPXt9O2UgaW5zdGFuY2VvZiBPYmplY3QmJiFBcnJheS5pc0FycmF5KGUpP3ZvaWQgMDpyKCExKTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihuW3RdPXQpO3JldHVybiBufTt0LmV4cG9ydHM9b30sezE1NDoxNTR9XSwxNTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0O3JldHVybiBudWxsfTt0LmV4cG9ydHM9cn0se31dLDE1OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgcj17fTtmb3IodmFyIGkgaW4gZSlvLmNhbGwoZSxpKSYmKHJbaV09dC5jYWxsKG4sZVtpXSxpLGUpKTtyZXR1cm4gcn12YXIgbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1yfSx7fV0sMTYwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9e307cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lLmNhbGwodGhpcyxuKSksdFtuXX19dC5leHBvcnRzPXJ9LHt9XSwxNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1lKDE0MCk7by5jYW5Vc2VET00mJihyPXdpbmRvdy5wZXJmb3JtYW5jZXx8d2luZG93Lm1zUGVyZm9ybWFuY2V8fHdpbmRvdy53ZWJraXRQZXJmb3JtYW5jZSksdC5leHBvcnRzPXJ8fHt9fSx7MTQwOjE0MH1dLDE2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPWUoMTYxKTtyPW8ubm93P2Z1bmN0aW9uKCl7cmV0dXJuIG8ubm93KCl9OmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHQuZXhwb3J0cz1yfSx7MTYxOjE2MX1dLDE2MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwxL2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSx0KXtpZihyKGUsdCkpcmV0dXJuITA7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8Im9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dClyZXR1cm4hMTt2YXIgbj1PYmplY3Qua2V5cyhlKSxvPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspaWYoIWkuY2FsbCh0LG5bYV0pfHwhcihlW25bYV1dLHRbblthXV0pKXJldHVybiExO3JldHVybiEwfXZhciBpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPW99LHt9XSwxNjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNDYpLG89cjt0LmV4cG9ydHM9b30sezE0NjoxNDZ9XSwxNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihudWxsPT09ZXx8dm9pZCAwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpO3JldHVybiBPYmplY3QoZSl9ZnVuY3Rpb24gbygpe3RyeXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTt2YXIgZT1uZXcgU3RyaW5nKCJhYmMiKTtpZihlWzVdPSJkZSIsIjUiPT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSlbMF0pcmV0dXJuITE7Zm9yKHZhciB0PXt9LG49MDsxMD5uO24rKyl0WyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXT1uO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pO2lmKCIwMTIzNDU2Nzg5IiE9PXIuam9pbigiIikpcmV0dXJuITE7dmFyIG89e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPWV9KSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxvKSkuam9pbigiIil9Y2F0Y2goaSl7cmV0dXJuITF9fXZhciBpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3QuZXhwb3J0cz1vKCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixvLHU9cihlKSxzPTE7czxhcmd1bWVudHMubGVuZ3RoO3MrKyl7bj1PYmplY3QoYXJndW1lbnRzW3NdKTtmb3IodmFyIGwgaW4gbilpLmNhbGwobixsKSYmKHVbbF09bltsXSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7bz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG4pO2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKWEuY2FsbChuLG9bY10pJiYodVtvW2NdXT1uW29bY11dKX19cmV0dXJuIHV9fSx7fV19LHt9LFs4OF0pKDg4KX0pOw=="></script>
<script src="data:application/x-javascript;base64,LyoqCiAqIFJlYWN0RE9NIHYxNS4xLjAKICoKICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAogKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICoKICovCiFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgicmVhY3QiKSk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbInJlYWN0Il0sZSk7ZWxzZXt2YXIgZjtmPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmLlJlYWN0RE9NPWUoZi5SZWFjdCl9fShmdW5jdGlvbihlKXtyZXR1cm4gZS5fX1NFQ1JFVF9ET01fRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRH0pOw=="></script>
<link href="data:text/css;charset=utf-8,%0A%0A%2EjsonEditor%20%2A%20%7B%0Avertical%2Dalign%3A%20top%3B%0A%7D%0A%2EjsonEditor%20%3E%20%2EjsonObject%20%3E%20%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%200%3B%0Aborder%2Dleft%3A%200%3B%0Apadding%3A%200%3B%0A%7D%0A%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Adisplay%3A%20none%3B%0Afont%2Dweight%3A%20normal%3B%0Aborder%2Dleft%3A%201px%20dotted%20%23ddd%3B%0A%7D%0A%2EjsonFlex%20%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%20%2D20px%3B%0A%7D%0A%2EjsonCompound%2Eopen%20%3E%20%2EjsonChildren%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%2EjsonAdd%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2EjsonFlex%20%2EjsonField%20%7B%0Adisplay%3A%20%2Dms%2Dflexbox%3B%0Adisplay%3A%20%2Dwebkit%2Dflex%3B%0Adisplay%3A%20flex%3B%0A%2Dwebkit%2Dflex%2Ddirection%3A%20row%3B%0A%2Dms%2Dflex%2Ddirection%3A%20row%3B%0Aflex%2Ddirection%3A%20row%3B%0A%2Dwebkit%2Dflex%2Dwrap%3A%20nowrap%3B%0A%2Dms%2Dflex%2Dwrap%3A%20nowrap%3B%0Aflex%2Dwrap%3A%20nowrap%3B%0A%2Dwebkit%2Djustify%2Dcontent%3A%20flex%2Dstart%3B%0A%2Dms%2Dflex%2Dpack%3A%20start%3B%0Ajustify%2Dcontent%3A%20flex%2Dstart%3B%0A%2Dwebkit%2Dalign%2Dcontent%3A%20stretch%3B%0A%2Dms%2Dflex%2Dline%2Dpack%3A%20stretch%3B%0Aalign%2Dcontent%3A%20stretch%3B%0A%7D%0A%2EjsonFieldAdder%20%7B%0Amargin%2Dleft%3A%2013px%3B%0A%7D%0A%2EjsonFieldAdder%20select%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2EcompoundToggle%3Abefore%20%7B%0Acontent%3A%20%27%E2%96%B8%27%3B%0Acolor%3A%20%23333%3B%0Aline%2Dheight%3A%201em%3B%0Amargin%2Dright%3A%203px%3B%0A%7D%0A%2Eopen%20%3E%20%2EcompoundToggle%3Abefore%20%7B%0Acontent%3A%20%27%E2%96%BE%27%3B%0A%7D%0A%2EjsonName%20%7B%0Afont%2Dstyle%3A%20italic%3B%0Atext%2Dalign%3A%20right%3B%0Aposition%3A%20relative%3B%0Apadding%2Dleft%3A%2015px%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2EjsonValue%20%7B%0Apadding%2Dleft%3A%205px%3B%0Aflex%2Dgrow%3A%201%3B%0A%7D%0A%2EjsonValue%20%3E%20input%2C%0A%2EjsonValue%20%3E%20textarea%2C%0A%2EjsonValue%20%3E%20select%20%7B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%2EjsonFlex%20input%5Btype%3Dtext%5D%2C%0A%2EjsonFlex%20input%5Btype%3Dnumber%5D%2C%0A%2EjsonFlex%20input%5Btype%3Dpassword%5D%2C%0A%2EjsonFlex%20textarea%20%7B%0Awidth%3A%20100%25%3B%0A%7D%0A%2EjsonRemove%2C%20%2EjsonFixed%20%7B%0Avisibility%3A%20hidden%3B%0Amargin%2Dright%3A%205px%3B%0Atext%2Ddecoration%3A%20none%3B%0Awidth%3A%20%2E6em%3B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0A%7D%0A%2EjsonName%3Ahover%20%3E%20%2EjsonRemove%20%7B%0Avisibility%3A%20visible%3B%0A%7D%0Apre%20%7B%0Abackground%3A%20%23eee%3B%0Aborder%3A%201px%20solid%20%23ddd%3B%0Apadding%3A%205px%3B%0Afloat%3A%20left%3B%0Awidth%3A%20180px%3B%0Amargin%3A%200%2010px%200%200%3B%0A%7D%0A%2EcompoundToggle%2C%20%2EjsonString%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2EbooleanField%20%2A%20%7B%0Avertical%2Dalign%3A%20middle%3B%0A%7D%0A%2EbooleanField%20input%20%7B%0Amargin%2Dbottom%3A%200%3B%0A%7D%0A%2EjsonError%20%3E%20%2EjsonName%2C%0A%2EjsonError%20%2EjsonErrorMsg%20%7B%0Acolor%3A%20%23f36%3B%0A%7D%0A%2EjsonError%20%2EjsonErrorMsg%20%7B%0Amargin%3A%200%200%2010px%2010px%3B%0Afont%2Dsize%3A%200%2E9em%3B%0Avertical%2Dalign%3A%20bottom%3B%0Adisplay%3A%20block%3B%0A%7D%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20input%2C%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20select%2C%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20textarea%20%7B%0Abackground%2Dcolor%3A%20%23fff8f8%3B%0A%7D%0A%2EjsonNovalue%20%7B%0Acolor%3A%20%23999%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0A%2EjsonGroup%20%7B%0Amargin%2Dbottom%3A%2010px%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoNCnJlYWN0LWpzb24gdjAuMC4xDQpodHRwczovL2dpdGh1Yi5jb20vYXJxZXgvcmVhY3QtanNvbg0KTUlUOiBodHRwczovL2dpdGh1Yi5jb20vYXJxZXgvcmVhY3QtanNvbi9yYXcvbWFzdGVyL0xJQ0VOU0UNCiovDQooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgew0KCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykNCgkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUodW5kZWZpbmVkKSk7DQoJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpDQoJCWRlZmluZShbXSwgZmFjdG9yeSk7DQoJZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpDQoJCWV4cG9ydHNbIkpzb24iXSA9IGZhY3RvcnkocmVxdWlyZSh1bmRlZmluZWQpKTsNCgllbHNlDQoJCXJvb3RbIkpzb24iXSA9IGZhY3Rvcnkocm9vdFsiUmVhY3QiXSk7DQp9KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXykgew0KcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXANCi8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlDQovKioqKioqLyAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsNCg0KLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uDQovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgew0KDQovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQ0KLyoqKioqKi8gCQlpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkNCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOw0KDQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpDQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsNCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9LA0KLyoqKioqKi8gCQkJaWQ6IG1vZHVsZUlkLA0KLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQ0KLyoqKioqKi8gCQl9Ow0KDQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbg0KLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsNCg0KLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkDQovKioqKioqLyAJCW1vZHVsZS5sb2FkZWQgPSB0cnVlOw0KDQovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlDQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsNCi8qKioqKiovIAl9DQoNCg0KLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsNCg0KLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsNCg0KLyoqKioqKi8gCS8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7DQoNCi8qKioqKiovIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMNCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsNCi8qKioqKiovIH0pDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKi8gKFsNCi8qIDAgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgidmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RnJlZXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpLFxuXHRvYmplY3RBc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSxcblx0VHlwZUZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSxcblx0T2JqZWN0RmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLFxuXHRBcnJheUZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KSxcblx0U3RyaW5nRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRCb29sZWFuRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLFxuXHROdW1iZXJGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oNyksXG5cdFRleHRGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oOCksXG5cdFBhc3N3b3JkRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpLFxuXHRTZWxlY3RGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTApLFxuXHRkZWVwU2V0dGluZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuO1xuXG5cbi8qKlxuICogVGhlIG1haW4gY29tcG9uZW50LiBJdCB3aWxsIHJlZnJlc2ggdGhlIHByb3BzIHdoZW4gdGhlIHN0b3JlIGNoYW5nZXMuXG4gKlxuICogQHByb3AgIHtPYmplY3R8RnJlZXplck5vZGV9IHZhbHVlIFRoZSBKU09OIG9iamVjdCwgdmFsdWUgb2YgdGhlIGZvcm0uXG4gKiBAcHJvcCAge09iamVjdH0gc2V0dGluZ3MgQ3VzdG9taXphdGlvbiBzZXR0aW5nc1xuICovXG52YXIgSnNvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuXHRnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB7fSxcblx0XHRcdGVycm9yczogZmFsc2UsXG5cdFx0XHR1cGRhdGluZzogZmFsc2Vcblx0XHR9O1xuXHR9LFxuXG5cdGNoaWxkQ29udGV4dFR5cGVzOiB7XG5cdFx0dHlwZURlZmF1bHRzOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG5cdH0sXG5cblx0Z2V0Q2hpbGRDb250ZXh0OiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlRGVmYXVsdHM6IHRoaXMuc3RhdGUuZGVmYXVsdHNcblx0XHR9O1xuXHR9LFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0dmFsdWUgPSB0aGlzLnByb3BzLnZhbHVlLFxuXHRcdFx0bGlzdGVuZXJcblx0XHQ7XG5cblx0XHQvLyBJZiBpdCBpcyBhIGZyZWV6ZXIgbm9kZVxuXHRcdGlmKCAhdmFsdWUuZ2V0TGlzdGVuZXIgKVxuXHRcdFx0dmFsdWUgPSBuZXcgRnJlZXplciggdmFsdWUgKS5nZXQoKTtcblxuXHRcdC8vIExpc3RlbiB0byBjaGFuZ2VzXG5cdFx0dmFsdWUuZ2V0TGlzdGVuZXIoKS5vbigndXBkYXRlJywgZnVuY3Rpb24oIHVwZGF0ZWQgKXtcblx0XHRcdGlmKCBtZS5zdGF0ZS51cGRhdGluZyApXG5cdFx0XHRcdHJldHVybiBtZS5zZXRTdGF0ZSh7IHVwZGF0aW5nOiBmYWxzZSB9KTtcblxuXHRcdFx0bWUuc2V0U3RhdGUoe3ZhbHVlOiB1cGRhdGVkfSk7XG5cblx0XHRcdGlmKCBtZS5zdGF0ZS5lcnJvcnMgKVxuXHRcdFx0XHRtZS5nZXRWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGlmKCBtZS5wcm9wcy5vbkNoYW5nZSApXG5cdFx0XHRcdG1lLnByb3BzLm9uQ2hhbmdlKCB1cGRhdGVkLnRvSlMoKSApO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRlZmF1bHRzOiB0aGlzLmNyZWF0ZURlZmF1bHRzKCksXG5cdFx0XHRpZDogdGhpcy5nZXRJZCgpXG5cdFx0fTtcblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV3UHJvcHMgKXtcblx0XHRpZiggIW5ld1Byb3BzLnZhbHVlLmdldExpc3RlbmVyICl7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHt1cGRhdGluZzogdHJ1ZSwgdmFsdWU6IHRoaXMuc3RhdGUudmFsdWUucmVzZXQoIG5ld1Byb3BzLnZhbHVlICl9KTtcblx0XHR9XG5cblx0XHR0aGlzLnNldFN0YXRlKCB7ZGVmYXVsdHM6IHRoaXMuY3JlYXRlRGVmYXVsdHMoKX0gKTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5wcm9wcy5zZXR0aW5ncyB8fCB7fSxcblx0XHRcdG9iID0gUmVhY3QuY3JlYXRlRWxlbWVudCggVHlwZUZpZWxkLCB7XG5cdFx0XHRcdHR5cGU6ICdvYmplY3QnLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcblx0XHRcdFx0c2V0dGluZ3M6IG9iamVjdEFzc2lnbigge30sIHRoaXMuc3RhdGUuZGVmYXVsdHMub2JqZWN0LCB7XG5cdFx0XHRcdFx0ZmllbGRzOiBzZXR0aW5ncy5maWVsZHMsXG5cdFx0XHRcdFx0ZWRpdGluZzogdGhpcy5nZXRGb3JtU2V0dGluZyggc2V0dGluZ3MsICdlZGl0aW5nJywgJ2Fsd2F5cycpLFxuXHRcdFx0XHRcdGZpeGVkRmllbGRzOiB0aGlzLmdldEZvcm1TZXR0aW5nKCBzZXR0aW5ncywgJ2ZpeGVkRmllbGRzJywgdHJ1ZSksXG5cdFx0XHRcdFx0YWRkZXI6ICB0aGlzLmdldEZvcm1TZXR0aW5nKCBzZXR0aW5ncywgJ2FkZGVyJywgZmFsc2UpLFxuXHRcdFx0XHRcdGhlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0b3JkZXI6IHNldHRpbmdzLm9yZGVyXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRyZWY6ICd2YWx1ZScsXG5cdFx0XHRcdGRlZmF1bHRzOiB0aGlzLnN0YXRlLmRlZmF1bHRzLFxuXHRcdFx0XHRpZDogdGhpcy5zdGF0ZS5pZFxuXHRcdFx0fSlcblx0XHQ7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmRpdih7Y2xhc3NOYW1lOiBcImpzb25FZGl0b3JcIn0sIG9iKTtcblx0fSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZS50b0pTKCk7XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oKXtcblx0XHR2YXIganNvblZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpLFxuXHRcdFx0ZXJyb3JzID0gdGhpcy5yZWZzLnZhbHVlLmdldFZhbGlkYXRpb25FcnJvcnMoIGpzb25WYWx1ZSApXG5cdFx0O1xuXG5cdFx0dGhpcy5zZXRTdGF0ZSgge2Vycm9yczogZXJyb3JzLmxlbmd0aH0gKTtcblx0XHRyZXR1cm4gZXJyb3JzLmxlbmd0aCA/IGVycm9ycyA6IGZhbHNlO1xuXHR9LFxuXHRnZXREZWVwU2V0dGluZ3M6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHNldHRpbmdzID0ge307XG5cblx0XHRmb3IoIHZhciBrZXkgaW4gZGVlcFNldHRpbmdzICl7XG5cdFx0XHRzZXR0aW5nc1sga2V5IF0gPSBkZWVwU2V0dGluZ3NbIGtleSBdKCB0aGlzLCBzZXR0aW5nc1trZXldICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNldHRpbmdzO1xuXHR9LFxuXHRjcmVhdGVEZWZhdWx0czogZnVuY3Rpb24oKXtcblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLnByb3BzLnNldHRpbmdzIHx8IHt9LFxuXHRcdFx0Y29tcG9uZW50cyA9IFR5cGVGaWVsZC5wcm90b3R5cGUuY29tcG9uZW50cyxcblx0XHRcdHByb3BEZWZhdWx0cyA9IHNldHRpbmdzLmRlZmF1bHRzIHx8IHt9LFxuXHRcdFx0ZGVmYXVsdHMgPSB7fVxuXHRcdDtcblxuXHRcdGZvciggdmFyIHR5cGUgaW4gY29tcG9uZW50cyApe1xuXHRcdFx0ZGVmYXVsdHNbIHR5cGUgXSA9IG9iamVjdEFzc2lnbigge30sIGNvbXBvbmVudHNbIHR5cGUgXS5wcm90b3R5cGUuZGVmYXVsdHMgfHwge30sIHByb3BEZWZhdWx0c1sgdHlwZSBdIHx8IHt9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdH0sXG5cblx0Z2V0SWQ6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIGJ0b2EoIHBhcnNlSW50KCBNYXRoLnJhbmRvbSgpICogMTAwMDAgKSApLnJlcGxhY2UoLz0vZywgJycpO1xuXHR9LFxuXG5cdGdldEZvcm1TZXR0aW5nOiBmdW5jdGlvbiggc2V0dGluZ3MsIGZpZWxkLCBkZWYgKXtcblx0XHRpZiggdHlwZW9mIHNldHRpbmdzWyBmaWVsZCBdICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiBzZXR0aW5nc1sgZmllbGQgXTtcblx0XHRpZiggc2V0dGluZ3MuZm9ybSApXG5cdFx0XHRyZXR1cm4gZGVmO1xuXHR9XG59KTtcblxuLy8gQWRkIGdsb2JhbCBtb2RpZmllciBmdW5jdGlvbnNcbkpzb24ucmVnaXN0ZXJUeXBlID0gVHlwZUZpZWxkLnJlZ2lzdGVyVHlwZS5iaW5kKCBUeXBlRmllbGQgKTtcblxuLy8gUmVnaXN0ZXIgYmFzaWMgdHlwZXNcbkpzb24ucmVnaXN0ZXJUeXBlKCAnb2JqZWN0JywgT2JqZWN0RmllbGQgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnYXJyYXknLCBBcnJheUZpZWxkLCB0cnVlICk7XG5Kc29uLnJlZ2lzdGVyVHlwZSggJ3N0cmluZycsIFN0cmluZ0ZpZWxkLCB0cnVlICk7XG5Kc29uLnJlZ2lzdGVyVHlwZSggJ3RleHQnLCBUZXh0RmllbGQsIHRydWUgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnbnVtYmVyJywgTnVtYmVyRmllbGQsIHRydWUgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnYm9vbGVhbicsIEJvb2xlYW5GaWVsZCwgdHJ1ZSApO1xuSnNvbi5yZWdpc3RlclR5cGUoICdwYXNzd29yZCcsIFBhc3N3b3JkRmllbGQgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnc2VsZWN0JywgU2VsZWN0RmllbGQgKTtcblxubW9kdWxlLmV4cG9ydHMgPSBKc29uO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9Kc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9Kc29uLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCJ9XG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vZXh0ZXJuYWxfJTdCJTIycm9vdCUyMjolMjJSZWFjdCUyMiU3RD8iKTsNCg0KLyoqKi8gfSwNCi8qIDIgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRkZWVwU2V0dGluZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSxcblx0b2JqZWN0QXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcbjtcblxudmFyIGNvbXBvbmVudHMgPSB7fTtcbnZhciB0eXBlQ2hlY2tPcmRlciA9IFtdO1xuXG52YXIgVHlwZUZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRjb21wb25lbnRzOiB7fSxcblx0dHlwZUNoZWNrT3JkZXI6IFtdLFxuXG5cdGNvbnRleHRUeXBlczoge1xuXHRcdHR5cGVEZWZhdWx0czogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIENvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KCksXG5cdFx0XHRzZXR0aW5ncyA9IG9iamVjdEFzc2lnbihcblx0XHRcdFx0e30sXG5cdFx0XHRcdHRoaXMuY29udGV4dC50eXBlRGVmYXVsdHNbIHRoaXMucHJvcHMudHlwZSBdLFxuXHRcdFx0XHR0aGlzLnByb3BzLnNldHRpbmdzXG5cdFx0XHQpXG5cdFx0O1xuXG5cdFx0dGhpcy5hZGREZWVwU2V0dGluZ3MoIHNldHRpbmdzICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCggQ29tcG9uZW50LCB7XG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdHNldHRpbmdzOiBzZXR0aW5ncyxcblx0XHRcdG9uVXBkYXRlZDogdGhpcy5wcm9wcy5vblVwZGF0ZWQsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdHJlZjogJ2ZpZWxkJ1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24oKXtcblx0XHR2YXIgdHlwZSA9IHRoaXMucHJvcHMudHlwZTtcblx0XHRpZiggIXR5cGUgKVxuXHRcdFx0dHlwZSA9IHRoaXMuZ3Vlc3NUeXBlKCB0aGlzLnByb3BzLnZhbHVlICk7XG5cblx0XHR0aGlzLmZpZWxkVHlwZSA9IHR5cGU7XG5cblx0XHRyZXR1cm4gdGhpcy5jb21wb25lbnRzWyB0eXBlIF07XG5cdH0sXG5cblx0Z3Vlc3NUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHR2YXIgdHlwZSA9IGZhbHNlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHR0eXBlcyA9IHRoaXMudHlwZUNoZWNrT3JkZXIsXG5cdFx0XHRjb21wb25lbnRcblx0XHQ7XG5cblx0XHR3aGlsZSggIXR5cGUgJiYgaSA8IHR5cGVzLmxlbmd0aCApe1xuXHRcdFx0Y29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzWyB0eXBlc1tpXSBdLnByb3RvdHlwZTtcblx0XHRcdGlmKCBjb21wb25lbnQuaXNUeXBlICYmIGNvbXBvbmVudC5pc1R5cGUoIHZhbHVlICkgKVxuXHRcdFx0XHR0eXBlID0gdHlwZXNbaSsrXTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiB0eXBlIHx8ICdvYmplY3QnO1xuXHR9LFxuXG5cdGdldFZhbGlkYXRpb25FcnJvcnM6IGZ1bmN0aW9uKCBqc29uVmFsdWUgKXtcblx0XHRyZXR1cm4gdGhpcy5yZWZzLmZpZWxkLmdldFZhbGlkYXRpb25FcnJvcnMoIGpzb25WYWx1ZSApO1xuXHR9LFxuXG5cdGFkZERlZXBTZXR0aW5nczogZnVuY3Rpb24oIHNldHRpbmdzICl7XG5cdFx0dmFyIHBhcmVudFNldHRpbmdzID0gdGhpcy5wcm9wcy5wYXJlbnRTZXR0aW5ncyB8fCB7fSxcblx0XHRcdGRlZXBcblx0XHQ7XG5cblx0XHRmb3IoIHZhciBrZXkgaW4gZGVlcFNldHRpbmdzICl7XG5cdFx0XHRkZWVwID0gZGVlcFNldHRpbmdzWyBrZXkgXSggcGFyZW50U2V0dGluZ3Nba2V5XSwgc2V0dGluZ3Nba2V5XSApO1xuXHRcdFx0aWYoIHR5cGVvZiBkZWVwICE9ICd1bmRlZmluZWQnIClcblx0XHRcdFx0c2V0dGluZ3NbIGtleSBdID0gZGVlcDtcblx0XHR9XG4gXHR9XG59KTtcblxuVHlwZUZpZWxkLnJlZ2lzdGVyVHlwZSA9IGZ1bmN0aW9uKCBuYW1lLCBDb21wb25lbnQsIHNlbGVjdGFibGUgKXtcblx0dmFyIHByb3RvID0gVHlwZUZpZWxkLnByb3RvdHlwZTtcblx0cHJvdG8uY29tcG9uZW50c1sgbmFtZSBdID0gQ29tcG9uZW50O1xuXHRpZiggc2VsZWN0YWJsZSApXG5cdFx0cHJvdG8udHlwZUNoZWNrT3JkZXIudW5zaGlmdCggbmFtZSApO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUeXBlRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy9UeXBlRmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSAyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9UeXBlRmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiAzICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSxcblx0YXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMiksXG5cdENvbXBvdW5kRmllbGRNaXhpbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG47XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgaGFzaC5cbiAqIEBwYXJhbSAge0ZyZWV6ZXJOb2RlfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpdCB0aGUgb3JpZ2luYWwganNvbi5cbiAqL1xudmFyIE9iamVjdEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtDb21wb3VuZEZpZWxkTWl4aW5dLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdGdldFN0YXRlRnJvbVByb3BzOiBmdW5jdGlvbiggcHJvcHMgKXtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZWRpdGluZzogcHJvcHMuc2V0dGluZ3MuZWRpdGluZyB8fCBmYWxzZSxcblx0XHRcdGZpZWxkczogYXNzaWduKHt9LCBwcm9wcy5zZXR0aW5ncyAmJiBwcm9wcy5zZXR0aW5ncy5maWVsZHMgfHwge30pXG5cdFx0fTtcblx0fSxcblxuXHRkZWZhdWx0VmFsdWU6IHt9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLnByb3BzLnNldHRpbmdzLFxuXHRcdFx0Y2xhc3NOYW1lID0gdGhpcy5zdGF0ZS5lZGl0aW5nIHx8IHNldHRpbmdzLmhlYWRlciA9PT0gZmFsc2UgPyAnb3BlbiBqc29uT2JqZWN0IGpzb25Db21wb3VuZCcgOiAnanNvbk9iamVjdCBqc29uQ29tcG91bmQnLFxuXHRcdFx0b3Blbkhhc2ggPSAnJyxcblx0XHRcdGRlZmluaXRpb25zID0gdGhpcy5zdGF0ZS5maWVsZHMsXG5cdFx0XHRhdHRycyA9IFtdLFxuXHRcdFx0dmFsdWUgPSBhc3NpZ24oe30sIHRoaXMucHJvcHMudmFsdWUgKSxcblx0XHRcdGZpeGVkRmllbGRzID0gdGhpcy5nZXRGaXhlZEZpZWxkcygpLFxuXHRcdFx0Z3JvdXBDb3VudCA9IDAsXG5cdFx0XHRkZWZpbml0aW9uXG5cdFx0O1xuXG5cdFx0dGhpcy5nZXRGaWVsZE9yZGVyKCkuZm9yRWFjaCggZnVuY3Rpb24oIGZpZWxkICl7XG5cdFx0XHQvLyBJZiB0aGUgZmllbGQgaXMgYW4gYXJyYXkgaGFuZGxlIGdyb3VwaW5nXG5cdFx0XHRpZiggZmllbGQuY29uc3RydWN0b3IgPT09IEFycmF5IClcblx0XHRcdFx0YXR0cnMucHVzaCggbWUucmVuZGVyR3JvdXAoIGZpZWxkLCBmaXhlZEZpZWxkcywgKytncm91cENvdW50ICkgKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXR0cnMucHVzaCggbWUucmVuZGVyRmllbGQoIGZpZWxkLCBmaXhlZEZpZWxkcyApICk7XG5cdFx0fSk7XG5cblx0XHR2YXIgb3Blbkhhc2hDaGlsZHJlbiA9IFsgYXR0cnMgXTtcblx0XHRpZiggc2V0dGluZ3MuYWRkZXIgIT09IGZhbHNlICl7XG5cdFx0XHRvcGVuSGFzaENoaWxkcmVuLnB1c2goIHRoaXMucmVuZGVyQWRkZXIoKSApO1xuXHRcdH1cblxuXHRcdG9wZW5IYXNoID0gUmVhY3QuRE9NLmRpdih7IGtleTogJ28nLCBjbGFzc05hbWU6ICdqc29uQ2hpbGRyZW4nfSwgb3Blbkhhc2hDaGlsZHJlbik7XG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5zcGFuKHtjbGFzc05hbWU6IGNsYXNzTmFtZX0sIFtcblx0XHRcdHRoaXMucmVuZGVySGVhZGVyKCksXG5cdFx0XHRvcGVuSGFzaFxuXHRcdF0pO1xuXHR9LFxuXG5cdHJlbmRlckZpZWxkOiBmdW5jdGlvbigga2V5LCBmaXhlZEZpZWxkcyApe1xuXHRcdHZhciB2YWx1ZSA9IHRoaXMucHJvcHMudmFsdWVbIGtleSBdLFxuXHRcdFx0ZGVmaW5pdGlvbiA9IHRoaXMuc3RhdGUuZmllbGRzWyBrZXkgXSB8fCB7fSxcblx0XHRcdGZpeGVkID0gZml4ZWRGaWVsZHMgPT09IHRydWUgfHwgdHlwZW9mIGZpeGVkRmllbGRzID09ICdvYmplY3QnICYmIGZpeGVkRmllbGRzWyBrZXkgXVxuXHRcdDtcblxuXHRcdGlmKCAhZGVmaW5pdGlvbi5zZXR0aW5ncyApXG5cdFx0XHRkZWZpbml0aW9uLnNldHRpbmdzID0ge307XG5cblx0XHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCggRmllbGQsIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmFtZToga2V5LFxuXHRcdFx0cmVmOiBrZXksXG5cdFx0XHRmaXhlZDogZml4ZWQsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdGRlZmluaXRpb246IGRlZmluaXRpb24sXG5cdFx0XHRvblVwZGF0ZWQ6IHRoaXMudXBkYXRlRmllbGQsXG5cdFx0XHRvbkRlbGV0ZWQ6IHRoaXMuZGVsZXRlRmllbGQsXG5cdFx0XHRwYXJlbnRTZXR0aW5nczogdGhpcy5wcm9wcy5zZXR0aW5nc1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbmRlckdyb3VwOiBmdW5jdGlvbiggZmllbGROYW1lcywgZml4ZWRGaWVsZHMsIGdyb3VwTnVtYmVyICl7XG5cdFx0dmFyIG1lID0gdGhpcyxcblx0XHRcdGZpZWxkcyA9IFtdXG5cdFx0O1xuXG5cdFx0ZmllbGROYW1lcy5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKXtcblx0XHRcdGZpZWxkcy5wdXNoKCBtZS5yZW5kZXJGaWVsZCggZmllbGQsIGZpeGVkRmllbGRzICkgKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBSZWFjdC5ET00uZGl2KHsgY2xhc3NOYW1lOiAnanNvbkdyb3VwIGpzb25Hcm91cF8nICsgZ3JvdXBOdW1iZXIgfSwgZmllbGRzICk7XG5cdH0sXG5cblx0Z2V0RGVmYXVsdEhlYWRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gJ01hcCBbJyArIE9iamVjdC5rZXlzKCB0aGlzLnByb3BzLnZhbHVlICkubGVuZ3RoICsgJ10nO1xuXHR9LFxuXG5cdGdldERlZmF1bHRBZGRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gJysgQWRkIGZpZWxkJztcblx0fSxcblxuXHR1cGRhdGVGaWVsZDogZnVuY3Rpb24oIGtleSwgdmFsdWUgKXtcblx0XHR0aGlzLmNoZWNrRWRpdGluZ1NldHRpbmcoIGtleSApO1xuXHRcdHRoaXMucHJvcHMudmFsdWUuc2V0KCBrZXksIHZhbHVlICk7XG5cdH0sXG5cblx0ZGVsZXRlRmllbGQ6IGZ1bmN0aW9uKCBrZXkgKXtcblx0XHR0aGlzLnByb3BzLnZhbHVlLnJlbW92ZSgga2V5ICk7XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oIGpzb25WYWx1ZSApe1xuXHRcdHZhciBtZSA9IHRoaXMsXG5cdFx0XHRlcnJvcnMgPSBbXSxcblx0XHRcdGF0dHJzID0gT2JqZWN0LmtleXMoIHRoaXMucmVmcyApXG5cdFx0O1xuXG5cdFx0YXR0cnMuZm9yRWFjaCggZnVuY3Rpb24oIGF0dHIgKXtcblx0XHRcdHZhciBlcnJvciA9IG1lLnJlZnNbYXR0cl0uZ2V0VmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0aWYoIGVycm9yIClcblx0XHRcdFx0ZXJyb3JzID0gZXJyb3JzLmNvbmNhdCggZXJyb3IgKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG5cblx0Z2V0RmllbGRPcmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0c2V0dGluZ3NPcmRlciA9IHRoaXMucHJvcHMuc2V0dGluZ3Mub3JkZXIsXG5cdFx0XHRvcmRlclR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NPcmRlcixcblx0XHRcdGZpZWxkcyA9IHRoaXMucHJvcHMuc2V0dGluZ3MuZmllbGRzIHx8IHt9LFxuXHRcdFx0Z3JvdXBcblx0XHQ7XG5cblx0XHRpZiggIXNldHRpbmdzT3JkZXIgfHwgKG9yZGVyVHlwZSAhPSAnZnVuY3Rpb24nICYmIHNldHRpbmdzT3JkZXIuY29uc3RydWN0b3IgIT09IEFycmF5KSApXG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoIHRoaXMucHJvcHMudmFsdWUgKTtcblxuXHRcdHZhciB2YWx1ZSA9IGFzc2lnbigge30sIHRoaXMucHJvcHMudmFsdWUgKSxcblx0XHRcdG9yZGVyID0gW11cblx0XHQ7XG5cblx0XHRpZiggb3JkZXJUeXBlID09ICdmdW5jdGlvbicgKVxuXHRcdFx0cmV0dXJuIHNldHRpbmdzT3JkZXIoIHZhbHVlICk7XG5cblx0XHQvLyBBZGQgZmllbGRzIGluIHRoZSBhcnJheVxuXHRcdGlmKCBzZXR0aW5nc09yZGVyLmNvbnN0cnVjdG9yID09PSBBcnJheSApe1xuXHRcdFx0c2V0dGluZ3NPcmRlci5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKXtcblxuXHRcdFx0XHQvLyBBbiBhcnJheSwgaGFuZGxlIGdyb3VwXG5cdFx0XHRcdGlmKCBmaWVsZC5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xuXHRcdFx0XHRcdGdyb3VwID0gW107XG5cdFx0XHRcdFx0ZmllbGQuZm9yRWFjaCggZnVuY3Rpb24oIGdyb3VwRmllbGQgKXtcblx0XHRcdFx0XHRcdGlmKCBtZS5hZGRGaWVsZFRvT3JkZXIoIGdyb3VwRmllbGQsIHZhbHVlLCBmaWVsZHMgKSApe1xuXHRcdFx0XHRcdFx0XHRncm91cC5wdXNoKCBncm91cEZpZWxkICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZW0gZnJvbSBjdXJyZW50IHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdmFsdWVbIGdyb3VwRmllbGQgXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiggZ3JvdXAubGVuZ3RoIClcblx0XHRcdFx0XHRcdG9yZGVyLnB1c2goIGdyb3VwICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiggbWUuYWRkRmllbGRUb09yZGVyKCBmaWVsZCwgdmFsdWUsIGZpZWxkcyApICl7XG5cdFx0XHRcdFx0b3JkZXIucHVzaCggZmllbGQgKTtcblxuXHRcdFx0XHRcdC8vIERlbGV0ZSB0aGVtIGZyb20gY3VycmVudCB2YWx1ZXNcblx0XHRcdFx0XHRkZWxldGUgdmFsdWVbIGZpZWxkIF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUga2V5cyBsZWZ0IGluIHRoZSB2YWx1ZVxuXHRcdGZvciggdmFyIGtleSBpbiB2YWx1ZSApe1xuXHRcdFx0aWYoIG9yZGVyLmluZGV4T2YoIGtleSApID09IC0xIClcblx0XHRcdFx0b3JkZXIucHVzaCgga2V5ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9yZGVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hlbiBhIGZpZWxkIHRoYXQgYXBwZWFycyBpbiB0aGUgc29ydCBzZXR0aW5ncyBuZWVkcyB0byBiZSBhZGRlZCB0b1xuXHQgKiB0aGUgZmllbGRPcmRlciBhcnJheVxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQgVGhlIGZpZWxkIG5hbWVcblx0ICovXG5cdGFkZEZpZWxkVG9PcmRlcjogZnVuY3Rpb24oIGZpZWxkLCB2YWx1ZSwgZmllbGRzICl7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZVsgZmllbGQgXSAhPSAndW5kZWZpbmVkJyB8fCBmaWVsZHNbIGZpZWxkIF0gJiYgZmllbGRzWyBmaWVsZCBdLnR5cGUgPT0gJ3JlYWN0Jztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0RmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy90eXBlcy9PYmplY3RGaWVsZC5qc1xuICoqIG1vZHVsZSBpZCA9IDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL3R5cGVzL09iamVjdEZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNCAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSksXG5cdEZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCksXG5cdGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLFxuXHRDb21wb3VuZEZpZWxkTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZWRpdGluZyBhbiBhcnJheS5cbiAqIEBwYXJhbSAge0ZyZWV6ZXJOb2RlfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGFycmF5LlxuICogQHBhcmFtICB7TWl4ZWR9IG9yaWdpbmFsIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGl0IHRoZSBvcmlnaW5hbCBqc29uLlxuICovXG52YXIgQXJyYXlGaWVsZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0bWl4aW5zOiBbQ29tcG91bmRGaWVsZE1peGluXSxcblxuXHRnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RhdGVGcm9tUHJvcHMoIHRoaXMucHJvcHMgKTtcblx0fSxcblxuXHRnZXRTdGF0ZUZyb21Qcm9wczogZnVuY3Rpb24oIHByb3BzICl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGVkaXRpbmc6IHByb3BzLnNldHRpbmdzLmVkaXRpbmcgfHwgZmFsc2UsXG5cdFx0XHRmaWVsZHM6IHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5maWVsZHMgfHwge31cblx0XHR9O1xuXHR9LFxuXG5cdGRlZmF1bHRWYWx1ZTogW10sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMucHJvcHMuc2V0dGluZ3MsXG5cdFx0XHRjbGFzc05hbWUgPSB0aGlzLnN0YXRlLmVkaXRpbmcgPyAnb3BlbiBqc29uQXJyYXkganNvbkNvbXBvdW5kJyA6ICdqc29uQXJyYXkganNvbkNvbXBvdW5kJyxcblx0XHRcdG9wZW5BcnJheSA9ICcnLFxuXHRcdFx0Zml4ZWRGaWVsZHMgPSB0aGlzLmdldEZpeGVkRmllbGRzKCksXG5cdFx0XHRkZWZpbml0aW9ucyA9IHRoaXMuc3RhdGUuZmllbGRzXG5cdFx0O1xuXG5cdFx0dmFyIGF0dHJzID0gW10sXG5cdFx0XHRkZWZpbml0aW9uLCBmaXhlZFxuXHRcdDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcHMudmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGRlZmluaXRpb24gPSBkZWZpbml0aW9uc1sgaSBdIHx8IHt9O1xuXHRcdFx0aWYoICFkZWZpbml0aW9uLnNldHRpbmdzIClcblx0XHRcdFx0ZGVmaW5pdGlvbi5zZXR0aW5ncyA9IHt9O1xuXG5cdFx0XHRmaXhlZCA9IGZpeGVkRmllbGRzID09PSB0cnVlIHx8IHR5cGVvZiBmaXhlZEZpZWxkcyA9PSAnb2JqZWN0JyAmJiBmaXhlZEZpZWxkc1sgaSBdO1xuXG5cdFx0XHRhdHRycy5wdXNoKCBSZWFjdC5jcmVhdGVFbGVtZW50KCBGaWVsZCwge1xuXHRcdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZVtpXSxcblx0XHRcdFx0a2V5OiBpLFxuXHRcdFx0XHRuYW1lOiBpLFxuXHRcdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdFx0ZGVmaW5pdGlvbjogZGVmaW5pdGlvbixcblx0XHRcdFx0Zml4ZWQ6IGZpeGVkLFxuXHRcdFx0XHRvblVwZGF0ZWQ6IHRoaXMudXBkYXRlRmllbGQsXG5cdFx0XHRcdG9uRGVsZXRlZDogdGhpcy5kZWxldGVGaWVsZCxcblx0XHRcdFx0cGFyZW50U2V0dGluZ3M6IHRoaXMucHJvcHMuc2V0dGluZ3Ncblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHR2YXIgb3BlbkFycmF5Q2hpbGRyZW4gPSBbIGF0dHJzIF07XG5cdFx0aWYoIHNldHRpbmdzLmFkZGVyICE9PSBmYWxzZSApe1xuXHRcdFx0b3BlbkFycmF5Q2hpbGRyZW4ucHVzaCggdGhpcy5yZW5kZXJBZGRlciggdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggKSApO1xuXHRcdH1cblxuXHRcdG9wZW5BcnJheSA9IFJlYWN0LkRPTS5kaXYoeyBrZXk6J28nLCBjbGFzc05hbWU6ICdqc29uQ2hpbGRyZW4nIH0sIG9wZW5BcnJheUNoaWxkcmVuICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oe2NsYXNzTmFtZTogY2xhc3NOYW1lfSwgW1xuXHRcdFx0dGhpcy5yZW5kZXJIZWFkZXIoKSxcblx0XHRcdG9wZW5BcnJheVxuXHRcdF0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRIZWFkZXI6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuICdMaXN0IFsnICsgdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggKyAnXSc7XG5cdH0sXG5cblx0Z2V0RGVmYXVsdEFkZGVyOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiAnKyBBZGQgZWxlbWVudCc7XG5cdH0sXG5cblx0dXBkYXRlRmllbGQ6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7XG5cdFx0dGhpcy5jaGVja0VkaXRpbmdTZXR0aW5nKCBrZXkgKTtcblx0XHR0aGlzLnByb3BzLnZhbHVlLnNldCgga2V5LCB2YWx1ZSApO1xuXHR9LFxuXG5cdGRlbGV0ZUZpZWxkOiBmdW5jdGlvbigga2V5ICl7XG5cdFx0dmFyIGZpZWxkcyA9IHt9O1xuXG5cdFx0Zm9yKCB2YXIgaW5kZXggaW4gdGhpcy5zdGF0ZS5maWVsZHMgKXtcblx0XHRcdGlmKCBpbmRleCA+IGtleSApe1xuXHRcdFx0XHRmaWVsZHNbIGluZGV4IC0gMSBdID0gdGhpcy5zdGF0ZS5maWVsZHNbIGluZGV4IF07XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKCBpbmRleCA8IGtleSApe1xuXHRcdFx0XHRmaWVsZHNbIGluZGV4IF0gPSB0aGlzLnN0YXRlLmZpZWxkc1sgaW5kZXggXTtcblx0XHRcdH1cblx0XHRcdC8vIElmIHRoZXkgYXJlIGVxdWFsIHdlIGFyZSBkZWxldGluZyB0aGUgZWxlbWVudCwgZG8gbm90aGluZ1xuXHRcdH1cblxuXHRcdHRoaXMucHJvcHMudmFsdWUuc3BsaWNlKCBrZXksIDEgKTtcblx0XHR0aGlzLnNldFN0YXRlKCB7IGZpZWxkczogZmllbGRzIH0gKTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXlGaWVsZDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vc3JjL3R5cGVzL0FycmF5RmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy90eXBlcy9BcnJheUZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgc3RyaW5nLlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSAge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpdCB0aGUgb3JpZ2luYWwganNvbi5cbiAqIEBwYXJhbSB7RnJlZXplck5vZGV9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUgdG8gbGV0IHRoZSBzdHJpbmcgY29tcG9uZW50IHVwZGF0ZSBpdHMgdmFsdWUuXG4gKi9cbnZhciBTdHJpbmdGaWVsZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0bWl4aW5zOiBbTGVhZk1peGluXSxcblx0dHlwZUNsYXNzOiAnanNvblN0cmluZycsXG5cdGlucHV0VHlwZTogJ3RleHQnLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJJbnB1dCgpO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH0sXG5cblx0aXNUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlICE9ICdvYmplY3QnO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdGaWVsZDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vc3JjL3R5cGVzL1N0cmluZ0ZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvU3RyaW5nRmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiA2ICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBib29sZWFuLlxuICovXG52YXIgQm9vbGVhbkZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG5cdGRlZmF1bHRWYWx1ZTogZmFsc2UsXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBjbGFzc05hbWUgPSAnanNvbkJvb2xlYW4nO1xuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5pbnB1dCh7XG5cdFx0XHR0eXBlOiBcImNoZWNrYm94XCIsXG5cdFx0XHRjbGFzc05hbWU6IGNsYXNzTmFtZSxcblx0XHRcdGlkOiB0aGlzLnByb3BzLmlkLFxuXHRcdFx0Y2hlY2tlZDogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdG9uQ2hhbmdlOiB0aGlzLnVwZGF0ZVZhbHVlXG5cdFx0fSk7XG5cdH0sXG5cblx0dXBkYXRlVmFsdWU6IGZ1bmN0aW9uKCBlICl7XG5cdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIGUudGFyZ2V0LmNoZWNrZWQgKTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Jvb2xlYW4nO1xuXHR9LFxuXG5cdGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKCBuZXh0UHJvcHMgKXtcblx0XHRpZiggdGhpcy5wcm9wcy52YWx1ZSAhPSBuZXh0UHJvcHMudmFsdWUgKVxuXHRcdFx0dGhpcy5zZXRTdGF0ZSggeyB2YWx1ZTogbmV4dFByb3BzLnZhbHVlIH0gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQm9vbGVhbkZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvQm9vbGVhbkZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvQm9vbGVhbkZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNyAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZWRpdGluZyBhIG51bWJlci5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgc3RyaW5nIGNvbXBvbmVudCB1cGRhdGUgaXRzIHZhbHVlLlxuICovXG52YXIgTnVtYmVyRmllbGQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdG1peGluczogW0xlYWZNaXhpbl0sXG5cdHR5cGVDbGFzczogJ2pzb25OdW1iZXInLFxuXHRpbnB1dFR5cGU6ICdudW1iZXInLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJJbnB1dCgpO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogcGFyc2VGbG9hdCggZS50YXJnZXQudmFsdWUgKSB9KTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcic7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlckZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvTnVtYmVyRmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy90eXBlcy9OdW1iZXJGaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDggKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgidmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0TGVhZk1peGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcbjtcblxuLyoqXG4gKiBDb21wb25lbnQgZm9yIGVkaXRpbmcgYSBsb25nIHN0cmluZy5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgc3RyaW5nIGNvbXBvbmVudCB1cGRhdGUgaXRzIHZhbHVlLlxuICovXG52YXIgVGV4dEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtMZWFmTWl4aW5dLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgY2xhc3NOYW1lID0gJ2pzb25UZXh0JztcblxuXHRcdGlmKCAhdGhpcy5zdGF0ZS5lZGl0aW5nIClcblx0XHRcdHJldHVybiBSZWFjdC5ET00uc3Bhbigge29uQ2xpY2s6IHRoaXMuc2V0RWRpdE1vZGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lfSwgdGhpcy5wcm9wcy52YWx1ZSApO1xuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS50ZXh0YXJlYSh7XG5cdFx0XHR2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcblx0XHRcdGlkOiB0aGlzLnByb3BzLmlkLFxuXHRcdFx0b25DaGFuZ2U6IHRoaXMudXBkYXRlVmFsdWUsXG5cdFx0XHRwbGFjZWhvbGRlcjogdGhpcy5wcm9wcy5zZXR0aW5ncy5wbGFjZWhvbGRlciB8fCAnJyxcblx0XHRcdG9uQmx1cjogdGhpcy5zZXRWYWx1ZSxcblx0XHRcdHJlZjogJ2lucHV0J1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH0sXG5cblx0aXNUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDEwMDtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGV4dEZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvVGV4dEZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvVGV4dEZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogOSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgcGFzc3dvcmQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFzc3dvcmQuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgcGFzc3dvcmQgY29tcG9uZW50IHVwZGF0ZSBpdHMgdmFsdWUuXG4gKi9cbnZhciBQYXNzd29yZEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtMZWFmTWl4aW5dLFxuXHR0eXBlQ2xhc3M6ICdqc29uUGFzc3dvcmQnLFxuXHRpbnB1dFR5cGU6ICdwYXNzd29yZCcsXG5cdGRlZmF1bHRWYWx1ZTogJycsXG5cblx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB0aGlzLmdldFN0YXRlRnJvbVByb3BzKCB0aGlzLnByb3BzICk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB0aGlzLnJlbmRlcklucHV0KCk7XG5cdH0sXG5cblx0Z2V0RGlzcGxheU1vZGVTdHJpbmc6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0V2lsZGNhcmRzKCk7XG5cdH0sXG5cblx0Z2V0V2lsZGNhcmRzOiBmdW5jdGlvbigpe1xuXHRcdHZhciBvdXQgPSAnJztcblx0XHRmb3IgKHZhciBpID0gdGhpcy5zdGF0ZS52YWx1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0b3V0ICs9ICcqJztcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3N3b3JkRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy90eXBlcy9QYXNzd29yZEZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvUGFzc3dvcmRGaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEwICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBib29sZWFuLlxuICovXG52YXIgU2VsZWN0VHlwZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gIHtcblx0XHRcdHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlXG5cdFx0fTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIGNsYXNzTmFtZSA9ICdqc29uU2VsZWN0JztcblxuXHRcdHJldHVybiBSZWFjdC5ET00uc2VsZWN0KHtcblx0XHRcdGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuXHRcdFx0aWQ6IHRoaXMucHJvcHMuaWQsXG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdG9uQ2hhbmdlOiB0aGlzLnVwZGF0ZVZhbHVlXG5cdFx0fSwgdGhpcy5yZW5kZXJPcHRpb25zKCkgKTtcblx0fSxcblxuXHRyZW5kZXJPcHRpb25zOiBmdW5jdGlvbigpe1xuXHRcdHZhciBvcHRzID0gdGhpcy5wcm9wcy5zZXR0aW5ncy5vcHRpb25zLFxuXHRcdFx0b3B0aW9ucyA9IFtdXG5cdFx0O1xuXG5cdFx0aWYoICFvcHRzIHx8ICFvcHRzLmxlbmd0aCApXG5cdFx0XHRyZXR1cm4gb3B0aW9ucztcblxuXHRcdG9wdHMuZm9yRWFjaCggZnVuY3Rpb24oIG9wdCApe1xuXHRcdFx0dmFyIGRhdGEgPSBvcHQ7XG5cdFx0XHRpZiggdHlwZW9mIG9wdCAhPSAnb2JqZWN0JyApXG5cdFx0XHRcdGRhdGEgPSB7IHZhbHVlOiBvcHQsIGxhYmVsOiBvcHQgfTtcblxuXHRcdFx0b3B0aW9ucy5wdXNoKFxuXHRcdFx0XHRSZWFjdC5ET00ub3B0aW9uKHt2YWx1ZTogZGF0YS52YWx1ZX0sIGRhdGEubGFiZWwpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9wdGlvbnM7XG5cdH0sXG5cblx0dXBkYXRlVmFsdWU6IGZ1bmN0aW9uKCBlICl7XG5cdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIGUudGFyZ2V0LnZhbHVlICk7XG5cdH0sXG5cblx0Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24oIG5leHRQcm9wcyApe1xuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlICE9IG5leHRQcm9wcy52YWx1ZSApXG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7IHZhbHVlOiBuZXh0UHJvcHMudmFsdWUgfSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3RUeXBlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvU2VsZWN0RmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvU2VsZWN0RmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiAxMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJtb2R1bGUuZXhwb3J0cyA9IHtcblx0ZWRpdGluZzogZnVuY3Rpb24oIHBhcmVudFZhbHVlLCB2YWx1ZSApe1xuXHRcdGlmKCB0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgKVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYoIHBhcmVudFZhbHVlID09ICdhbHdheXMnIClcblx0XHRcdHJldHVybiAnYWx3YXlzJztcblxuXHRcdC8vIGVsc2UgcmV0dXJuIHVuZGVmaW5lZDogZG8gbm90IG92ZXJyaWRlXG5cdH0sXG5cdGFkZGVyOiBmdW5jdGlvbiggcGFyZW50VmFsdWUsIHZhbHVlICl7XG5cblx0XHRpZiggdHlwZW9mIHZhbHVlICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRpZiggdHlwZW9mIHBhcmVudFZhbHVlICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiBwYXJlbnRWYWx1ZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHRmaXhlZEZpZWxkczogZnVuY3Rpb24oIHBhcmVudFZhbHVlLCB2YWx1ZSApe1xuXHRcdGlmKCB0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgKVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYoIHR5cGVvZiBwYXJlbnRWYWx1ZSA9PSAnYm9vbGVhbicgKVxuXHRcdFx0cmV0dXJuIHBhcmVudFZhbHVlO1xuXHR9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvZGVlcFNldHRpbmdzLmpzXG4gKiogbW9kdWxlIGlkID0gMTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL2RlZXBTZXR0aW5ncy5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEyICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gVG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciBrZXlzO1xuXHR2YXIgdG8gPSBUb09iamVjdCh0YXJnZXQpO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IGFyZ3VtZW50c1tzXTtcblx0XHRrZXlzID0gT2JqZWN0LmtleXMoT2JqZWN0KGZyb20pKTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dG9ba2V5c1tpXV0gPSBmcm9tW2tleXNbaV1dO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEzICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBGcmVlemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5tb2R1bGUuZXhwb3J0cyA9IEZyZWV6ZXI7XG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvZnJlZXplci5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9mcmVlemVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMTQgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRvYmplY3RBc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSxcblx0VmFsaWRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpLFxuXHRUeXBlRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG47XG5cbi8qKlxuICogRmllbGQgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50IGVhY2ggQXJyYXkgZWxlbWVudCBvciBPYmplY3QgZmllbGQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgVGhlIGtleSBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSBwYXJlbnQuXG4gKiBAcGFyYW0gIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGF0dGlidXRlIGluIHRoZSBvcmlnaW5hbCBqc29uIHRvIGhpZ2hsaWdodCB0aGUgY2hhbmdlcy5cbiAqIEBwYXJhbSB7RnJlZXplck5vZGV9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUgdG8gbm90aWZ5IGF0dHJpYnV0ZSB1cGRhdGVzLlxuICovXG52YXIgRmllbGQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cblx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7ZXJyb3I6IGZhbHNlfTtcblx0fSxcblx0Z2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7XG5cdFx0XHRkZWZpbml0aW9uOiB7fVxuXHRcdH07XG5cdH0sXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgZGVmaW5pdGlvbiA9IHRoaXMucHJvcHMuZGVmaW5pdGlvbiB8fCB7fSxcblx0XHRcdGNsYXNzTmFtZSA9ICdqc29uRmllbGQnLFxuXHRcdFx0dHlwZSA9IGRlZmluaXRpb24udHlwZSB8fCBUeXBlRmllbGQucHJvdG90eXBlLmd1ZXNzVHlwZSggdGhpcy5wcm9wcy52YWx1ZSApLFxuXHRcdFx0aWQgPSB0aGlzLnByb3BzLmlkICsgJ18nICsgdGhpcy5wcm9wcy5uYW1lLFxuXHRcdFx0ZXJyb3IgPSAnJyxcblx0XHRcdHR5cGVGaWVsZFxuXHRcdDtcblxuXHRcdGlmKCB0eXBlID09ICdyZWFjdCcgKVxuXHRcdFx0cmV0dXJuIHRoaXMucmVuZGVyUmVhY3RGaWVsZCggZGVmaW5pdGlvbiApO1xuXG5cdFx0dHlwZUZpZWxkID0gdGhpcy5yZW5kZXJUeXBlRmllbGQoIHR5cGUsIGlkICk7XG5cblx0XHRjbGFzc05hbWUgKz0gJyAnICsgdHlwZSArICdGaWVsZCc7XG5cblx0XHRpZiggdGhpcy5zdGF0ZS5lcnJvciApe1xuXHRcdFx0Y2xhc3NOYW1lICs9ICcganNvbkVycm9yJztcblx0XHRcdGlmKCB0aGlzLnN0YXRlLmVycm9yICE9PSB0cnVlIClcblx0XHRcdFx0ZXJyb3IgPSBSZWFjdC5ET00uc3Bhbih7IGtleTonZScsIGNsYXNzTmFtZTogJ2pzb25FcnJvck1zZycgfSwgdGhpcy5zdGF0ZS5lcnJvciApO1xuXHRcdH1cblxuXHRcdHZhciBqc29uTmFtZSA9IFsgUmVhY3QuRE9NLmxhYmVsKHsga2V5OiAnczEnLCBodG1sRm9yOiBpZCB9LCAoZGVmaW5pdGlvbi50aXRsZSB8fCB0aGlzLnByb3BzLm5hbWUpICsgJzonICkgXTtcblxuXHRcdGlmKCB0aGlzLnByb3BzLmZpeGVkICl7XG5cdFx0XHQvLyBJZiB0aGUgZmllbGQgY2Fubm90IGJlIHJlbW92ZWQsIGFkZCBhIHBsYWNlaG9sZGVyIHRvIG1haW50YWluIHRoZSBkZXNpZ25cblx0XHRcdGpzb25OYW1lLnVuc2hpZnQoIFJlYWN0LkRPTS5zcGFuKHsga2V5OidmJywgY2xhc3NOYW1lOiAnanNvbkZpeGVkJyB9KSApO1xuXHRcdH1cblx0XHRlbHNle1xuXHRcdFx0anNvbk5hbWUudW5zaGlmdCggUmVhY3QuRE9NLmEoeyBrZXk6J2EnLCBocmVmOiAnIycsIGNsYXNzTmFtZTogJ2pzb25SZW1vdmUnLCBvbkNsaWNrOiB0aGlzLmhhbmRsZVJlbW92ZX0sICd4JykgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmRpdih7Y2xhc3NOYW1lOiBjbGFzc05hbWV9LCBbXG5cdFx0XHRSZWFjdC5ET00uc3Bhbigge2NsYXNzTmFtZTogJ2pzb25OYW1lJywga2V5OiAnbid9LCBqc29uTmFtZSApLFxuXHRcdFx0UmVhY3QuRE9NLnNwYW4oIHtjbGFzc05hbWU6ICdqc29uVmFsdWUnLCBrZXk6ICd2J30sIHR5cGVGaWVsZCApLFxuXHRcdFx0ZXJyb3Jcblx0XHRdKTtcblx0fSxcblxuXHRyZW5kZXJUeXBlRmllbGQ6IGZ1bmN0aW9uKCB0eXBlLCBpZCApe1xuXHRcdHZhciBkZWZpbml0aW9uID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLFxuXHRcdFx0c2V0dGluZ3MgPSBvYmplY3RBc3NpZ24oIHt9LCBkZWZpbml0aW9uLnNldHRpbmdzIHx8IHt9ICksXG5cdFx0XHRjb21wb25lbnRcblx0XHQ7XG5cblx0XHRpZiggZGVmaW5pdGlvbi5maWVsZHMgKVxuXHRcdFx0c2V0dGluZ3MuZmllbGRzID0gZGVmaW5pdGlvbi5maWVsZHM7XG5cblx0XHRjb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KCBUeXBlRmllbGQsIHtcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdHNldHRpbmdzOiBzZXR0aW5ncyxcblx0XHRcdG9uVXBkYXRlZDogdGhpcy5vblVwZGF0ZWQsXG5cdFx0XHRyZWY6ICd0eXBlRmllbGQnLFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0cGFyZW50U2V0dGluZ3M6IHRoaXMucHJvcHMucGFyZW50U2V0dGluZ3Ncblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcG9uZW50O1xuXHR9LFxuXG5cdHJlbmRlclJlYWN0RmllbGQ6IGZ1bmN0aW9uKCBkZWZpbml0aW9uICl7XG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5kaXYoIHsgY2xhc3NOYW1lOiAnanNvbkZpZWxkIHJlYWN0RmllbGQnIH0sIGRlZmluaXRpb24ub3V0cHV0ICk7XG5cdH0sXG5cblx0aGFuZGxlUmVtb3ZlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMucHJvcHMub25EZWxldGVkKCB0aGlzLnByb3BzLm5hbWUgKTtcblx0fSxcblxuXHRzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uKCBuZXh0UHJvcHMsIG5leHRTdGF0ZSApe1xuXHRcdHJldHVybiBuZXh0UHJvcHMudmFsdWUgIT0gdGhpcy5wcm9wcy52YWx1ZSB8fCBuZXh0U3RhdGUuZXJyb3IgIT0gdGhpcy5zdGF0ZS5lcnJvcjtcblx0fSxcblxuXHRvblVwZGF0ZWQ6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHZhciBkZWZpbml0aW9uID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uO1xuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlICE9PSB2YWx1ZSApe1xuXHRcdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIHRoaXMucHJvcHMubmFtZSwgdmFsdWUgKTtcblx0XHRcdGlmKCBkZWZpbml0aW9uLm9uQ2hhbmdlIClcblx0XHRcdFx0ZGVmaW5pdGlvbi5vbkNoYW5nZSggdmFsdWUsIHRoaXMucHJvcHMudmFsdWUgKTtcblx0XHR9XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oIGpzb25WYWx1ZSApe1xuXHRcdHZhciBjaGlsZEVycm9ycyA9IFtdLFxuXHRcdFx0dmFsaWRhdGVzID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLnZhbGlkYXRlcyxcblx0XHRcdG5hbWUgPSB0aGlzLnByb3BzLm5hbWUsXG5cdFx0XHRmaWVsZCA9IHRoaXMucmVmcy50eXBlRmllbGRcblx0XHQ7XG5cblx0XHRpZiggIWZpZWxkIClcblx0XHRcdHJldHVybiBbXTtcblxuXHRcdGlmKCBmaWVsZC5maWVsZFR5cGUgPT0gJ29iamVjdCcgKXtcblx0XHRcdGNoaWxkRXJyb3JzID0gZmllbGQuZ2V0VmFsaWRhdGlvbkVycm9ycygganNvblZhbHVlICk7XG5cdFx0XHRjaGlsZEVycm9ycy5mb3JFYWNoKCBmdW5jdGlvbiggZXJyb3IgKXtcblx0XHRcdFx0aWYoICFlcnJvci5wYXRoIClcblx0XHRcdFx0XHRlcnJvci5wYXRoID0gbmFtZTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGVycm9yLnBhdGggPSBuYW1lICsgJy4nICsgZXJyb3IucGF0aDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiggY2hpbGRFcnJvcnMubGVuZ3RoIClcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSgge2Vycm9yOiB0cnVlfSApO1xuXHRcdH1cblxuXHRcdGlmKCAhdmFsaWRhdGVzIClcblx0XHRcdHJldHVybiBjaGlsZEVycm9ycztcblxuXG5cdFx0dmFyIGVycm9yID0gVmFsaWRhdGlvbi5nZXRWYWxpZGF0aW9uRXJyb3IoIHRoaXMucHJvcHMudmFsdWUsIGpzb25WYWx1ZSwgdmFsaWRhdGVzICksXG5cdFx0XHRtZXNzYWdlXG5cdFx0O1xuXG5cdFx0aWYoIGVycm9yICl7XG5cdFx0XHRtZXNzYWdlID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLmVycm9yTWVzc2FnZTtcblx0XHRcdGlmKCAhbWVzc2FnZSApXG5cdFx0XHRcdG1lc3NhZ2UgPSAoIHRoaXMucHJvcHMuZGVmaW5pdGlvbi5sYWJlbCB8fCB0aGlzLnByb3BzLm5hbWUgKSArICcgdmFsdWUgaXMgbm90IHZhbGlkLic7XG5cblx0XHRcdGVycm9yLnBhdGggPSBuYW1lO1xuXHRcdFx0ZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZXJyb3I6IG1lc3NhZ2V9ICk7XG5cdFx0XHRjaGlsZEVycm9ycyA9IGNoaWxkRXJyb3JzLmNvbmNhdCggW2Vycm9yXSApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB0aGlzLnN0YXRlLmVycm9yICl7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZXJyb3I6IGZhbHNlfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGlsZEVycm9ycztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy9GaWVsZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9GaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDE1ICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RmllbGRBZGRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpLFxuXHRhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVuZGVySGVhZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBzZXR0aW5nc0hlYWRlciA9IHRoaXMucHJvcHMuc2V0dGluZ3MuaGVhZGVyO1xuXHRcdGlmKCBzZXR0aW5nc0hlYWRlciA9PT0gZmFsc2UgKVxuXHRcdFx0cmV0dXJuICcnO1xuXG5cdFx0dmFyIHR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NIZWFkZXIsXG5cdFx0XHRoZWFkZXJcblx0XHQ7XG5cblx0XHRpZiggdHlwZSA9PSAnZnVuY3Rpb24nICl7XG5cdFx0XHRoZWFkZXIgPSBzZXR0aW5nc0hlYWRlciggdGhpcy5wcm9wcy52YWx1ZS50b0pTKCkgKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiggdHlwZSA9PSAndW5kZWZpbmVkJyApe1xuXHRcdFx0aGVhZGVyID0gdGhpcy5nZXREZWZhdWx0SGVhZGVyKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aGVhZGVyID0gc2V0dGluZ3NIZWFkZXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5zcGFuKHsga2V5OiAncycsIG9uQ2xpY2s6IHRoaXMudG9nZ2xlRWRpdGluZywgY2xhc3NOYW1lOiAnY29tcG91bmRUb2dnbGUnIH0sIGhlYWRlcik7XG5cdH0sXG5cblx0dG9nZ2xlRWRpdGluZzogZnVuY3Rpb24oKXtcblx0XHRpZiggdGhpcy5zdGF0ZS5lZGl0aW5nICE9ICdhbHdheXMnICYmIHRoaXMucHJvcHMuc2V0dGluZ3MuaGVhZGVyICE9PSBmYWxzZSApXG5cdFx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiAhdGhpcy5zdGF0ZS5lZGl0aW5nfSk7XG5cdH0sXG5cblx0Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24oIG5leHRQcm9wcyApe1xuXHRcdGlmKCB0aGlzLnByb3BzLnNldHRpbmdzLmVkaXRpbmcgIT0gbmV4dFByb3BzLnNldHRpbmdzLmVkaXRpbmcgKVxuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmc6IG5leHRQcm9wcy5lZGl0aW5nIH0pO1xuXHR9LFxuXG5cdHJlbmRlckFkZGVyOiBmdW5jdGlvbiggbmFtZSApe1xuXHRcdHZhciBzZXR0aW5nc0FkZGVyID0gdGhpcy5wcm9wcy5zZXR0aW5ncy5hZGRlcixcblx0XHRcdHR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NBZGRlcixcblx0XHRcdGFkZGVyXG5cdFx0O1xuXG5cdFx0aWYoIHR5cGUgPT0gJ2Z1bmN0aW9uJyApe1xuXHRcdFx0YWRkZXIgPSBzZXR0aW5nc0FkZGVyKCB0aGlzLnByb3BzLnZhbHVlLnRvSlMoKSApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCBzZXR0aW5nc0FkZGVyID09PSB0cnVlIHx8IHR5cGUgPT0gJ3VuZGVmaW5lZCcgKXtcblx0XHRcdGFkZGVyID0gdGhpcy5nZXREZWZhdWx0QWRkZXIoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRhZGRlciA9IHNldHRpbmdzQWRkZXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoIEZpZWxkQWRkZXIsIHtcblx0XHRcdG9uQ3JlYXRlOiB0aGlzLmNyZWF0ZUZpZWxkLFxuXHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdGtleTogJ2FkZCcsXG5cdFx0XHR0ZXh0OiBhZGRlclxuXHRcdH0pO1xuXHR9LFxuXG5cdGNyZWF0ZUZpZWxkOiBmdW5jdGlvbigga2V5LCB2YWx1ZSwgZGVmaW5pdGlvbiApe1xuXG5cdFx0aWYoIHRoaXMucHJvcHMudmFsdWVbIGtleSBdIClcblx0XHRcdHJldHVybiBjb25zb2xlLmxvZyggJ0ZpZWxkICcgKyBrZXkgKyAnIGFscmVhZHkgZXhpc3RzLicpO1xuXG5cdFx0Ly8gU3RhcnQgZWRpdGluZyBhbmQgZm9jdXNcblx0XHRkZWZpbml0aW9uLnNldHRpbmdzID0ge1xuXHRcdFx0ZWRpdGluZzogdGhpcy5zdGF0ZS5lZGl0aW5nID09ICdhbHdheXMnID8gJ2Fsd2F5cycgOiB0cnVlLFxuXHRcdFx0Zm9jdXM6IHRydWVcblx0XHR9O1xuXG5cdFx0dmFyIGZpZWxkcyA9IGFzc2lnbigge30sIHRoaXMuc3RhdGUuZmllbGRzICk7XG5cdFx0ZmllbGRzWyBrZXkgXSA9IGRlZmluaXRpb247XG5cblx0XHR0aGlzLnNldFN0YXRlKHtmaWVsZHM6IGZpZWxkc30pO1xuXHRcdHRoaXMucHJvcHMudmFsdWUuc2V0KCBrZXksIHZhbHVlICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBrZXkgZWRpdGluZyBzZXR0aW5nIGlzIHRydWVcblx0ICogYW5kIHNldCBpdCB0byBmYWxzZS4gVGhlIGVkaXRpbmcgc2V0dGluZyBpcyBzZXRcblx0ICogdG8gdHJ1ZSB3aGVuIGEgbmV3IGNoaWxkIGlzIGFkZGVkIHRvIGVkaXQgaXQgYXV0b21hdGljYWxseVxuXHQgKiBhZnRlciBpcyBlZGl0ZWQgaXQgbG9zZXMgdGhlIHBvaW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSBUaGUgY2hpbGQga2V5XG5cdCAqL1xuXHRjaGVja0VkaXRpbmdTZXR0aW5nOiBmdW5jdGlvbigga2V5ICl7XG5cdFx0dmFyIGZpZWxkcyA9IHRoaXMuc3RhdGUuZmllbGRzO1xuXHRcdGlmKCBmaWVsZHNbIGtleSBdICYmIGZpZWxkc1sga2V5IF0uc2V0dGluZ3MuZm9jdXMgPT09IHRydWUgKXtcblx0XHRcdGZpZWxkcyA9IGFzc2lnbih7fSwgZmllbGRzKTtcblx0XHRcdGZpZWxkc1trZXldLnNldHRpbmdzLmZvY3VzID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZmllbGRzOiBmaWVsZHN9ICk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEZpeGVkRmllbGRzOiBmdW5jdGlvbigpe1xuXHRcdHZhciBmaWVsZHMgPSB0aGlzLnByb3BzLnNldHRpbmdzLmZpeGVkRmllbGRzLFxuXHRcdFx0Zml4ZWQgPSB7fVxuXHRcdDtcblx0XHRpZiggZmllbGRzICYmIGZpZWxkcy5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xuXHRcdFx0ZmllbGRzLmZvckVhY2goIGZ1bmN0aW9uKCBmICl7XG5cdFx0XHRcdGZpeGVkWyBmIF0gPSAxO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZml4ZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL21peGlucy9Db21wb3VuZEZpZWxkTWl4aW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9taXhpbnMvQ29tcG91bmRGaWVsZE1peGluLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMTYgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Z2V0U3RhdGVGcm9tUHJvcHM6IGZ1bmN0aW9uKCBwcm9wcyApe1xuXHRcdHJldHVybiB7XG5cdFx0XHRlZGl0aW5nOiBwcm9wcy5zZXR0aW5ncy5lZGl0aW5nIHx8IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHByb3BzLnZhbHVlXG5cdFx0fTtcblx0fSxcblxuXHRyZW5kZXJJbnB1dDogZnVuY3Rpb24oKXtcblx0XHR2YXIgY2xhc3NOYW1lID0gdGhpcy50eXBlQ2xhc3M7XG5cblx0XHRpZiggIXRoaXMuc3RhdGUuZWRpdGluZyApXG5cdFx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oIHtvbkNsaWNrOiB0aGlzLnNldEVkaXRNb2RlLCBjbGFzc05hbWU6IGNsYXNzTmFtZX0sIHRoaXMuZ2V0RGlzcGxheVN0cmluZygpICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmlucHV0KHtcblx0XHRcdHR5cGU6IHRoaXMuaW5wdXRUeXBlLFxuXHRcdFx0dmFsdWU6IHRoaXMuc3RhdGUudmFsdWUsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLnNldHRpbmdzLnBsYWNlaG9sZGVyIHx8ICcnLFxuXHRcdFx0b25DaGFuZ2U6IHRoaXMudXBkYXRlVmFsdWUsXG5cdFx0XHRvbkJsdXI6IHRoaXMuc2V0VmFsdWUsXG5cdFx0XHRyZWY6ICdpbnB1dCcsXG5cdFx0XHRvbktleURvd246IHRoaXMuaGFuZGxlS2V5RG93blxuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERpc3BsYXlTdHJpbmc6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuZ2V0RGlzcGxheU1vZGVTdHJpbmcgKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RGlzcGxheU1vZGVTdHJpbmcoKTtcblxuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlID09PSAnJyApXG5cdFx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oIHtjbGFzc05hbWU6ICdqc29uTm92YWx1ZSd9LCAnTm8gdmFsdWUnICk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9wcy52YWx1ZTtcblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV4dFByb3BzICl7XG5cdFx0dmFyIG5leHRTdGF0ZSA9IHt9LFxuXHRcdFx0dXBkYXRlID0gZmFsc2Vcblx0XHQ7XG5cblx0XHRpZiggdGhpcy5wcm9wcy52YWx1ZSAhPSBuZXh0UHJvcHMudmFsdWUgKXtcblx0XHRcdHVwZGF0ZSA9IHRydWU7XG5cdFx0XHRuZXh0U3RhdGUudmFsdWUgPSBuZXh0UHJvcHMudmFsdWU7XG5cdFx0fVxuXHRcdGlmKCB0aGlzLnByb3BzLnNldHRpbmdzLmVkaXRpbmcgIT0gbmV4dFByb3BzLnNldHRpbmdzLmVkaXRpbmcgKXtcblx0XHRcdHVwZGF0ZSA9IHRydWU7XG5cdFx0XHRuZXh0U3RhdGUuZWRpdGluZyA9IG5leHRQcm9wcy5lZGl0aW5nO1xuXHRcdH1cblx0XHRpZiggdXBkYXRlIClcblx0XHRcdHRoaXMuc2V0U3RhdGUoIG5leHRTdGF0ZSApO1xuXHR9LFxuXG5cdGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24oIHByZXZQcm9wcywgcHJldlN0YXRlICl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyAmJiAhIHByZXZTdGF0ZS5lZGl0aW5nIHx8IHRoaXMucHJvcHMuc2V0dGluZ3MuZm9jdXMgKXtcblx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cblx0Y29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyA9PT0gdHJ1ZSB8fCB0aGlzLnByb3BzLnNldHRpbmdzLmZvY3VzIClcblx0XHRcdHRoaXMuZm9jdXMoKTtcblx0fSxcblxuXHRzZXRFZGl0TW9kZTogZnVuY3Rpb24oKXtcblx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiB0cnVlfSk7XG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyAhPSAnYWx3YXlzJyApXG5cdFx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiBmYWxzZX0pO1xuXHRcdHRoaXMucHJvcHMub25VcGRhdGVkKCB0aGlzLnN0YXRlLnZhbHVlICk7XG5cdH0sXG5cblx0dG9nZ2xlRWRpdGluZzogZnVuY3Rpb24oKXtcblx0XHR0aGlzLnNldFN0YXRlKHsgZWRpdGluZzogIXRoaXMuc3RhdGUuZWRpdGluZyB9KTtcblx0fSxcblxuXHRoYW5kbGVLZXlEb3duOiBmdW5jdGlvbiggZSApe1xuXHRcdGlmKCBlLndoaWNoID09IDEzIClcblx0XHRcdHRoaXMuc2V0VmFsdWUoKTtcblx0fSxcblxuXHRmb2N1czogZnVuY3Rpb24oKXtcblx0XHR2YXIgbm9kZSA9IHRoaXMucmVmcy5pbnB1dC5nZXRET01Ob2RlKCk7XG5cdFx0bm9kZS5mb2N1cygpO1xuXHRcdG5vZGUudmFsdWUgPSBub2RlLnZhbHVlO1xuXHR9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9taXhpbnMvTGVhZkZpZWxkTWl4aW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9taXhpbnMvTGVhZkZpZWxkTWl4aW4uanM/Iik7DQoNCi8qKiovIH0sDQovKiAxNyAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMCApLFxyXG5cdEVtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMSApLFxyXG5cdE1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oIDIyICksXHJcblx0RnJvemVuID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjMgKVxyXG47XHJcblxyXG4vLyNidWlsZFxyXG52YXIgRnJlZXplciA9IGZ1bmN0aW9uKCBpbml0aWFsVmFsdWUsIG11dGFibGUgKSB7XHJcblx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0Ly8gSW1tdXRhYmxlIGRhdGFcclxuXHR2YXIgZnJvemVuO1xyXG5cclxuXHR2YXIgbm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KCBldmVudE5hbWUsIG5vZGUsIG9wdGlvbnMgKXtcclxuXHRcdGlmKCBldmVudE5hbWUgPT0gJ2xpc3RlbmVyJyApXHJcblx0XHRcdHJldHVybiBGcm96ZW4uY3JlYXRlTGlzdGVuZXIoIG5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gRnJvemVuLnVwZGF0ZSggZXZlbnROYW1lLCBub2RlLCBvcHRpb25zICk7XHJcblx0fTtcclxuXHJcblx0dmFyIGZyZWV6ZSA9IGZ1bmN0aW9uKCl7fTtcclxuXHRpZiggIW11dGFibGUgKVxyXG5cdFx0ZnJlZXplID0gZnVuY3Rpb24oIG9iaiApeyBPYmplY3QuZnJlZXplKCBvYmogKTsgfTtcclxuXHJcblx0Ly8gQ3JlYXRlIHRoZSBmcm96ZW4gb2JqZWN0XHJcblx0ZnJvemVuID0gRnJvemVuLmZyZWV6ZSggaW5pdGlhbFZhbHVlLCBub3RpZnksIGZyZWV6ZSApO1xyXG5cclxuXHQvLyBMaXN0ZW4gdG8gaXRzIGNoYW5nZXMgaW1tZWRpYXRlbHlcclxuXHR2YXIgbGlzdGVuZXIgPSBmcm96ZW4uZ2V0TGlzdGVuZXIoKTtcclxuXHJcblx0Ly8gVXBkYXRpbmcgZmxhZyB0byB0cmlnZ2VyIHRoZSBldmVudCBvbiBuZXh0VGlja1xyXG5cdHZhciB1cGRhdGluZyA9IGZhbHNlO1xyXG5cclxuXHRsaXN0ZW5lci5vbiggJ2ltbWVkaWF0ZScsIGZ1bmN0aW9uKCBwcmV2Tm9kZSwgdXBkYXRlZCApe1xyXG5cdFx0aWYoIHByZXZOb2RlICE9IGZyb3plbiApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRmcm96ZW4gPSB1cGRhdGVkO1xyXG5cclxuXHRcdC8vIFRyaWdnZXIgb24gbmV4dCB0aWNrXHJcblx0XHRpZiggIXVwZGF0aW5nICl7XHJcblx0XHRcdHVwZGF0aW5nID0gdHJ1ZTtcclxuXHRcdFx0VXRpbHMubmV4dFRpY2soIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0dXBkYXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRtZS50cmlnZ2VyKCAndXBkYXRlJywgZnJvemVuICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRVdGlscy5hZGRORSggdGhpcywge1xyXG5cdFx0Z2V0OiBmdW5jdGlvbigpe1xyXG5cdFx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdFx0fSxcclxuXHRcdHNldDogZnVuY3Rpb24oIG5vZGUgKXtcclxuXHRcdFx0dmFyIG5ld05vZGUgPSBub3RpZnkoICdyZXNldCcsIGZyb3plbiwgbm9kZSApO1xyXG5cdFx0XHRuZXdOb2RlLl9fLmxpc3RlbmVyLnRyaWdnZXIoICdpbW1lZGlhdGUnLCBmcm96ZW4sIG5ld05vZGUgKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0VXRpbHMuYWRkTkUoIHRoaXMsIHsgZ2V0RGF0YTogdGhpcy5nZXQsIHNldERhdGE6IHRoaXMuc2V0IH0gKTtcclxuXHJcblx0Ly8gVGhlIGV2ZW50IHN0b3JlXHJcblx0dGhpcy5fZXZlbnRzID0gW107XHJcbn1cclxuXHJcbkZyZWV6ZXIucHJvdG90eXBlID0gVXRpbHMuY3JlYXRlTm9uRW51bWVyYWJsZSh7Y29uc3RydWN0b3I6IEZyZWV6ZXJ9LCBFbWl0dGVyKTtcclxuLy8jYnVpbGRcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRnJlZXplcjtcclxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvc3JjL2ZyZWV6ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9+L2ZyZWV6ZXItanMvc3JjL2ZyZWV6ZXIuanM/Iik7DQoNCi8qKiovIH0sDQovKiAxOCAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBWYWxpZGF0aW9uTWV0aG9kcyA9IHtcbiAgcmVxdWlyZWQ6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuICAgICAgaWYoICF2YWx1ZSApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBFbXB0eSB0cmltbWVkIHN0cmluZyBkb2VzIG5vdCB2YWxpZGF0ZVxuICAgICAgaWYoIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiAhdmFsdWUudHJpbSgpIClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGVtYWlsOiBmdW5jdGlvbiggdmFsdWUgKXtcblxuICAgICAgLy8gSWYgbm90aGluZyBnaXZlbiwgbWF5YmUgdGhlIGZpZWxkIGlzIG5vdCByZXF1aXJlZFxuICAgICAgLy8gc28gaXQgcGFzc2VzIHRoZSBjaGVjay5cbiAgICAgIGlmKCAhdmFsdWUgKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAvKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MTU1L3ZhbGlkYXRlLWVtYWlsLWFkZHJlc3MtaW4tamF2YXNjcmlwdCAqL1xuICAgICAgdmFyIHJlID0gL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICAgIHJldHVybiByZS50ZXN0KCB2YWx1ZSApO1xuICB9LFxuXG4gIGxlbmd0aDogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIG1pbiwgbWF4ICl7XG4gICAgICBpZiggIW1pbiApXG4gICAgICAgICAgbWluID0gMDtcbiAgICAgIGlmKCAhbWF4IClcbiAgICAgICAgICBtYXggPSBJbmZpbml0eTtcblxuICAgICAgcmV0dXJuICggdmFsdWUubGVuZ3RoID49IG1pbiAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4ICk7XG4gIH0sXG5cbiAgaW50ZWdlcjogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIG1pbiwgbWF4ICl7XG4gICAgICBpZiggIW1pbiAmJiBtaW4gIT09IDAgKVxuICAgICAgICAgIG1pbiA9IC1JbmZpbml0eTtcbiAgICAgIGlmKCAhbWF4IClcbiAgICAgICAgICBtYXggPSBJbmZpbml0eTtcblxuICAgICAgLy8gRW1wdHkgc3RyaW5nIHBhc3NlcyB0aGUgY2hlY2tcbiAgICAgIGlmKCF2YWx1ZSAmJiB2YWx1ZSAhPSAwKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICB2YXIgaW50VmFsID0gcGFyc2VJbnQoIHZhbHVlICk7XG5cbiAgICAgIGlmKCB2YWx1ZSAhPSBpbnRWYWwgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuICggaW50VmFsIDw9IG1heCAmJiBpbnRWYWwgPj0gbWluICk7XG4gIH0sXG5cbiAgY2hlY2tlZDogZnVuY3Rpb24oIHZhbHVlICl7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgbWF0Y2hlczogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIHBhdGggKXtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBmaW5kSW5UcmVlKCBwYXRoLnNwbGl0KCcuJyksIGpzb25WYWx1ZSApO1xuICB9XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRnZXRWYWxpZGF0aW9uRXJyb3I6IGZ1bmN0aW9uKCB2YWx1ZSwganNvblZhbHVlLCB2YWxpZGF0ZXMgKXtcblx0XHR2YXIgbWV0aG9kcyA9IFtdLFxuXHRcdFx0ZXJyb3IgPSBmYWxzZSxcblx0XHRcdGkgPSAwXG5cdFx0O1xuXG5cdFx0Ly8gU3RvcmUgdGhlIHZhbGlkYXRpb24gbWV0aG9kcyBpbiBhbiBhcnJheVxuXHRcdGlmKCB0eXBlb2YgdmFsaWRhdGVzID09ICdzdHJpbmcnICl7XG5cdFx0XHRtZXRob2RzID0gcGFyc2VNZXRob2RTdHJpbmcoIHZhbGlkYXRlcyApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB0eXBlb2YgdmFsaWRhdGVzID09ICdmdW5jdGlvbicgKXtcblx0XHRcdG1ldGhvZHMgPSBbIHZhbGlkYXRlcyBdO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB2YWxpZGF0ZXMgJiYgdmFsaWRhdGVzLmNvbnN0cnVjdG9yID09PSBBcnJheSApe1xuXHRcdFx0bWV0aG9kcyA9IHZhbGlkYXRlcztcblx0XHR9XG5cblxuXHRcdHZhciBkZWZpbml0aW9uLCBmLCBtZXRob2Q7XG5cdFx0d2hpbGUoICFlcnJvciAmJiBpIDwgbWV0aG9kcy5sZW5ndGggKXtcblx0XHRcdG1ldGhvZCA9IG1ldGhvZHNbaSsrXTtcblx0XHRcdGlmKCB0eXBlb2YgbWV0aG9kID09ICdzdHJpbmcnICl7XG5cblx0XHRcdFx0Ly8gZGVmaW5pdGlvbiB7bmFtZSwgYXJnc31cblx0XHRcdFx0ZGVmaW5pdGlvbiA9IHBhcnNlTWV0aG9kTmFtZSggbWV0aG9kICk7XG5cdFx0XHRcdGYgPSBWYWxpZGF0aW9uTWV0aG9kc1sgZGVmaW5pdGlvbi5uYW1lIF07XG5cdFx0XHRcdGlmKCAhZiApXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coICdVbmtvd24gdmFsaWRhdGlvbiBtZXRob2QgJyArIGRlZmluaXRpb24ubmFtZSApO1xuXHRcdFx0XHRlbHNlIGlmKCAhZi5hcHBseSggbnVsbCwgWyB2YWx1ZSwganNvblZhbHVlIF0uY29uY2F0KCBkZWZpbml0aW9uLmFyZ3MgKSApKXtcblx0XHRcdFx0XHRlcnJvciA9IHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdG1ldGhvZDogbWV0aG9kXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiggdHlwZW9mIG1ldGhvZCA9PSAnZnVuY3Rpb24nICl7XG5cdFx0XHRcdGlmKCAhbWV0aG9kKCB2YWx1ZSwganNvblZhbHVlICkgKVxuXHRcdFx0XHRcdGVycm9yID0ge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0bWV0aG9kOiAnY3VzdG9tJ1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVycm9yO1xuXHR9XG59O1xuXG4vKlxuIEhFTFBFUiBNRVRIT0RTXG4gKi9cblxudmFyIHBhcnNlTWV0aG9kU3RyaW5nID0gZnVuY3Rpb24oIHN0cmluZyApe1xuXHRyZXR1cm4gc3RyaW5nLm1hdGNoKC9bXlxcc1xcW10rKFxcW1teXFxdXSs/XFxdKT8vaWcpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhIG1ldGhvZCBjYWxsIGluIHRoZSBkYXRhLXZhbGlkYXRpb24gYXR0cmlidXRlLlxuICogQHBhcmFtICB7U3RyaW5nfSBtZXRob2RTdHIgQSBtZXRob2QgY2FsbCBsaWtlIG1ldGhvZFthcmcxLCBhcmcyLCAuLi5dXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICBBbiBvYmplY3QgbGlrZSB7bmFtZTogJ21ldGhvZCcsIGFyZ3M6IFthcmcxLCBhcmcyLCAuLi5dfVxuICovXG52YXIgcGFyc2VNZXRob2ROYW1lID0gZnVuY3Rpb24oIG1ldGhvZFN0ciApe1xuICAgIHZhciBwYXJ0cyA9IG1ldGhvZFN0ci5zcGxpdCgnWycpLFxuICAgICAgICBkZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgbmFtZTogcGFydHNbMF0sXG4gICAgICAgICAgICBhcmdzOiBbXVxuICAgICAgICB9LFxuICAgICAgICBhcmdzXG4gICAgO1xuXG4gICAgaWYoIHBhcnRzLmxlbmd0aCA+IDEgKXtcbiAgICAgICAgYXJncyA9IHBhcnRzWzFdO1xuXG4gICAgICAgIGlmKCBhcmdzWyBhcmdzLmxlbmd0aCAtIDEgXSA9PSAnXScgKVxuICAgICAgICAgICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgYXJncy5sZW5ndGggLSAxKTtcblxuICAgICAgICBkZWZpbml0aW9uLmFyZ3MgPSBhcmdzLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkIG5vZGUsIGhpZGluZyB0aGUgZGlmZmVyZW5jZXMgYW1vbmdcbiAqIGRpZmZlcmVudCB0eXBlIG9mIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0gIHtET01FbGVtZW50fSBmaWVsZCBUaGUgZmllbGQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC5cbiAqL1xudmFyIGdldEZpZWxkVmFsdWUgPSBmdW5jdGlvbiggZmllbGQgKXtcbiAgICB2YXIgdGFnTmFtZSA9IGZpZWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmKCB0YWdOYW1lID09ICdpbnB1dCcgJiYgZmllbGQudHlwZSA9PSAnY2hlY2tib3gnICl7XG4gICAgICAgIHJldHVybiBmaWVsZC5jaGVja2VkO1xuICAgIH1cblxuICAgIGlmKCB0YWdOYW1lID09ICdzZWxlY3QnICl7XG4gICAgICAgIHJldHVybiBmaWVsZC5vcHRpb25zW2ZpZWxkLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZC52YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIGZpbmRJblRyZWUoIHBhdGgsIGpzb25WYWx1ZSApe1xuXHRpZiggIXBhdGgubGVuZ3RoIClcblx0XHRyZXR1cm4ganNvblZhbHVlO1xuXG5cdHJldHVybiBmaW5kSW5UcmVlKHBhdGguc2xpY2UoMSksIGpzb25WYWx1ZVsgcGF0aFswXSBdKTtcbn1cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy92YWxpZGF0aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL3ZhbGlkYXRpb24uanM/Iik7DQoNCi8qKiovIH0sDQovKiAxOSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRUeXBlRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG47XG5cbi8qKlxuICogQ29tcG9uZW50IHRvIGFkZCBmaWVsZHMgdG8gYW4gT2JqZWN0IG9yIEFycmF5LlxuICogQHBhcmFtICB7RnJlZXplck5vZGV9IHJvb3QgVGhlIHBhcmVudCB0byBhZGQgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSBPcHRpb25hbC4gSWYgcHJvdmlkZWQsIHRoZSBhdHRyaWJ1dGUgYWRkZWQgd2lsbCBoYXZlIHRoYXQga2V5IChhcnJheXMpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgYW4gaW5wdXQgd2lsbCBiZSBzaG93biB0byBsZXQgdGhlIHVzZXIgZGVmaW5lIHRoZSBrZXkuXG4gKi9cbnZhciBGaWVsZEFkZGVyID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNyZWF0aW5nOiB0aGlzLnByb3BzLmNyZWF0aW5nIHx8IGZhbHNlLFxuXHRcdFx0bmFtZTogdGhpcy5wcm9wcy5uYW1lLFxuXHRcdFx0dHlwZTogJ3N0cmluZydcblx0XHR9O1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRpZiggIXRoaXMuc3RhdGUuY3JlYXRpbmcgKVxuXHRcdFx0cmV0dXJuIFJlYWN0LkRPTS5hKHsgY2xhc3NOYW1lOiAnanNvbkFkZCcsIGhyZWY6ICcjJywgb25DbGljazogdGhpcy5oYW5kbGVDcmVhdGUgfSwgdGhpcy5wcm9wcy50ZXh0ICk7XG5cblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0VHlwZXMoKS5tYXAoIGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHRcdHJldHVybiBSZWFjdC5ET00ub3B0aW9uKHt2YWx1ZTogdHlwZSwga2V5OiB0eXBlfSwgdHlwZVswXS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zbGljZSgxKSk7XG5cdFx0XHR9KSxcblx0XHRcdGZpZWxkTmFtZVxuXHRcdDtcblxuXHRcdGlmKCB0eXBlb2YgdGhpcy5wcm9wcy5uYW1lICE9ICd1bmRlZmluZWQnIClcblx0XHRcdGZpZWxkTmFtZSA9ICBbXG5cdFx0XHRcdFJlYWN0LkRPTS5zcGFuKHtjbGFzc05hbWU6ICdqc29uTmFtZSd9LCB0aGlzLnByb3BzLm5hbWUpLFxuXHRcdFx0XHRSZWFjdC5ET00uc3BhbihudWxsLCAnOicpXG5cdFx0XHRdO1xuXHRcdGVsc2Uge1xuXHRcdFx0ZmllbGROYW1lID0gW1xuXHRcdFx0XHRSZWFjdC5ET00uaW5wdXQoe3JlZjogJ2tleUlucHV0JywgdHlwZTogJ3RleHQnLCB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSwgb25DaGFuZ2U6IHRoaXMuY2hhbmdlS2V5fSksXG5cdFx0XHRcdFJlYWN0LkRPTS5zcGFuKG51bGwsICc6Jylcblx0XHRcdF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5kaXYoIHtjbGFzc05hbWU6ICdqc29uRmllbGQganNvbkZpZWxkQWRkZXInfSwgW1xuXHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0UmVhY3QuRE9NLnNlbGVjdCh7IGtleTogJ3MnLCB2YWx1ZTogdGhpcy5zdGF0ZS50eXBlLCBvbkNoYW5nZTogdGhpcy5jaGFuZ2VUeXBlLCByZWY6ICd0eXBlU2VsZWN0b3InfSwgb3B0aW9ucyksXG5cdFx0XHRSZWFjdC5ET00uYnV0dG9uKHsga2V5OiAnYicsIG9uQ2xpY2s6IHRoaXMuY3JlYXRlRmllbGQgfSwgJ09LJyApLFxuXHRcdFx0UmVhY3QuRE9NLmEoeyBrZXk6ICdhJywgaHJlZjogJyMnLCBjbGFzc05hbWU6ICdjYW5jZWxGaWVsZCcsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2FuY2VsfSwgJ0NhbmNlbCcpXG5cdFx0XSk7XG5cdH0sXG5cblx0Y29tcG9uZW50RGlkVXBkYXRlOiBmdW5jdGlvbiggcHJldlByb3BzLCBwcmV2U3RhdGUgKXtcblx0XHRpZiggIXByZXZTdGF0ZS5jcmVhdGluZyAmJiB0aGlzLnN0YXRlLmNyZWF0aW5nICl7XG5cdFx0XHRpZiggdGhpcy5yZWZzLmtleUlucHV0IClcblx0XHRcdFx0dGhpcy5yZWZzLmtleUlucHV0LmdldERPTU5vZGUoKS5mb2N1cygpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnJlZnMudHlwZVNlbGVjdG9yLmdldERPTU5vZGUoKS5mb2N1cygpO1xuXHRcdH1cblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV3UHJvcHMgKXtcblx0XHR0aGlzLnNldFN0YXRlKHtuYW1lOiBuZXdQcm9wcy5uYW1lfSk7XG5cdH0sXG5cblx0aGFuZGxlQ3JlYXRlOiBmdW5jdGlvbiggZSApe1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLnNldFN0YXRlKHtjcmVhdGluZzogdHJ1ZX0pO1xuXHR9LFxuXG5cdGhhbmRsZUNhbmNlbDogZnVuY3Rpb24oIGUgKXtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5zZXRTdGF0ZSh7Y3JlYXRpbmc6IGZhbHNlfSk7XG5cdH0sXG5cblx0Y2hhbmdlVHlwZTogZnVuY3Rpb24oIGUgKXtcblx0XHR0aGlzLnNldFN0YXRlKHt0eXBlOiBlLnRhcmdldC52YWx1ZX0pO1xuXHR9LFxuXG5cdGNoYW5nZUtleTogZnVuY3Rpb24oIGUgKXtcblx0XHR0aGlzLnNldFN0YXRlKHtuYW1lOiBlLnRhcmdldC52YWx1ZX0pO1xuXHR9LFxuXG5cdGNyZWF0ZUZpZWxkOiBmdW5jdGlvbigpe1xuXHRcdHRoaXMuc2V0U3RhdGUoe2NyZWF0aW5nOiBmYWxzZX0pO1xuXG5cdFx0dmFyIHZhbHVlID0gVHlwZUZpZWxkLnByb3RvdHlwZS5jb21wb25lbnRzWyB0aGlzLnN0YXRlLnR5cGUgXS5wcm90b3R5cGUuZGVmYXVsdFZhbHVlO1xuXG5cdFx0dGhpcy5wcm9wcy5vbkNyZWF0ZSggdGhpcy5zdGF0ZS5uYW1lLCB2YWx1ZSwge3R5cGU6IHRoaXMuc3RhdGUudHlwZSB9KTtcblx0fSxcblxuXHRnZXRUeXBlczogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoIFR5cGVGaWVsZC5wcm90b3R5cGUuY29tcG9uZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWVsZEFkZGVyO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvRmllbGRBZGRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9GaWVsZEFkZGVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjAgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG4vLyNidWlsZFxudmFyIGdsb2JhbCA9IChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpKTtcblxudmFyIFV0aWxzID0ge1xuXHRleHRlbmQ6IGZ1bmN0aW9uKCBvYiwgcHJvcHMgKXtcblx0XHRmb3IoIHZhciBwIGluIHByb3BzICl7XG5cdFx0XHRvYltwXSA9IHByb3BzW3BdO1xuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH0sXG5cblx0Y3JlYXRlTm9uRW51bWVyYWJsZTogZnVuY3Rpb24oIG9iaiwgcHJvdG8gKXtcblx0XHR2YXIgbmUgPSB7fTtcblx0XHRmb3IoIHZhciBrZXkgaW4gb2JqIClcblx0XHRcdG5lW2tleV0gPSB7dmFsdWU6IG9ialtrZXldIH07XG5cdFx0cmV0dXJuIE9iamVjdC5jcmVhdGUoIHByb3RvIHx8IHt9LCBuZSApO1xuXHR9LFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbWVzc2FnZSApe1xuXHRcdHZhciBlcnIgPSBuZXcgRXJyb3IoIG1lc3NhZ2UgKTtcblx0XHRpZiggY29uc29sZSApXG5cdFx0XHRyZXR1cm4gY29uc29sZS5lcnJvciggZXJyICk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhyb3cgZXJyO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvLCBjbGJrICl7XG5cdFx0dmFyIGksbCxrZXlzO1xuXHRcdGlmKCBvICYmIG8uY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcblx0XHRcdGZvciAoaSA9IDAsIGwgPSBvLmxlbmd0aDsgaSA8IGw7IGkrKylcblx0XHRcdFx0Y2xiayggb1tpXSwgaSApO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGtleXMgPSBPYmplY3Qua2V5cyggbyApO1xuXHRcdFx0Zm9yKCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrIClcblx0XHRcdFx0Y2xiayggb1sga2V5c1tpXSBdLCBrZXlzW2ldICk7XG5cdFx0fVxuXHR9LFxuXG5cdGFkZE5FOiBmdW5jdGlvbiggbm9kZSwgYXR0cnMgKXtcblx0XHRmb3IoIHZhciBrZXkgaW4gYXR0cnMgKXtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggbm9kZSwga2V5LCB7XG5cdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogYXR0cnNbIGtleSBdXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gbmV4dFRpY2sgLSBieSBzdGFnYXMgLyBwdWJsaWMgZG9tYWluXG4gIFx0bmV4dFRpY2s6IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcXVldWUgPSBbXSxcblx0XHRcdGRpcnR5ID0gZmFsc2UsXG5cdFx0XHRmbixcblx0XHRcdGhhc1Bvc3RNZXNzYWdlID0gISFnbG9iYWwucG9zdE1lc3NhZ2UsXG5cdFx0XHRtZXNzYWdlTmFtZSA9ICduZXh0dGljaycsXG5cdFx0XHR0cmlnZ2VyID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGhhc1Bvc3RNZXNzYWdlXG5cdFx0XHRcdFx0PyBmdW5jdGlvbiB0cmlnZ2VyICgpIHtcblx0XHRcdFx0XHRnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZU5hbWUsICcqJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0OiBmdW5jdGlvbiB0cmlnZ2VyICgpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcHJvY2Vzc1F1ZXVlKCkgfSwgMCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KCkpLFxuXHRcdFx0cHJvY2Vzc1F1ZXVlID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGhhc1Bvc3RNZXNzYWdlXG5cdFx0XHRcdFx0PyBmdW5jdGlvbiBwcm9jZXNzUXVldWUgKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiYgZXZlbnQuZGF0YSA9PT0gbWVzc2FnZU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdGZsdXNoUXVldWUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0OiBmbHVzaFF1ZXVlO1xuICAgICAgXHR9KSgpXG4gICAgICA7XG5cbiAgICAgIGZ1bmN0aW9uIGZsdXNoUXVldWUgKCkge1xuICAgICAgICAgIHdoaWxlIChmbiA9IHF1ZXVlLnNoaWZ0KCkpIHtcbiAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGlydHkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV4dFRpY2sgKGZuKSB7XG4gICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgaWYgKGRpcnR5KSByZXR1cm47XG4gICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1Bvc3RNZXNzYWdlKSBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHByb2Nlc3NRdWV1ZSwgdHJ1ZSk7XG5cbiAgICAgIG5leHRUaWNrLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGdsb2JhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcHJvY2Vzc1F1ZXVlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRUaWNrO1xuICB9KSgpXG59O1xuLy8jYnVpbGRcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mcmVlemVyLWpzL3NyYy91dGlscy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9zcmMvdXRpbHMuanM/Iik7DQoNCi8qKiovIH0sDQovKiAyMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBVdGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oIDIwICk7XG5cbi8vI2J1aWxkXG5cbi8vIFRoZSBwcm90b3R5cGUgbWV0aG9kcyBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IG9iamVjdFxuLy8gYW5kIGFwcGxpZWQgYXMgbm9uIGVudW1lcmFibGUgcHJvcGVydGllcyBsYXRlclxudmFyIGVtaXR0ZXJQcm90byA9IHtcblx0b246IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyLCBvbmNlICl7XG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG5cblx0XHRsaXN0ZW5lcnMucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgb25jZTogb25jZX0pO1xuXHRcdHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF0gPSAgbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0b25jZTogZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKXtcblx0XHR0aGlzLm9uKCBldmVudE5hbWUsIGxpc3RlbmVyLCB0cnVlICk7XG5cdH0sXG5cblx0b2ZmOiBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApe1xuXHRcdGlmKCB0eXBlb2YgZXZlbnROYW1lID09ICd1bmRlZmluZWQnICl7XG5cdFx0XHR0aGlzLl9ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZSBpZiggdHlwZW9mIGxpc3RlbmVyID09ICd1bmRlZmluZWQnICkge1xuXHRcdFx0dGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXSA9IFtdO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdIHx8IFtdLFxuXHRcdFx0XHRpXG5cdFx0XHQ7XG5cblx0XHRcdGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRpZiggbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lciApXG5cdFx0XHRcdFx0bGlzdGVuZXJzLnNwbGljZSggaSwgMSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudE5hbWUgKXtcblx0XHR2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLFxuXHRcdFx0bGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXSB8fCBbXSxcblx0XHRcdG9uY2VMaXN0ZW5lcnMgPSBbXSxcblx0XHRcdGksIGxpc3RlbmVyXG5cdFx0O1xuXG5cdFx0Ly8gQ2FsbCBsaXN0ZW5lcnNcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcblxuXHRcdFx0aWYoIGxpc3RlbmVyLmNhbGxiYWNrIClcblx0XHRcdFx0bGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoIG51bGwsIGFyZ3MgKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBub3QgYSBjYWxsYmFjaywgcmVtb3ZlIVxuXHRcdFx0XHRsaXN0ZW5lci5vbmNlID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYoIGxpc3RlbmVyLm9uY2UgKVxuXHRcdFx0XHRvbmNlTGlzdGVuZXJzLnB1c2goIGkgKTtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgbGlzdGVuZXJzIG1hcmtlZCBhcyBvbmNlXG5cdFx0Zm9yKCBpID0gb25jZUxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApe1xuXHRcdFx0bGlzdGVuZXJzLnNwbGljZSggb25jZUxpc3RlbmVyc1tpXSwgMSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG4vLyBNZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZSBzbywgd2hlbiB0aGUgc3RvcmVzIGFyZVxuLy8gZXh0ZW5kZWQgd2l0aCB0aGUgZW1pdHRlciwgdGhleSBjYW4gYmUgaXRlcmF0ZWQgYXNcbi8vIGhhc2htYXBzXG52YXIgRW1pdHRlciA9IFV0aWxzLmNyZWF0ZU5vbkVudW1lcmFibGUoIGVtaXR0ZXJQcm90byApO1xuLy8jYnVpbGRcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mcmVlemVyLWpzL3NyYy9lbWl0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vfi9mcmVlemVyLWpzL3NyYy9lbWl0dGVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjIgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjAgKTtcclxuXHJcbi8vI2J1aWxkXHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycywgdG8gYmUgdXNlZCBieSBPYmplY3QuY3JlYXRlLlxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IGF0dHJzIFByb3BlcnRpZXMgdG8gY3JlYXRlIGRlc2NyaXB0b3JzXHJcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgQSBoYXNoIHdpdGggdGhlIGRlc2NyaXB0b3JzLlxyXG4gKi9cclxudmFyIGNyZWF0ZU5FID0gZnVuY3Rpb24oIGF0dHJzICl7XHJcblx0dmFyIG5lID0ge307XHJcblxyXG5cdGZvciggdmFyIGtleSBpbiBhdHRycyApe1xyXG5cdFx0bmVbIGtleSBdID0ge1xyXG5cdFx0XHR3cml0YWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0dmFsdWU6IGF0dHJzWyBrZXldXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbmU7XHJcbn1cclxuXHJcbnZhciBjb21tb25NZXRob2RzID0ge1xyXG5cdHNldDogZnVuY3Rpb24oIGF0dHIsIHZhbHVlICl7XHJcblx0XHR2YXIgYXR0cnMgPSBhdHRyLFxyXG5cdFx0XHR1cGRhdGUgPSB0aGlzLl9fLnRyYW5zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJyApe1xyXG5cdFx0XHRhdHRycyA9IHt9O1xyXG5cdFx0XHRhdHRyc1sgYXR0ciBdID0gdmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYoICF1cGRhdGUgKXtcclxuXHRcdFx0Zm9yKCB2YXIga2V5IGluIGF0dHJzICl7XHJcblx0XHRcdFx0dXBkYXRlID0gdXBkYXRlIHx8IHRoaXNbIGtleSBdICE9IGF0dHJzWyBrZXkgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTm8gY2hhbmdlcywganVzdCByZXR1cm4gdGhlIG5vZGVcclxuXHRcdFx0aWYoICF1cGRhdGUgKVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ21lcmdlJywgdGhpcywgYXR0cnMgKTtcclxuXHR9LFxyXG5cclxuXHRyZXNldDogZnVuY3Rpb24oIGF0dHJzICkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAncmVwbGFjZScsIHRoaXMsIGF0dHJzICk7XHJcblx0fSxcclxuXHJcblx0Z2V0TGlzdGVuZXI6IGZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdsaXN0ZW5lcicsIHRoaXMgKTtcclxuXHR9LFxyXG5cclxuXHR0b0pTOiBmdW5jdGlvbigpe1xyXG5cdFx0dmFyIGpzO1xyXG5cdFx0aWYoIHRoaXMuY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcclxuXHRcdFx0anMgPSBuZXcgQXJyYXkoIHRoaXMubGVuZ3RoICk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0anMgPSB7fTtcclxuXHRcdH1cclxuXHJcblx0XHRVdGlscy5lYWNoKCB0aGlzLCBmdW5jdGlvbiggY2hpbGQsIGkgKXtcclxuXHRcdFx0aWYoIGNoaWxkICYmIGNoaWxkLl9fIClcclxuXHRcdFx0XHRqc1sgaSBdID0gY2hpbGQudG9KUygpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0anNbIGkgXSA9IGNoaWxkO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIGpzO1xyXG5cdH0sXHJcblxyXG5cdHRyYW5zYWN0OiBmdW5jdGlvbigpe1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAndHJhbnNhY3QnLCB0aGlzICk7XHJcblx0fSxcclxuXHRydW46IGZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdydW4nLCB0aGlzICk7XHJcblx0fVxyXG59O1xyXG5cclxudmFyIGFycmF5TWV0aG9kcyA9IFV0aWxzLmV4dGVuZCh7XHJcblx0cHVzaDogZnVuY3Rpb24oIGVsICl7XHJcblx0XHRyZXR1cm4gdGhpcy5hcHBlbmQoIFtlbF0gKTtcclxuXHR9LFxyXG5cclxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCBlbHMgKXtcclxuXHRcdGlmKCBlbHMgJiYgZWxzLmxlbmd0aCApXHJcblx0XHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ3NwbGljZScsIHRoaXMsIFt0aGlzLmxlbmd0aCwgMF0uY29uY2F0KCBlbHMgKSApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0cG9wOiBmdW5jdGlvbigpe1xyXG5cdFx0aWYoICF0aGlzLmxlbmd0aCApXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ3NwbGljZScsIHRoaXMsIFt0aGlzLmxlbmd0aCAtMSwgMV0gKTtcclxuXHR9LFxyXG5cclxuXHR1bnNoaWZ0OiBmdW5jdGlvbiggZWwgKXtcclxuXHRcdHJldHVybiB0aGlzLnByZXBlbmQoIFtlbF0gKTtcclxuXHR9LFxyXG5cclxuXHRwcmVwZW5kOiBmdW5jdGlvbiggZWxzICl7XHJcblx0XHRpZiggZWxzICYmIGVscy5sZW5ndGggKVxyXG5cdFx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdzcGxpY2UnLCB0aGlzLCBbMCwgMF0uY29uY2F0KCBlbHMgKSApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0c2hpZnQ6IGZ1bmN0aW9uKCl7XHJcblx0XHRpZiggIXRoaXMubGVuZ3RoIClcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAnc3BsaWNlJywgdGhpcywgWzAsIDFdICk7XHJcblx0fSxcclxuXHJcblx0c3BsaWNlOiBmdW5jdGlvbiggaW5kZXgsIHRvUmVtb3ZlLCB0b0FkZCApe1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAnc3BsaWNlJywgdGhpcywgYXJndW1lbnRzICk7XHJcblx0fVxyXG59LCBjb21tb25NZXRob2RzICk7XHJcblxyXG52YXIgRnJvemVuQXJyYXkgPSBPYmplY3QuY3JlYXRlKCBBcnJheS5wcm90b3R5cGUsIGNyZWF0ZU5FKCBhcnJheU1ldGhvZHMgKSApO1xyXG5cclxudmFyIE1peGlucyA9IHtcclxuXHJcbkhhc2g6IE9iamVjdC5jcmVhdGUoIE9iamVjdC5wcm90b3R5cGUsIGNyZWF0ZU5FKCBVdGlscy5leHRlbmQoe1xyXG5cdHJlbW92ZTogZnVuY3Rpb24oIGtleXMgKXtcclxuXHRcdHZhciBmaWx0ZXJlZCA9IFtdLFxyXG5cdFx0XHRrID0ga2V5c1xyXG5cdFx0O1xyXG5cclxuXHRcdGlmKCBrZXlzLmNvbnN0cnVjdG9yICE9IEFycmF5IClcclxuXHRcdFx0ayA9IFsga2V5cyBdO1xyXG5cclxuXHRcdGZvciggdmFyIGkgPSAwLCBsID0gay5sZW5ndGg7IGk8bDsgaSsrICl7XHJcblx0XHRcdGlmKCB0aGlzLmhhc093blByb3BlcnR5KCBrW2ldICkgKVxyXG5cdFx0XHRcdGZpbHRlcmVkLnB1c2goIGtbaV0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiggZmlsdGVyZWQubGVuZ3RoIClcclxuXHRcdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAncmVtb3ZlJywgdGhpcywgZmlsdGVyZWQgKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxufSwgY29tbW9uTWV0aG9kcykpKSxcclxuXHJcbkxpc3Q6IEZyb3plbkFycmF5LFxyXG5hcnJheU1ldGhvZHM6IGFycmF5TWV0aG9kc1xyXG59O1xyXG4vLyNidWlsZFxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNaXhpbnM7XG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvc3JjL21peGlucy5qc1xuICoqIG1vZHVsZSBpZCA9IDIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9zcmMvbWl4aW5zLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjMgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjAgKSxcclxuXHRNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMiksXHJcblx0RW1pdHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpXHJcbjtcclxuXHJcbi8vI2J1aWxkXHJcbnZhciBGcm96ZW4gPSB7XHJcblx0ZnJlZXplOiBmdW5jdGlvbiggbm9kZSwgbm90aWZ5LCBmcmVlemVGbiApe1xyXG5cdFx0aWYoIG5vZGUgJiYgbm9kZS5fXyApe1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4sIG1peGluLCBjb25zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIG5vZGUuY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5jcmVhdGVBcnJheSggbm9kZS5sZW5ndGggKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRmcm96ZW4gPSBPYmplY3QuY3JlYXRlKCBNaXhpbnMuSGFzaCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdFV0aWxzLmFkZE5FKCBmcm96ZW4sIHsgX186IHtcclxuXHRcdFx0bGlzdGVuZXI6IGZhbHNlLFxyXG5cdFx0XHRwYXJlbnRzOiBbXSxcclxuXHRcdFx0bm90aWZ5OiBub3RpZnksXHJcblx0XHRcdGRpcnR5OiBmYWxzZSxcclxuXHRcdFx0ZnJlZXplRm46IGZyZWV6ZUZuXHJcblx0XHR9fSk7XHJcblxyXG5cdFx0Ly8gRnJlZXplIGNoaWxkcmVuXHJcblx0XHRVdGlscy5lYWNoKCBub2RlLCBmdW5jdGlvbiggY2hpbGQsIGtleSApe1xyXG5cdFx0XHRjb25zID0gY2hpbGQgJiYgY2hpbGQuY29uc3RydWN0b3I7XHJcblx0XHRcdGlmKCBjb25zID09IEFycmF5IHx8IGNvbnMgPT0gT2JqZWN0ICl7XHJcblx0XHRcdFx0Y2hpbGQgPSBtZS5mcmVlemUoIGNoaWxkLCBub3RpZnksIGZyZWV6ZUZuICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCBjaGlsZCAmJiBjaGlsZC5fXyApe1xyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5bIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRmcmVlemVGbiggZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHR1cGRhdGU6IGZ1bmN0aW9uKCB0eXBlLCBub2RlLCBvcHRpb25zICl7XHJcblx0XHRpZiggIXRoaXNbIHR5cGUgXSlcclxuXHRcdFx0cmV0dXJuIFV0aWxzLmVycm9yKCAnVW5rbm93biB1cGRhdGUgdHlwZTogJyArIHR5cGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpc1sgdHlwZSBdKCBub2RlLCBvcHRpb25zICk7XHJcblx0fSxcclxuXHJcblx0cmVzZXQ6IGZ1bmN0aW9uKCBub2RlLCB2YWx1ZSApe1xyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0ZnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHZhbHVlICYmIHZhbHVlLl9fICl7XHJcblx0XHRcdGZyb3plbiA9IHZhbHVlO1xyXG5cdFx0XHRmcm96ZW4uX18ubGlzdGVuZXIgPSB2YWx1ZS5fXy5saXN0ZW5lcjtcclxuXHRcdFx0ZnJvemVuLl9fLnBhcmVudHMgPSBbXTtcclxuXHJcblx0XHRcdC8vIFNldCBiYWNrIHRoZSBwYXJlbnQgb24gdGhlIGNoaWxkcmVuXHJcblx0XHRcdC8vIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWRcclxuXHRcdFx0dGhpcy5maXhDaGlsZHJlbiggZnJvemVuLCBub2RlICk7XHJcblx0XHRcdFV0aWxzLmVhY2goIGZyb3plbiwgZnVuY3Rpb24oIGNoaWxkICl7XHJcblx0XHRcdFx0aWYoIGNoaWxkICYmIGNoaWxkLl9fICl7XHJcblx0XHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIG5vZGUgKTtcclxuXHRcdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5mcmVlemUoIG5vZGUsIG5vZGUuX18ubm90aWZ5LCBub2RlLl9fLmZyZWV6ZUZuICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRtZXJnZTogZnVuY3Rpb24oIG5vZGUsIGF0dHJzICl7XHJcblx0XHR2YXIgdHJhbnMgPSBub2RlLl9fLnRyYW5zLFxyXG5cclxuXHRcdFx0Ly8gQ2xvbmUgdGhlIGF0dHJzIHRvIG5vdCBtb2RpZnkgdGhlIGFyZ3VtZW50XHJcblx0XHRcdGF0dHJzID0gVXRpbHMuZXh0ZW5kKCB7fSwgYXR0cnMpXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zICl7XHJcblxyXG5cdFx0XHRmb3IoIHZhciBhdHRyIGluIGF0dHJzIClcclxuXHRcdFx0XHR0cmFuc1sgYXR0ciBdID0gYXR0cnNbIGF0dHIgXTtcclxuXHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5jb3B5TWV0YSggbm9kZSApLFxyXG5cdFx0XHRub3RpZnkgPSBub2RlLl9fLm5vdGlmeSxcclxuXHRcdFx0dmFsLCBjb25zLCBrZXksIGlzRnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0aXNGcm96ZW4gPSBjaGlsZCAmJiBjaGlsZC5fXztcclxuXHJcblx0XHRcdGlmKCBpc0Zyb3plbiApe1xyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG5vZGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFsID0gYXR0cnNbIGtleSBdO1xyXG5cdFx0XHRpZiggIXZhbCApe1xyXG5cdFx0XHRcdGlmKCBpc0Zyb3plbiApXHJcblx0XHRcdFx0XHRtZS5hZGRQYXJlbnQoIGNoaWxkLCBmcm96ZW4gKTtcclxuXHRcdFx0XHRyZXR1cm4gZnJvemVuWyBrZXkgXSA9IGNoaWxkO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zID0gdmFsICYmIHZhbC5jb25zdHJ1Y3RvcjtcclxuXHJcblx0XHRcdGlmKCBjb25zID09IEFycmF5IHx8IGNvbnMgPT0gT2JqZWN0IClcclxuXHRcdFx0XHR2YWwgPSBtZS5mcmVlemUoIHZhbCwgbm90aWZ5LCBub2RlLl9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRpZiggdmFsICYmIHZhbC5fXyApXHJcblx0XHRcdFx0bWUuYWRkUGFyZW50KCB2YWwsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0ZGVsZXRlIGF0dHJzWyBrZXkgXTtcclxuXHJcblx0XHRcdGZyb3plblsga2V5IF0gPSB2YWw7XHJcblx0XHR9KTtcclxuXHJcblxyXG5cdFx0Zm9yKCBrZXkgaW4gYXR0cnMgKSB7XHJcblx0XHRcdHZhbCA9IGF0dHJzWyBrZXkgXTtcclxuXHRcdFx0Y29ucyA9IHZhbCAmJiB2YWwuY29uc3RydWN0b3I7XHJcblxyXG5cdFx0XHRpZiggY29ucyA9PSBBcnJheSB8fCBjb25zID09IE9iamVjdCApXHJcblx0XHRcdFx0dmFsID0gbWUuZnJlZXplKCB2YWwsIG5vdGlmeSwgbm9kZS5fXy5mcmVlemVGbiApO1xyXG5cclxuXHRcdFx0aWYoIHZhbCAmJiB2YWwuX18gKVxyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggdmFsLCBmcm96ZW4gKTtcclxuXHJcblx0XHRcdGZyb3plblsga2V5IF0gPSB2YWw7XHJcblx0XHR9XHJcblxyXG5cdFx0bm9kZS5fXy5mcmVlemVGbiggZnJvemVuICk7XHJcblxyXG5cdFx0dGhpcy5yZWZyZXNoUGFyZW50cyggbm9kZSwgZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRyZXBsYWNlOiBmdW5jdGlvbiggbm9kZSwgcmVwbGFjZW1lbnQgKSB7XHJcblxyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0Y29ucyA9IHJlcGxhY2VtZW50ICYmIHJlcGxhY2VtZW50LmNvbnN0cnVjdG9yLFxyXG5cdFx0XHRfXyA9IG5vZGUuX18sXHJcblx0XHRcdGZyb3plbiA9IHJlcGxhY2VtZW50XHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGNvbnMgPT0gQXJyYXkgfHwgY29ucyA9PSBPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRmcm96ZW4gPSBtZS5mcmVlemUoIHJlcGxhY2VtZW50LCBfXy5ub3RpZnksIF9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRmcm96ZW4uX18ucGFyZW50cyA9IF9fLnBhcmVudHM7XHJcblxyXG5cdFx0XHQvLyBBZGQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaWYgZXhpc3RzLCByZXBsYWNpbmcgYVxyXG5cdFx0XHQvLyBwcmV2aW91cyBsaXN0ZW5lciBpbiB0aGUgZnJvemVuIGlmIGV4aXN0ZWRcclxuXHRcdFx0aWYoIF9fLmxpc3RlbmVyIClcclxuXHRcdFx0XHRmcm96ZW4uX18ubGlzdGVuZXIgPSBub2RlLl9fLmxpc3RlbmVyO1xyXG5cclxuXHRcdFx0Ly8gU2luY2UgdGhlIHBhcmVudHMgd2lsbCBiZSByZWZyZXNoZWQgZGlyZWN0bHksXHJcblx0XHRcdC8vIFRyaWdnZXIgdGhlIGxpc3RlbmVyIGhlcmVcclxuXHRcdFx0aWYoIGZyb3plbi5fXy5saXN0ZW5lciApXHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBmcm96ZW4sICd1cGRhdGUnLCBmcm96ZW4gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZWZyZXNoIHRoZSBwYXJlbnQgbm9kZXMgZGlyZWN0bHlcclxuXHRcdGlmKCAhX18ucGFyZW50cy5sZW5ndGggJiYgX18ubGlzdGVuZXIgKXtcclxuXHRcdFx0X18ubGlzdGVuZXIudHJpZ2dlciggJ2ltbWVkaWF0ZScsIG5vZGUsIGZyb3plbiApO1xyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIgaSA9IF9fLnBhcmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0aWYoIGkgPT0gMCApe1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaCggX18ucGFyZW50c1tpXSwgbm9kZSwgZnJvemVuLCBmYWxzZSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2V7XHJcblxyXG5cdFx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBbbm9kZSwgZnJvemVuXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdH0sXHJcblxyXG5cdHJlbW92ZTogZnVuY3Rpb24oIG5vZGUsIGF0dHJzICl7XHJcblx0XHR2YXIgdHJhbnMgPSBub2RlLl9fLnRyYW5zO1xyXG5cdFx0aWYoIHRyYW5zICl7XHJcblx0XHRcdGZvciggdmFyIGwgPSBhdHRycy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSApXHJcblx0XHRcdFx0ZGVsZXRlIHRyYW5zWyBhdHRyc1tsXSBdO1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGlzRnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0aXNGcm96ZW4gPSBjaGlsZCAmJiBjaGlsZC5fXztcclxuXHJcblx0XHRcdGlmKCBpc0Zyb3plbiApe1xyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG5vZGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIGF0dHJzLmluZGV4T2YoIGtleSApICE9IC0xICl7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggaXNGcm96ZW4gKVxyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0ZnJvemVuWyBrZXkgXSA9IGNoaWxkO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0bm9kZS5fXy5mcmVlemVGbiggZnJvemVuICk7XHJcblx0XHR0aGlzLnJlZnJlc2hQYXJlbnRzKCBub2RlLCBmcm96ZW4gKTtcclxuXHJcblx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdH0sXHJcblxyXG5cdHNwbGljZTogZnVuY3Rpb24oIG5vZGUsIGFyZ3MgKXtcclxuXHRcdHZhciB0cmFucyA9IG5vZGUuX18udHJhbnM7XHJcblx0XHRpZiggdHJhbnMgKXtcclxuXHRcdFx0dHJhbnMuc3BsaWNlLmFwcGx5KCB0cmFucywgYXJncyApO1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGluZGV4ID0gYXJnc1swXSxcclxuXHRcdFx0ZGVsZXRlSW5kZXggPSBpbmRleCArIGFyZ3NbMV0sXHJcblx0XHRcdF9fID0gbm9kZS5fXyxcclxuXHRcdFx0Y29uLCBjaGlsZFxyXG5cdFx0O1xyXG5cclxuXHRcdC8vIENsb25lIHRoZSBhcnJheVxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBpICl7XHJcblxyXG5cdFx0XHRpZiggY2hpbGQgJiYgY2hpbGQuX18gKXtcclxuXHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIGNoaWxkLCBub2RlICk7XHJcblxyXG5cdFx0XHRcdC8vIFNraXAgdGhlIG5vZGVzIHRvIGRlbGV0ZVxyXG5cdFx0XHRcdGlmKCBpIDwgaW5kZXggfHwgaT49IGRlbGV0ZUluZGV4IClcclxuXHRcdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5baV0gPSBjaGlsZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFByZXBhcmUgdGhlIG5ldyBub2Rlc1xyXG5cdFx0aWYoIGFyZ3MubGVuZ3RoID4gMSApe1xyXG5cdFx0XHRmb3IgKHZhciBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDI7IGktLSkge1xyXG5cdFx0XHRcdGNoaWxkID0gYXJnc1tpXTtcclxuXHRcdFx0XHRjb24gPSBjaGlsZCAmJiBjaGlsZC5jb25zdHJ1Y3RvcjtcclxuXHJcblx0XHRcdFx0aWYoIGNvbiA9PSBBcnJheSB8fCBjb24gPT0gT2JqZWN0IClcclxuXHRcdFx0XHRcdGNoaWxkID0gdGhpcy5mcmVlemUoIGNoaWxkLCBfXy5ub3RpZnksIF9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRcdGlmKCBjaGlsZCAmJiBjaGlsZC5fXyApXHJcblx0XHRcdFx0XHR0aGlzLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0XHRhcmdzW2ldID0gY2hpbGQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzcGxpY2VcclxuXHRcdEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoIGZyb3plbiwgYXJncyApO1xyXG5cclxuXHRcdG5vZGUuX18uZnJlZXplRm4oIGZyb3plbiApO1xyXG5cdFx0dGhpcy5yZWZyZXNoUGFyZW50cyggbm9kZSwgZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHR0cmFuc2FjdDogZnVuY3Rpb24oIG5vZGUgKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHR0cmFuc2FjdGluZyA9IG5vZGUuX18udHJhbnMsXHJcblx0XHRcdHRyYW5zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zYWN0aW5nIClcclxuXHRcdFx0cmV0dXJuIHRyYW5zYWN0aW5nO1xyXG5cclxuXHRcdHRyYW5zID0gbm9kZS5jb25zdHJ1Y3RvciA9PSBBcnJheSA/IFtdIDoge307XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0dHJhbnNbIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRub2RlLl9fLnRyYW5zID0gdHJhbnM7XHJcblxyXG5cdFx0Ly8gQ2FsbCBydW4gYXV0b21hdGljYWxseSBpbiBjYXNlXHJcblx0XHQvLyB0aGUgdXNlciBmb3Jnb3QgYWJvdXQgaXRcclxuXHRcdFV0aWxzLm5leHRUaWNrKCBmdW5jdGlvbigpe1xyXG5cdFx0XHRpZiggbm9kZS5fXy50cmFucyApXHJcblx0XHRcdFx0bWUucnVuKCBub2RlICk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnM7XHJcblx0fSxcclxuXHJcblx0cnVuOiBmdW5jdGlvbiggbm9kZSApIHtcclxuXHRcdHZhciBtZSA9IHRoaXMsXHJcblx0XHRcdHRyYW5zID0gbm9kZS5fXy50cmFuc1xyXG5cdFx0O1xyXG5cclxuXHRcdGlmKCAhdHJhbnMgKVxyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0XHQvLyBSZW1vdmUgdGhlIG5vZGUgYXMgYSBwYXJlbnRcclxuXHRcdFV0aWxzLmVhY2goIHRyYW5zLCBmdW5jdGlvbiggY2hpbGQsIGtleSApe1xyXG5cdFx0XHRpZiggY2hpbGQgJiYgY2hpbGQuX18gKXtcclxuXHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIGNoaWxkLCBub2RlICk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGRlbGV0ZSBub2RlLl9fLnRyYW5zO1xyXG5cclxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlcGxhY2UoIG5vZGUsIHRyYW5zICk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH0sXHJcblxyXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCBub2RlLCBvbGRDaGlsZCwgbmV3Q2hpbGQsIHJldHVyblVwZGF0ZWQgKXtcclxuXHRcdHZhciBtZSA9IHRoaXMsXHJcblx0XHRcdHRyYW5zID0gbm9kZS5fXy50cmFucyxcclxuXHRcdFx0Zm91bmQgPSAwXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zICl7XHJcblxyXG5cdFx0XHRVdGlscy5lYWNoKCB0cmFucywgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0XHRpZiggZm91bmQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdGlmKCBjaGlsZCA9PT0gb2xkQ2hpbGQgKXtcclxuXHJcblx0XHRcdFx0XHR0cmFuc1sga2V5IF0gPSBuZXdDaGlsZDtcclxuXHRcdFx0XHRcdGZvdW5kID0gMTtcclxuXHJcblx0XHRcdFx0XHRpZiggbmV3Q2hpbGQgJiYgbmV3Q2hpbGQuX18gKVxyXG5cdFx0XHRcdFx0XHRtZS5hZGRQYXJlbnQoIG5ld0NoaWxkLCBub2RlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiBub2RlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGRpcnR5ID0gbm9kZS5fXy5kaXJ0eSxcclxuXHRcdFx0ZGlydCwgcmVwbGFjZW1lbnQsIF9fXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGRpcnR5ICl7XHJcblx0XHRcdGRpcnQgPSBkaXJ0eVswXSxcclxuXHRcdFx0cmVwbGFjZW1lbnQgPSBkaXJ0eVsxXVxyXG5cdFx0fVxyXG5cclxuXHRcdFV0aWxzLmVhY2goIG5vZGUsIGZ1bmN0aW9uKCBjaGlsZCwga2V5ICl7XHJcblx0XHRcdGlmKCBjaGlsZCA9PT0gb2xkQ2hpbGQgKXtcclxuXHRcdFx0XHRjaGlsZCA9IG5ld0NoaWxkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYoIGNoaWxkID09PSBkaXJ0ICl7XHJcblx0XHRcdFx0Y2hpbGQgPSByZXBsYWNlbWVudDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIGNoaWxkICYmIChfXyA9IGNoaWxkLl9fKSApe1xyXG5cclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIHRyYW5zIGhhcHBlbmluZyB3ZVxyXG5cdFx0XHRcdC8vIGRvbid0IHVwZGF0ZSBhIGRpcnR5IG5vZGUgbm93LiBUaGUgdXBkYXRlXHJcblx0XHRcdFx0Ly8gd2lsbCBvY2N1ciBvbiBydW4uXHJcblx0XHRcdFx0aWYoICFfXy50cmFucyAmJiBfXy5kaXJ0eSApe1xyXG5cdFx0XHRcdFx0Y2hpbGQgPSBtZS5yZWZyZXNoKCBjaGlsZCwgX18uZGlydHlbMF0sIF9fLmRpcnR5WzFdLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0bWUucmVtb3ZlUGFyZW50KCBjaGlsZCwgbm9kZSApO1xyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5bIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRub2RlLl9fLmZyZWV6ZUZuKCBmcm96ZW4gKTtcclxuXHJcblx0XHQvLyBJZiB0aGUgbm9kZSB3YXMgZGlydHksIGNsZWFuIGl0XHJcblx0XHRub2RlLl9fLmRpcnR5ID0gZmFsc2U7XHJcblxyXG5cdFx0aWYoIHJldHVyblVwZGF0ZWQgKVxyXG5cdFx0XHRyZXR1cm4gZnJvemVuO1xyXG5cclxuXHRcdHRoaXMucmVmcmVzaFBhcmVudHMoIG5vZGUsIGZyb3plbiApO1xyXG5cdH0sXHJcblxyXG5cdGZpeENoaWxkcmVuOiBmdW5jdGlvbiggbm9kZSwgb2xkTm9kZSApe1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFV0aWxzLmVhY2goIG5vZGUsIGZ1bmN0aW9uKCBjaGlsZCApe1xyXG5cdFx0XHRpZiggIWNoaWxkIHx8ICFjaGlsZC5fXyApXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gSWYgdGhlIGNoaWxkIGlzIGxpbmtlZCB0byB0aGUgbm9kZSxcclxuXHRcdFx0Ly8gbWF5YmUgaXRzIGNoaWxkcmVuIGFyZSBub3QgbGlua2VkXHJcblx0XHRcdGlmKCBjaGlsZC5fXy5wYXJlbnRzLmluZGV4T2YoIG5vZGUgKSAhPSAtMSApXHJcblx0XHRcdFx0cmV0dXJuIG1lLmZpeENoaWxkcmVuKCBjaGlsZCApO1xyXG5cclxuXHRcdFx0Ly8gSWYgdGhlIGNoaWxkIHdhc24ndCBsaW5rZWQgaXQgaXMgc3VyZVxyXG5cdFx0XHQvLyB0aGF0IGl0IHdhc24ndCBtb2RpZmllZC4gSnVzdCBsaW5rIGl0XHJcblx0XHRcdC8vIHRvIHRoZSBuZXcgcGFyZW50XHJcblx0XHRcdGlmKCBjaGlsZC5fXy5wYXJlbnRzLmxlbmd0aCA9PSAxIClcclxuXHRcdFx0XHRyZXR1cm4gY2hpbGQuX18ucGFyZW50cyA9IFsgbm9kZSBdO1xyXG5cclxuXHRcdFx0aWYoIG9sZE5vZGUgKVxyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG9sZE5vZGUgKTtcclxuXHJcblx0XHRcdG1lLmFkZFBhcmVudCggbm9kZSApO1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0Y29weU1ldGE6IGZ1bmN0aW9uKCBub2RlICl7XHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW5cclxuXHRcdDtcclxuXHJcblx0XHRpZiggbm9kZS5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNyZWF0ZUFycmF5KCBub2RlLmxlbmd0aCApO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGZyb3plbiA9IE9iamVjdC5jcmVhdGUoIE1peGlucy5IYXNoICk7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIF9fID0gbm9kZS5fXztcclxuXHJcblx0XHRVdGlscy5hZGRORSggZnJvemVuLCB7X186IHtcclxuXHRcdFx0bm90aWZ5OiBfXy5ub3RpZnksXHJcblx0XHRcdGxpc3RlbmVyOiBfXy5saXN0ZW5lcixcclxuXHRcdFx0cGFyZW50czogX18ucGFyZW50cy5zbGljZSggMCApLFxyXG5cdFx0XHR0cmFuczogX18udHJhbnMsXHJcblx0XHRcdGRpcnR5OiBmYWxzZSxcclxuXHRcdFx0ZnJlZXplRm46IF9fLmZyZWV6ZUZuXHJcblx0XHR9fSk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRyZWZyZXNoUGFyZW50czogZnVuY3Rpb24oIG9sZENoaWxkLCBuZXdDaGlsZCApe1xyXG5cdFx0dmFyIF9fID0gb2xkQ2hpbGQuX18sXHJcblx0XHRcdGlcclxuXHRcdDtcclxuXHJcblx0XHRpZiggX18ubGlzdGVuZXIgKVxyXG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5ld0NoaWxkLCAndXBkYXRlJywgbmV3Q2hpbGQgKTtcclxuXHJcblx0XHRpZiggIV9fLnBhcmVudHMubGVuZ3RoICl7XHJcblx0XHRcdGlmKCBfXy5saXN0ZW5lciApe1xyXG5cdFx0XHRcdF9fLmxpc3RlbmVyLnRyaWdnZXIoICdpbW1lZGlhdGUnLCBvbGRDaGlsZCwgbmV3Q2hpbGQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGZvciAoaSA9IF9fLnBhcmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhcmVudCwgbWFyayBldmVyeW9uZSBhcyBkaXJ0eVxyXG5cdFx0XHRcdC8vIGJ1dCB0aGUgbGFzdCBpbiB0aGUgaXRlcmF0aW9uLCBhbmQgd2hlbiB0aGUgbGFzdCBpcyByZWZyZXNoZWRcclxuXHRcdFx0XHQvLyBpdCB3aWxsIHVwZGF0ZSB0aGUgZGlydHkgbm9kZXMuXHJcblx0XHRcdFx0aWYoIGkgPT0gMCApXHJcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2goIF9fLnBhcmVudHNbaV0sIG9sZENoaWxkLCBuZXdDaGlsZCwgZmFsc2UgKTtcclxuXHRcdFx0XHRlbHNle1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBbb2xkQ2hpbGQsIG5ld0NoaWxkXSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdG1hcmtEaXJ0eTogZnVuY3Rpb24oIG5vZGUsIGRpcnQgKXtcclxuXHRcdHZhciBfXyA9IG5vZGUuX18sXHJcblx0XHRcdGlcclxuXHRcdDtcclxuXHRcdF9fLmRpcnR5ID0gZGlydDtcclxuXHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIGhhcHBlbmluZyBpbiB0aGUgbm9kZVxyXG5cdFx0Ly8gdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBkYXRhIGltbWVkaWF0ZWx5XHJcblx0XHRpZiggX18udHJhbnMgKVxyXG5cdFx0XHR0aGlzLnJlZnJlc2goIG5vZGUsIGRpcnRbMF0sIGRpcnRbMV0gKTtcclxuXHJcblx0XHRmb3IgKCBpID0gX18ucGFyZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHtcclxuXHJcblx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBkaXJ0ICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0cmVtb3ZlUGFyZW50OiBmdW5jdGlvbiggbm9kZSwgcGFyZW50ICl7XHJcblx0XHR2YXIgcGFyZW50cyA9IG5vZGUuX18ucGFyZW50cyxcclxuXHRcdFx0aW5kZXggPSBwYXJlbnRzLmluZGV4T2YoIHBhcmVudCApXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGluZGV4ICE9IC0xICl7XHJcblxyXG5cdFx0XHRwYXJlbnRzLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZGRQYXJlbnQ6IGZ1bmN0aW9uKCBub2RlLCBwYXJlbnQgKXtcclxuXHRcdHZhciBwYXJlbnRzID0gbm9kZS5fXy5wYXJlbnRzLFxyXG5cdFx0XHRpbmRleCA9IHBhcmVudHMuaW5kZXhPZiggcGFyZW50IClcclxuXHRcdDtcclxuXHJcblx0XHRpZiggaW5kZXggPT0gLTEgKXtcclxuXHRcdFx0cGFyZW50c1sgcGFyZW50cy5sZW5ndGggXSA9IHBhcmVudDtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggbm9kZSwgZXZlbnROYW1lLCBwYXJhbSApe1xyXG5cdFx0dmFyIGxpc3RlbmVyID0gbm9kZS5fXy5saXN0ZW5lcixcclxuXHRcdFx0dGlja2luZyA9IGxpc3RlbmVyLnRpY2tpbmdcclxuXHRcdDtcclxuXHJcblx0XHRsaXN0ZW5lci50aWNraW5nID0gcGFyYW07XHJcblx0XHRpZiggIXRpY2tpbmcgKXtcclxuXHRcdFx0VXRpbHMubmV4dFRpY2soIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0dmFyIHVwZGF0ZWQgPSBsaXN0ZW5lci50aWNraW5nO1xyXG5cdFx0XHRcdGxpc3RlbmVyLnRpY2tpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRsaXN0ZW5lci50cmlnZ2VyKCBldmVudE5hbWUsIHVwZGF0ZWQgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCBmcm96ZW4gKXtcclxuXHRcdHZhciBsID0gZnJvemVuLl9fLmxpc3RlbmVyO1xyXG5cclxuXHRcdGlmKCAhbCApIHtcclxuXHRcdFx0bCA9IE9iamVjdC5jcmVhdGUoRW1pdHRlciwge1xyXG5cdFx0XHRcdF9ldmVudHM6IHtcclxuXHRcdFx0XHRcdHZhbHVlOiB7fSxcclxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGZyb3plbi5fXy5saXN0ZW5lciA9IGw7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGw7XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlQXJyYXk6IChmdW5jdGlvbigpe1xyXG5cdFx0Ly8gU2V0IGNyZWF0ZUFycmF5IG1ldGhvZFxyXG5cdFx0aWYoIFtdLl9fcHJvdG9fXyApXHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggbGVuZ3RoICl7XHJcblx0XHRcdFx0dmFyIGFyciA9IG5ldyBBcnJheSggbGVuZ3RoICk7XHJcblx0XHRcdFx0YXJyLl9fcHJvdG9fXyA9IE1peGlucy5MaXN0O1xyXG5cdFx0XHRcdHJldHVybiBhcnI7XHJcblx0XHRcdH1cclxuXHRcdHJldHVybiBmdW5jdGlvbiggbGVuZ3RoICl7XHJcblx0XHRcdHZhciBhcnIgPSBuZXcgQXJyYXkoIGxlbmd0aCApLFxyXG5cdFx0XHRcdG1ldGhvZHMgPSBNaXhpbnMuYXJyYXlNZXRob2RzXHJcblx0XHRcdDtcclxuXHRcdFx0Zm9yKCB2YXIgbSBpbiBtZXRob2RzICl7XHJcblx0XHRcdFx0YXJyWyBtIF0gPSBtZXRob2RzWyBtIF07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFycjtcclxuXHRcdH1cclxuXHR9KSgpXHJcbn07XHJcbi8vI2J1aWxkXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZyb3plbjtcblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vZnJlZXplci1qcy9zcmMvZnJvemVuLmpzXG4gKiogbW9kdWxlIGlkID0gMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vfi9mcmVlemVyLWpzL3NyYy9mcm96ZW4uanM/Iik7DQoNCi8qKiovIH0NCi8qKioqKiovIF0pDQp9KTsNCjsNCg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container">
<div id="htmlwidget-7644" class="reactjson html-widget" style="width:960px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-7644">{"x":{"json":[{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4"},{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.875,"qsec":17.02,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4 Wag"},{"mpg":22.8,"cyl":4,"disp":108,"hp":93,"drat":3.85,"wt":2.32,"qsec":18.61,"vs":1,"am":1,"gear":4,"carb":1,"_row":"Datsun 710"},{"mpg":21.4,"cyl":6,"disp":258,"hp":110,"drat":3.08,"wt":3.215,"qsec":19.44,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Hornet 4 Drive"},{"mpg":18.7,"cyl":8,"disp":360,"hp":175,"drat":3.15,"wt":3.44,"qsec":17.02,"vs":0,"am":0,"gear":3,"carb":2,"_row":"Hornet Sportabout"}]},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-7644">{"viewer":{"width":450,"height":350,"padding":15,"fill":true},"browser":{"width":960,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<script src="data:application/x-javascript;base64,KGZ1bmN0aW9uKCkgewogIC8vIElmIHdpbmRvdy5IVE1MV2lkZ2V0cyBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZW4gdXNlIGl0OyBvdGhlcndpc2UgY3JlYXRlIGEKICAvLyBuZXcgb2JqZWN0LiBUaGlzIGFsbG93cyBwcmVjZWRpbmcgY29kZSB0byBzZXQgb3B0aW9ucyB0aGF0IGFmZmVjdCB0aGUKICAvLyBpbml0aWFsaXphdGlvbiBwcm9jZXNzICh0aG91Z2ggbm9uZSBjdXJyZW50bHkgZXhpc3QpLgogIHdpbmRvdy5IVE1MV2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cyB8fCB7fTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gYSB2aWV3ZXIgcGFuZS4gSWYgbm90LCB3ZSdyZSBpbiBhIHdlYiBicm93c2VyLgogIHZhciB2aWV3ZXJNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnZpZXdlck1vZGUgPQogICAgICAvXGJ2aWV3ZXJfcGFuZT0xXGIvLnRlc3Qod2luZG93LmxvY2F0aW9uKTsKCiAgLy8gU2VlIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gU2hpbnkgbW9kZS4gSWYgbm90LCBpdCdzIGEgc3RhdGljIGRvY3VtZW50LgogIC8vIE5vdGUgdGhhdCBzdGF0aWMgd2lkZ2V0cyBjYW4gYXBwZWFyIGluIGJvdGggU2hpbnkgYW5kIHN0YXRpYyBtb2RlcywgYnV0CiAgLy8gb2J2aW91c2x5LCBTaGlueSB3aWRnZXRzIGNhbiBvbmx5IGFwcGVhciBpbiBTaGlueSBhcHBzL2RvY3VtZW50cy4KICB2YXIgc2hpbnlNb2RlID0gd2luZG93LkhUTUxXaWRnZXRzLnNoaW55TW9kZSA9CiAgICAgIHR5cGVvZih3aW5kb3cuU2hpbnkpICE9PSAidW5kZWZpbmVkIiAmJiAhIXdpbmRvdy5TaGlueS5vdXRwdXRCaW5kaW5nczsKCiAgLy8gV2UgY2FuJ3QgY291bnQgb24galF1ZXJ5IGJlaW5nIGF2YWlsYWJsZSwgc28gd2UgaW1wbGVtZW50IG91ciBvd24KICAvLyB2ZXJzaW9uIGlmIG5lY2Vzc2FyeS4KICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKHR5cGVvZihqUXVlcnkpICE9PSAidW5kZWZpbmVkIiAmJiBzY29wZSBpbnN0YW5jZW9mIGpRdWVyeSkgewogICAgICByZXR1cm4gc2NvcGUuZmluZChzZWxlY3Rvcik7CiAgICB9CiAgICBpZiAoc2NvcGUucXVlcnlTZWxlY3RvckFsbCkgewogICAgICByZXR1cm4gc2NvcGUucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhc0FycmF5KHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT09IG51bGwpCiAgICAgIHJldHVybiBbXTsKICAgIGlmICgkLmlzQXJyYXkodmFsdWUpKQogICAgICByZXR1cm4gdmFsdWU7CiAgICByZXR1cm4gW3ZhbHVlXTsKICB9CgogIC8vIEltcGxlbWVudCBqUXVlcnkncyBleHRlbmQKICBmdW5jdGlvbiBleHRlbmQodGFyZ2V0IC8qLCAuLi4gKi8pIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgcmV0dXJuIHRhcmdldDsKICAgIH0KICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07CiAgICAgIGZvciAodmFyIHByb3AgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgdGFyZ2V0W3Byb3BdID0gc291cmNlW3Byb3BdOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIElFOCBkb2Vzbid0IHN1cHBvcnQgQXJyYXkuZm9yRWFjaC4KICBmdW5jdGlvbiBmb3JFYWNoKHZhbHVlcywgY2FsbGJhY2ssIHRoaXNBcmcpIHsKICAgIGlmICh2YWx1ZXMuZm9yRWFjaCkgewogICAgICB2YWx1ZXMuZm9yRWFjaChjYWxsYmFjaywgdGhpc0FyZyk7CiAgICB9IGVsc2UgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdmFsdWVzW2ldLCBpLCB2YWx1ZXMpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZXBsYWNlcyB0aGUgc3BlY2lmaWVkIG1ldGhvZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgZnVuY1NvdXJjZS4KICAvLwogIC8vIE5vdGUgdGhhdCBmdW5jU291cmNlIHNob3VsZCBub3QgQkUgdGhlIG5ldyBtZXRob2QsIGl0IHNob3VsZCBiZSBhIGZ1bmN0aW9uCiAgLy8gdGhhdCBSRVRVUk5TIHRoZSBuZXcgbWV0aG9kLiBmdW5jU291cmNlIHJlY2VpdmVzIGEgc2luZ2xlIGFyZ3VtZW50IHRoYXQgaXMKICAvLyB0aGUgb3ZlcnJpZGRlbiBtZXRob2QsIGl0IGNhbiBiZSBjYWxsZWQgZnJvbSB0aGUgbmV3IG1ldGhvZC4gVGhlIG92ZXJyaWRkZW4KICAvLyBtZXRob2QgY2FuIGJlIGNhbGxlZCBsaWtlIGEgcmVndWxhciBmdW5jdGlvbiwgaXQgaGFzIHRoZSB0YXJnZXQgcGVybWFuZW50bHkKICAvLyBib3VuZCB0byBpdCBzbyAidGhpcyIgd2lsbCB3b3JrIGNvcnJlY3RseS4KICBmdW5jdGlvbiBvdmVycmlkZU1ldGhvZCh0YXJnZXQsIG1ldGhvZE5hbWUsIGZ1bmNTb3VyY2UpIHsKICAgIHZhciBzdXBlckZ1bmMgPSB0YXJnZXRbbWV0aG9kTmFtZV0gfHwgZnVuY3Rpb24oKSB7fTsKICAgIHZhciBzdXBlckZ1bmNCb3VuZCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gc3VwZXJGdW5jLmFwcGx5KHRhcmdldCwgYXJndW1lbnRzKTsKICAgIH07CiAgICB0YXJnZXRbbWV0aG9kTmFtZV0gPSBmdW5jU291cmNlKHN1cGVyRnVuY0JvdW5kKTsKICB9CgogIC8vIEFkZCBhIG1ldGhvZCB0byBkZWxlZ2F0b3IgdGhhdCwgd2hlbiBpbnZva2VkLCBjYWxscwogIC8vIGRlbGVnYXRlZS5tZXRob2ROYW1lLiBJZiB0aGVyZSBpcyBubyBzdWNoIG1ldGhvZCBvbgogIC8vIHRoZSBkZWxlZ2F0ZWUsIGJ1dCB0aGVyZSB3YXMgb25lIG9uIGRlbGVnYXRvciBiZWZvcmUKICAvLyBkZWxlZ2F0ZU1ldGhvZCB3YXMgY2FsbGVkLCB0aGVuIHRoZSBvcmlnaW5hbCB2ZXJzaW9uCiAgLy8gaXMgaW52b2tlZCBpbnN0ZWFkLgogIC8vIEZvciBleGFtcGxlOgogIC8vCiAgLy8gdmFyIGEgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2ExJyk7IH0KICAvLyAgIG1ldGhvZDI6IGZ1bmN0aW9uKCkgeyBjb25zb2xlLmxvZygnYTInKTsgfQogIC8vIH07CiAgLy8gdmFyIGIgPSB7CiAgLy8gICBtZXRob2QxOiBmdW5jdGlvbigpIHsgY29uc29sZS5sb2coJ2IxJyk7IH0KICAvLyB9OwogIC8vIGRlbGVnYXRlTWV0aG9kKGEsIGIsICJtZXRob2QxIik7CiAgLy8gZGVsZWdhdGVNZXRob2QoYSwgYiwgIm1ldGhvZDIiKTsKICAvLyBhLm1ldGhvZDEoKTsKICAvLyBhLm1ldGhvZDIoKTsKICAvLwogIC8vIFRoZSBvdXRwdXQgd291bGQgYmUgImIxIiwgImEyIi4KICBmdW5jdGlvbiBkZWxlZ2F0ZU1ldGhvZChkZWxlZ2F0b3IsIGRlbGVnYXRlZSwgbWV0aG9kTmFtZSkgewogICAgdmFyIGluaGVyaXRlZCA9IGRlbGVnYXRvclttZXRob2ROYW1lXTsKICAgIGRlbGVnYXRvclttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgdGFyZ2V0ID0gZGVsZWdhdGVlOwogICAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGVlW21ldGhvZE5hbWVdOwoKICAgICAgLy8gVGhlIG1ldGhvZCBkb2Vzbid0IGV4aXN0IG9uIHRoZSBkZWxlZ2F0ZWUuIEluc3RlYWQsCiAgICAgIC8vIGNhbGwgdGhlIG1ldGhvZCBvbiB0aGUgZGVsZWdhdG9yLCBpZiBpdCBleGlzdHMuCiAgICAgIGlmICghbWV0aG9kKSB7CiAgICAgICAgdGFyZ2V0ID0gZGVsZWdhdG9yOwogICAgICAgIG1ldGhvZCA9IGluaGVyaXRlZDsKICAgICAgfQoKICAgICAgaWYgKG1ldGhvZCkgewogICAgICAgIHJldHVybiBtZXRob2QuYXBwbHkodGFyZ2V0LCBhcmd1bWVudHMpOwogICAgICB9CiAgICB9OwogIH0KCiAgLy8gSW1wbGVtZW50IGEgdmFndWUgZmFjc2ltaWxpZSBvZiBqUXVlcnkncyBkYXRhIG1ldGhvZAogIGZ1bmN0aW9uIGVsZW1lbnREYXRhKGVsLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMikgewogICAgICByZXR1cm4gZWxbImh0bWx3aWRnZXRfZGF0YV8iICsgbmFtZV07CiAgICB9IGVsc2UgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMykgewogICAgICBlbFsiaHRtbHdpZGdldF9kYXRhXyIgKyBuYW1lXSA9IHZhbHVlOwogICAgICByZXR1cm4gZWw7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMgZm9yIGVsZW1lbnREYXRhOiAiICsKICAgICAgICBhcmd1bWVudHMubGVuZ3RoKTsKICAgIH0KICB9CgogIC8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzQ0NjE3MC9lc2NhcGUtc3RyaW5nLWZvci11c2UtaW4tamF2YXNjcmlwdC1yZWdleAogIGZ1bmN0aW9uIGVzY2FwZVJlZ0V4cChzdHIpIHsKICAgIHJldHVybiBzdHIucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpOwogIH0KCiAgZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkgewogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiXFxiIiArIGVzY2FwZVJlZ0V4cChjbGFzc05hbWUpICsgIlxcYiIpOwogICAgcmV0dXJuIHJlLnRlc3QoZWwuY2xhc3NOYW1lKTsKICB9CgogIC8vIGVsZW1lbnRzIC0gYXJyYXkgKG9yIGFycmF5LWxpa2Ugb2JqZWN0KSBvZiBIVE1MIGVsZW1lbnRzCiAgLy8gY2xhc3NOYW1lIC0gY2xhc3MgbmFtZSB0byB0ZXN0IGZvcgogIC8vIGluY2x1ZGUgLSBpZiB0cnVlLCBvbmx5IHJldHVybiBlbGVtZW50cyB3aXRoIGdpdmVuIGNsYXNzTmFtZTsKICAvLyAgIGlmIGZhbHNlLCBvbmx5IHJldHVybiBlbGVtZW50cyAqd2l0aG91dCogZ2l2ZW4gY2xhc3NOYW1lCiAgZnVuY3Rpb24gZmlsdGVyQnlDbGFzcyhlbGVtZW50cywgY2xhc3NOYW1lLCBpbmNsdWRlKSB7CiAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoaGFzQ2xhc3MoZWxlbWVudHNbaV0sIGNsYXNzTmFtZSkgPT0gaW5jbHVkZSkKICAgICAgICByZXN1bHRzLnB1c2goZWxlbWVudHNbaV0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQoKICBmdW5jdGlvbiBvbihvYmosIGV2ZW50TmFtZSwgZnVuYykgewogICAgaWYgKG9iai5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgIG9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgZmFsc2UpOwogICAgfSBlbHNlIGlmIChvYmouYXR0YWNoRXZlbnQpIHsKICAgICAgb2JqLmF0dGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvZmYob2JqLCBldmVudE5hbWUsIGZ1bmMpIHsKICAgIGlmIChvYmoucmVtb3ZlRXZlbnRMaXN0ZW5lcikKICAgICAgb2JqLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBmdW5jLCBmYWxzZSk7CiAgICBlbHNlIGlmIChvYmouZGV0YWNoRXZlbnQpIHsKICAgICAgb2JqLmRldGFjaEV2ZW50KGV2ZW50TmFtZSwgZnVuYyk7CiAgICB9CiAgfQoKICAvLyBUcmFuc2xhdGUgYXJyYXkgb2YgdmFsdWVzIHRvIHRvcC9yaWdodC9ib3R0b20vbGVmdCwgYXMgdXN1YWwgd2l0aAogIC8vIHRoZSAicGFkZGluZyIgQ1NTIHByb3BlcnR5CiAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL3BhZGRpbmcKICBmdW5jdGlvbiB1bnBhY2tQYWRkaW5nKHZhbHVlKSB7CiAgICBpZiAodHlwZW9mKHZhbHVlKSA9PT0gIm51bWJlciIpCiAgICAgIHZhbHVlID0gW3ZhbHVlXTsKICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDEpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMF0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzBdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDIpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMF0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDMpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzFdfTsKICAgIH0KICAgIGlmICh2YWx1ZS5sZW5ndGggPT09IDQpIHsKICAgICAgcmV0dXJuIHt0b3A6IHZhbHVlWzBdLCByaWdodDogdmFsdWVbMV0sIGJvdHRvbTogdmFsdWVbMl0sIGxlZnQ6IHZhbHVlWzNdfTsKICAgIH0KICB9CgogIC8vIENvbnZlcnQgYW4gdW5wYWNrZWQgcGFkZGluZyBvYmplY3QgdG8gYSBDU1MgdmFsdWUKICBmdW5jdGlvbiBwYWRkaW5nVG9Dc3MocGFkZGluZ09iaikgewogICAgcmV0dXJuIHBhZGRpbmdPYmoudG9wICsgInB4ICIgKyBwYWRkaW5nT2JqLnJpZ2h0ICsgInB4ICIgKyBwYWRkaW5nT2JqLmJvdHRvbSArICJweCAiICsgcGFkZGluZ09iai5sZWZ0ICsgInB4IjsKICB9CgogIC8vIE1ha2VzIGEgbnVtYmVyIHN1aXRhYmxlIGZvciBDU1MKICBmdW5jdGlvbiBweCh4KSB7CiAgICBpZiAodHlwZW9mKHgpID09PSAibnVtYmVyIikKICAgICAgcmV0dXJuIHggKyAicHgiOwogICAgZWxzZQogICAgICByZXR1cm4geDsKICB9CgogIC8vIFJldHJpZXZlcyBydW50aW1lIHdpZGdldCBzaXppbmcgaW5mb3JtYXRpb24gZm9yIGFuIGVsZW1lbnQuCiAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBlaXRoZXIgbnVsbCwgb3IgYW4gb2JqZWN0IHdpdGggZmlsbCwgcGFkZGluZywKICAvLyBkZWZhdWx0V2lkdGgsIGRlZmF1bHRIZWlnaHQgZmllbGRzLgogIGZ1bmN0aW9uIHNpemluZ1BvbGljeShlbCkgewogICAgdmFyIHNpemluZ0VsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vaHRtbHdpZGdldC1zaXppbmcnXSIpOwogICAgaWYgKCFzaXppbmdFbCkKICAgICAgcmV0dXJuIG51bGw7CiAgICB2YXIgc3AgPSBKU09OLnBhcnNlKHNpemluZ0VsLnRleHRDb250ZW50IHx8IHNpemluZ0VsLnRleHQgfHwgInt9Iik7CiAgICBpZiAodmlld2VyTW9kZSkgewogICAgICByZXR1cm4gc3Audmlld2VyOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHNwLmJyb3dzZXI7CiAgICB9CiAgfQoKICAvLyBAcGFyYW0gdGFza3MgQXJyYXkgb2Ygc3RyaW5ncyAob3IgZmFsc3kgdmFsdWUsIGluIHdoaWNoIGNhc2Ugbm8tb3ApLgogIC8vICAgRWFjaCBlbGVtZW50IG11c3QgYmUgYSB2YWxpZCBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCB5aWVsZHMgYQogIC8vICAgZnVuY3Rpb24uIE9yLCBjYW4gYmUgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoICJjb2RlIiBhbmQgImRhdGEiCiAgLy8gICBwcm9wZXJ0aWVzOyBpbiB0aGlzIGNhc2UsIHRoZSAiY29kZSIgcHJvcGVydHkgc2hvdWxkIGJlIGEgc3RyaW5nCiAgLy8gICBvZiBKUyB0aGF0J3MgYW4gZXhwciB0aGF0IHlpZWxkcyBhIGZ1bmN0aW9uLCBhbmQgImRhdGEiIHNob3VsZCBiZQogIC8vICAgYW4gb2JqZWN0IHRoYXQgd2lsbCBiZSBhZGRlZCBhcyBhbiBhZGRpdGlvbmFsIGFyZ3VtZW50IHdoZW4gdGhhdAogIC8vICAgZnVuY3Rpb24gaXMgY2FsbGVkLgogIC8vIEBwYXJhbSB0YXJnZXQgVGhlIG9iamVjdCB0aGF0IHdpbGwgYmUgInRoaXMiIGZvciBlYWNoIGZ1bmN0aW9uCiAgLy8gICBleGVjdXRpb24uCiAgLy8gQHBhcmFtIGFyZ3MgQXJyYXkgb2YgYXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0aGUgZnVuY3Rpb25zLiAoVGhlCiAgLy8gICBzYW1lIGFyZ3VtZW50cyB3aWxsIGJlIHBhc3NlZCB0byBhbGwgZnVuY3Rpb25zLikKICBmdW5jdGlvbiBldmFsQW5kUnVuKHRhc2tzLCB0YXJnZXQsIGFyZ3MpIHsKICAgIGlmICh0YXNrcykgewogICAgICBmb3JFYWNoKHRhc2tzLCBmdW5jdGlvbih0YXNrKSB7CiAgICAgICAgdmFyIHRoZXNlQXJncyA9IGFyZ3M7CiAgICAgICAgaWYgKHR5cGVvZih0YXNrKSA9PT0gIm9iamVjdCIpIHsKICAgICAgICAgIHRoZXNlQXJncyA9IHRoZXNlQXJncy5jb25jYXQoW3Rhc2suZGF0YV0pOwogICAgICAgICAgdGFzayA9IHRhc2suY29kZTsKICAgICAgICB9CiAgICAgICAgdmFyIHRhc2tGdW5jID0gZXZhbCgiKCIgKyB0YXNrICsgIikiKTsKICAgICAgICBpZiAodHlwZW9mKHRhc2tGdW5jKSAhPT0gImZ1bmN0aW9uIikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG11c3QgYmUgYSBmdW5jdGlvbiEgU291cmNlOlxuIiArIHRhc2spOwogICAgICAgIH0KICAgICAgICB0YXNrRnVuYy5hcHBseSh0YXJnZXQsIHRoZXNlQXJncyk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5pdFNpemluZyhlbCkgewogICAgdmFyIHNpemluZyA9IHNpemluZ1BvbGljeShlbCk7CiAgICBpZiAoIXNpemluZykKICAgICAgcmV0dXJuOwoKICAgIHZhciBjZWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaHRtbHdpZGdldF9jb250YWluZXIiKTsKICAgIGlmICghY2VsKQogICAgICByZXR1cm47CgogICAgaWYgKHR5cGVvZihzaXppbmcucGFkZGluZykgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gIjAiOwogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnBhZGRpbmcgPSBwYWRkaW5nVG9Dc3ModW5wYWNrUGFkZGluZyhzaXppbmcucGFkZGluZykpOwogICAgfQoKICAgIGlmIChzaXppbmcuZmlsbCkgewogICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLm92ZXJmbG93ID0gImhpZGRlbiI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5oZWlnaHQgPSAiMTAwJSI7CiAgICAgIGlmIChjZWwpIHsKICAgICAgICBjZWwuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgIHZhciBwYWQgPSB1bnBhY2tQYWRkaW5nKHNpemluZy5wYWRkaW5nKTsKICAgICAgICBjZWwuc3R5bGUudG9wID0gcGFkLnRvcCArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLnJpZ2h0ID0gcGFkLnJpZ2h0ICsgInB4IjsKICAgICAgICBjZWwuc3R5bGUuYm90dG9tID0gcGFkLmJvdHRvbSArICJweCI7CiAgICAgICAgY2VsLnN0eWxlLmxlZnQgPSBwYWQubGVmdCArICJweCI7CiAgICAgICAgZWwuc3R5bGUud2lkdGggPSAiMTAwJSI7CiAgICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gIjEwMCUiOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNlbC5vZmZzZXRXaWR0aDsgfSwKICAgICAgICBnZXRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2VsLm9mZnNldEhlaWdodDsgfQogICAgICB9OwoKICAgIH0gZWxzZSB7CiAgICAgIGVsLnN0eWxlLndpZHRoID0gcHgoc2l6aW5nLndpZHRoKTsKICAgICAgZWwuc3R5bGUuaGVpZ2h0ID0gcHgoc2l6aW5nLmhlaWdodCk7CgogICAgICByZXR1cm4gewogICAgICAgIGdldFdpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGVsLm9mZnNldFdpZHRoOyB9LAogICAgICAgIGdldEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiBlbC5vZmZzZXRIZWlnaHQ7IH0KICAgICAgfTsKICAgIH0KICB9CgogIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBtZXRob2RzCiAgdmFyIGRlZmF1bHRzID0gewogICAgZmluZDogZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgcmV0dXJuIHF1ZXJ5U2VsZWN0b3JBbGwoc2NvcGUsICIuIiArIHRoaXMubmFtZSk7CiAgICB9LAogICAgcmVuZGVyRXJyb3I6IGZ1bmN0aW9uKGVsLCBlcnIpIHsKICAgICAgdmFyICRlbCA9ICQoZWwpOwoKICAgICAgdGhpcy5jbGVhckVycm9yKGVsKTsKCiAgICAgIC8vIEFkZCBhbGwgdGhlc2UgZXJyb3IgY2xhc3NlcywgYXMgU2hpbnkgZG9lcwogICAgICB2YXIgZXJyQ2xhc3MgPSAic2hpbnktb3V0cHV0LWVycm9yIjsKICAgICAgaWYgKGVyci50eXBlICE9PSBudWxsKSB7CiAgICAgICAgLy8gdXNlIHRoZSBjbGFzc2VzIG9mIHRoZSBlcnJvciBjb25kaXRpb24gYXMgQ1NTIGNsYXNzIG5hbWVzCiAgICAgICAgZXJyQ2xhc3MgPSBlcnJDbGFzcyArICIgIiArICQubWFwKGFzQXJyYXkoZXJyLnR5cGUpLCBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICByZXR1cm4gZXJyQ2xhc3MgKyAiLSIgKyB0eXBlOwogICAgICAgIH0pLmpvaW4oIiAiKTsKICAgICAgfQogICAgICBlcnJDbGFzcyA9IGVyckNsYXNzICsgIiBodG1sd2lkZ2V0cy1lcnJvciI7CgogICAgICAvLyBJcyBlbCBpbmxpbmUgb3IgYmxvY2s/IElmIGlubGluZSBvciBpbmxpbmUtYmxvY2ssIGp1c3QgZGlzcGxheTpub25lIGl0CiAgICAgIC8vIGFuZCBhZGQgYW4gaW5saW5lIGVycm9yLgogICAgICB2YXIgZGlzcGxheSA9ICRlbC5jc3MoImRpc3BsYXkiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgZGlzcGxheSk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICAkZWwuaGlkZSgpOwogICAgICAgIGlmIChlcnIubWVzc2FnZSAhPT0gIiIpIHsKICAgICAgICAgIHZhciBlcnJvclNwYW4gPSAkKCI8c3Bhbj4iKS5hZGRDbGFzcyhlcnJDbGFzcyk7CiAgICAgICAgICBlcnJvclNwYW4udGV4dChlcnIubWVzc2FnZSk7CiAgICAgICAgICAkZWwuYWZ0ZXIoZXJyb3JTcGFuKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoZGlzcGxheSA9PT0gImJsb2NrIikgewogICAgICAgIC8vIElmIGJsb2NrLCBhZGQgYW4gZXJyb3IganVzdCBhZnRlciB0aGUgZWwsIHNldCB2aXNpYmlsaXR5Om5vbmUgb24gdGhlCiAgICAgICAgLy8gZWwsIGFuZCBwb3NpdGlvbiB0aGUgZXJyb3IgdG8gYmUgb24gdG9wIG9mIHRoZSBlbC4KICAgICAgICAvLyBNYXJrIGl0IHdpdGggYSB1bmlxdWUgSUQgYW5kIENTUyBjbGFzcyBzbyB3ZSBjYW4gcmVtb3ZlIGl0IGxhdGVyLgogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgaWYgKGVyci5tZXNzYWdlICE9PSAiIikgewogICAgICAgICAgdmFyIGVycm9yRGl2ID0gJCgiPGRpdj4iKS5hZGRDbGFzcyhlcnJDbGFzcykuY3NzKCJwb3NpdGlvbiIsICJhYnNvbHV0ZSIpCiAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgLmNzcygibGVmdCIsIGVsLm9mZnNldExlZnQpCiAgICAgICAgICAgIC8vIHNldHRpbmcgd2lkdGggY2FuIHB1c2ggb3V0IHRoZSBwYWdlIHNpemUsIGZvcmNpbmcgb3RoZXJ3aXNlCiAgICAgICAgICAgIC8vIHVubmVjZXNzYXJ5IHNjcm9sbGJhcnMgdG8gYXBwZWFyIGFuZCBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgdG8gc2hyaW5rOyBzbyB1c2UgbWF4LXdpZHRoIGluc3RlYWQKICAgICAgICAgICAgLmNzcygibWF4V2lkdGgiLCBlbC5vZmZzZXRXaWR0aCkKICAgICAgICAgICAgLmNzcygiaGVpZ2h0IiwgZWwub2Zmc2V0SGVpZ2h0KTsKICAgICAgICAgIGVycm9yRGl2LnRleHQoZXJyLm1lc3NhZ2UpOwogICAgICAgICAgJGVsLmFmdGVyKGVycm9yRGl2KTsKCiAgICAgICAgICAvLyBSZWFsbHkgZHVtYiB3YXkgdG8ga2VlcCB0aGUgc2l6ZS9wb3NpdGlvbiBvZiB0aGUgZXJyb3IgaW4gc3luYyB3aXRoCiAgICAgICAgICAvLyB0aGUgcGFyZW50IGVsZW1lbnQgYXMgdGhlIHdpbmRvdyBpcyByZXNpemVkIG9yIHdoYXRldmVyLgogICAgICAgICAgdmFyIGludElkID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICghZXJyb3JEaXZbMF0ucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoaW50SWQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvckRpdgogICAgICAgICAgICAgIC5jc3MoInRvcCIsIGVsLm9mZnNldFRvcCkKICAgICAgICAgICAgICAuY3NzKCJsZWZ0IiwgZWwub2Zmc2V0TGVmdCkKICAgICAgICAgICAgICAuY3NzKCJtYXhXaWR0aCIsIGVsLm9mZnNldFdpZHRoKQogICAgICAgICAgICAgIC5jc3MoImhlaWdodCIsIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgIGNsZWFyRXJyb3I6IGZ1bmN0aW9uKGVsKSB7CiAgICAgIHZhciAkZWwgPSAkKGVsKTsKICAgICAgdmFyIGRpc3BsYXkgPSAkZWwuZGF0YSgicmVzdG9yZS1kaXNwbGF5LW1vZGUiKTsKICAgICAgJGVsLmRhdGEoInJlc3RvcmUtZGlzcGxheS1tb2RlIiwgbnVsbCk7CgogICAgICBpZiAoZGlzcGxheSA9PT0gImlubGluZSIgfHwgZGlzcGxheSA9PT0gImlubGluZS1ibG9jayIpIHsKICAgICAgICBpZiAoZGlzcGxheSkKICAgICAgICAgICRlbC5jc3MoImRpc3BsYXkiLCBkaXNwbGF5KTsKICAgICAgICAkKGVsLm5leHRTaWJsaW5nKS5maWx0ZXIoIi5odG1sd2lkZ2V0cy1lcnJvciIpLnJlbW92ZSgpOwogICAgICB9IGVsc2UgaWYgKGRpc3BsYXkgPT09ICJibG9jayIpewogICAgICAgICRlbC5jc3MoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICQoZWwubmV4dFNpYmxpbmcpLmZpbHRlcigiLmh0bWx3aWRnZXRzLWVycm9yIikucmVtb3ZlKCk7CiAgICAgIH0KICAgIH0sCiAgICBzaXppbmc6IHt9CiAgfTsKCiAgLy8gQ2FsbGVkIGJ5IHdpZGdldCBiaW5kaW5ncyB0byByZWdpc3RlciBhIG5ldyB0eXBlIG9mIHdpZGdldC4gVGhlIGRlZmluaXRpb24KICAvLyBvYmplY3QgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogIC8vIC0gbmFtZSAocmVxdWlyZWQpIC0gQSBzdHJpbmcgaW5kaWNhdGluZyB0aGUgYmluZGluZyBuYW1lLCB3aGljaCB3aWxsIGJlCiAgLy8gICB1c2VkIGJ5IGRlZmF1bHQgYXMgdGhlIENTUyBjbGFzc25hbWUgdG8gbG9vayBmb3IuCiAgLy8gLSBpbml0aWFsaXplIChvcHRpb25hbCkgLSBBIGZ1bmN0aW9uKGVsKSB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uY2UgcGVyCiAgLy8gICB3aWRnZXQgZWxlbWVudDsgaWYgYSB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHRoaXJkCiAgLy8gICB2YWx1ZSB0byByZW5kZXJWYWx1ZS4KICAvLyAtIHJlbmRlclZhbHVlIChyZXF1aXJlZCkgLSBBIGZ1bmN0aW9uKGVsLCBkYXRhLCBpbml0VmFsdWUpIHRoYXQgd2lsbCBiZQogIC8vICAgY2FsbGVkIHdpdGggZGF0YS4gU3RhdGljIGNvbnRleHRzIHdpbGwgY2F1c2UgdGhpcyB0byBiZSBjYWxsZWQgb25jZSBwZXIKICAvLyAgIGVsZW1lbnQ7IFNoaW55IGFwcHMgd2lsbCBjYXVzZSB0aGlzIHRvIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyBwZXIKICAvLyAgIGVsZW1lbnQsIGFzIHRoZSBkYXRhIGNoYW5nZXMuCiAgd2luZG93LkhUTUxXaWRnZXRzLndpZGdldCA9IGZ1bmN0aW9uKGRlZmluaXRpb24pIHsKICAgIGlmICghZGVmaW5pdGlvbi5uYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIG5hbWUiKTsKICAgIH0KICAgIGlmICghZGVmaW5pdGlvbi50eXBlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHR5cGUiKTsKICAgIH0KICAgIC8vIEN1cnJlbnRseSB3ZSBvbmx5IHN1cHBvcnQgb3V0cHV0IHdpZGdldHMKICAgIGlmIChkZWZpbml0aW9uLnR5cGUgIT09ICJvdXRwdXQiKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiVW5yZWNvZ25pemVkIHdpZGdldCB0eXBlICciICsgZGVmaW5pdGlvbi50eXBlICsgIiciKTsKICAgIH0KICAgIC8vIFRPRE86IFZlcmlmeSB0aGF0IC5uYW1lIGlzIGEgdmFsaWQgQ1NTIGNsYXNzbmFtZQoKICAgIC8vIFN1cHBvcnQgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb25zLiBPbGQtc3R5bGUgY2xhc3MtYm91bmQKICAgIC8vIGRlZmluaXRpb25zIGhhdmUgb25lIHdpZGdldCAib2JqZWN0IiBwZXIgd2lkZ2V0IHBlciB0eXBlL2NsYXNzIG9mCiAgICAvLyB3aWRnZXQ7IHRoZSByZW5kZXJWYWx1ZSBhbmQgcmVzaXplIG1ldGhvZHMgb24gc3VjaCB3aWRnZXQgb2JqZWN0cwogICAgLy8gdGFrZSBlbCBhbmQgaW5zdGFuY2UgYXJndW1lbnRzLCBiZWNhdXNlIHRoZSB3aWRnZXQgb2JqZWN0IGNhbid0CiAgICAvLyBzdG9yZSB0aGVtLiBOZXctc3R5bGUgaW5zdGFuY2UtYm91bmQgZGVmaW5pdGlvbnMgaGF2ZSBvbmUgd2lkZ2V0CiAgICAvLyBvYmplY3QgcGVyIHdpZGdldCBpbnN0YW5jZTsgdGhlIGRlZmluaXRpb24gdGhhdCdzIHBhc3NlZCBpbiBkb2Vzbid0CiAgICAvLyBwcm92aWRlIHJlbmRlclZhbHVlIG9yIHJlc2l6ZSBtZXRob2RzIGF0IGFsbCwganVzdCB0aGUgc2luZ2xlIG1ldGhvZAogICAgLy8gICBmYWN0b3J5KGVsLCB3aWR0aCwgaGVpZ2h0KQogICAgLy8gd2hpY2ggcmV0dXJucyBhbiBvYmplY3QgdGhhdCBoYXMgcmVuZGVyVmFsdWUoeCkgYW5kIHJlc2l6ZSh3LCBoKS4KICAgIC8vIFRoaXMgZW5hYmxlcyBhIGZhciBtb3JlIG5hdHVyYWwgcHJvZ3JhbW1pbmcgc3R5bGUgZm9yIHRoZSB3aWRnZXQKICAgIC8vIGF1dGhvciwgd2hvIGNhbiBzdG9yZSBwZXItaW5zdGFuY2Ugc3RhdGUgdXNpbmcgZWl0aGVyIE9PLXN0eWxlCiAgICAvLyBpbnN0YW5jZSBmaWVsZHMgb3IgZnVuY3Rpb25hbC1zdHlsZSBjbG9zdXJlIHZhcmlhYmxlcyAoSSBndWVzcyB0aGlzCiAgICAvLyBpcyBpbiBjb250cmFzdCB0byB3aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBDLXN0eWxlIHBzZXVkby1PTyB3aGljaCBpcwogICAgLy8gd2hhdCB3ZSByZXF1aXJlZCBiZWZvcmUpLgogICAgaWYgKGRlZmluaXRpb24uZmFjdG9yeSkgewogICAgICBkZWZpbml0aW9uID0gY3JlYXRlTGVnYWN5RGVmaW5pdGlvbkFkYXB0ZXIoZGVmaW5pdGlvbik7CiAgICB9CgogICAgaWYgKCFkZWZpbml0aW9uLnJlbmRlclZhbHVlKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigiV2lkZ2V0IG11c3QgaGF2ZSBhIHJlbmRlclZhbHVlIGZ1bmN0aW9uIik7CiAgICB9CgogICAgLy8gRm9yIHN0YXRpYyByZW5kZXJpbmcgKG5vbi1TaGlueSksIHVzZSBhIHNpbXBsZSB3aWRnZXQgcmVnaXN0cmF0aW9uCiAgICAvLyBzY2hlbWUuIFdlIGFsc28gdXNlIHRoaXMgc2NoZW1lIGZvciBTaGlueSBhcHBzL2RvY3VtZW50cyB0aGF0IGFsc28KICAgIC8vIGNvbnRhaW4gc3RhdGljIHdpZGdldHMuCiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cyA9IHdpbmRvdy5IVE1MV2lkZ2V0cy53aWRnZXRzIHx8IFtdOwogICAgLy8gTWVyZ2UgZGVmYXVsdHMgaW50byB0aGUgZGVmaW5pdGlvbjsgZG9uJ3QgbXV0YXRlIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uLgogICAgdmFyIHN0YXRpY0JpbmRpbmcgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKICAgIG92ZXJyaWRlTWV0aG9kKHN0YXRpY0JpbmRpbmcsICJmaW5kIiwgZnVuY3Rpb24oc3VwZXJmdW5jKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzY29wZSkgewogICAgICAgIHZhciByZXN1bHRzID0gc3VwZXJmdW5jKHNjb3BlKTsKICAgICAgICAvLyBGaWx0ZXIgb3V0IFNoaW55IG91dHB1dHMsIHdlIG9ubHkgd2FudCB0aGUgc3RhdGljIGtpbmQKICAgICAgICByZXR1cm4gZmlsdGVyQnlDbGFzcyhyZXN1bHRzLCAiaHRtbC13aWRnZXQtb3V0cHV0IiwgZmFsc2UpOwogICAgICB9OwogICAgfSk7CiAgICB3aW5kb3cuSFRNTFdpZGdldHMud2lkZ2V0cy5wdXNoKHN0YXRpY0JpbmRpbmcpOwoKICAgIGlmIChzaGlueU1vZGUpIHsKICAgICAgLy8gU2hpbnkgaXMgcnVubmluZy4gUmVnaXN0ZXIgdGhlIGRlZmluaXRpb24gd2l0aCBhbiBvdXRwdXQgYmluZGluZy4KICAgICAgLy8gVGhlIGRlZmluaXRpb24gaXRzZWxmIHdpbGwgbm90IGJlIHRoZSBvdXRwdXQgYmluZGluZywgaW5zdGVhZAogICAgICAvLyB3ZSB3aWxsIG1ha2UgYW4gb3V0cHV0IGJpbmRpbmcgb2JqZWN0IHRoYXQgZGVsZWdhdGVzIHRvIHRoZQogICAgICAvLyBkZWZpbml0aW9uLiBUaGlzIGlzIGJlY2F1c2Ugd2UgZm9vbGlzaGx5IHVzZWQgdGhlIHNhbWUgbWV0aG9kCiAgICAgIC8vIG5hbWUgKHJlbmRlclZhbHVlKSBmb3IgaHRtbHdpZGdldHMgZGVmaW5pdGlvbiBhbmQgU2hpbnkgYmluZGluZ3MKICAgICAgLy8gYnV0IHRoZXkgYWN0dWFsbHkgaGF2ZSBxdWl0ZSBkaWZmZXJlbnQgc2VtYW50aWNzICh0aGUgU2hpbnkKICAgICAgLy8gYmluZGluZ3MgcmVjZWl2ZSBkYXRhIHRoYXQgaW5jbHVkZXMgbG90cyBvZiBtZXRhZGF0YSB0aGF0IGl0CiAgICAgIC8vIHN0cmlwcyBvZmYgYmVmb3JlIGNhbGxpbmcgaHRtbHdpZGdldHMgcmVuZGVyVmFsdWUpLiBXZSBjYW4ndAogICAgICAvLyBqdXN0IGlnbm9yZSB0aGUgZGlmZmVyZW5jZSBiZWNhdXNlIGluIHNvbWUgd2lkZ2V0cyBpdCdzIGhlbHBmdWwKICAgICAgLy8gdG8gY2FsbCB0aGlzLnJlbmRlclZhbHVlKCkgZnJvbSBpbnNpZGUgb2YgcmVzaXplKCksIGFuZCBpZgogICAgICAvLyB3ZSdyZSBub3QgZGVsZWdhdGluZywgdGhlbiB0aGF0IGNhbGwgd2lsbCBnbyB0byB0aGUgU2hpbnkKICAgICAgLy8gdmVyc2lvbiBpbnN0ZWFkIG9mIHRoZSBodG1sd2lkZ2V0cyB2ZXJzaW9uLgoKICAgICAgLy8gTWVyZ2UgZGVmYXVsdHMgd2l0aCBkZWZpbml0aW9uLCB3aXRob3V0IG11dGF0aW5nIGVpdGhlci4KICAgICAgdmFyIGJpbmRpbmdEZWYgPSBleHRlbmQoe30sIGRlZmF1bHRzLCBkZWZpbml0aW9uKTsKCiAgICAgIC8vIFRoaXMgb2JqZWN0IHdpbGwgYmUgb3VyIGFjdHVhbCBTaGlueSBiaW5kaW5nLgogICAgICB2YXIgc2hpbnlCaW5kaW5nID0gbmV3IFNoaW55Lk91dHB1dEJpbmRpbmcoKTsKCiAgICAgIC8vIFdpdGggYSBmZXcgZXhjZXB0aW9ucywgd2UnbGwgd2FudCB0byBzaW1wbHkgdXNlIHRoZSBiaW5kaW5nRGVmJ3MKICAgICAgLy8gdmVyc2lvbiBvZiBtZXRob2RzIGlmIHRoZXkgYXJlIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIGZhbGwgYmFjayB0bwogICAgICAvLyBTaGlueSdzIGRlZmF1bHRzLiBOT1RFOiBJZiBTaGlueSdzIG91dHB1dCBiaW5kaW5ncyBnYWluIGFkZGl0aW9uYWwKICAgICAgLy8gbWV0aG9kcyBpbiB0aGUgZnV0dXJlLCBhbmQgd2Ugd2FudCB0aGVtIHRvIGJlIG92ZXJyaWRlYWJsZSBieQogICAgICAvLyBIVE1MV2lkZ2V0IGJpbmRpbmcgZGVmaW5pdGlvbnMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgdGhlbSB0byB0aGlzCiAgICAgIC8vIGxpc3QuCiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImdldElkIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgIm9uVmFsdWVDaGFuZ2UiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAib25WYWx1ZUVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgInJlbmRlckVycm9yIik7CiAgICAgIGRlbGVnYXRlTWV0aG9kKHNoaW55QmluZGluZywgYmluZGluZ0RlZiwgImNsZWFyRXJyb3IiKTsKICAgICAgZGVsZWdhdGVNZXRob2Qoc2hpbnlCaW5kaW5nLCBiaW5kaW5nRGVmLCAic2hvd1Byb2dyZXNzIik7CgogICAgICAvLyBUaGUgZmluZCwgcmVuZGVyVmFsdWUsIGFuZCByZXNpemUgYXJlIGhhbmRsZWQgZGlmZmVyZW50bHksIGJlY2F1c2Ugd2UKICAgICAgLy8gd2FudCB0byBhY3R1YWxseSBkZWNvcmF0ZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGJpbmRpbmdEZWYgbWV0aG9kcy4KCiAgICAgIHNoaW55QmluZGluZy5maW5kID0gZnVuY3Rpb24oc2NvcGUpIHsKICAgICAgICB2YXIgcmVzdWx0cyA9IGJpbmRpbmdEZWYuZmluZChzY29wZSk7CgogICAgICAgIC8vIE9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgYXJlIFNoaW55IG91dHB1dHMsIG5vdCBzdGF0aWMgb25lcwogICAgICAgIHZhciBkeW5hbWljUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKCIuaHRtbC13aWRnZXQtb3V0cHV0Iik7CgogICAgICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCB3aGF0ZXZlciBjYXVzZWQgU2hpbnkgdG8gdGhpbmsgdGhlcmUgbWlnaHQgYmUKICAgICAgICAvLyBuZXcgZHluYW1pYyBvdXRwdXRzLCBhbHNvIGNhdXNlZCB0aGVyZSB0byBiZSBuZXcgc3RhdGljIG91dHB1dHMuCiAgICAgICAgLy8gU2luY2UgdGhlcmUgbWlnaHQgYmUgbG90cyBvZiBkaWZmZXJlbnQgaHRtbHdpZGdldHMgYmluZGluZ3MsIHdlCiAgICAgICAgLy8gc2NoZWR1bGUgZXhlY3V0aW9uIGZvciBsYXRlci0tbm8gbmVlZCB0byBzdGF0aWNSZW5kZXIgbXVsdGlwbGUKICAgICAgICAvLyB0aW1lcy4KICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggIT09IGR5bmFtaWNSZXN1bHRzLmxlbmd0aCkKICAgICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyKCk7CgogICAgICAgIHJldHVybiBkeW5hbWljUmVzdWx0czsKICAgICAgfTsKCiAgICAgIC8vIFdyYXAgcmVuZGVyVmFsdWUgdG8gaGFuZGxlIGluaXRpYWxpemF0aW9uLCB3aGljaCB1bmZvcnR1bmF0ZWx5IGlzbid0CiAgICAgIC8vIHN1cHBvcnRlZCBuYXRpdmVseSBieSBTaGlueSBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgogICAgICBzaGlueUJpbmRpbmcucmVuZGVyVmFsdWUgPSBmdW5jdGlvbihlbCwgZGF0YSkgewogICAgICAgIC8vIFJlc29sdmUgc3RyaW5ncyBtYXJrZWQgYXMgamF2YXNjcmlwdCBsaXRlcmFscyB0byBvYmplY3RzCiAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgZGF0YS5ldmFscyAmJiBpIDwgZGF0YS5ldmFscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLmV2YWx1YXRlU3RyaW5nTWVtYmVyKGRhdGEueCwgZGF0YS5ldmFsc1tpXSk7CiAgICAgICAgfQogICAgICAgIGlmICghYmluZGluZ0RlZi5yZW5kZXJPbk51bGxWYWx1ZSkgewogICAgICAgICAgaWYgKGRhdGEueCA9PT0gbnVsbCkgewogICAgICAgICAgICBlbC5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiI7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnN0eWxlLnZpc2liaWxpdHkgPSAiaW5oZXJpdCI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghZWxlbWVudERhdGEoZWwsICJpbml0aWFsaXplZCIpKSB7CiAgICAgICAgICBpbml0U2l6aW5nKGVsKTsKCiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRpYWxpemVkIiwgdHJ1ZSk7CiAgICAgICAgICBpZiAoYmluZGluZ0RlZi5pbml0aWFsaXplKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBiaW5kaW5nRGVmLmluaXRpYWxpemUoZWwsIGVsLm9mZnNldFdpZHRoLAogICAgICAgICAgICAgIGVsLm9mZnNldEhlaWdodCk7CiAgICAgICAgICAgIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiLCByZXN1bHQpOwogICAgICAgICAgfQogICAgICAgICAgZXZhbEFuZFJ1bihkYXRhLmpzSG9va3MucmVuZGVyLCBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiksIFtlbCwgZGF0YS54XSk7CiAgICAgICAgfQogICAgICAgIFNoaW55LnJlbmRlckRlcGVuZGVuY2llcyhkYXRhLmRlcHMpOwogICAgICAgIGJpbmRpbmdEZWYucmVuZGVyVmFsdWUoZWwsIGRhdGEueCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgfTsKCiAgICAgIC8vIE9ubHkgb3ZlcnJpZGUgcmVzaXplIGlmIGJpbmRpbmdEZWYgaW1wbGVtZW50cyBpdAogICAgICBpZiAoYmluZGluZ0RlZi5yZXNpemUpIHsKICAgICAgICBzaGlueUJpbmRpbmcucmVzaXplID0gZnVuY3Rpb24oZWwsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgIC8vIFNoaW55IGNhbiBjYWxsIHJlc2l6ZSBiZWZvcmUgaW5pdGlhbGl6ZS9yZW5kZXJWYWx1ZSBoYXZlIGJlZW4KICAgICAgICAgIC8vIGNhbGxlZCwgd2hpY2ggZG9lc24ndCBtYWtlIHNlbnNlIGZvciB3aWRnZXRzLgogICAgICAgICAgaWYgKGVsZW1lbnREYXRhKGVsLCAiaW5pdGlhbGl6ZWQiKSkgewogICAgICAgICAgICBiaW5kaW5nRGVmLnJlc2l6ZShlbCwgd2lkdGgsIGhlaWdodCwgZWxlbWVudERhdGEoZWwsICJpbml0X3Jlc3VsdCIpKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBTaGlueS5vdXRwdXRCaW5kaW5ncy5yZWdpc3RlcihzaGlueUJpbmRpbmcsIGJpbmRpbmdEZWYubmFtZSk7CiAgICB9CiAgfTsKCiAgdmFyIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgZnVuY3Rpb24gc2NoZWR1bGVTdGF0aWNSZW5kZXIoKSB7CiAgICBpZiAoIXNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCkgewogICAgICBzY2hlZHVsZVN0YXRpY1JlbmRlclRpbWVySWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlU3RhdGljUmVuZGVyVGltZXJJZCA9IG51bGw7CiAgICAgICAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlcigpOwogICAgICB9LCAxKTsKICAgIH0KICB9CgogIC8vIFJlbmRlciBzdGF0aWMgd2lkZ2V0cyBhZnRlciB0aGUgZG9jdW1lbnQgZmluaXNoZXMgbG9hZGluZwogIC8vIFN0YXRpY2FsbHkgcmVuZGVyIGFsbCBlbGVtZW50cyB0aGF0IGFyZSBvZiB0aGlzIHdpZGdldCdzIGNsYXNzCiAgd2luZG93LkhUTUxXaWRnZXRzLnN0YXRpY1JlbmRlciA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGJpbmRpbmdzID0gd2luZG93LkhUTUxXaWRnZXRzLndpZGdldHMgfHwgW107CiAgICBmb3JFYWNoKGJpbmRpbmdzLCBmdW5jdGlvbihiaW5kaW5nKSB7CiAgICAgIHZhciBtYXRjaGVzID0gYmluZGluZy5maW5kKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCk7CiAgICAgIGZvckVhY2gobWF0Y2hlcywgZnVuY3Rpb24oZWwpIHsKICAgICAgICB2YXIgc2l6ZU9iaiA9IGluaXRTaXppbmcoZWwsIGJpbmRpbmcpOwoKICAgICAgICBpZiAoaGFzQ2xhc3MoZWwsICJodG1sLXdpZGdldC1zdGF0aWMtYm91bmQiKSkKICAgICAgICAgIHJldHVybjsKICAgICAgICBlbC5jbGFzc05hbWUgPSBlbC5jbGFzc05hbWUgKyAiIGh0bWwtd2lkZ2V0LXN0YXRpYy1ib3VuZCI7CgogICAgICAgIHZhciBpbml0UmVzdWx0OwogICAgICAgIGlmIChiaW5kaW5nLmluaXRpYWxpemUpIHsKICAgICAgICAgIGluaXRSZXN1bHQgPSBiaW5kaW5nLmluaXRpYWxpemUoZWwsCiAgICAgICAgICAgIHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgc2l6ZU9iaiA/IHNpemVPYmouZ2V0SGVpZ2h0KCkgOiBlbC5vZmZzZXRIZWlnaHQKICAgICAgICAgICk7CiAgICAgICAgICBlbGVtZW50RGF0YShlbCwgImluaXRfcmVzdWx0IiwgaW5pdFJlc3VsdCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYmluZGluZy5yZXNpemUpIHsKICAgICAgICAgIHZhciBsYXN0U2l6ZSA9IHt9OwogICAgICAgICAgdmFyIHJlc2l6ZUhhbmRsZXIgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBzaXplID0gewogICAgICAgICAgICAgIHc6IHNpemVPYmogPyBzaXplT2JqLmdldFdpZHRoKCkgOiBlbC5vZmZzZXRXaWR0aCwKICAgICAgICAgICAgICBoOiBzaXplT2JqID8gc2l6ZU9iai5nZXRIZWlnaHQoKSA6IGVsLm9mZnNldEhlaWdodAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2l6ZS53ID09PSAwICYmIHNpemUuaCA9PT0gMCkKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGlmIChzaXplLncgPT09IGxhc3RTaXplLncgJiYgc2l6ZS5oID09PSBsYXN0U2l6ZS5oKQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgbGFzdFNpemUgPSBzaXplOwogICAgICAgICAgICBiaW5kaW5nLnJlc2l6ZShlbCwgc2l6ZS53LCBzaXplLmgsIGluaXRSZXN1bHQpOwogICAgICAgICAgfTsKCiAgICAgICAgICBvbih3aW5kb3csICJyZXNpemUiLCByZXNpemVIYW5kbGVyKTsKCiAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgY2FzZXMgd2hlcmUgd2UncmUgcnVubmluZyBpbiBhIFNoaW55CiAgICAgICAgICAvLyBhcHAsIGJ1dCB0aGUgd2lkZ2V0IGl0c2VsZiBpcyBub3QgYSBTaGlueSBvdXRwdXQsIGJ1dAogICAgICAgICAgLy8gcmF0aGVyIGEgc2ltcGxlIHN0YXRpYyB3aWRnZXQuIE9uZSBleGFtcGxlIG9mIHRoaXMgaXMKICAgICAgICAgIC8vIGFuIHJtYXJrZG93biBkb2N1bWVudCB0aGF0IGhhcyBydW50aW1lOnNoaW55IGFuZCB3aWRnZXQKICAgICAgICAgIC8vIHRoYXQgaXNuJ3QgaW4gYSByZW5kZXIgZnVuY3Rpb24uIFNoaW55IG9ubHkga25vd3MgdG8KICAgICAgICAgIC8vIGNhbGwgcmVzaXplIGhhbmRsZXJzIGZvciBTaGlueSBvdXRwdXRzLCBub3QgZm9yIHN0YXRpYwogICAgICAgICAgLy8gd2lkZ2V0cywgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgogICAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkpIHsKICAgICAgICAgICAgd2luZG93LmpRdWVyeShkb2N1bWVudCkub24oCiAgICAgICAgICAgICAgInNob3duLmh0bWx3aWRnZXRzIHNob3duLmJzLnRhYi5odG1sd2lkZ2V0cyBzaG93bi5icy5jb2xsYXBzZS5odG1sd2lkZ2V0cyIsCiAgICAgICAgICAgICAgcmVzaXplSGFuZGxlcgogICAgICAgICAgICApOwogICAgICAgICAgICB3aW5kb3cualF1ZXJ5KGRvY3VtZW50KS5vbigKICAgICAgICAgICAgICAiaGlkZGVuLmh0bWx3aWRnZXRzIGhpZGRlbi5icy50YWIuaHRtbHdpZGdldHMgaGlkZGVuLmJzLmNvbGxhcHNlLmh0bWx3aWRnZXRzIiwKICAgICAgICAgICAgICByZXNpemVIYW5kbGVyCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWZpYyBjYXNlIG9mIGlvc2xpZGVzLCB3aGljaAogICAgICAgICAgLy8gZmxpcHMgc2xpZGVzIGJldHdlZW4gZGlzcGxheTpub25lIGFuZCBkaXNwbGF5OmJsb2NrLgogICAgICAgICAgLy8gSWRlYWxseSB3ZSB3b3VsZCBub3QgaGF2ZSB0byBoYXZlIGlvc2xpZGUtc3BlY2lmaWMgY29kZQogICAgICAgICAgLy8gaGVyZSwgYnV0IHJhdGhlciBoYXZlIGlvc2xpZGVzIHJhaXNlIGEgZ2VuZXJpYyBldmVudCwKICAgICAgICAgIC8vIGJ1dCB0aGUgcm1hcmtkb3duIHBhY2thZ2UganVzdCB3ZW50IHRvIENSQU4gc28gdGhlCiAgICAgICAgICAvLyB3aW5kb3cgdG8gZ2V0dGluZyB0aGF0IGZpeGVkIG1heSBiZSBsb25nLgogICAgICAgICAgaWYgKHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKSB7CiAgICAgICAgICAgIC8vIEl0J3MgT0sgdG8gbGltaXQgdGhpcyB0byB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBicm93c2VycyBiZWNhdXNlIGlvc2xpZGVzIGl0c2VsZiBvbmx5IHN1cHBvcnRzCiAgICAgICAgICAgIC8vIHN1Y2ggYnJvd3NlcnMuCiAgICAgICAgICAgIG9uKGRvY3VtZW50LCAic2xpZGVlbnRlciIsIHJlc2l6ZUhhbmRsZXIpOwogICAgICAgICAgICBvbihkb2N1bWVudCwgInNsaWRlbGVhdmUiLCByZXNpemVIYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzY3JpcHREYXRhID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcigic2NyaXB0W2RhdGEtZm9yPSciICsgZWwuaWQgKyAiJ11bdHlwZT0nYXBwbGljYXRpb24vanNvbiddIik7CiAgICAgICAgaWYgKHNjcmlwdERhdGEpIHsKICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShzY3JpcHREYXRhLnRleHRDb250ZW50IHx8IHNjcmlwdERhdGEudGV4dCk7CiAgICAgICAgICAvLyBSZXNvbHZlIHN0cmluZ3MgbWFya2VkIGFzIGphdmFzY3JpcHQgbGl0ZXJhbHMgdG8gb2JqZWN0cwogICAgICAgICAgaWYgKCEoZGF0YS5ldmFscyBpbnN0YW5jZW9mIEFycmF5KSkgZGF0YS5ldmFscyA9IFtkYXRhLmV2YWxzXTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBkYXRhLmV2YWxzICYmIGsgPCBkYXRhLmV2YWxzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgIHdpbmRvdy5IVE1MV2lkZ2V0cy5ldmFsdWF0ZVN0cmluZ01lbWJlcihkYXRhLngsIGRhdGEuZXZhbHNba10pOwogICAgICAgICAgfQogICAgICAgICAgYmluZGluZy5yZW5kZXJWYWx1ZShlbCwgZGF0YS54LCBpbml0UmVzdWx0KTsKICAgICAgICAgIGV2YWxBbmRSdW4oZGF0YS5qc0hvb2tzLnJlbmRlciwgaW5pdFJlc3VsdCwgW2VsLCBkYXRhLnhdKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CgogICAgaW52b2tlUG9zdFJlbmRlckhhbmRsZXJzKCk7CiAgfQoKICAvLyBXYWl0IHVudGlsIGFmdGVyIHRoZSBkb2N1bWVudCBoYXMgbG9hZGVkIHRvIHJlbmRlciB0aGUgd2lkZ2V0cy4KICBpZiAoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcikgewogICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsIGZ1bmN0aW9uKCkgewogICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIiwgYXJndW1lbnRzLmNhbGxlZSwgZmFsc2UpOwogICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICB9LCBmYWxzZSk7CiAgfSBlbHNlIGlmIChkb2N1bWVudC5hdHRhY2hFdmVudCkgewogICAgZG9jdW1lbnQuYXR0YWNoRXZlbnQoIm9ucmVhZHlzdGF0ZWNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gImNvbXBsZXRlIikgewogICAgICAgIGRvY3VtZW50LmRldGFjaEV2ZW50KCJvbnJlYWR5c3RhdGVjaGFuZ2UiLCBhcmd1bWVudHMuY2FsbGVlKTsKICAgICAgICB3aW5kb3cuSFRNTFdpZGdldHMuc3RhdGljUmVuZGVyKCk7CiAgICAgIH0KICAgIH0pOwogIH0KCgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRBdHRhY2htZW50VXJsID0gZnVuY3Rpb24oZGVwbmFtZSwga2V5KSB7CiAgICAvLyBJZiBubyBrZXksIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGl0ZW0KICAgIGlmICh0eXBlb2Yoa2V5KSA9PT0gInVuZGVmaW5lZCIpCiAgICAgIGtleSA9IDE7CgogICAgdmFyIGxpbmsgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChkZXBuYW1lICsgIi0iICsga2V5ICsgIi1hdHRhY2htZW50Iik7CiAgICBpZiAoIWxpbmspIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCJBdHRhY2htZW50ICIgKyBkZXBuYW1lICsgIi8iICsga2V5ICsgIiBub3QgZm91bmQgaW4gZG9jdW1lbnQiKTsKICAgIH0KICAgIHJldHVybiBsaW5rLmdldEF0dHJpYnV0ZSgiaHJlZiIpOwogIH07CgogIHdpbmRvdy5IVE1MV2lkZ2V0cy5kYXRhZnJhbWVUb0QzID0gZnVuY3Rpb24oZGYpIHsKICAgIHZhciBuYW1lcyA9IFtdOwogICAgdmFyIGxlbmd0aDsKICAgIGZvciAodmFyIG5hbWUgaW4gZGYpIHsKICAgICAgICBpZiAoZGYuaGFzT3duUHJvcGVydHkobmFtZSkpCiAgICAgICAgICAgIG5hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgaWYgKHR5cGVvZihkZltuYW1lXSkgIT09ICJvYmplY3QiIHx8IHR5cGVvZihkZltuYW1lXS5sZW5ndGgpID09PSAidW5kZWZpbmVkIikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMiKTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZihsZW5ndGgpICE9PSAidW5kZWZpbmVkIiAmJiBsZW5ndGggIT09IGRmW25hbWVdLmxlbmd0aCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFsbCBmaWVsZHMgbXVzdCBiZSBhcnJheXMgb2YgdGhlIHNhbWUgbGVuZ3RoIik7CiAgICAgICAgfQogICAgICAgIGxlbmd0aCA9IGRmW25hbWVdLmxlbmd0aDsKICAgIH0KICAgIHZhciByZXN1bHRzID0gW107CiAgICB2YXIgaXRlbTsKICAgIGZvciAodmFyIHJvdyA9IDA7IHJvdyA8IGxlbmd0aDsgcm93KyspIHsKICAgICAgICBpdGVtID0ge307CiAgICAgICAgZm9yICh2YXIgY29sID0gMDsgY29sIDwgbmFtZXMubGVuZ3RoOyBjb2wrKykgewogICAgICAgICAgICBpdGVtW25hbWVzW2NvbF1dID0gZGZbbmFtZXNbY29sXV1bcm93XTsKICAgICAgICB9CiAgICAgICAgcmVzdWx0cy5wdXNoKGl0ZW0pOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfTsKCiAgd2luZG93LkhUTUxXaWRnZXRzLnRyYW5zcG9zZUFycmF5MkQgPSBmdW5jdGlvbihhcnJheSkgewogICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSByZXR1cm4gYXJyYXk7CiAgICAgIHZhciBuZXdBcnJheSA9IGFycmF5WzBdLm1hcChmdW5jdGlvbihjb2wsIGkpIHsKICAgICAgICAgIHJldHVybiBhcnJheS5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJvd1tpXQogICAgICAgICAgfSkKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBcnJheTsKICB9OwogIC8vIFNwbGl0IHZhbHVlIGF0IHNwbGl0Q2hhciwgYnV0IGFsbG93IHNwbGl0Q2hhciB0byBiZSBlc2NhcGVkCiAgLy8gdXNpbmcgZXNjYXBlQ2hhci4gQW55IG90aGVyIGNoYXJhY3RlcnMgZXNjYXBlZCBieSBlc2NhcGVDaGFyCiAgLy8gd2lsbCBiZSBpbmNsdWRlZCBhcyB1c3VhbCAoaW5jbHVkaW5nIGVzY2FwZUNoYXIgaXRzZWxmKS4KICBmdW5jdGlvbiBzcGxpdFdpdGhFc2NhcGUodmFsdWUsIHNwbGl0Q2hhciwgZXNjYXBlQ2hhcikgewogICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgIHZhciBlc2NhcGVNb2RlID0gZmFsc2U7CiAgICB2YXIgY3VycmVudFJlc3VsdCA9ICIiOwogICAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgdmFsdWUubGVuZ3RoOyBwb3MrKykgewogICAgICBpZiAoIWVzY2FwZU1vZGUpIHsKICAgICAgICBpZiAodmFsdWVbcG9zXSA9PT0gc3BsaXRDaGFyKSB7CiAgICAgICAgICByZXN1bHRzLnB1c2goY3VycmVudFJlc3VsdCk7CiAgICAgICAgICBjdXJyZW50UmVzdWx0ID0gIiI7CiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZVtwb3NdID09PSBlc2NhcGVDaGFyKSB7CiAgICAgICAgICBlc2NhcGVNb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VycmVudFJlc3VsdCArPSB2YWx1ZVtwb3NdOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBjdXJyZW50UmVzdWx0ICs9IHZhbHVlW3Bvc107CiAgICAgICAgZXNjYXBlTW9kZSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgICBpZiAoY3VycmVudFJlc3VsdCAhPT0gIiIpIHsKICAgICAgcmVzdWx0cy5wdXNoKGN1cnJlbnRSZXN1bHQpOwogICAgfQogICAgcmV0dXJuIHJlc3VsdHM7CiAgfQogIC8vIEZ1bmN0aW9uIGF1dGhvcmVkIGJ5IFlpaHVpL0pKIEFsbGFpcmUKICB3aW5kb3cuSFRNTFdpZGdldHMuZXZhbHVhdGVTdHJpbmdNZW1iZXIgPSBmdW5jdGlvbihvLCBtZW1iZXIpIHsKICAgIHZhciBwYXJ0cyA9IHNwbGl0V2l0aEVzY2FwZShtZW1iZXIsICcuJywgJ1xcJyk7CiAgICBmb3IgKHZhciBpID0gMCwgbCA9IHBhcnRzLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICB2YXIgcGFydCA9IHBhcnRzW2ldOwogICAgICAvLyBwYXJ0IG1heSBiZSBhIGNoYXJhY3RlciBvciAnbnVtZXJpYycgbWVtYmVyIG5hbWUKICAgICAgaWYgKG8gIT09IG51bGwgJiYgdHlwZW9mIG8gPT09ICJvYmplY3QiICYmIHBhcnQgaW4gbykgewogICAgICAgIGlmIChpID09IChsIC0gMSkpIHsgLy8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUgdGhlbiBldmFsdWxhdGUKICAgICAgICAgIGlmICh0eXBlb2Ygb1twYXJ0XSA9PT0gInN0cmluZyIpCiAgICAgICAgICAgIG9bcGFydF0gPSBldmFsKCIoIiArIG9bcGFydF0gKyAiKSIpOwogICAgICAgIH0gZWxzZSB7IC8vIG90aGVyd2lzZSBjb250aW51ZSB0byBuZXh0IGVtYmVkZGVkIG9iamVjdAogICAgICAgICAgbyA9IG9bcGFydF07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgLy8gUmV0cmlldmUgdGhlIEhUTUxXaWRnZXQgaW5zdGFuY2UgKGkuZS4gdGhlIHJldHVybiB2YWx1ZSBvZiBhbgogIC8vIEhUTUxXaWRnZXQgYmluZGluZydzIGluaXRpYWxpemUoKSBvciBmYWN0b3J5KCkgZnVuY3Rpb24pCiAgLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGVsZW1lbnQsIG9yIG51bGwgaWYgbm9uZS4KICB3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2UgPSBmdW5jdGlvbihlbCkgewogICAgcmV0dXJuIGVsZW1lbnREYXRhKGVsLCAiaW5pdF9yZXN1bHQiKTsKICB9OwoKICAvLyBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgc2NvcGUgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3RvciwKICAvLyBhbmQgcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZSAoaS5lLiB0aGUgcmV0dXJuIHZhbHVlIG9mCiAgLy8gYW4gSFRNTFdpZGdldCBiaW5kaW5nJ3MgaW5pdGlhbGl6ZSgpIG9yIGZhY3RvcnkoKSBmdW5jdGlvbikKICAvLyBhc3NvY2lhdGVkIHdpdGggdGhhdCBlbGVtZW50LCBpZiBhbnkuIElmIG5vIGVsZW1lbnQgbWF0Y2hlcyB0aGUKICAvLyBzZWxlY3Rvciwgb3IgdGhlIGZpcnN0IG1hdGNoaW5nIGVsZW1lbnQgaGFzIG5vIEhUTUxXaWRnZXQKICAvLyBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggaXQsIHRoZW4gbnVsbCBpcyByZXR1cm5lZC4KICAvLwogIC8vIFRoZSBzY29wZSBhcmd1bWVudCBpcyBvcHRpb25hbCwgYW5kIGRlZmF1bHRzIHRvIHdpbmRvdy5kb2N1bWVudC4KICB3aW5kb3cuSFRNTFdpZGdldHMuZmluZCA9IGZ1bmN0aW9uKHNjb3BlLCBzZWxlY3RvcikgewogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICBzZWxlY3RvciA9IHNjb3BlOwogICAgICBzY29wZSA9IGRvY3VtZW50OwogICAgfQoKICAgIHZhciBlbCA9IHNjb3BlLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgaWYgKGVsID09PSBudWxsKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHdpbmRvdy5IVE1MV2lkZ2V0cy5nZXRJbnN0YW5jZShlbCk7CiAgICB9CiAgfTsKCiAgLy8gRmluZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzY29wZSB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciwgYW5kCiAgLy8gcmV0dXJucyB0aGUgSFRNTFdpZGdldCBpbnN0YW5jZXMgKGkuZS4gdGhlIHJldHVybiB2YWx1ZXMgb2YKICAvLyBhbiBIVE1MV2lkZ2V0IGJpbmRpbmcncyBpbml0aWFsaXplKCkgb3IgZmFjdG9yeSgpIGZ1bmN0aW9uKQogIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudHMsIGluIGFuIGFycmF5LiBJZiBlbGVtZW50cyB0aGF0CiAgLy8gbWF0Y2ggdGhlIHNlbGVjdG9yIGRvbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBIVE1MV2lkZ2V0CiAgLy8gaW5zdGFuY2UsIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIGNvbnRhaW4gbnVsbHMuCiAgLy8KICAvLyBUaGUgc2NvcGUgYXJndW1lbnQgaXMgb3B0aW9uYWwsIGFuZCBkZWZhdWx0cyB0byB3aW5kb3cuZG9jdW1lbnQuCiAgd2luZG93LkhUTUxXaWRnZXRzLmZpbmRBbGwgPSBmdW5jdGlvbihzY29wZSwgc2VsZWN0b3IpIHsKICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgc2VsZWN0b3IgPSBzY29wZTsKICAgICAgc2NvcGUgPSBkb2N1bWVudDsKICAgIH0KCiAgICB2YXIgbm9kZXMgPSBzY29wZS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgIHZhciByZXN1bHRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlc3VsdHMucHVzaCh3aW5kb3cuSFRNTFdpZGdldHMuZ2V0SW5zdGFuY2Uobm9kZXNbaV0pKTsKICAgIH0KICAgIHJldHVybiByZXN1bHRzOwogIH07CgogIHZhciBwb3N0UmVuZGVySGFuZGxlcnMgPSBbXTsKICBmdW5jdGlvbiBpbnZva2VQb3N0UmVuZGVySGFuZGxlcnMoKSB7CiAgICB3aGlsZSAocG9zdFJlbmRlckhhbmRsZXJzLmxlbmd0aCkgewogICAgICB2YXIgaGFuZGxlciA9IHBvc3RSZW5kZXJIYW5kbGVycy5zaGlmdCgpOwogICAgICBpZiAoaGFuZGxlcikgewogICAgICAgIGhhbmRsZXIoKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUmVnaXN0ZXIgdGhlIGdpdmVuIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgdGhlCiAgLy8gbmV4dCB0aW1lIHN0YXRpYyB3aWRnZXRzIGFyZSByZW5kZXJlZC4KICB3aW5kb3cuSFRNTFdpZGdldHMuYWRkUG9zdFJlbmRlckhhbmRsZXIgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgcG9zdFJlbmRlckhhbmRsZXJzLnB1c2goY2FsbGJhY2spOwogIH07CgogIC8vIFRha2VzIGEgbmV3LXN0eWxlIGluc3RhbmNlLWJvdW5kIGRlZmluaXRpb24sIGFuZCByZXR1cm5zIGFuCiAgLy8gb2xkLXN0eWxlIGNsYXNzLWJvdW5kIGRlZmluaXRpb24uIFRoaXMgc2F2ZXMgdXMgZnJvbSBoYXZpbmcKICAvLyB0byByZXdyaXRlIGFsbCB0aGUgbG9naWMgaW4gdGhpcyBmaWxlIHRvIGFjY29tb2RhdGUgYm90aAogIC8vIHR5cGVzIG9mIGRlZmluaXRpb25zLgogIGZ1bmN0aW9uIGNyZWF0ZUxlZ2FjeURlZmluaXRpb25BZGFwdGVyKGRlZm4pIHsKICAgIHZhciByZXN1bHQgPSB7CiAgICAgIG5hbWU6IGRlZm4ubmFtZSwKICAgICAgdHlwZTogZGVmbi50eXBlLAogICAgICBpbml0aWFsaXplOiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJldHVybiBkZWZuLmZhY3RvcnkoZWwsIHdpZHRoLCBoZWlnaHQpOwogICAgICB9LAogICAgICByZW5kZXJWYWx1ZTogZnVuY3Rpb24oZWwsIHgsIGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlLnJlbmRlclZhbHVlKHgpOwogICAgICB9LAogICAgICByZXNpemU6IGZ1bmN0aW9uKGVsLCB3aWR0aCwgaGVpZ2h0LCBpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpbnN0YW5jZS5yZXNpemUod2lkdGgsIGhlaWdodCk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKGRlZm4uZmluZCkKICAgICAgcmVzdWx0LmZpbmQgPSBkZWZuLmZpbmQ7CiAgICBpZiAoZGVmbi5yZW5kZXJFcnJvcikKICAgICAgcmVzdWx0LnJlbmRlckVycm9yID0gZGVmbi5yZW5kZXJFcnJvcjsKICAgIGlmIChkZWZuLmNsZWFyRXJyb3IpCiAgICAgIHJlc3VsdC5jbGVhckVycm9yID0gZGVmbi5jbGVhckVycm9yOwoKICAgIHJldHVybiByZXN1bHQ7CiAgfQp9KSgpOwoK"></script>
<script src="data:application/x-javascript;base64,SFRNTFdpZGdldHMud2lkZ2V0KHsNCg0KICBuYW1lOiAncmVhY3Rqc29uJywNCg0KICB0eXBlOiAnb3V0cHV0JywNCg0KICBmYWN0b3J5OiBmdW5jdGlvbihlbCwgd2lkdGgsIGhlaWdodCkgew0KDQogICAgLy8gVE9ETzogZGVmaW5lIHNoYXJlZCB2YXJpYWJsZXMgZm9yIHRoaXMgaW5zdGFuY2UNCg0KICAgIHJldHVybiB7DQoNCiAgICAgIHJlbmRlclZhbHVlOiBmdW5jdGlvbih4KSB7DQoNCiAgICAgICAgICBSZWFjdERPTS5yZW5kZXIoDQogICAgICAgICAgICBSZWFjdC5jcmVhdGVFbGVtZW50KA0KICAgICAgICAgICAgICBKc29uLA0KICAgICAgICAgICAgICB7IHZhbHVlOiB4Lmpzb24sIG9uQ2hhbmdlOiBsb2dDaGFuZ2UgfQ0KICAgICAgICAgICAgKSwNCiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkNCiAgICAgICAgICApOw0KDQogICAgICAgICAgZnVuY3Rpb24gbG9nQ2hhbmdlKCB2YWx1ZSApew0KICAgICAgICAgICAgY29uc29sZS5sb2coIHZhbHVlICk7DQogICAgICAgICAgICBpZih0eXBlb2YoU2hpbnkpICE9PSAidW5kZWZpbmVkIil7DQogICAgICAgICAgICAgIFNoaW55Lm9uSW5wdXRDaGFuZ2UoZWwuaWQgKyAiX2NoYW5nZSIsIHt2YWx1ZTp2YWx1ZX0pOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgIH0NCg0KICAgICAgfSwNCg0KICAgICAgcmVzaXplOiBmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7DQoNCiAgICAgICAgLy8gVE9ETzogY29kZSB0byByZS1yZW5kZXIgdGhlIHdpZGdldCB3aXRoIGEgbmV3IHNpemUNCg0KICAgICAgfQ0KDQogICAgfTsNCiAgfQ0KfSk7DQo="></script>
<script src="data:application/x-javascript;base64,LyoqCiAqIFJlYWN0IHYxNS4xLjAKICoKICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAogKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICoKICovCiFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUoKTtlbHNlIGlmKCJmdW5jdGlvbiI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQpZGVmaW5lKFtdLGUpO2Vsc2V7dmFyIHQ7dD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBnbG9iYWw/Z2xvYmFsOiJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZj9zZWxmOnRoaXMsdC5SZWFjdD1lKCl9fShmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBvKGEsdSl7aWYoIW5bYV0pe2lmKCF0W2FdKXt2YXIgcz0iZnVuY3Rpb24iPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighdSYmcylyZXR1cm4gcyhhLCEwKTtpZihpKXJldHVybiBpKGEsITApO3ZhciBsPW5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK2ErIiciKTt0aHJvdyBsLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGx9dmFyIGM9blthXT17ZXhwb3J0czp7fX07dFthXVswXS5jYWxsKGMuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W2FdWzFdW2VdO3JldHVybiBvKG4/bjplKX0sYyxjLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bYV0uZXhwb3J0c31mb3IodmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsYT0wO2E8ci5sZW5ndGg7YSsrKW8oclthXSk7cmV0dXJuIG99KHsxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNDApLG89ZSgxNDgpLGk9e2ZvY3VzRE9NQ29tcG9uZW50OmZ1bmN0aW9uKCl7byhyLmdldE5vZGVGcm9tSW5zdGFuY2UodGhpcykpfX07dC5leHBvcnRzPWl9LHsxNDg6MTQ4LDQwOjQwfV0sMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dmFyIGU9d2luZG93Lm9wZXJhO3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudmVyc2lvbiYmcGFyc2VJbnQoZS52ZXJzaW9uKCksMTApPD0xMn1mdW5jdGlvbiBvKGUpe3JldHVybihlLmN0cmxLZXl8fGUuYWx0S2V5fHxlLm1ldGFLZXkpJiYhKGUuY3RybEtleSYmZS5hbHRLZXkpfWZ1bmN0aW9uIGkoZSl7c3dpdGNoKGUpe2Nhc2UgUy50b3BDb21wb3NpdGlvblN0YXJ0OnJldHVybiBNLmNvbXBvc2l0aW9uU3RhcnQ7Y2FzZSBTLnRvcENvbXBvc2l0aW9uRW5kOnJldHVybiBNLmNvbXBvc2l0aW9uRW5kO2Nhc2UgUy50b3BDb21wb3NpdGlvblVwZGF0ZTpyZXR1cm4gTS5jb21wb3NpdGlvblVwZGF0ZX19ZnVuY3Rpb24gYShlLHQpe3JldHVybiBlPT09Uy50b3BLZXlEb3duJiZ0LmtleUNvZGU9PT1ffWZ1bmN0aW9uIHUoZSx0KXtzd2l0Y2goZSl7Y2FzZSBTLnRvcEtleVVwOnJldHVybi0xIT09Yi5pbmRleE9mKHQua2V5Q29kZSk7Y2FzZSBTLnRvcEtleURvd246cmV0dXJuIHQua2V5Q29kZSE9PV87Y2FzZSBTLnRvcEtleVByZXNzOmNhc2UgUy50b3BNb3VzZURvd246Y2FzZSBTLnRvcEJsdXI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLmRldGFpbDtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHQmJiJkYXRhImluIHQ/dC5kYXRhOm51bGx9ZnVuY3Rpb24gbChlLHQsbixyKXt2YXIgbyxsO2lmKEU/bz1pKGUpOlI/dShlLG4pJiYobz1NLmNvbXBvc2l0aW9uRW5kKTphKGUsbikmJihvPU0uY29tcG9zaXRpb25TdGFydCksIW8pcmV0dXJuIG51bGw7VCYmKFJ8fG8hPT1NLmNvbXBvc2l0aW9uU3RhcnQ/bz09PU0uY29tcG9zaXRpb25FbmQmJlImJihsPVIuZ2V0RGF0YSgpKTpSPW0uZ2V0UG9vbGVkKHIpKTt2YXIgYz1nLmdldFBvb2xlZChvLHQsbixyKTtpZihsKWMuZGF0YT1sO2Vsc2V7dmFyIHA9cyhuKTtudWxsIT09cCYmKGMuZGF0YT1wKX1yZXR1cm4gaC5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKGMpLGN9ZnVuY3Rpb24gYyhlLHQpe3N3aXRjaChlKXtjYXNlIFMudG9wQ29tcG9zaXRpb25FbmQ6cmV0dXJuIHModCk7Y2FzZSBTLnRvcEtleVByZXNzOnZhciBuPXQud2hpY2g7cmV0dXJuIG4hPT1QP251bGw6KGs9ITAsdyk7Y2FzZSBTLnRvcFRleHRJbnB1dDp2YXIgcj10LmRhdGE7cmV0dXJuIHI9PT13JiZrP251bGw6cjtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBwKGUsdCl7aWYoUil7aWYoZT09PVMudG9wQ29tcG9zaXRpb25FbmR8fHUoZSx0KSl7dmFyIG49Ui5nZXREYXRhKCk7cmV0dXJuIG0ucmVsZWFzZShSKSxSPW51bGwsbn1yZXR1cm4gbnVsbH1zd2l0Y2goZSl7Y2FzZSBTLnRvcFBhc3RlOnJldHVybiBudWxsO2Nhc2UgUy50b3BLZXlQcmVzczpyZXR1cm4gdC53aGljaCYmIW8odCk/U3RyaW5nLmZyb21DaGFyQ29kZSh0LndoaWNoKTpudWxsO2Nhc2UgUy50b3BDb21wb3NpdGlvbkVuZDpyZXR1cm4gVD9udWxsOnQuZGF0YTtkZWZhdWx0OnJldHVybiBudWxsfX1mdW5jdGlvbiBkKGUsdCxuLHIpe3ZhciBvO2lmKG89Tj9jKGUsbik6cChlLG4pLCFvKXJldHVybiBudWxsO3ZhciBpPXkuZ2V0UG9vbGVkKE0uYmVmb3JlSW5wdXQsdCxuLHIpO3JldHVybiBpLmRhdGE9byxoLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoaSksaX12YXIgZj1lKDE2KSxoPWUoMjApLHY9ZSgxNDApLG09ZSgyMSksZz1lKDk3KSx5PWUoMTAxKSxDPWUoMTU4KSxiPVs5LDEzLDI3LDMyXSxfPTIyOSxFPXYuY2FuVXNlRE9NJiYiQ29tcG9zaXRpb25FdmVudCJpbiB3aW5kb3cseD1udWxsO3YuY2FuVXNlRE9NJiYiZG9jdW1lbnRNb2RlImluIGRvY3VtZW50JiYoeD1kb2N1bWVudC5kb2N1bWVudE1vZGUpO3ZhciBOPXYuY2FuVXNlRE9NJiYiVGV4dEV2ZW50ImluIHdpbmRvdyYmIXgmJiFyKCksVD12LmNhblVzZURPTSYmKCFFfHx4JiZ4PjgmJjExPj14KSxQPTMyLHc9U3RyaW5nLmZyb21DaGFyQ29kZShQKSxTPWYudG9wTGV2ZWxUeXBlcyxNPXtiZWZvcmVJbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25CZWZvcmVJbnB1dDpudWxsfSksY2FwdHVyZWQ6Qyh7b25CZWZvcmVJbnB1dENhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W1MudG9wQ29tcG9zaXRpb25FbmQsUy50b3BLZXlQcmVzcyxTLnRvcFRleHRJbnB1dCxTLnRvcFBhc3RlXX0sY29tcG9zaXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOkMoe29uQ29tcG9zaXRpb25FbmQ6bnVsbH0pLGNhcHR1cmVkOkMoe29uQ29tcG9zaXRpb25FbmRDYXB0dXJlOm51bGx9KX0sZGVwZW5kZW5jaWVzOltTLnRvcEJsdXIsUy50b3BDb21wb3NpdGlvbkVuZCxTLnRvcEtleURvd24sUy50b3BLZXlQcmVzcyxTLnRvcEtleVVwLFMudG9wTW91c2VEb3duXX0sY29tcG9zaXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25Db21wb3NpdGlvblN0YXJ0Om51bGx9KSxjYXB0dXJlZDpDKHtvbkNvbXBvc2l0aW9uU3RhcnRDYXB0dXJlOm51bGx9KX0sZGVwZW5kZW5jaWVzOltTLnRvcEJsdXIsUy50b3BDb21wb3NpdGlvblN0YXJ0LFMudG9wS2V5RG93bixTLnRvcEtleVByZXNzLFMudG9wS2V5VXAsUy50b3BNb3VzZURvd25dfSxjb21wb3NpdGlvblVwZGF0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Qyh7b25Db21wb3NpdGlvblVwZGF0ZTpudWxsfSksY2FwdHVyZWQ6Qyh7b25Db21wb3NpdGlvblVwZGF0ZUNhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W1MudG9wQmx1cixTLnRvcENvbXBvc2l0aW9uVXBkYXRlLFMudG9wS2V5RG93bixTLnRvcEtleVByZXNzLFMudG9wS2V5VXAsUy50b3BNb3VzZURvd25dfX0saz0hMSxSPW51bGwsRD17ZXZlbnRUeXBlczpNLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuW2woZSx0LG4sciksZChlLHQsbixyKV19fTt0LmV4cG9ydHM9RH0sezEwMToxMDEsMTQwOjE0MCwxNTg6MTU4LDE2OjE2LDIwOjIwLDIxOjIxLDk3Ojk3fV0sMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGUrdC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnN1YnN0cmluZygxKX12YXIgbz17YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsYm9yZGVySW1hZ2VPdXRzZXQ6ITAsYm9yZGVySW1hZ2VTbGljZTohMCxib3JkZXJJbWFnZVdpZHRoOiEwLGJveEZsZXg6ITAsYm94RmxleEdyb3VwOiEwLGJveE9yZGluYWxHcm91cDohMCxjb2x1bW5Db3VudDohMCxmbGV4OiEwLGZsZXhHcm93OiEwLGZsZXhQb3NpdGl2ZTohMCxmbGV4U2hyaW5rOiEwLGZsZXhOZWdhdGl2ZTohMCxmbGV4T3JkZXI6ITAsZ3JpZFJvdzohMCxncmlkQ29sdW1uOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUNsYW1wOiEwLGxpbmVIZWlnaHQ6ITAsb3BhY2l0eTohMCxvcmRlcjohMCxvcnBoYW5zOiEwLHRhYlNpemU6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwLGZpbGxPcGFjaXR5OiEwLGZsb29kT3BhY2l0eTohMCxzdG9wT3BhY2l0eTohMCxzdHJva2VEYXNoYXJyYXk6ITAsc3Ryb2tlRGFzaG9mZnNldDohMCxzdHJva2VNaXRlcmxpbWl0OiEwLHN0cm9rZU9wYWNpdHk6ITAsc3Ryb2tlV2lkdGg6ITB9LGk9WyJXZWJraXQiLCJtcyIsIk1veiIsIk8iXTtPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kuZm9yRWFjaChmdW5jdGlvbih0KXtvW3IodCxlKV09b1tlXX0pfSk7dmFyIGE9e2JhY2tncm91bmQ6e2JhY2tncm91bmRBdHRhY2htZW50OiEwLGJhY2tncm91bmRDb2xvcjohMCxiYWNrZ3JvdW5kSW1hZ2U6ITAsYmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwLGJhY2tncm91bmRSZXBlYXQ6ITB9LGJhY2tncm91bmRQb3NpdGlvbjp7YmFja2dyb3VuZFBvc2l0aW9uWDohMCxiYWNrZ3JvdW5kUG9zaXRpb25ZOiEwfSxib3JkZXI6e2JvcmRlcldpZHRoOiEwLGJvcmRlclN0eWxlOiEwLGJvcmRlckNvbG9yOiEwfSxib3JkZXJCb3R0b206e2JvcmRlckJvdHRvbVdpZHRoOiEwLGJvcmRlckJvdHRvbVN0eWxlOiEwLGJvcmRlckJvdHRvbUNvbG9yOiEwfSxib3JkZXJMZWZ0Ontib3JkZXJMZWZ0V2lkdGg6ITAsYm9yZGVyTGVmdFN0eWxlOiEwLGJvcmRlckxlZnRDb2xvcjohMH0sYm9yZGVyUmlnaHQ6e2JvcmRlclJpZ2h0V2lkdGg6ITAsYm9yZGVyUmlnaHRTdHlsZTohMCxib3JkZXJSaWdodENvbG9yOiEwfSxib3JkZXJUb3A6e2JvcmRlclRvcFdpZHRoOiEwLGJvcmRlclRvcFN0eWxlOiEwLGJvcmRlclRvcENvbG9yOiEwfSxmb250Ontmb250U3R5bGU6ITAsZm9udFZhcmlhbnQ6ITAsZm9udFdlaWdodDohMCxmb250U2l6ZTohMCxsaW5lSGVpZ2h0OiEwLGZvbnRGYW1pbHk6ITB9LG91dGxpbmU6e291dGxpbmVXaWR0aDohMCxvdXRsaW5lU3R5bGU6ITAsb3V0bGluZUNvbG9yOiEwfX0sdT17aXNVbml0bGVzc051bWJlcjpvLHNob3J0aGFuZFByb3BlcnR5RXhwYW5zaW9uczphfTt0LmV4cG9ydHM9dX0se31dLDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgzKSxvPWUoMTQwKSxpPShlKDcwKSxlKDE0MiksZSgxMTQpKSxhPWUoMTUzKSx1PWUoMTYwKSxzPShlKDE2NCksdShmdW5jdGlvbihlKXtyZXR1cm4gYShlKX0pKSxsPSExLGM9ImNzc0Zsb2F0IjtpZihvLmNhblVzZURPTSl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGU7dHJ5e3AuZm9udD0iIn1jYXRjaChkKXtsPSEwfXZvaWQgMD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5jc3NGbG9hdCYmKGM9InN0eWxlRmxvYXQiKX12YXIgZj17Y3JlYXRlTWFya3VwRm9yU3R5bGVzOmZ1bmN0aW9uKGUsdCl7dmFyIG49IiI7Zm9yKHZhciByIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShyKSl7dmFyIG89ZVtyXTtudWxsIT1vJiYobis9cyhyKSsiOiIsbis9aShyLG8sdCkrIjsiKX1yZXR1cm4gbnx8bnVsbH0sc2V0VmFsdWVGb3JTdHlsZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWUuc3R5bGU7Zm9yKHZhciBhIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIHU9aShhLHRbYV0sbik7aWYoImZsb2F0IiE9PWEmJiJjc3NGbG9hdCIhPT1hfHwoYT1jKSx1KW9bYV09dTtlbHNle3ZhciBzPWwmJnIuc2hvcnRoYW5kUHJvcGVydHlFeHBhbnNpb25zW2FdO2lmKHMpZm9yKHZhciBwIGluIHMpb1twXT0iIjtlbHNlIG9bYV09IiJ9fX19O3QuZXhwb3J0cz1mfSx7MTE0OjExNCwxNDA6MTQwLDE0MjoxNDIsMTUzOjE1MywxNjA6MTYwLDE2NDoxNjQsMzozLDcwOjcwfV0sNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fY2FsbGJhY2tzPW51bGwsdGhpcy5fY29udGV4dHM9bnVsbH12YXIgbz1lKDE2NSksaT1lKDI1KSxhPWUoMTU0KTtvKHIucHJvdG90eXBlLHtlbnF1ZXVlOmZ1bmN0aW9uKGUsdCl7dGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8W10sdGhpcy5fY29udGV4dHM9dGhpcy5fY29udGV4dHN8fFtdLHRoaXMuX2NhbGxiYWNrcy5wdXNoKGUpLHRoaXMuX2NvbnRleHRzLnB1c2godCl9LG5vdGlmeUFsbDpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2NhbGxiYWNrcyx0PXRoaXMuX2NvbnRleHRzO2lmKGUpe2UubGVuZ3RoIT09dC5sZW5ndGg/YSghMSk6dm9pZCAwLHRoaXMuX2NhbGxiYWNrcz1udWxsLHRoaXMuX2NvbnRleHRzPW51bGw7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspZVtuXS5jYWxsKHRbbl0pO2UubGVuZ3RoPTAsdC5sZW5ndGg9MH19LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzP3RoaXMuX2NhbGxiYWNrcy5sZW5ndGg6MH0scm9sbGJhY2s6ZnVuY3Rpb24oZSl7dGhpcy5fY2FsbGJhY2tzJiYodGhpcy5fY2FsbGJhY2tzLmxlbmd0aD1lLHRoaXMuX2NvbnRleHRzLmxlbmd0aD1lKX0scmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFja3M9bnVsbCx0aGlzLl9jb250ZXh0cz1udWxsfSxkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5yZXNldCgpfX0pLGkuYWRkUG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1yfSx7MTU0OjE1NCwxNjU6MTY1LDI1OjI1fV0sNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4ic2VsZWN0Ij09PXR8fCJpbnB1dCI9PT10JiYiZmlsZSI9PT1lLnR5cGV9ZnVuY3Rpb24gbyhlKXt2YXIgdD1OLmdldFBvb2xlZChrLmNoYW5nZSxELGUsVChlKSk7Yi5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHQpLHguYmF0Y2hlZFVwZGF0ZXMoaSx0KX1mdW5jdGlvbiBpKGUpe0MuZW5xdWV1ZUV2ZW50cyhlKSxDLnByb2Nlc3NFdmVudFF1ZXVlKCExKX1mdW5jdGlvbiBhKGUsdCl7Uj1lLEQ9dCxSLmF0dGFjaEV2ZW50KCJvbmNoYW5nZSIsbyl9ZnVuY3Rpb24gdSgpe1ImJihSLmRldGFjaEV2ZW50KCJvbmNoYW5nZSIsbyksUj1udWxsLEQ9bnVsbCl9ZnVuY3Rpb24gcyhlLHQpe3JldHVybiBlPT09TS50b3BDaGFuZ2U/dDp2b2lkIDB9ZnVuY3Rpb24gbChlLHQsbil7ZT09PU0udG9wRm9jdXM/KHUoKSxhKHQsbikpOmU9PT1NLnRvcEJsdXImJnUoKX1mdW5jdGlvbiBjKGUsdCl7Uj1lLEQ9dCxJPWUudmFsdWUsTz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUuY29uc3RydWN0b3IucHJvdG90eXBlLCJ2YWx1ZSIpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShSLCJ2YWx1ZSIsVSksUi5hdHRhY2hFdmVudD9SLmF0dGFjaEV2ZW50KCJvbnByb3BlcnR5Y2hhbmdlIixkKTpSLmFkZEV2ZW50TGlzdGVuZXIoInByb3BlcnR5Y2hhbmdlIixkLCExKX1mdW5jdGlvbiBwKCl7UiYmKGRlbGV0ZSBSLnZhbHVlLFIuZGV0YWNoRXZlbnQ/Ui5kZXRhY2hFdmVudCgib25wcm9wZXJ0eWNoYW5nZSIsZCk6Ui5yZW1vdmVFdmVudExpc3RlbmVyKCJwcm9wZXJ0eWNoYW5nZSIsZCwhMSksUj1udWxsLEQ9bnVsbCxJPW51bGwsTz1udWxsKX1mdW5jdGlvbiBkKGUpe2lmKCJ2YWx1ZSI9PT1lLnByb3BlcnR5TmFtZSl7dmFyIHQ9ZS5zcmNFbGVtZW50LnZhbHVlO3QhPT1JJiYoST10LG8oZSkpfX1mdW5jdGlvbiBmKGUsdCl7cmV0dXJuIGU9PT1NLnRvcElucHV0P3Q6dm9pZCAwfWZ1bmN0aW9uIGgoZSx0LG4pe2U9PT1NLnRvcEZvY3VzPyhwKCksYyh0LG4pKTplPT09TS50b3BCbHVyJiZwKCl9ZnVuY3Rpb24gdihlLHQpe3JldHVybiBlIT09TS50b3BTZWxlY3Rpb25DaGFuZ2UmJmUhPT1NLnRvcEtleVVwJiZlIT09TS50b3BLZXlEb3dufHwhUnx8Ui52YWx1ZT09PUk/dm9pZCAwOihJPVIudmFsdWUsRCl9ZnVuY3Rpb24gbShlKXtyZXR1cm4gZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmKCJjaGVja2JveCI9PT1lLnR5cGV8fCJyYWRpbyI9PT1lLnR5cGUpfWZ1bmN0aW9uIGcoZSx0KXtyZXR1cm4gZT09PU0udG9wQ2xpY2s/dDp2b2lkIDB9dmFyIHk9ZSgxNiksQz1lKDE3KSxiPWUoMjApLF89ZSgxNDApLEU9ZSg0MCkseD1lKDkwKSxOPWUoOTkpLFQ9ZSgxMjIpLFA9ZSgxMjkpLHc9ZSgxMzApLFM9ZSgxNTgpLE09eS50b3BMZXZlbFR5cGVzLGs9e2NoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Uyh7b25DaGFuZ2U6bnVsbH0pLGNhcHR1cmVkOlMoe29uQ2hhbmdlQ2FwdHVyZTpudWxsfSl9LGRlcGVuZGVuY2llczpbTS50b3BCbHVyLE0udG9wQ2hhbmdlLE0udG9wQ2xpY2ssTS50b3BGb2N1cyxNLnRvcElucHV0LE0udG9wS2V5RG93bixNLnRvcEtleVVwLE0udG9wU2VsZWN0aW9uQ2hhbmdlXX19LFI9bnVsbCxEPW51bGwsST1udWxsLE89bnVsbCxBPSExO18uY2FuVXNlRE9NJiYoQT1QKCJjaGFuZ2UiKSYmKCEoImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCl8fGRvY3VtZW50LmRvY3VtZW50TW9kZT44KSk7dmFyIEw9ITE7Xy5jYW5Vc2VET00mJihMPVAoImlucHV0IikmJighKCJkb2N1bWVudE1vZGUiaW4gZG9jdW1lbnQpfHxkb2N1bWVudC5kb2N1bWVudE1vZGU+MTEpKTt2YXIgVT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE8uZ2V0LmNhbGwodGhpcyl9LHNldDpmdW5jdGlvbihlKXtJPSIiK2UsTy5zZXQuY2FsbCh0aGlzLGUpfX0sRj17ZXZlbnRUeXBlczprLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4sbyl7dmFyIGksYSx1PXQ/RS5nZXROb2RlRnJvbUluc3RhbmNlKHQpOndpbmRvdztpZihyKHUpP0E/aT1zOmE9bDp3KHUpP0w/aT1mOihpPXYsYT1oKTptKHUpJiYoaT1nKSxpKXt2YXIgYz1pKGUsdCk7aWYoYyl7dmFyIHA9Ti5nZXRQb29sZWQoay5jaGFuZ2UsYyxuLG8pO3JldHVybiBwLnR5cGU9ImNoYW5nZSIsYi5hY2N1bXVsYXRlVHdvUGhhc2VEaXNwYXRjaGVzKHApLHB9fWEmJmEoZSx1LHQpfX07dC5leHBvcnRzPUZ9LHsxMjI6MTIyLDEyOToxMjksMTMwOjEzMCwxNDA6MTQwLDE1ODoxNTgsMTY6MTYsMTc6MTcsMjA6MjAsNDA6NDAsOTA6OTAsOTk6OTl9XSw3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KSYmKHQ9dFsxXSksdD90Lm5leHRTaWJsaW5nOmUuZmlyc3RDaGlsZH1mdW5jdGlvbiBvKGUsdCxuKXtjLmluc2VydFRyZWVCZWZvcmUoZSx0LG4pfWZ1bmN0aW9uIGkoZSx0LG4pe0FycmF5LmlzQXJyYXkodCk/dShlLHRbMF0sdFsxXSxuKTptKGUsdCxuKX1mdW5jdGlvbiBhKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIG49dFsxXTt0PXRbMF0scyhlLHQsbiksZS5yZW1vdmVDaGlsZChuKX1lLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHUoZSx0LG4scil7Zm9yKHZhciBvPXQ7Oyl7dmFyIGk9by5uZXh0U2libGluZztpZihtKGUsbyxyKSxvPT09bilicmVhaztvPWl9fWZ1bmN0aW9uIHMoZSx0LG4pe2Zvcig7Oyl7dmFyIHI9dC5uZXh0U2libGluZztpZihyPT09bilicmVhaztlLnJlbW92ZUNoaWxkKHIpfX1mdW5jdGlvbiBsKGUsdCxuKXt2YXIgcj1lLnBhcmVudE5vZGUsbz1lLm5leHRTaWJsaW5nO289PT10P24mJm0ocixkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSxvKTpuPyh2KG8sbikscyhyLG8sdCkpOnMocixlLHQpfXZhciBjPWUoOCkscD1lKDEyKSxkPWUoNzQpLGY9KGUoNDApLGUoNzApLGUoMTEzKSksaD1lKDEzNCksdj1lKDEzNSksbT1mKGZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSksZz1wLmRhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwLHk9e2Rhbmdlcm91c2x5UmVwbGFjZU5vZGVXaXRoTWFya3VwOmcscmVwbGFjZURlbGltaXRlZFRleHQ6bCxwcm9jZXNzVXBkYXRlczpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgdT10W25dO3N3aXRjaCh1LnR5cGUpe2Nhc2UgZC5JTlNFUlRfTUFSS1VQOm8oZSx1LmNvbnRlbnQscihlLHUuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSBkLk1PVkVfRVhJU1RJTkc6aShlLHUuZnJvbU5vZGUscihlLHUuYWZ0ZXJOb2RlKSk7YnJlYWs7Y2FzZSBkLlNFVF9NQVJLVVA6aChlLHUuY29udGVudCk7YnJlYWs7Y2FzZSBkLlRFWFRfQ09OVEVOVDp2KGUsdS5jb250ZW50KTticmVhaztjYXNlIGQuUkVNT1ZFX05PREU6YShlLHUuZnJvbU5vZGUpfX19fTt0LmV4cG9ydHM9eX0sezExMzoxMTMsMTI6MTIsMTM0OjEzNCwxMzU6MTM1LDQwOjQwLDcwOjcwLDc0Ojc0LDg6OH1dLDg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZih2KXt2YXIgdD1lLm5vZGUsbj1lLmNoaWxkcmVuO2lmKG4ubGVuZ3RoKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKW0odCxuW3JdLG51bGwpO2Vsc2UgbnVsbCE9ZS5odG1sP3QuaW5uZXJIVE1MPWUuaHRtbDpudWxsIT1lLnRleHQmJmQodCxlLnRleHQpfX1mdW5jdGlvbiBvKGUsdCl7ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZCh0Lm5vZGUsZSkscih0KX1mdW5jdGlvbiBpKGUsdCl7dj9lLmNoaWxkcmVuLnB1c2godCk6ZS5ub2RlLmFwcGVuZENoaWxkKHQubm9kZSl9ZnVuY3Rpb24gYShlLHQpe3Y/ZS5odG1sPXQ6ZS5ub2RlLmlubmVySFRNTD10fWZ1bmN0aW9uIHUoZSx0KXt2P2UudGV4dD10OmQoZS5ub2RlLHQpfWZ1bmN0aW9uIHMoKXtyZXR1cm4gdGhpcy5ub2RlLm5vZGVOYW1lfWZ1bmN0aW9uIGwoZSl7cmV0dXJue25vZGU6ZSxjaGlsZHJlbjpbXSxodG1sOm51bGwsdGV4dDpudWxsLHRvU3RyaW5nOnN9fXZhciBjPWUoOSkscD1lKDExMyksZD1lKDEzNSksZj0xLGg9MTEsdj0idW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYibnVtYmVyIj09dHlwZW9mIGRvY3VtZW50LmRvY3VtZW50TW9kZXx8InVuZGVmaW5lZCIhPXR5cGVvZiBuYXZpZ2F0b3ImJiJzdHJpbmciPT10eXBlb2YgbmF2aWdhdG9yLnVzZXJBZ2VudCYmL1xiRWRnZVwvXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksbT1wKGZ1bmN0aW9uKGUsdCxuKXt0Lm5vZGUubm9kZVR5cGU9PT1ofHx0Lm5vZGUubm9kZVR5cGU9PT1mJiYib2JqZWN0Ij09PXQubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYobnVsbD09dC5ub2RlLm5hbWVzcGFjZVVSSXx8dC5ub2RlLm5hbWVzcGFjZVVSST09PWMuaHRtbCk/KHIodCksZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pKTooZS5pbnNlcnRCZWZvcmUodC5ub2RlLG4pLHIodCkpfSk7bC5pbnNlcnRUcmVlQmVmb3JlPW0sbC5yZXBsYWNlQ2hpbGRXaXRoVHJlZT1vLGwucXVldWVDaGlsZD1pLGwucXVldWVIVE1MPWEsbC5xdWV1ZVRleHQ9dSx0LmV4cG9ydHM9bH0sezExMzoxMTMsMTM1OjEzNSw5Ojl9XSw5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtodG1sOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixtYXRobWw6Imh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiLHN2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcifTt0LmV4cG9ydHM9cn0se31dLDEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4oZSZ0KT09PXR9dmFyIG89ZSgxNTQpLGk9e01VU1RfVVNFX1BST1BFUlRZOjEsSEFTX1NJREVfRUZGRUNUUzoyLEhBU19CT09MRUFOX1ZBTFVFOjQsSEFTX05VTUVSSUNfVkFMVUU6OCxIQVNfUE9TSVRJVkVfTlVNRVJJQ19WQUxVRToyNCxIQVNfT1ZFUkxPQURFRF9CT09MRUFOX1ZBTFVFOjMyLGluamVjdERPTVByb3BlcnR5Q29uZmlnOmZ1bmN0aW9uKGUpe3ZhciB0PWksbj1lLlByb3BlcnRpZXN8fHt9LGE9ZS5ET01BdHRyaWJ1dGVOYW1lc3BhY2VzfHx7fSxzPWUuRE9NQXR0cmlidXRlTmFtZXN8fHt9LGw9ZS5ET01Qcm9wZXJ0eU5hbWVzfHx7fSxjPWUuRE9NTXV0YXRpb25NZXRob2RzfHx7fTtlLmlzQ3VzdG9tQXR0cmlidXRlJiZ1Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5wdXNoKGUuaXNDdXN0b21BdHRyaWJ1dGUpO2Zvcih2YXIgcCBpbiBuKXt1LnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkocCk/byghMSk6dm9pZCAwO3ZhciBkPXAudG9Mb3dlckNhc2UoKSxmPW5bcF0saD17YXR0cmlidXRlTmFtZTpkLGF0dHJpYnV0ZU5hbWVzcGFjZTpudWxsLHByb3BlcnR5TmFtZTpwLG11dGF0aW9uTWV0aG9kOm51bGwsbXVzdFVzZVByb3BlcnR5OnIoZix0Lk1VU1RfVVNFX1BST1BFUlRZKSxoYXNTaWRlRWZmZWN0czpyKGYsdC5IQVNfU0lERV9FRkZFQ1RTKSxoYXNCb29sZWFuVmFsdWU6cihmLHQuSEFTX0JPT0xFQU5fVkFMVUUpLGhhc051bWVyaWNWYWx1ZTpyKGYsdC5IQVNfTlVNRVJJQ19WQUxVRSksaGFzUG9zaXRpdmVOdW1lcmljVmFsdWU6cihmLHQuSEFTX1BPU0lUSVZFX05VTUVSSUNfVkFMVUUpLGhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWU6cihmLHQuSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSl9O2lmKCFoLm11c3RVc2VQcm9wZXJ0eSYmaC5oYXNTaWRlRWZmZWN0cz9vKCExKTp2b2lkIDAsaC5oYXNCb29sZWFuVmFsdWUraC5oYXNOdW1lcmljVmFsdWUraC5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlPD0xP3ZvaWQgMDpvKCExKSxzLmhhc093blByb3BlcnR5KHApKXt2YXIgdj1zW3BdO2guYXR0cmlidXRlTmFtZT12fWEuaGFzT3duUHJvcGVydHkocCkmJihoLmF0dHJpYnV0ZU5hbWVzcGFjZT1hW3BdKSxsLmhhc093blByb3BlcnR5KHApJiYoaC5wcm9wZXJ0eU5hbWU9bFtwXSksYy5oYXNPd25Qcm9wZXJ0eShwKSYmKGgubXV0YXRpb25NZXRob2Q9Y1twXSksdS5wcm9wZXJ0aWVzW3BdPWh9fX0sYT0iOkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQiLHU9e0lEX0FUVFJJQlVURV9OQU1FOiJkYXRhLXJlYWN0aWQiLFJPT1RfQVRUUklCVVRFX05BTUU6ImRhdGEtcmVhY3Ryb290IixBVFRSSUJVVEVfTkFNRV9TVEFSVF9DSEFSOmEsQVRUUklCVVRFX05BTUVfQ0hBUjphKyJcXC0uMC05XFx1QjdcXHUwMzAwLVxcdTAzNkZcXHUyMDNGLVxcdTIwNDAiLHByb3BlcnRpZXM6e30sZ2V0UG9zc2libGVTdGFuZGFyZE5hbWU6bnVsbCxfaXNDdXN0b21BdHRyaWJ1dGVGdW5jdGlvbnM6W10saXNDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDx1Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9ucy5sZW5ndGg7dCsrKXt2YXIgbj11Ll9pc0N1c3RvbUF0dHJpYnV0ZUZ1bmN0aW9uc1t0XTtpZihuKGUpKXJldHVybiEwfXJldHVybiExfSxpbmplY3Rpb246aX07dC5leHBvcnRzPXV9LHsxNTQ6MTU0fV0sMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbC5oYXNPd25Qcm9wZXJ0eShlKT8hMDpzLmhhc093blByb3BlcnR5KGUpPyExOnUudGVzdChlKT8obFtlXT0hMCwhMCk6KHNbZV09ITAsITEpfWZ1bmN0aW9uIG8oZSx0KXtyZXR1cm4gbnVsbD09dHx8ZS5oYXNCb29sZWFuVmFsdWUmJiF0fHxlLmhhc051bWVyaWNWYWx1ZSYmaXNOYU4odCl8fGUuaGFzUG9zaXRpdmVOdW1lcmljVmFsdWUmJjE+dHx8ZS5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ0PT09ITF9dmFyIGk9ZSgxMCksYT0oZSg0MCksZSg0OCksZSg3MCksZSgxMzIpKSx1PShlKDE2NCksbmV3IFJlZ0V4cCgiXlsiK2kuQVRUUklCVVRFX05BTUVfU1RBUlRfQ0hBUisiXVsiK2kuQVRUUklCVVRFX05BTUVfQ0hBUisiXSokIikpLHM9e30sbD17fSxjPXtjcmVhdGVNYXJrdXBGb3JJRDpmdW5jdGlvbihlKXtyZXR1cm4gaS5JRF9BVFRSSUJVVEVfTkFNRSsiPSIrYShlKX0sc2V0QXR0cmlidXRlRm9ySUQ6ZnVuY3Rpb24oZSx0KXtlLnNldEF0dHJpYnV0ZShpLklEX0FUVFJJQlVURV9OQU1FLHQpfSxjcmVhdGVNYXJrdXBGb3JSb290OmZ1bmN0aW9uKCl7cmV0dXJuIGkuUk9PVF9BVFRSSUJVVEVfTkFNRSsnPSIiJ30sc2V0QXR0cmlidXRlRm9yUm9vdDpmdW5jdGlvbihlKXtlLnNldEF0dHJpYnV0ZShpLlJPT1RfQVRUUklCVVRFX05BTUUsIiIpfSxjcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3ZhciBuPWkucHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShlKT9pLnByb3BlcnRpZXNbZV06bnVsbDtpZihuKXtpZihvKG4sdCkpcmV0dXJuIiI7dmFyIHI9bi5hdHRyaWJ1dGVOYW1lO3JldHVybiBuLmhhc0Jvb2xlYW5WYWx1ZXx8bi5oYXNPdmVybG9hZGVkQm9vbGVhblZhbHVlJiZ0PT09ITA/cisnPSIiJzpyKyI9IithKHQpfXJldHVybiBpLmlzQ3VzdG9tQXR0cmlidXRlKGUpP251bGw9PXQ/IiI6ZSsiPSIrYSh0KTpudWxsfSxjcmVhdGVNYXJrdXBGb3JDdXN0b21BdHRyaWJ1dGU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcihlKSYmbnVsbCE9dD9lKyI9IithKHQpOiIifSxzZXRWYWx1ZUZvclByb3BlcnR5OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1pLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYocil7dmFyIGE9ci5tdXRhdGlvbk1ldGhvZDtpZihhKWEoZSxuKTtlbHNle2lmKG8ocixuKSlyZXR1cm4gdm9pZCB0aGlzLmRlbGV0ZVZhbHVlRm9yUHJvcGVydHkoZSx0KTtpZihyLm11c3RVc2VQcm9wZXJ0eSl7dmFyIHU9ci5wcm9wZXJ0eU5hbWU7ci5oYXNTaWRlRWZmZWN0cyYmIiIrZVt1XT09IiIrbnx8KGVbdV09bil9ZWxzZXt2YXIgcz1yLmF0dHJpYnV0ZU5hbWUsbD1yLmF0dHJpYnV0ZU5hbWVzcGFjZTtsP2Uuc2V0QXR0cmlidXRlTlMobCxzLCIiK24pOnIuaGFzQm9vbGVhblZhbHVlfHxyLmhhc092ZXJsb2FkZWRCb29sZWFuVmFsdWUmJm49PT0hMD9lLnNldEF0dHJpYnV0ZShzLCIiKTplLnNldEF0dHJpYnV0ZShzLCIiK24pfX19ZWxzZSBpZihpLmlzQ3VzdG9tQXR0cmlidXRlKHQpKXJldHVybiB2b2lkIGMuc2V0VmFsdWVGb3JBdHRyaWJ1dGUoZSx0LG4pfSxzZXRWYWx1ZUZvckF0dHJpYnV0ZTpmdW5jdGlvbihlLHQsbil7cih0KSYmKG51bGw9PW4/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6ZS5zZXRBdHRyaWJ1dGUodCwiIituKSl9LGRlbGV0ZVZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXt2YXIgbj1pLnByb3BlcnRpZXMuaGFzT3duUHJvcGVydHkodCk/aS5wcm9wZXJ0aWVzW3RdOm51bGw7aWYobil7dmFyIHI9bi5tdXRhdGlvbk1ldGhvZDtpZihyKXIoZSx2b2lkIDApO2Vsc2UgaWYobi5tdXN0VXNlUHJvcGVydHkpe3ZhciBvPW4ucHJvcGVydHlOYW1lO24uaGFzQm9vbGVhblZhbHVlP2Vbb109ITE6bi5oYXNTaWRlRWZmZWN0cyYmIiIrZVtvXT09IiJ8fChlW29dPSIiKX1lbHNlIGUucmVtb3ZlQXR0cmlidXRlKG4uYXR0cmlidXRlTmFtZSl9ZWxzZSBpLmlzQ3VzdG9tQXR0cmlidXRlKHQpJiZlLnJlbW92ZUF0dHJpYnV0ZSh0KX19O3QuZXhwb3J0cz1jfSx7MTA6MTAsMTMyOjEzMiwxNjQ6MTY0LDQwOjQwLDQ4OjQ4LDcwOjcwfV0sMTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5zdWJzdHJpbmcoMSxlLmluZGV4T2YoIiAiKSl9dmFyIG89ZSg4KSxpPWUoMTQwKSxhPWUoMTQ1KSx1PWUoMTQ2KSxzPWUoMTUwKSxsPWUoMTU0KSxjPS9eKDxbXiBcLz5dKykvLHA9ImRhdGEtZGFuZ2VyLWluZGV4IixkPXtkYW5nZXJvdXNseVJlbmRlck1hcmt1cDpmdW5jdGlvbihlKXtpLmNhblVzZURPTT92b2lkIDA6bCghMSk7Zm9yKHZhciB0LG49e30sbz0wO288ZS5sZW5ndGg7bysrKWVbb10/dm9pZCAwOmwoITEpLHQ9cihlW29dKSx0PXModCk/dDoiKiIsblt0XT1uW3RdfHxbXSxuW3RdW29dPWVbb107dmFyIGQ9W10sZj0wO2Zvcih0IGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eSh0KSl7dmFyIGgsdj1uW3RdO2ZvcihoIGluIHYpaWYodi5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIG09dltoXTt2W2hdPW0ucmVwbGFjZShjLCIkMSAiK3ArJz0iJytoKyciICcpfWZvcih2YXIgZz1hKHYuam9pbigiIiksdSkseT0wO3k8Zy5sZW5ndGg7Kyt5KXt2YXIgQz1nW3ldO0MuaGFzQXR0cmlidXRlJiZDLmhhc0F0dHJpYnV0ZShwKSYmKGg9K0MuZ2V0QXR0cmlidXRlKHApLEMucmVtb3ZlQXR0cmlidXRlKHApLGQuaGFzT3duUHJvcGVydHkoaCk/bCghMSk6dm9pZCAwLGRbaF09QyxmKz0xKX19cmV0dXJuIGYhPT1kLmxlbmd0aD9sKCExKTp2b2lkIDAsZC5sZW5ndGghPT1lLmxlbmd0aD9sKCExKTp2b2lkIDAsZH0sZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXA6ZnVuY3Rpb24oZSx0KXtpZihpLmNhblVzZURPTT92b2lkIDA6bCghMSksdD92b2lkIDA6bCghMSksIkhUTUwiPT09ZS5ub2RlTmFtZT9sKCExKTp2b2lkIDAsInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgbj1hKHQsdSlbMF07ZS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChuLGUpfWVsc2Ugby5yZXBsYWNlQ2hpbGRXaXRoVHJlZShlLHQpfX07dC5leHBvcnRzPWR9LHsxNDA6MTQwLDE0NToxNDUsMTQ2OjE0NiwxNTA6MTUwLDE1NDoxNTQsODo4fV0sMTM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTgpLG89W3Ioe1Jlc3BvbmRlckV2ZW50UGx1Z2luOm51bGx9KSxyKHtTaW1wbGVFdmVudFBsdWdpbjpudWxsfSkscih7VGFwRXZlbnRQbHVnaW46bnVsbH0pLHIoe0VudGVyTGVhdmVFdmVudFBsdWdpbjpudWxsfSkscih7Q2hhbmdlRXZlbnRQbHVnaW46bnVsbH0pLHIoe1NlbGVjdEV2ZW50UGx1Z2luOm51bGx9KSxyKHtCZWZvcmVJbnB1dEV2ZW50UGx1Z2luOm51bGx9KV07dC5leHBvcnRzPW99LHsxNTg6MTU4fV0sMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e29uQ2xpY2s6ITAsb25Eb3VibGVDbGljazohMCxvbk1vdXNlRG93bjohMCxvbk1vdXNlTW92ZTohMCxvbk1vdXNlVXA6ITAsb25DbGlja0NhcHR1cmU6ITAsb25Eb3VibGVDbGlja0NhcHR1cmU6ITAsb25Nb3VzZURvd25DYXB0dXJlOiEwLG9uTW91c2VNb3ZlQ2FwdHVyZTohMCxvbk1vdXNlVXBDYXB0dXJlOiEwfSxvPXtnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe2lmKCF0LmRpc2FibGVkKXJldHVybiB0O3ZhciBuPXt9O2Zvcih2YXIgbyBpbiB0KSFyW29dJiZ0Lmhhc093blByb3BlcnR5KG8pJiYobltvXT10W29dKTtyZXR1cm4gbn19O3QuZXhwb3J0cz1vfSx7fV0sMTU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNiksbz1lKDIwKSxpPWUoNDApLGE9ZSgxMDMpLHU9ZSgxNTgpLHM9ci50b3BMZXZlbFR5cGVzLGw9e21vdXNlRW50ZXI6e3JlZ2lzdHJhdGlvbk5hbWU6dSh7b25Nb3VzZUVudGVyOm51bGx9KSxkZXBlbmRlbmNpZXM6W3MudG9wTW91c2VPdXQscy50b3BNb3VzZU92ZXJdfSxtb3VzZUxlYXZlOntyZWdpc3RyYXRpb25OYW1lOnUoe29uTW91c2VMZWF2ZTpudWxsfSksZGVwZW5kZW5jaWVzOltzLnRvcE1vdXNlT3V0LHMudG9wTW91c2VPdmVyXX19LGM9e2V2ZW50VHlwZXM6bCxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1zLnRvcE1vdXNlT3ZlciYmKG4ucmVsYXRlZFRhcmdldHx8bi5mcm9tRWxlbWVudCkpcmV0dXJuIG51bGw7aWYoZSE9PXMudG9wTW91c2VPdXQmJmUhPT1zLnRvcE1vdXNlT3ZlcilyZXR1cm4gbnVsbDt2YXIgdTtpZihyLndpbmRvdz09PXIpdT1yO2Vsc2V7dmFyIGM9ci5vd25lckRvY3VtZW50O3U9Yz9jLmRlZmF1bHRWaWV3fHxjLnBhcmVudFdpbmRvdzp3aW5kb3d9dmFyIHAsZDtpZihlPT09cy50b3BNb3VzZU91dCl7cD10O3ZhciBmPW4ucmVsYXRlZFRhcmdldHx8bi50b0VsZW1lbnQ7ZD1mP2kuZ2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGUoZik6bnVsbH1lbHNlIHA9bnVsbCxkPXQ7aWYocD09PWQpcmV0dXJuIG51bGw7dmFyIGg9bnVsbD09cD91OmkuZ2V0Tm9kZUZyb21JbnN0YW5jZShwKSx2PW51bGw9PWQ/dTppLmdldE5vZGVGcm9tSW5zdGFuY2UoZCksbT1hLmdldFBvb2xlZChsLm1vdXNlTGVhdmUscCxuLHIpO20udHlwZT0ibW91c2VsZWF2ZSIsbS50YXJnZXQ9aCxtLnJlbGF0ZWRUYXJnZXQ9djt2YXIgZz1hLmdldFBvb2xlZChsLm1vdXNlRW50ZXIsZCxuLHIpO3JldHVybiBnLnR5cGU9Im1vdXNlZW50ZXIiLGcudGFyZ2V0PXYsZy5yZWxhdGVkVGFyZ2V0PWgsby5hY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXMobSxnLHAsZCksW20sZ119fTt0LmV4cG9ydHM9Y30sezEwMzoxMDMsMTU4OjE1OCwxNjoxNiwyMDoyMCw0MDo0MH1dLDE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU3KSxvPXIoe2J1YmJsZWQ6bnVsbCxjYXB0dXJlZDpudWxsfSksaT1yKHt0b3BBYm9ydDpudWxsLHRvcEFuaW1hdGlvbkVuZDpudWxsLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpudWxsLHRvcEFuaW1hdGlvblN0YXJ0Om51bGwsdG9wQmx1cjpudWxsLHRvcENhblBsYXk6bnVsbCx0b3BDYW5QbGF5VGhyb3VnaDpudWxsLHRvcENoYW5nZTpudWxsLHRvcENsaWNrOm51bGwsdG9wQ29tcG9zaXRpb25FbmQ6bnVsbCx0b3BDb21wb3NpdGlvblN0YXJ0Om51bGwsdG9wQ29tcG9zaXRpb25VcGRhdGU6bnVsbCx0b3BDb250ZXh0TWVudTpudWxsLHRvcENvcHk6bnVsbCx0b3BDdXQ6bnVsbCx0b3BEb3VibGVDbGljazpudWxsLHRvcERyYWc6bnVsbCx0b3BEcmFnRW5kOm51bGwsdG9wRHJhZ0VudGVyOm51bGwsdG9wRHJhZ0V4aXQ6bnVsbCx0b3BEcmFnTGVhdmU6bnVsbCx0b3BEcmFnT3ZlcjpudWxsLHRvcERyYWdTdGFydDpudWxsLHRvcERyb3A6bnVsbCx0b3BEdXJhdGlvbkNoYW5nZTpudWxsLHRvcEVtcHRpZWQ6bnVsbCx0b3BFbmNyeXB0ZWQ6bnVsbCx0b3BFbmRlZDpudWxsLHRvcEVycm9yOm51bGwsdG9wRm9jdXM6bnVsbCx0b3BJbnB1dDpudWxsLHRvcEludmFsaWQ6bnVsbCx0b3BLZXlEb3duOm51bGwsdG9wS2V5UHJlc3M6bnVsbCx0b3BLZXlVcDpudWxsLHRvcExvYWQ6bnVsbCx0b3BMb2FkZWREYXRhOm51bGwsdG9wTG9hZGVkTWV0YWRhdGE6bnVsbCx0b3BMb2FkU3RhcnQ6bnVsbCx0b3BNb3VzZURvd246bnVsbCx0b3BNb3VzZU1vdmU6bnVsbCx0b3BNb3VzZU91dDpudWxsLHRvcE1vdXNlT3ZlcjpudWxsLHRvcE1vdXNlVXA6bnVsbCx0b3BQYXN0ZTpudWxsLHRvcFBhdXNlOm51bGwsdG9wUGxheTpudWxsLHRvcFBsYXlpbmc6bnVsbCx0b3BQcm9ncmVzczpudWxsLHRvcFJhdGVDaGFuZ2U6bnVsbCx0b3BSZXNldDpudWxsLHRvcFNjcm9sbDpudWxsLHRvcFNlZWtlZDpudWxsLHRvcFNlZWtpbmc6bnVsbCx0b3BTZWxlY3Rpb25DaGFuZ2U6bnVsbCx0b3BTdGFsbGVkOm51bGwsdG9wU3VibWl0Om51bGwsdG9wU3VzcGVuZDpudWxsLHRvcFRleHRJbnB1dDpudWxsLHRvcFRpbWVVcGRhdGU6bnVsbCx0b3BUb3VjaENhbmNlbDpudWxsLHRvcFRvdWNoRW5kOm51bGwsdG9wVG91Y2hNb3ZlOm51bGwsdG9wVG91Y2hTdGFydDpudWxsLHRvcFRyYW5zaXRpb25FbmQ6bnVsbCx0b3BWb2x1bWVDaGFuZ2U6bnVsbCx0b3BXYWl0aW5nOm51bGwsdG9wV2hlZWw6bnVsbH0pLGE9e3RvcExldmVsVHlwZXM6aSxQcm9wYWdhdGlvblBoYXNlczpvfTt0LmV4cG9ydHM9YX0sezE1NzoxNTd9XSwxNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE4KSxvPWUoMTkpLGk9ZSg2MyksYT1lKDExMCksdT1lKDExOCkscz1lKDE1NCksbD17fSxjPW51bGwscD1mdW5jdGlvbihlLHQpe2UmJihvLmV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcihlLHQpLGUuaXNQZXJzaXN0ZW50KCl8fGUuY29uc3RydWN0b3IucmVsZWFzZShlKSl9LGQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSwhMCl9LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHAoZSwhMSl9LGg9e2luamVjdGlvbjp7aW5qZWN0RXZlbnRQbHVnaW5PcmRlcjpyLmluamVjdEV2ZW50UGx1Z2luT3JkZXIsaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lOnIuaW5qZWN0RXZlbnRQbHVnaW5zQnlOYW1lfSxwdXRMaXN0ZW5lcjpmdW5jdGlvbihlLHQsbil7ImZ1bmN0aW9uIiE9dHlwZW9mIG4/cyghMSk6dm9pZCAwO3ZhciBvPWxbdF18fChsW3RdPXt9KTtvW2UuX3Jvb3ROb2RlSURdPW47dmFyIGk9ci5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0XTtpJiZpLmRpZFB1dExpc3RlbmVyJiZpLmRpZFB1dExpc3RlbmVyKGUsdCxuKX0sZ2V0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbj1sW3RdO3JldHVybiBuJiZuW2UuX3Jvb3ROb2RlSURdfSxkZWxldGVMaXN0ZW5lcjpmdW5jdGlvbihlLHQpe3ZhciBuPXIucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdF07biYmbi53aWxsRGVsZXRlTGlzdGVuZXImJm4ud2lsbERlbGV0ZUxpc3RlbmVyKGUsdCk7dmFyIG89bFt0XTtvJiZkZWxldGUgb1tlLl9yb290Tm9kZUlEXX0sZGVsZXRlQWxsTGlzdGVuZXJzOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCBpbiBsKWlmKGxbdF1bZS5fcm9vdE5vZGVJRF0pe3ZhciBuPXIucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXNbdF07biYmbi53aWxsRGVsZXRlTGlzdGVuZXImJm4ud2lsbERlbGV0ZUxpc3RlbmVyKGUsdCksZGVsZXRlIGxbdF1bZS5fcm9vdE5vZGVJRF19fSxleHRyYWN0RXZlbnRzOmZ1bmN0aW9uKGUsdCxuLG8pe2Zvcih2YXIgaSx1PXIucGx1Z2lucyxzPTA7czx1Lmxlbmd0aDtzKyspe3ZhciBsPXVbc107aWYobCl7dmFyIGM9bC5leHRyYWN0RXZlbnRzKGUsdCxuLG8pO2MmJihpPWEoaSxjKSl9fXJldHVybiBpfSxlbnF1ZXVlRXZlbnRzOmZ1bmN0aW9uKGUpe2UmJihjPWEoYyxlKSl9LHByb2Nlc3NFdmVudFF1ZXVlOmZ1bmN0aW9uKGUpe3ZhciB0PWM7Yz1udWxsLGU/dSh0LGQpOnUodCxmKSxjP3MoITEpOnZvaWQgMCxpLnJldGhyb3dDYXVnaHRFcnJvcigpfSxfX3B1cmdlOmZ1bmN0aW9uKCl7bD17fX0sX19nZXRMaXN0ZW5lckJhbms6ZnVuY3Rpb24oKXtyZXR1cm4gbH19O3QuZXhwb3J0cz1ofSx7MTEwOjExMCwxMTg6MTE4LDE1NDoxNTQsMTg6MTgsMTk6MTksNjM6NjN9XSwxODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7aWYodSlmb3IodmFyIGUgaW4gcyl7dmFyIHQ9c1tlXSxuPXUuaW5kZXhPZihlKTtpZihuPi0xP3ZvaWQgMDphKCExKSwhbC5wbHVnaW5zW25dKXt0LmV4dHJhY3RFdmVudHM/dm9pZCAwOmEoITEpLGwucGx1Z2luc1tuXT10O3ZhciByPXQuZXZlbnRUeXBlcztmb3IodmFyIGkgaW4gcilvKHJbaV0sdCxpKT92b2lkIDA6YSghMSl9fX1mdW5jdGlvbiBvKGUsdCxuKXtsLmV2ZW50TmFtZURpc3BhdGNoQ29uZmlncy5oYXNPd25Qcm9wZXJ0eShuKT9hKCExKTp2b2lkIDAsbC5ldmVudE5hbWVEaXNwYXRjaENvbmZpZ3Nbbl09ZTt2YXIgcj1lLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzO2lmKHIpe2Zvcih2YXIgbyBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkobykpe3ZhciB1PXJbb107aSh1LHQsbil9cmV0dXJuITB9cmV0dXJuIGUucmVnaXN0cmF0aW9uTmFtZT8oaShlLnJlZ2lzdHJhdGlvbk5hbWUsdCxuKSwhMCk6ITF9ZnVuY3Rpb24gaShlLHQsbil7bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXT9hKCExKTp2b2lkIDAsbC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1tlXT10LGwucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXT10LmV2ZW50VHlwZXNbbl0uZGVwZW5kZW5jaWVzfXZhciBhPWUoMTU0KSx1PW51bGwscz17fSxsPXtwbHVnaW5zOltdLGV2ZW50TmFtZURpc3BhdGNoQ29uZmlnczp7fSxyZWdpc3RyYXRpb25OYW1lTW9kdWxlczp7fSxyZWdpc3RyYXRpb25OYW1lRGVwZW5kZW5jaWVzOnt9LHBvc3NpYmxlUmVnaXN0cmF0aW9uTmFtZXM6bnVsbCxpbmplY3RFdmVudFBsdWdpbk9yZGVyOmZ1bmN0aW9uKGUpe3U/YSghMSk6dm9pZCAwLHU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZSkscigpfSxpbmplY3RFdmVudFBsdWdpbnNCeU5hbWU6ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIG89ZVtuXTtzLmhhc093blByb3BlcnR5KG4pJiZzW25dPT09b3x8KHNbbl0/YSghMSk6dm9pZCAwLHNbbl09byx0PSEwKX10JiZyKCl9LGdldFBsdWdpbk1vZHVsZUZvckV2ZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUuZGlzcGF0Y2hDb25maWc7aWYodC5yZWdpc3RyYXRpb25OYW1lKXJldHVybiBsLnJlZ2lzdHJhdGlvbk5hbWVNb2R1bGVzW3QucmVnaXN0cmF0aW9uTmFtZV18fG51bGw7Zm9yKHZhciBuIGluIHQucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMpaWYodC5waGFzZWRSZWdpc3RyYXRpb25OYW1lcy5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9bC5yZWdpc3RyYXRpb25OYW1lTW9kdWxlc1t0LnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzW25dXTtpZihyKXJldHVybiByfXJldHVybiBudWxsfSxfcmVzZXRFdmVudFBsdWdpbnM6ZnVuY3Rpb24oKXt1PW51bGw7Zm9yKHZhciBlIGluIHMpcy5oYXNPd25Qcm9wZXJ0eShlKSYmZGVsZXRlIHNbZV07bC5wbHVnaW5zLmxlbmd0aD0wO3ZhciB0PWwuZXZlbnROYW1lRGlzcGF0Y2hDb25maWdzO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSB0W25dO3ZhciByPWwucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXM7Zm9yKHZhciBvIGluIHIpci5oYXNPd25Qcm9wZXJ0eShvKSYmZGVsZXRlIHJbb119fTt0LmV4cG9ydHM9bH0sezE1NDoxNTR9XSwxOTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBlPT09eS50b3BNb3VzZVVwfHxlPT09eS50b3BUb3VjaEVuZHx8ZT09PXkudG9wVG91Y2hDYW5jZWx9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT09PXkudG9wTW91c2VNb3ZlfHxlPT09eS50b3BUb3VjaE1vdmV9ZnVuY3Rpb24gaShlKXtyZXR1cm4gZT09PXkudG9wTW91c2VEb3dufHxlPT09eS50b3BUb3VjaFN0YXJ0fWZ1bmN0aW9uIGEoZSx0LG4scil7dmFyIG89ZS50eXBlfHwidW5rbm93bi1ldmVudCI7ZS5jdXJyZW50VGFyZ2V0PUMuZ2V0Tm9kZUZyb21JbnN0YW5jZShyKSx0P3YuaW52b2tlR3VhcmRlZENhbGxiYWNrV2l0aENhdGNoKG8sbixlKTp2Lmludm9rZUd1YXJkZWRDYWxsYmFjayhvLG4sZSksZS5jdXJyZW50VGFyZ2V0PW51bGx9ZnVuY3Rpb24gdShlLHQpe3ZhciBuPWUuX2Rpc3BhdGNoTGlzdGVuZXJzLHI9ZS5fZGlzcGF0Y2hJbnN0YW5jZXM7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIG89MDtvPG4ubGVuZ3RoJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO28rKylhKGUsdCxuW29dLHJbb10pO2Vsc2UgbiYmYShlLHQsbixyKTtlLl9kaXNwYXRjaExpc3RlbmVycz1udWxsLGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGx9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLl9kaXNwYXRjaExpc3RlbmVycyxuPWUuX2Rpc3BhdGNoSW5zdGFuY2VzO2lmKEFycmF5LmlzQXJyYXkodCkpe2Zvcih2YXIgcj0wO3I8dC5sZW5ndGgmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7cisrKWlmKHRbcl0oZSxuW3JdKSlyZXR1cm4gbltyXX1lbHNlIGlmKHQmJnQoZSxuKSlyZXR1cm4gbjtyZXR1cm4gbnVsbH1mdW5jdGlvbiBsKGUpe3ZhciB0PXMoZSk7cmV0dXJuIGUuX2Rpc3BhdGNoSW5zdGFuY2VzPW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCx0fWZ1bmN0aW9uIGMoZSl7dmFyIHQ9ZS5fZGlzcGF0Y2hMaXN0ZW5lcnMsbj1lLl9kaXNwYXRjaEluc3RhbmNlcztBcnJheS5pc0FycmF5KHQpP20oITEpOnZvaWQgMCxlLmN1cnJlbnRUYXJnZXQ9dD9DLmdldE5vZGVGcm9tSW5zdGFuY2Uobik6bnVsbDt2YXIgcj10P3QoZSk6bnVsbDtyZXR1cm4gZS5jdXJyZW50VGFyZ2V0PW51bGwsZS5fZGlzcGF0Y2hMaXN0ZW5lcnM9bnVsbCxlLl9kaXNwYXRjaEluc3RhbmNlcz1udWxsLHJ9ZnVuY3Rpb24gcChlKXtyZXR1cm4hIWUuX2Rpc3BhdGNoTGlzdGVuZXJzfXZhciBkLGYsaD1lKDE2KSx2PWUoNjMpLG09ZSgxNTQpLGc9KGUoMTY0KSx7aW5qZWN0Q29tcG9uZW50VHJlZTpmdW5jdGlvbihlKXtkPWV9LGluamVjdFRyZWVUcmF2ZXJzYWw6ZnVuY3Rpb24oZSl7Zj1lfX0pLHk9aC50b3BMZXZlbFR5cGVzLEM9e2lzRW5kaXNoOnIsaXNNb3ZlaXNoOm8saXNTdGFydGlzaDppLGV4ZWN1dGVEaXJlY3REaXNwYXRjaDpjLGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlcjp1LGV4ZWN1dGVEaXNwYXRjaGVzSW5PcmRlclN0b3BBdFRydWU6bCxoYXNEaXNwYXRjaGVzOnAsZ2V0SW5zdGFuY2VGcm9tTm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZC5nZXRJbnN0YW5jZUZyb21Ob2RlKGUpfSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBkLmdldE5vZGVGcm9tSW5zdGFuY2UoZSl9LGlzQW5jZXN0b3I6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZi5pc0FuY2VzdG9yKGUsdCl9LGdldExvd2VzdENvbW1vbkFuY2VzdG9yOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGYuZ2V0TG93ZXN0Q29tbW9uQW5jZXN0b3IoZSx0KX0sZ2V0UGFyZW50SW5zdGFuY2U6ZnVuY3Rpb24oZSl7cmV0dXJuIGYuZ2V0UGFyZW50SW5zdGFuY2UoZSl9LHRyYXZlcnNlVHdvUGhhc2U6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBmLnRyYXZlcnNlVHdvUGhhc2UoZSx0LG4pfSx0cmF2ZXJzZUVudGVyTGVhdmU6ZnVuY3Rpb24oZSx0LG4scixvKXtyZXR1cm4gZi50cmF2ZXJzZUVudGVyTGVhdmUoZSx0LG4scixvKX0saW5qZWN0aW9uOmd9O3QuZXhwb3J0cz1DfSx7MTU0OjE1NCwxNjoxNiwxNjQ6MTY0LDYzOjYzfV0sMjA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9dC5kaXNwYXRjaENvbmZpZy5waGFzZWRSZWdpc3RyYXRpb25OYW1lc1tuXTtyZXR1cm4gQyhlLHIpfWZ1bmN0aW9uIG8oZSx0LG4pe3ZhciBvPXQ/eS5idWJibGVkOnkuY2FwdHVyZWQsaT1yKGUsbixvKTtpJiYobi5fZGlzcGF0Y2hMaXN0ZW5lcnM9bShuLl9kaXNwYXRjaExpc3RlbmVycyxpKSxuLl9kaXNwYXRjaEluc3RhbmNlcz1tKG4uX2Rpc3BhdGNoSW5zdGFuY2VzLGUpKX1mdW5jdGlvbiBpKGUpe2UmJmUuZGlzcGF0Y2hDb25maWcucGhhc2VkUmVnaXN0cmF0aW9uTmFtZXMmJnYudHJhdmVyc2VUd29QaGFzZShlLl90YXJnZXRJbnN0LG8sZSl9ZnVuY3Rpb24gYShlKXtpZihlJiZlLmRpc3BhdGNoQ29uZmlnLnBoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzKXt2YXIgdD1lLl90YXJnZXRJbnN0LG49dD92LmdldFBhcmVudEluc3RhbmNlKHQpOm51bGw7di50cmF2ZXJzZVR3b1BoYXNlKG4sbyxlKX19ZnVuY3Rpb24gdShlLHQsbil7aWYobiYmbi5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lKXt2YXIgcj1uLmRpc3BhdGNoQ29uZmlnLnJlZ2lzdHJhdGlvbk5hbWUsbz1DKGUscik7byYmKG4uX2Rpc3BhdGNoTGlzdGVuZXJzPW0obi5fZGlzcGF0Y2hMaXN0ZW5lcnMsbyksbi5fZGlzcGF0Y2hJbnN0YW5jZXM9bShuLl9kaXNwYXRjaEluc3RhbmNlcyxlKSl9fWZ1bmN0aW9uIHMoZSl7ZSYmZS5kaXNwYXRjaENvbmZpZy5yZWdpc3RyYXRpb25OYW1lJiZ1KGUuX3RhcmdldEluc3QsbnVsbCxlKX1mdW5jdGlvbiBsKGUpe2coZSxpKX1mdW5jdGlvbiBjKGUpe2coZSxhKX1mdW5jdGlvbiBwKGUsdCxuLHIpe3YudHJhdmVyc2VFbnRlckxlYXZlKG4scix1LGUsdCl9ZnVuY3Rpb24gZChlKXtnKGUscyl9dmFyIGY9ZSgxNiksaD1lKDE3KSx2PWUoMTkpLG09ZSgxMTApLGc9ZSgxMTgpLHk9KGUoMTY0KSxmLlByb3BhZ2F0aW9uUGhhc2VzKSxDPWguZ2V0TGlzdGVuZXIsYj17YWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlczpsLGFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXNTa2lwVGFyZ2V0OmMsYWNjdW11bGF0ZURpcmVjdERpc3BhdGNoZXM6ZCxhY2N1bXVsYXRlRW50ZXJMZWF2ZURpc3BhdGNoZXM6cH07dC5leHBvcnRzPWJ9LHsxMTA6MTEwLDExODoxMTgsMTY6MTYsMTY0OjE2NCwxNzoxNywxOToxOX1dLDIxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dGhpcy5fcm9vdD1lLHRoaXMuX3N0YXJ0VGV4dD10aGlzLmdldFRleHQoKSx0aGlzLl9mYWxsYmFja1RleHQ9bnVsbH12YXIgbz1lKDE2NSksaT1lKDI1KSxhPWUoMTI2KTtvKHIucHJvdG90eXBlLHtkZXN0cnVjdG9yOmZ1bmN0aW9uKCl7dGhpcy5fcm9vdD1udWxsLHRoaXMuX3N0YXJ0VGV4dD1udWxsLHRoaXMuX2ZhbGxiYWNrVGV4dD1udWxsfSxnZXRUZXh0OmZ1bmN0aW9uKCl7cmV0dXJuInZhbHVlImluIHRoaXMuX3Jvb3Q/dGhpcy5fcm9vdC52YWx1ZTp0aGlzLl9yb290W2EoKV19LGdldERhdGE6ZnVuY3Rpb24oKXtpZih0aGlzLl9mYWxsYmFja1RleHQpcmV0dXJuIHRoaXMuX2ZhbGxiYWNrVGV4dDt2YXIgZSx0LG49dGhpcy5fc3RhcnRUZXh0LHI9bi5sZW5ndGgsbz10aGlzLmdldFRleHQoKSxpPW8ubGVuZ3RoO2ZvcihlPTA7cj5lJiZuW2VdPT09b1tlXTtlKyspO3ZhciBhPXItZTtmb3IodD0xO2E+PXQmJm5bci10XT09PW9baS10XTt0KyspO3ZhciB1PXQ+MT8xLXQ6dm9pZCAwO3JldHVybiB0aGlzLl9mYWxsYmFja1RleHQ9by5zbGljZShlLHUpLHRoaXMuX2ZhbGxiYWNrVGV4dH19KSxpLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEyNjoxMjYsMTY1OjE2NSwyNToyNX1dLDIyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTApLG89ci5pbmplY3Rpb24uTVVTVF9VU0VfUFJPUEVSVFksaT1yLmluamVjdGlvbi5IQVNfQk9PTEVBTl9WQUxVRSxhPXIuaW5qZWN0aW9uLkhBU19TSURFX0VGRkVDVFMsdT1yLmluamVjdGlvbi5IQVNfTlVNRVJJQ19WQUxVRSxzPXIuaW5qZWN0aW9uLkhBU19QT1NJVElWRV9OVU1FUklDX1ZBTFVFLGw9ci5pbmplY3Rpb24uSEFTX09WRVJMT0FERURfQk9PTEVBTl9WQUxVRSxjPXtpc0N1c3RvbUF0dHJpYnV0ZTpSZWdFeHAucHJvdG90eXBlLnRlc3QuYmluZChuZXcgUmVnRXhwKCJeKGRhdGF8YXJpYSktWyIrci5BVFRSSUJVVEVfTkFNRV9DSEFSKyJdKiQiKSksUHJvcGVydGllczp7YWNjZXB0OjAsYWNjZXB0Q2hhcnNldDowLGFjY2Vzc0tleTowLGFjdGlvbjowLGFsbG93RnVsbFNjcmVlbjppLGFsbG93VHJhbnNwYXJlbmN5OjAsYWx0OjAsYXN5bmM6aSxhdXRvQ29tcGxldGU6MCxhdXRvUGxheTppLGNhcHR1cmU6aSxjZWxsUGFkZGluZzowLGNlbGxTcGFjaW5nOjAsY2hhclNldDowLGNoYWxsZW5nZTowLGNoZWNrZWQ6b3xpLGNpdGU6MCxjbGFzc0lEOjAsY2xhc3NOYW1lOjAsY29sczpzLGNvbFNwYW46MCxjb250ZW50OjAsY29udGVudEVkaXRhYmxlOjAsY29udGV4dE1lbnU6MCxjb250cm9sczppLGNvb3JkczowLGNyb3NzT3JpZ2luOjAsZGF0YTowLGRhdGVUaW1lOjAsImRlZmF1bHQiOmksZGVmZXI6aSxkaXI6MCxkaXNhYmxlZDppLGRvd25sb2FkOmwsZHJhZ2dhYmxlOjAsZW5jVHlwZTowLGZvcm06MCxmb3JtQWN0aW9uOjAsZm9ybUVuY1R5cGU6MCxmb3JtTWV0aG9kOjAsZm9ybU5vVmFsaWRhdGU6aSxmb3JtVGFyZ2V0OjAsZnJhbWVCb3JkZXI6MCxoZWFkZXJzOjAsaGVpZ2h0OjAsaGlkZGVuOmksaGlnaDowLGhyZWY6MCxocmVmTGFuZzowLGh0bWxGb3I6MCxodHRwRXF1aXY6MCxpY29uOjAsaWQ6MCxpbnB1dE1vZGU6MCxpbnRlZ3JpdHk6MCxpczowLGtleVBhcmFtczowLGtleVR5cGU6MCxraW5kOjAsbGFiZWw6MCxsYW5nOjAsbGlzdDowLGxvb3A6aSxsb3c6MCxtYW5pZmVzdDowLG1hcmdpbkhlaWdodDowLG1hcmdpbldpZHRoOjAsbWF4OjAsbWF4TGVuZ3RoOjAsbWVkaWE6MCxtZWRpYUdyb3VwOjAsbWV0aG9kOjAsbWluOjAsbWluTGVuZ3RoOjAsbXVsdGlwbGU6b3xpLG11dGVkOm98aSxuYW1lOjAsbm9uY2U6MCxub1ZhbGlkYXRlOmksb3BlbjppLG9wdGltdW06MCxwYXR0ZXJuOjAscGxhY2Vob2xkZXI6MCxwb3N0ZXI6MCxwcmVsb2FkOjAscHJvZmlsZTowLHJhZGlvR3JvdXA6MCxyZWFkT25seTppLHJlbDowLHJlcXVpcmVkOmkscmV2ZXJzZWQ6aSxyb2xlOjAscm93czpzLHJvd1NwYW46dSxzYW5kYm94OjAsc2NvcGU6MCxzY29wZWQ6aSxzY3JvbGxpbmc6MCxzZWFtbGVzczppLHNlbGVjdGVkOm98aSxzaGFwZTowLHNpemU6cyxzaXplczowLHNwYW46cyxzcGVsbENoZWNrOjAsc3JjOjAsc3JjRG9jOjAsc3JjTGFuZzowLHNyY1NldDowLHN0YXJ0OnUsc3RlcDowLHN0eWxlOjAsc3VtbWFyeTowLHRhYkluZGV4OjAsdGFyZ2V0OjAsdGl0bGU6MCx0eXBlOjAsdXNlTWFwOjAsdmFsdWU6b3xhLHdpZHRoOjAsd21vZGU6MCx3cmFwOjAsYWJvdXQ6MCxkYXRhdHlwZTowLGlubGlzdDowLHByZWZpeDowLHByb3BlcnR5OjAscmVzb3VyY2U6MCwidHlwZW9mIjowLHZvY2FiOjAsYXV0b0NhcGl0YWxpemU6MCxhdXRvQ29ycmVjdDowLGF1dG9TYXZlOjAsY29sb3I6MCxpdGVtUHJvcDowLGl0ZW1TY29wZTppLGl0ZW1UeXBlOjAsaXRlbUlEOjAsaXRlbVJlZjowLHJlc3VsdHM6MCxzZWN1cml0eTowLHVuc2VsZWN0YWJsZTowfSxET01BdHRyaWJ1dGVOYW1lczp7YWNjZXB0Q2hhcnNldDoiYWNjZXB0LWNoYXJzZXQiLGNsYXNzTmFtZToiY2xhc3MiLGh0bWxGb3I6ImZvciIsaHR0cEVxdWl2OiJodHRwLWVxdWl2In0sRE9NUHJvcGVydHlOYW1lczp7fX07dC5leHBvcnRzPWN9LHsxMDoxMH1dLDIzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9L1s9Ol0vZyxuPXsiPSI6Ij0wIiwiOiI6Ij0yIn0scj0oIiIrZSkucmVwbGFjZSh0LGZ1bmN0aW9uKGUpe3JldHVybiBuW2VdfSk7cmV0dXJuIiQiK3J9ZnVuY3Rpb24gbyhlKXt2YXIgdD0vKD0wfD0yKS9nLG49eyI9MCI6Ij0iLCI9MiI6IjoifSxyPSIuIj09PWVbMF0mJiIkIj09PWVbMV0/ZS5zdWJzdHJpbmcoMik6ZS5zdWJzdHJpbmcoMSk7cmV0dXJuKCIiK3IpLnJlcGxhY2UodCxmdW5jdGlvbihlKXtyZXR1cm4gbltlXX0pfXZhciBpPXtlc2NhcGU6cix1bmVzY2FwZTpvfTt0LmV4cG9ydHM9aX0se31dLDI0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7bnVsbCE9ZS5jaGVja2VkTGluayYmbnVsbCE9ZS52YWx1ZUxpbms/bCghMSk6dm9pZCAwfWZ1bmN0aW9uIG8oZSl7cihlKSxudWxsIT1lLnZhbHVlfHxudWxsIT1lLm9uQ2hhbmdlP2woITEpOnZvaWQgMH1mdW5jdGlvbiBpKGUpe3IoZSksbnVsbCE9ZS5jaGVja2VkfHxudWxsIT1lLm9uQ2hhbmdlP2woITEpOnZvaWQgMH1mdW5jdGlvbiBhKGUpe2lmKGUpe3ZhciB0PWUuZ2V0TmFtZSgpO2lmKHQpcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIit0KyJgLiJ9cmV0dXJuIiJ9dmFyIHU9ZSg4MSkscz1lKDgwKSxsPWUoMTU0KSxjPShlKDE2NCkse2J1dHRvbjohMCxjaGVja2JveDohMCxpbWFnZTohMCxoaWRkZW46ITAscmFkaW86ITAscmVzZXQ6ITAsc3VibWl0OiEwfSkscD17dmFsdWU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiFlW3RdfHxjW2UudHlwZV18fGUub25DaGFuZ2V8fGUucmVhZE9ubHl8fGUuZGlzYWJsZWQ/bnVsbDpuZXcgRXJyb3IoIllvdSBwcm92aWRlZCBhIGB2YWx1ZWAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRWYWx1ZWAuIE90aGVyd2lzZSwgc2V0IGVpdGhlciBgb25DaGFuZ2VgIG9yIGByZWFkT25seWAuIil9LGNoZWNrZWQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiFlW3RdfHxlLm9uQ2hhbmdlfHxlLnJlYWRPbmx5fHxlLmRpc2FibGVkP251bGw6bmV3IEVycm9yKCJZb3UgcHJvdmlkZWQgYSBgY2hlY2tlZGAgcHJvcCB0byBhIGZvcm0gZmllbGQgd2l0aG91dCBhbiBgb25DaGFuZ2VgIGhhbmRsZXIuIFRoaXMgd2lsbCByZW5kZXIgYSByZWFkLW9ubHkgZmllbGQuIElmIHRoZSBmaWVsZCBzaG91bGQgYmUgbXV0YWJsZSB1c2UgYGRlZmF1bHRDaGVja2VkYC4gT3RoZXJ3aXNlLCBzZXQgZWl0aGVyIGBvbkNoYW5nZWAgb3IgYHJlYWRPbmx5YC4iKX0sb25DaGFuZ2U6dS5mdW5jfSxkPXt9LGY9e2NoZWNrUHJvcFR5cGVzOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHIgaW4gcCl7aWYocC5oYXNPd25Qcm9wZXJ0eShyKSl2YXIgbz1wW3JdKHQscixlLHMucHJvcCk7byBpbnN0YW5jZW9mIEVycm9yJiYhKG8ubWVzc2FnZSBpbiBkKSYmKGRbby5tZXNzYWdlXT0hMCxhKG4pKX19LGdldFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay52YWx1ZSk6ZS52YWx1ZX0sZ2V0Q2hlY2tlZDpmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnZhbHVlKTplLmNoZWNrZWR9LGV4ZWN1dGVPbkNoYW5nZTpmdW5jdGlvbihlLHQpe3JldHVybiBlLnZhbHVlTGluaz8obyhlKSxlLnZhbHVlTGluay5yZXF1ZXN0Q2hhbmdlKHQudGFyZ2V0LnZhbHVlKSk6ZS5jaGVja2VkTGluaz8oaShlKSxlLmNoZWNrZWRMaW5rLnJlcXVlc3RDaGFuZ2UodC50YXJnZXQuY2hlY2tlZCkpOmUub25DaGFuZ2U/ZS5vbkNoYW5nZS5jYWxsKHZvaWQgMCx0KTp2b2lkIDB9fTt0LmV4cG9ydHM9Zn0sezE1NDoxNTQsMTY0OjE2NCw4MDo4MCw4MTo4MX1dLDI1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7aWYodC5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgbj10Lmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gdC5jYWxsKG4sZSksbn1yZXR1cm4gbmV3IHQoZSl9LGk9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzO2lmKG4uaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIHI9bi5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIG4uY2FsbChyLGUsdCkscn1yZXR1cm4gbmV3IG4oZSx0KX0sYT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihyLmluc3RhbmNlUG9vbC5sZW5ndGgpe3ZhciBvPXIuaW5zdGFuY2VQb29sLnBvcCgpO3JldHVybiByLmNhbGwobyxlLHQsbiksb31yZXR1cm4gbmV3IHIoZSx0LG4pfSx1PWZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPXRoaXM7aWYoby5pbnN0YW5jZVBvb2wubGVuZ3RoKXt2YXIgaT1vLmluc3RhbmNlUG9vbC5wb3AoKTtyZXR1cm4gby5jYWxsKGksZSx0LG4sciksaX1yZXR1cm4gbmV3IG8oZSx0LG4scil9LHM9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaT10aGlzO2lmKGkuaW5zdGFuY2VQb29sLmxlbmd0aCl7dmFyIGE9aS5pbnN0YW5jZVBvb2wucG9wKCk7cmV0dXJuIGkuY2FsbChhLGUsdCxuLHIsbyksYX1yZXR1cm4gbmV3IGkoZSx0LG4scixvKX0sbD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2UgaW5zdGFuY2VvZiB0P3ZvaWQgMDpyKCExKSxlLmRlc3RydWN0b3IoKSx0Lmluc3RhbmNlUG9vbC5sZW5ndGg8dC5wb29sU2l6ZSYmdC5pbnN0YW5jZVBvb2wucHVzaChlKX0sYz0xMCxwPW8sZD1mdW5jdGlvbihlLHQpe3ZhciBuPWU7cmV0dXJuIG4uaW5zdGFuY2VQb29sPVtdLG4uZ2V0UG9vbGVkPXR8fHAsbi5wb29sU2l6ZXx8KG4ucG9vbFNpemU9Yyksbi5yZWxlYXNlPWwsbn0sZj17YWRkUG9vbGluZ1RvOmQsb25lQXJndW1lbnRQb29sZXI6byx0d29Bcmd1bWVudFBvb2xlcjppLHRocmVlQXJndW1lbnRQb29sZXI6YSxmb3VyQXJndW1lbnRQb29sZXI6dSxmaXZlQXJndW1lbnRQb29sZXI6c307dC5leHBvcnRzPWZ9LHsxNTQ6MTU0fV0sMjY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgyOSksaT1lKDMxKSxhPWUoMzApLHU9ZSg0NCkscz1lKDYwKSxsPShlKDYxKSxlKDgxKSksYz1lKDkxKSxwPWUoMTMxKSxkPShlKDE2NCkscy5jcmVhdGVFbGVtZW50KSxmPXMuY3JlYXRlRmFjdG9yeSxoPXMuY2xvbmVFbGVtZW50LHY9cixtPXsKQ2hpbGRyZW46e21hcDpvLm1hcCxmb3JFYWNoOm8uZm9yRWFjaCxjb3VudDpvLmNvdW50LHRvQXJyYXk6by50b0FycmF5LG9ubHk6cH0sQ29tcG9uZW50OmksY3JlYXRlRWxlbWVudDpkLGNsb25lRWxlbWVudDpoLGlzVmFsaWRFbGVtZW50OnMuaXNWYWxpZEVsZW1lbnQsUHJvcFR5cGVzOmwsY3JlYXRlQ2xhc3M6YS5jcmVhdGVDbGFzcyxjcmVhdGVGYWN0b3J5OmYsY3JlYXRlTWl4aW46ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LERPTTp1LHZlcnNpb246YyxfX3NwcmVhZDp2fTt0LmV4cG9ydHM9bX0sezEzMToxMzEsMTY0OjE2NCwxNjU6MTY1LDI5OjI5LDMwOjMwLDMxOjMxLDQ0OjQ0LDYwOjYwLDYxOjYxLDgxOjgxLDkxOjkxfV0sMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbSl8fChlW21dPWgrKyxkW2VbbV1dPXt9KSxkW2VbbV1dfXZhciBvLGk9ZSgxNjUpLGE9ZSgxNiksdT1lKDE4KSxzPWUoNjQpLGw9ZSgxMDkpLGM9ZSgxMjcpLHA9ZSgxMjkpLGQ9e30sZj0hMSxoPTAsdj17dG9wQWJvcnQ6ImFib3J0Iix0b3BBbmltYXRpb25FbmQ6YygiYW5pbWF0aW9uZW5kIil8fCJhbmltYXRpb25lbmQiLHRvcEFuaW1hdGlvbkl0ZXJhdGlvbjpjKCJhbmltYXRpb25pdGVyYXRpb24iKXx8ImFuaW1hdGlvbml0ZXJhdGlvbiIsdG9wQW5pbWF0aW9uU3RhcnQ6YygiYW5pbWF0aW9uc3RhcnQiKXx8ImFuaW1hdGlvbnN0YXJ0Iix0b3BCbHVyOiJibHVyIix0b3BDYW5QbGF5OiJjYW5wbGF5Iix0b3BDYW5QbGF5VGhyb3VnaDoiY2FucGxheXRocm91Z2giLHRvcENoYW5nZToiY2hhbmdlIix0b3BDbGljazoiY2xpY2siLHRvcENvbXBvc2l0aW9uRW5kOiJjb21wb3NpdGlvbmVuZCIsdG9wQ29tcG9zaXRpb25TdGFydDoiY29tcG9zaXRpb25zdGFydCIsdG9wQ29tcG9zaXRpb25VcGRhdGU6ImNvbXBvc2l0aW9udXBkYXRlIix0b3BDb250ZXh0TWVudToiY29udGV4dG1lbnUiLHRvcENvcHk6ImNvcHkiLHRvcEN1dDoiY3V0Iix0b3BEb3VibGVDbGljazoiZGJsY2xpY2siLHRvcERyYWc6ImRyYWciLHRvcERyYWdFbmQ6ImRyYWdlbmQiLHRvcERyYWdFbnRlcjoiZHJhZ2VudGVyIix0b3BEcmFnRXhpdDoiZHJhZ2V4aXQiLHRvcERyYWdMZWF2ZToiZHJhZ2xlYXZlIix0b3BEcmFnT3ZlcjoiZHJhZ292ZXIiLHRvcERyYWdTdGFydDoiZHJhZ3N0YXJ0Iix0b3BEcm9wOiJkcm9wIix0b3BEdXJhdGlvbkNoYW5nZToiZHVyYXRpb25jaGFuZ2UiLHRvcEVtcHRpZWQ6ImVtcHRpZWQiLHRvcEVuY3J5cHRlZDoiZW5jcnlwdGVkIix0b3BFbmRlZDoiZW5kZWQiLHRvcEVycm9yOiJlcnJvciIsdG9wRm9jdXM6ImZvY3VzIix0b3BJbnB1dDoiaW5wdXQiLHRvcEtleURvd246ImtleWRvd24iLHRvcEtleVByZXNzOiJrZXlwcmVzcyIsdG9wS2V5VXA6ImtleXVwIix0b3BMb2FkZWREYXRhOiJsb2FkZWRkYXRhIix0b3BMb2FkZWRNZXRhZGF0YToibG9hZGVkbWV0YWRhdGEiLHRvcExvYWRTdGFydDoibG9hZHN0YXJ0Iix0b3BNb3VzZURvd246Im1vdXNlZG93biIsdG9wTW91c2VNb3ZlOiJtb3VzZW1vdmUiLHRvcE1vdXNlT3V0OiJtb3VzZW91dCIsdG9wTW91c2VPdmVyOiJtb3VzZW92ZXIiLHRvcE1vdXNlVXA6Im1vdXNldXAiLHRvcFBhc3RlOiJwYXN0ZSIsdG9wUGF1c2U6InBhdXNlIix0b3BQbGF5OiJwbGF5Iix0b3BQbGF5aW5nOiJwbGF5aW5nIix0b3BQcm9ncmVzczoicHJvZ3Jlc3MiLHRvcFJhdGVDaGFuZ2U6InJhdGVjaGFuZ2UiLHRvcFNjcm9sbDoic2Nyb2xsIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU2VsZWN0aW9uQ2hhbmdlOiJzZWxlY3Rpb25jaGFuZ2UiLHRvcFN0YWxsZWQ6InN0YWxsZWQiLHRvcFN1c3BlbmQ6InN1c3BlbmQiLHRvcFRleHRJbnB1dDoidGV4dElucHV0Iix0b3BUaW1lVXBkYXRlOiJ0aW1ldXBkYXRlIix0b3BUb3VjaENhbmNlbDoidG91Y2hjYW5jZWwiLHRvcFRvdWNoRW5kOiJ0b3VjaGVuZCIsdG9wVG91Y2hNb3ZlOiJ0b3VjaG1vdmUiLHRvcFRvdWNoU3RhcnQ6InRvdWNoc3RhcnQiLHRvcFRyYW5zaXRpb25FbmQ6YygidHJhbnNpdGlvbmVuZCIpfHwidHJhbnNpdGlvbmVuZCIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmciLHRvcFdoZWVsOiJ3aGVlbCJ9LG09Il9yZWFjdExpc3RlbmVyc0lEIitTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMiksZz1pKHt9LHMse1JlYWN0RXZlbnRMaXN0ZW5lcjpudWxsLGluamVjdGlvbjp7aW5qZWN0UmVhY3RFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGUpe2Uuc2V0SGFuZGxlVG9wTGV2ZWwoZy5oYW5kbGVUb3BMZXZlbCksZy5SZWFjdEV2ZW50TGlzdGVuZXI9ZX19LHNldEVuYWJsZWQ6ZnVuY3Rpb24oZSl7Zy5SZWFjdEV2ZW50TGlzdGVuZXImJmcuUmVhY3RFdmVudExpc3RlbmVyLnNldEVuYWJsZWQoZSl9LGlzRW5hYmxlZDpmdW5jdGlvbigpe3JldHVybiEoIWcuUmVhY3RFdmVudExpc3RlbmVyfHwhZy5SZWFjdEV2ZW50TGlzdGVuZXIuaXNFbmFibGVkKCkpfSxsaXN0ZW5UbzpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj10LG89cihuKSxpPXUucmVnaXN0cmF0aW9uTmFtZURlcGVuZGVuY2llc1tlXSxzPWEudG9wTGV2ZWxUeXBlcyxsPTA7bDxpLmxlbmd0aDtsKyspe3ZhciBjPWlbbF07by5oYXNPd25Qcm9wZXJ0eShjKSYmb1tjXXx8KGM9PT1zLnRvcFdoZWVsP3AoIndoZWVsIik/Zy5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChzLnRvcFdoZWVsLCJ3aGVlbCIsbik6cCgibW91c2V3aGVlbCIpP2cuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BXaGVlbCwibW91c2V3aGVlbCIsbik6Zy5SZWFjdEV2ZW50TGlzdGVuZXIudHJhcEJ1YmJsZWRFdmVudChzLnRvcFdoZWVsLCJET01Nb3VzZVNjcm9sbCIsbik6Yz09PXMudG9wU2Nyb2xsP3AoInNjcm9sbCIsITApP2cuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHMudG9wU2Nyb2xsLCJzY3JvbGwiLG4pOmcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BTY3JvbGwsInNjcm9sbCIsZy5SZWFjdEV2ZW50TGlzdGVuZXIuV0lORE9XX0hBTkRMRSk6Yz09PXMudG9wRm9jdXN8fGM9PT1zLnRvcEJsdXI/KHAoImZvY3VzIiwhMCk/KGcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBDYXB0dXJlZEV2ZW50KHMudG9wRm9jdXMsImZvY3VzIixuKSxnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChzLnRvcEJsdXIsImJsdXIiLG4pKTpwKCJmb2N1c2luIikmJihnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KHMudG9wRm9jdXMsImZvY3VzaW4iLG4pLGcuUmVhY3RFdmVudExpc3RlbmVyLnRyYXBCdWJibGVkRXZlbnQocy50b3BCbHVyLCJmb2N1c291dCIsbikpLG9bcy50b3BCbHVyXT0hMCxvW3MudG9wRm9jdXNdPSEwKTp2Lmhhc093blByb3BlcnR5KGMpJiZnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGMsdltjXSxuKSxvW2NdPSEwKX19LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQnViYmxlZEV2ZW50KGUsdCxuKX0sdHJhcENhcHR1cmVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBnLlJlYWN0RXZlbnRMaXN0ZW5lci50cmFwQ2FwdHVyZWRFdmVudChlLHQsbil9LGVuc3VyZVNjcm9sbFZhbHVlTW9uaXRvcmluZzpmdW5jdGlvbigpe2lmKHZvaWQgMD09PW8mJihvPWRvY3VtZW50LmNyZWF0ZUV2ZW50JiYicGFnZVgiaW4gZG9jdW1lbnQuY3JlYXRlRXZlbnQoIk1vdXNlRXZlbnQiKSksIW8mJiFmKXt2YXIgZT1sLnJlZnJlc2hTY3JvbGxWYWx1ZXM7Zy5SZWFjdEV2ZW50TGlzdGVuZXIubW9uaXRvclNjcm9sbFZhbHVlKGUpLGY9ITB9fX0pO3QuZXhwb3J0cz1nfSx7MTA5OjEwOSwxMjc6MTI3LDEyOToxMjksMTY6MTYsMTY1OjE2NSwxODoxOCw2NDo2NH1dLDI4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPXZvaWQgMD09PWVbbl07bnVsbCE9dCYmciYmKGVbbl09aSh0KSl9dmFyIG89ZSg4MyksaT1lKDEyOCksYT0oZSgyMyksZSgxMzYpKSx1PWUoMTM3KSxzPShlKDE2NCkse2luc3RhbnRpYXRlQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe2lmKG51bGw9PWUpcmV0dXJuIG51bGw7dmFyIG89e307cmV0dXJuIHUoZSxyLG8pLG99LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIsdSl7aWYodHx8ZSl7dmFyIHMsbDtmb3IocyBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocykpe2w9ZSYmZVtzXTt2YXIgYz1sJiZsLl9jdXJyZW50RWxlbWVudCxwPXRbc107aWYobnVsbCE9bCYmYShjLHApKW8ucmVjZWl2ZUNvbXBvbmVudChsLHAscix1KSx0W3NdPWw7ZWxzZXtsJiYobltzXT1vLmdldE5hdGl2ZU5vZGUobCksby51bm1vdW50Q29tcG9uZW50KGwsITEpKTt2YXIgZD1pKHApO3Rbc109ZH19Zm9yKHMgaW4gZSkhZS5oYXNPd25Qcm9wZXJ0eShzKXx8dCYmdC5oYXNPd25Qcm9wZXJ0eShzKXx8KGw9ZVtzXSxuW3NdPW8uZ2V0TmF0aXZlTm9kZShsKSxvLnVubW91bnRDb21wb25lbnQobCwhMSkpfX0sdW5tb3VudENoaWxkcmVuOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShuKSl7dmFyIHI9ZVtuXTtvLnVubW91bnRDb21wb25lbnQocix0KX19fSk7dC5leHBvcnRzPXN9LHsxMjg6MTI4LDEzNjoxMzYsMTM3OjEzNywxNjQ6MTY0LDIzOjIzLDgzOjgzfV0sMjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShiLCIkJi8iKX1mdW5jdGlvbiBvKGUsdCl7dGhpcy5mdW5jPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGkoZSx0LG4pe3ZhciByPWUuZnVuYyxvPWUuY29udGV4dDtyLmNhbGwobyx0LGUuY291bnQrKyl9ZnVuY3Rpb24gYShlLHQsbil7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgcj1vLmdldFBvb2xlZCh0LG4pO2coZSxpLHIpLG8ucmVsZWFzZShyKX1mdW5jdGlvbiB1KGUsdCxuLHIpe3RoaXMucmVzdWx0PWUsdGhpcy5rZXlQcmVmaXg9dCx0aGlzLmZ1bmM9bix0aGlzLmNvbnRleHQ9cix0aGlzLmNvdW50PTB9ZnVuY3Rpb24gcyhlLHQsbil7dmFyIG89ZS5yZXN1bHQsaT1lLmtleVByZWZpeCxhPWUuZnVuYyx1PWUuY29udGV4dCxzPWEuY2FsbCh1LHQsZS5jb3VudCsrKTtBcnJheS5pc0FycmF5KHMpP2wocyxvLG4sbS50aGF0UmV0dXJuc0FyZ3VtZW50KTpudWxsIT1zJiYodi5pc1ZhbGlkRWxlbWVudChzKSYmKHM9di5jbG9uZUFuZFJlcGxhY2VLZXkocyxpKyghcy5rZXl8fHQmJnQua2V5PT09cy5rZXk/IiI6cihzLmtleSkrIi8iKStuKSksby5wdXNoKHMpKX1mdW5jdGlvbiBsKGUsdCxuLG8saSl7dmFyIGE9IiI7bnVsbCE9biYmKGE9cihuKSsiLyIpO3ZhciBsPXUuZ2V0UG9vbGVkKHQsYSxvLGkpO2coZSxzLGwpLHUucmVsZWFzZShsKX1mdW5jdGlvbiBjKGUsdCxuKXtpZihudWxsPT1lKXJldHVybiBlO3ZhciByPVtdO3JldHVybiBsKGUscixudWxsLHQsbikscn1mdW5jdGlvbiBwKGUsdCxuKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBkKGUsdCl7cmV0dXJuIGcoZSxwLG51bGwpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9W107cmV0dXJuIGwoZSx0LG51bGwsbS50aGF0UmV0dXJuc0FyZ3VtZW50KSx0fXZhciBoPWUoMjUpLHY9ZSg2MCksbT1lKDE0NiksZz1lKDEzNykseT1oLnR3b0FyZ3VtZW50UG9vbGVyLEM9aC5mb3VyQXJndW1lbnRQb29sZXIsYj0vXC8rL2c7by5wcm90b3R5cGUuZGVzdHJ1Y3Rvcj1mdW5jdGlvbigpe3RoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0saC5hZGRQb29saW5nVG8obyx5KSx1LnByb3RvdHlwZS5kZXN0cnVjdG9yPWZ1bmN0aW9uKCl7dGhpcy5yZXN1bHQ9bnVsbCx0aGlzLmtleVByZWZpeD1udWxsLHRoaXMuZnVuYz1udWxsLHRoaXMuY29udGV4dD1udWxsLHRoaXMuY291bnQ9MH0saC5hZGRQb29saW5nVG8odSxDKTt2YXIgXz17Zm9yRWFjaDphLG1hcDpjLG1hcEludG9XaXRoS2V5UHJlZml4SW50ZXJuYWw6bCxjb3VudDpkLHRvQXJyYXk6Zn07dC5leHBvcnRzPV99LHsxMzc6MTM3LDE0NjoxNDYsMjU6MjUsNjA6NjB9XSwzMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG49RS5oYXNPd25Qcm9wZXJ0eSh0KT9FW3RdOm51bGw7Ti5oYXNPd25Qcm9wZXJ0eSh0KSYmKG4hPT1iLk9WRVJSSURFX0JBU0U/bSghMSk6dm9pZCAwKSxlJiYobiE9PWIuREVGSU5FX01BTlkmJm4hPT1iLkRFRklORV9NQU5ZX01FUkdFRD9tKCExKTp2b2lkIDApfWZ1bmN0aW9uIG8oZSx0KXtpZih0KXsiZnVuY3Rpb24iPT10eXBlb2YgdD9tKCExKTp2b2lkIDAsZi5pc1ZhbGlkRWxlbWVudCh0KT9tKCExKTp2b2lkIDA7dmFyIG49ZS5wcm90b3R5cGUsbz1uLl9fcmVhY3RBdXRvQmluZFBhaXJzO3QuaGFzT3duUHJvcGVydHkoQykmJngubWl4aW5zKGUsdC5taXhpbnMpO2Zvcih2YXIgaSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaSkmJmkhPT1DKXt2YXIgYT10W2ldLGw9bi5oYXNPd25Qcm9wZXJ0eShpKTtpZihyKGwsaSkseC5oYXNPd25Qcm9wZXJ0eShpKSl4W2ldKGUsYSk7ZWxzZXt2YXIgYz1FLmhhc093blByb3BlcnR5KGkpLHA9ImZ1bmN0aW9uIj09dHlwZW9mIGEsZD1wJiYhYyYmIWwmJnQuYXV0b2JpbmQhPT0hMTtpZihkKW8ucHVzaChpLGEpLG5baV09YTtlbHNlIGlmKGwpe3ZhciBoPUVbaV07IWN8fGghPT1iLkRFRklORV9NQU5ZX01FUkdFRCYmaCE9PWIuREVGSU5FX01BTlk/bSghMSk6dm9pZCAwLGg9PT1iLkRFRklORV9NQU5ZX01FUkdFRD9uW2ldPXUobltpXSxhKTpoPT09Yi5ERUZJTkVfTUFOWSYmKG5baV09cyhuW2ldLGEpKX1lbHNlIG5baV09YX19fX1mdW5jdGlvbiBpKGUsdCl7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZih0Lmhhc093blByb3BlcnR5KG4pKXt2YXIgbz1uIGluIHg7bz9tKCExKTp2b2lkIDA7dmFyIGk9biBpbiBlO2k/bSghMSk6dm9pZCAwLGVbbl09cn19fWZ1bmN0aW9uIGEoZSx0KXtlJiZ0JiYib2JqZWN0Ij09dHlwZW9mIGUmJiJvYmplY3QiPT10eXBlb2YgdD92b2lkIDA6bSghMSk7Zm9yKHZhciBuIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShuKSYmKHZvaWQgMCE9PWVbbl0/bSghMSk6dm9pZCAwLGVbbl09dFtuXSk7cmV0dXJuIGV9ZnVuY3Rpb24gdShlLHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLHI9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7aWYobnVsbD09bilyZXR1cm4gcjtpZihudWxsPT1yKXJldHVybiBuO3ZhciBvPXt9O3JldHVybiBhKG8sbiksYShvLHIpLG99fWZ1bmN0aW9uIHMoZSx0KXtyZXR1cm4gZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gbChlLHQpe3ZhciBuPXQuYmluZChlKTtyZXR1cm4gbn1mdW5jdGlvbiBjKGUpe2Zvcih2YXIgdD1lLl9fcmVhY3RBdXRvQmluZFBhaXJzLG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl0sbz10W24rMV07ZVtyXT1sKGUsbyl9fXZhciBwPWUoMTY1KSxkPWUoMzEpLGY9ZSg2MCksaD0oZSg4MCksZSg3OSksZSg3NykpLHY9ZSgxNDcpLG09ZSgxNTQpLGc9ZSgxNTcpLHk9ZSgxNTgpLEM9KGUoMTY0KSx5KHttaXhpbnM6bnVsbH0pKSxiPWcoe0RFRklORV9PTkNFOm51bGwsREVGSU5FX01BTlk6bnVsbCxPVkVSUklERV9CQVNFOm51bGwsREVGSU5FX01BTllfTUVSR0VEOm51bGx9KSxfPVtdLEU9e21peGluczpiLkRFRklORV9NQU5ZLHN0YXRpY3M6Yi5ERUZJTkVfTUFOWSxwcm9wVHlwZXM6Yi5ERUZJTkVfTUFOWSxjb250ZXh0VHlwZXM6Yi5ERUZJTkVfTUFOWSxjaGlsZENvbnRleHRUeXBlczpiLkRFRklORV9NQU5ZLGdldERlZmF1bHRQcm9wczpiLkRFRklORV9NQU5ZX01FUkdFRCxnZXRJbml0aWFsU3RhdGU6Yi5ERUZJTkVfTUFOWV9NRVJHRUQsZ2V0Q2hpbGRDb250ZXh0OmIuREVGSU5FX01BTllfTUVSR0VELHJlbmRlcjpiLkRFRklORV9PTkNFLGNvbXBvbmVudFdpbGxNb3VudDpiLkRFRklORV9NQU5ZLGNvbXBvbmVudERpZE1vdW50OmIuREVGSU5FX01BTlksY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczpiLkRFRklORV9NQU5ZLHNob3VsZENvbXBvbmVudFVwZGF0ZTpiLkRFRklORV9PTkNFLGNvbXBvbmVudFdpbGxVcGRhdGU6Yi5ERUZJTkVfTUFOWSxjb21wb25lbnREaWRVcGRhdGU6Yi5ERUZJTkVfTUFOWSxjb21wb25lbnRXaWxsVW5tb3VudDpiLkRFRklORV9NQU5ZLHVwZGF0ZUNvbXBvbmVudDpiLk9WRVJSSURFX0JBU0V9LHg9e2Rpc3BsYXlOYW1lOmZ1bmN0aW9uKGUsdCl7ZS5kaXNwbGF5TmFtZT10fSxtaXhpbnM6ZnVuY3Rpb24oZSx0KXtpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKW8oZSx0W25dKX0sY2hpbGRDb250ZXh0VHlwZXM6ZnVuY3Rpb24oZSx0KXtlLmNoaWxkQ29udGV4dFR5cGVzPXAoe30sZS5jaGlsZENvbnRleHRUeXBlcyx0KX0sY29udGV4dFR5cGVzOmZ1bmN0aW9uKGUsdCl7ZS5jb250ZXh0VHlwZXM9cCh7fSxlLmNvbnRleHRUeXBlcyx0KX0sZ2V0RGVmYXVsdFByb3BzOmZ1bmN0aW9uKGUsdCl7ZS5nZXREZWZhdWx0UHJvcHM/ZS5nZXREZWZhdWx0UHJvcHM9dShlLmdldERlZmF1bHRQcm9wcyx0KTplLmdldERlZmF1bHRQcm9wcz10fSxwcm9wVHlwZXM6ZnVuY3Rpb24oZSx0KXtlLnByb3BUeXBlcz1wKHt9LGUucHJvcFR5cGVzLHQpfSxzdGF0aWNzOmZ1bmN0aW9uKGUsdCl7aShlLHQpfSxhdXRvYmluZDpmdW5jdGlvbigpe319LE49e3JlcGxhY2VTdGF0ZTpmdW5jdGlvbihlLHQpe3RoaXMudXBkYXRlci5lbnF1ZXVlUmVwbGFjZVN0YXRlKHRoaXMsZSksdCYmdGhpcy51cGRhdGVyLmVucXVldWVDYWxsYmFjayh0aGlzLHQsInJlcGxhY2VTdGF0ZSIpfSxpc01vdW50ZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cGRhdGVyLmlzTW91bnRlZCh0aGlzKX19LFQ9ZnVuY3Rpb24oKXt9O3AoVC5wcm90b3R5cGUsZC5wcm90b3R5cGUsTik7dmFyIFA9e2NyZWF0ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKGUsdCxuKXt0aGlzLl9fcmVhY3RBdXRvQmluZFBhaXJzLmxlbmd0aCYmYyh0aGlzKSx0aGlzLnByb3BzPWUsdGhpcy5jb250ZXh0PXQsdGhpcy5yZWZzPXYsdGhpcy51cGRhdGVyPW58fGgsdGhpcy5zdGF0ZT1udWxsO3ZhciByPXRoaXMuZ2V0SW5pdGlhbFN0YXRlP3RoaXMuZ2V0SW5pdGlhbFN0YXRlKCk6bnVsbDsib2JqZWN0IiE9dHlwZW9mIHJ8fEFycmF5LmlzQXJyYXkocik/bSghMSk6dm9pZCAwLHRoaXMuc3RhdGU9cn07dC5wcm90b3R5cGU9bmV3IFQsdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5fX3JlYWN0QXV0b0JpbmRQYWlycz1bXSxfLmZvckVhY2goby5iaW5kKG51bGwsdCkpLG8odCxlKSx0LmdldERlZmF1bHRQcm9wcyYmKHQuZGVmYXVsdFByb3BzPXQuZ2V0RGVmYXVsdFByb3BzKCkpLHQucHJvdG90eXBlLnJlbmRlcj92b2lkIDA6bSghMSk7Zm9yKHZhciBuIGluIEUpdC5wcm90b3R5cGVbbl18fCh0LnByb3RvdHlwZVtuXT1udWxsKTtyZXR1cm4gdH0saW5qZWN0aW9uOntpbmplY3RNaXhpbjpmdW5jdGlvbihlKXtfLnB1c2goZSl9fX07dC5leHBvcnRzPVB9LHsxNDc6MTQ3LDE1NDoxNTQsMTU3OjE1NywxNTg6MTU4LDE2NDoxNjQsMTY1OjE2NSwzMTozMSw2MDo2MCw3Nzo3Nyw3OTo3OSw4MDo4MH1dLDMxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3RoaXMucHJvcHM9ZSx0aGlzLmNvbnRleHQ9dCx0aGlzLnJlZnM9aSx0aGlzLnVwZGF0ZXI9bnx8b312YXIgbz1lKDc3KSxpPShlKDcwKSxlKDExMiksZSgxNDcpKSxhPWUoMTU0KTtlKDE2NCk7ci5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxyLnByb3RvdHlwZS5zZXRTdGF0ZT1mdW5jdGlvbihlLHQpeyJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUmJm51bGwhPWU/YSghMSk6dm9pZCAwLHRoaXMudXBkYXRlci5lbnF1ZXVlU2V0U3RhdGUodGhpcyxlKSx0JiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsdCwic2V0U3RhdGUiKX0sci5wcm90b3R5cGUuZm9yY2VVcGRhdGU9ZnVuY3Rpb24oZSl7dGhpcy51cGRhdGVyLmVucXVldWVGb3JjZVVwZGF0ZSh0aGlzKSxlJiZ0aGlzLnVwZGF0ZXIuZW5xdWV1ZUNhbGxiYWNrKHRoaXMsZSwiZm9yY2VVcGRhdGUiKX07dC5leHBvcnRzPXJ9LHsxMTI6MTEyLDE0NzoxNDcsMTU0OjE1NCwxNjQ6MTY0LDcwOjcwLDc3Ojc3fV0sMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg3KSxvPWUoNDYpLGk9e3Byb2Nlc3NDaGlsZHJlblVwZGF0ZXM6by5kYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXMscmVwbGFjZU5vZGVXaXRoTWFya3VwOnIuZGFuZ2Vyb3VzbHlSZXBsYWNlTm9kZVdpdGhNYXJrdXAsdW5tb3VudElERnJvbUVudmlyb25tZW50OmZ1bmN0aW9uKGUpe319O3QuZXhwb3J0cz1pfSx7NDY6NDYsNzo3fV0sMzM6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTQpLG89ITEsaT17dW5tb3VudElERnJvbUVudmlyb25tZW50Om51bGwscmVwbGFjZU5vZGVXaXRoTWFya3VwOm51bGwscHJvY2Vzc0NoaWxkcmVuVXBkYXRlczpudWxsLGluamVjdGlvbjp7aW5qZWN0RW52aXJvbm1lbnQ6ZnVuY3Rpb24oZSl7bz9yKCExKTp2b2lkIDAsaS51bm1vdW50SURGcm9tRW52aXJvbm1lbnQ9ZS51bm1vdW50SURGcm9tRW52aXJvbm1lbnQsaS5yZXBsYWNlTm9kZVdpdGhNYXJrdXA9ZS5yZXBsYWNlTm9kZVdpdGhNYXJrdXAsaS5wcm9jZXNzQ2hpbGRyZW5VcGRhdGVzPWUucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyxvPSEwfX19O3QuZXhwb3J0cz1pfSx7MTU0OjE1NH1dLDM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQuX293bmVyfHxudWxsO2lmKHQpe3ZhciBuPXQuZ2V0TmFtZSgpO2lmKG4pcmV0dXJuIiBDaGVjayB0aGUgcmVuZGVyIG1ldGhvZCBvZiBgIituKyJgLiJ9cmV0dXJuIiJ9ZnVuY3Rpb24gbyhlKXt9ZnVuY3Rpb24gaShlLHQpe31mdW5jdGlvbiBhKGUpe3JldHVybiBlLnByb3RvdHlwZSYmZS5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudH12YXIgdT1lKDE2NSkscz1lKDMzKSxsPWUoMzUpLGM9ZSg2MCkscD1lKDYzKSxkPWUoNjkpLGY9KGUoNzApLGUoNzYpKSxoPWUoODApLHY9KGUoNzkpLGUoODMpKSxtPWUoODkpLGc9ZSgxNDcpLHk9ZSgxNTQpLEM9ZSgxMzYpO2UoMTY0KTtvLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgZT1kLmdldCh0aGlzKS5fY3VycmVudEVsZW1lbnQudHlwZSx0PWUodGhpcy5wcm9wcyx0aGlzLmNvbnRleHQsdGhpcy51cGRhdGVyKTtyZXR1cm4gaShlLHQpLHR9O3ZhciBiPTEsXz17Y29uc3RydWN0OmZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fcm9vdE5vZGVJRD1udWxsLHRoaXMuX2luc3RhbmNlPW51bGwsdGhpcy5fbmF0aXZlUGFyZW50PW51bGwsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1udWxsLHRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGwsdGhpcy5fcGVuZGluZ0VsZW1lbnQ9bnVsbCx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZT1udWxsLHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlPSExLHRoaXMuX3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2NvbnRleHQ9bnVsbCx0aGlzLl9tb3VudE9yZGVyPTAsdGhpcy5fdG9wTGV2ZWxXcmFwcGVyPW51bGwsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50PSExfSxtb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyKXt0aGlzLl9jb250ZXh0PXIsdGhpcy5fbW91bnRPcmRlcj1iKyssdGhpcy5fbmF0aXZlUGFyZW50PXQsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1uO3ZhciB1LHM9dGhpcy5fcHJvY2Vzc1Byb3BzKHRoaXMuX2N1cnJlbnRFbGVtZW50LnByb3BzKSxsPXRoaXMuX3Byb2Nlc3NDb250ZXh0KHIpLHA9dGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxmPXRoaXMuX2NvbnN0cnVjdENvbXBvbmVudChzLGwpO2EocCl8fG51bGwhPWYmJm51bGwhPWYucmVuZGVyfHwodT1mLGkocCx1KSxudWxsPT09Znx8Zj09PSExfHxjLmlzVmFsaWRFbGVtZW50KGYpP3ZvaWQgMDp5KCExKSxmPW5ldyBvKHApKSxmLnByb3BzPXMsZi5jb250ZXh0PWwsZi5yZWZzPWcsZi51cGRhdGVyPW0sdGhpcy5faW5zdGFuY2U9ZixkLnNldChmLHRoaXMpO3ZhciBoPWYuc3RhdGU7dm9pZCAwPT09aCYmKGYuc3RhdGU9aD1udWxsKSwib2JqZWN0IiE9dHlwZW9mIGh8fEFycmF5LmlzQXJyYXkoaCk/eSghMSk6dm9pZCAwLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITE7dmFyIHY7cmV0dXJuIHY9Zi51bnN0YWJsZV9oYW5kbGVFcnJvcj90aGlzLnBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZyh1LHQsbixlLHIpOnRoaXMucGVyZm9ybUluaXRpYWxNb3VudCh1LHQsbixlLHIpLGYuY29tcG9uZW50RGlkTW91bnQmJmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShmLmNvbXBvbmVudERpZE1vdW50LGYpLHZ9LF9jb25zdHJ1Y3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5fY29uc3RydWN0Q29tcG9uZW50V2l0aG91dE93bmVyKGUsdCl9LF9jb25zdHJ1Y3RDb21wb25lbnRXaXRob3V0T3duZXI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGU7cmV0dXJuIG49YShyKT9uZXcgcihlLHQsbSk6cihlLHQsbSl9LHBlcmZvcm1Jbml0aWFsTW91bnRXaXRoRXJyb3JIYW5kbGluZzpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGE9ci5jaGVja3BvaW50KCk7dHJ5e2k9dGhpcy5wZXJmb3JtSW5pdGlhbE1vdW50KGUsdCxuLHIsbyl9Y2F0Y2godSl7ci5yb2xsYmFjayhhKSx0aGlzLl9pbnN0YW5jZS51bnN0YWJsZV9oYW5kbGVFcnJvcih1KSx0aGlzLl9wZW5kaW5nU3RhdGVRdWV1ZSYmKHRoaXMuX2luc3RhbmNlLnN0YXRlPXRoaXMuX3Byb2Nlc3NQZW5kaW5nU3RhdGUodGhpcy5faW5zdGFuY2UucHJvcHMsdGhpcy5faW5zdGFuY2UuY29udGV4dCkpLGE9ci5jaGVja3BvaW50KCksdGhpcy5fcmVuZGVyZWRDb21wb25lbnQudW5tb3VudENvbXBvbmVudCghMCksci5yb2xsYmFjayhhKSxpPXRoaXMucGVyZm9ybUluaXRpYWxNb3VudChlLHQsbixyLG8pfXJldHVybiBpfSxwZXJmb3JtSW5pdGlhbE1vdW50OmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9dGhpcy5faW5zdGFuY2U7aS5jb21wb25lbnRXaWxsTW91bnQmJihpLmNvbXBvbmVudFdpbGxNb3VudCgpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlJiYoaS5zdGF0ZT10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGkucHJvcHMsaS5jb250ZXh0KSkpLHZvaWQgMD09PWUmJihlPXRoaXMuX3JlbmRlclZhbGlkYXRlZENvbXBvbmVudCgpKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPWYuZ2V0VHlwZShlKSx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KGUpO3ZhciBhPXYubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQscix0LG4sdGhpcy5fcHJvY2Vzc0NoaWxkQ29udGV4dChvKSk7cmV0dXJuIGF9LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gdi5nZXROYXRpdmVOb2RlKHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50KX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtpZih0aGlzLl9yZW5kZXJlZENvbXBvbmVudCl7dmFyIHQ9dGhpcy5faW5zdGFuY2U7aWYodC5jb21wb25lbnRXaWxsVW5tb3VudCYmIXQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50KWlmKHQuX2NhbGxlZENvbXBvbmVudFdpbGxVbm1vdW50PSEwLGUpe3ZhciBuPXRoaXMuZ2V0TmFtZSgpKyIuY29tcG9uZW50V2lsbFVubW91bnQoKSI7cC5pbnZva2VHdWFyZGVkQ2FsbGJhY2sobix0LmNvbXBvbmVudFdpbGxVbm1vdW50LmJpbmQodCkpfWVsc2UgdC5jb21wb25lbnRXaWxsVW5tb3VudCgpO3RoaXMuX3JlbmRlcmVkQ29tcG9uZW50JiYodi51bm1vdW50Q29tcG9uZW50KHRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LGUpLHRoaXMuX3JlbmRlcmVkTm9kZVR5cGU9bnVsbCx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD1udWxsLHRoaXMuX2luc3RhbmNlPW51bGwpLHRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlPW51bGwsdGhpcy5fcGVuZGluZ1JlcGxhY2VTdGF0ZT0hMSx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU9ITEsdGhpcy5fcGVuZGluZ0NhbGxiYWNrcz1udWxsLHRoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy5fY29udGV4dD1udWxsLHRoaXMuX3Jvb3ROb2RlSUQ9bnVsbCx0aGlzLl90b3BMZXZlbFdyYXBwZXI9bnVsbCxkLnJlbW92ZSh0KX19LF9tYXNrQ29udGV4dDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlLG49dC5jb250ZXh0VHlwZXM7aWYoIW4pcmV0dXJuIGc7dmFyIHI9e307Zm9yKHZhciBvIGluIG4pcltvXT1lW29dO3JldHVybiByfSxfcHJvY2Vzc0NvbnRleHQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fbWFza0NvbnRleHQoZSk7cmV0dXJuIHR9LF9wcm9jZXNzQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsbj10aGlzLl9pbnN0YW5jZSxyPW4uZ2V0Q2hpbGRDb250ZXh0JiZuLmdldENoaWxkQ29udGV4dCgpO2lmKHIpeyJvYmplY3QiIT10eXBlb2YgdC5jaGlsZENvbnRleHRUeXBlcz95KCExKTp2b2lkIDA7Zm9yKHZhciBvIGluIHIpbyBpbiB0LmNoaWxkQ29udGV4dFR5cGVzP3ZvaWQgMDp5KCExKTtyZXR1cm4gdSh7fSxlLHIpfXJldHVybiBlfSxfcHJvY2Vzc1Byb3BzOmZ1bmN0aW9uKGUpe3JldHVybiBlfSxfY2hlY2tQcm9wVHlwZXM6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPXRoaXMuZ2V0TmFtZSgpO2Zvcih2YXIgaSBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaSkpe3ZhciBhO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgZVtpXT95KCExKTp2b2lkIDAsYT1lW2ldKHQsaSxvLG4pfWNhdGNoKHUpe2E9dX1hIGluc3RhbmNlb2YgRXJyb3ImJihyKHRoaXMpLG49PT1oLnByb3ApfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9jb250ZXh0O3RoaXMuX3BlbmRpbmdFbGVtZW50PW51bGwsdGhpcy51cGRhdGVDb21wb25lbnQodCxyLGUsbyxuKX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUpe251bGwhPXRoaXMuX3BlbmRpbmdFbGVtZW50P3YucmVjZWl2ZUNvbXBvbmVudCh0aGlzLHRoaXMuX3BlbmRpbmdFbGVtZW50LGUsdGhpcy5fY29udGV4dCk6bnVsbCE9PXRoaXMuX3BlbmRpbmdTdGF0ZVF1ZXVlfHx0aGlzLl9wZW5kaW5nRm9yY2VVcGRhdGU/dGhpcy51cGRhdGVDb21wb25lbnQoZSx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jdXJyZW50RWxlbWVudCx0aGlzLl9jb250ZXh0LHRoaXMuX2NvbnRleHQpOnRoaXMuX3VwZGF0ZUJhdGNoTnVtYmVyPW51bGx9LHVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEsdT10aGlzLl9pbnN0YW5jZSxzPSExO3RoaXMuX2NvbnRleHQ9PT1vP2k9dS5jb250ZXh0OihpPXRoaXMuX3Byb2Nlc3NDb250ZXh0KG8pLHM9ITApLHQ9PT1uP2E9bi5wcm9wczooYT10aGlzLl9wcm9jZXNzUHJvcHMobi5wcm9wcykscz0hMCkscyYmdS5jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzJiZ1LmNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMoYSxpKTt2YXIgbD10aGlzLl9wcm9jZXNzUGVuZGluZ1N0YXRlKGEsaSksYz0hMDshdGhpcy5fcGVuZGluZ0ZvcmNlVXBkYXRlJiZ1LnNob3VsZENvbXBvbmVudFVwZGF0ZSYmKGM9dS5zaG91bGRDb21wb25lbnRVcGRhdGUoYSxsLGkpKSx0aGlzLl91cGRhdGVCYXRjaE51bWJlcj1udWxsLGM/KHRoaXMuX3BlbmRpbmdGb3JjZVVwZGF0ZT0hMSx0aGlzLl9wZXJmb3JtQ29tcG9uZW50VXBkYXRlKG4sYSxsLGksZSxvKSk6KHRoaXMuX2N1cnJlbnRFbGVtZW50PW4sdGhpcy5fY29udGV4dD1vLHUucHJvcHM9YSx1LnN0YXRlPWwsdS5jb250ZXh0PWkpfSxfcHJvY2Vzc1BlbmRpbmdTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX2luc3RhbmNlLHI9dGhpcy5fcGVuZGluZ1N0YXRlUXVldWUsbz10aGlzLl9wZW5kaW5nUmVwbGFjZVN0YXRlO2lmKHRoaXMuX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITEsdGhpcy5fcGVuZGluZ1N0YXRlUXVldWU9bnVsbCwhcilyZXR1cm4gbi5zdGF0ZTtpZihvJiYxPT09ci5sZW5ndGgpcmV0dXJuIHJbMF07Zm9yKHZhciBpPXUoe30sbz9yWzBdOm4uc3RhdGUpLGE9bz8xOjA7YTxyLmxlbmd0aDthKyspe3ZhciBzPXJbYV07dShpLCJmdW5jdGlvbiI9PXR5cGVvZiBzP3MuY2FsbChuLGksZSx0KTpzKX1yZXR1cm4gaX0sX3BlcmZvcm1Db21wb25lbnRVcGRhdGU6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhLHUscyxsPXRoaXMuX2luc3RhbmNlLGM9Qm9vbGVhbihsLmNvbXBvbmVudERpZFVwZGF0ZSk7YyYmKGE9bC5wcm9wcyx1PWwuc3RhdGUscz1sLmNvbnRleHQpLGwuY29tcG9uZW50V2lsbFVwZGF0ZSYmbC5jb21wb25lbnRXaWxsVXBkYXRlKHQsbixyKSx0aGlzLl9jdXJyZW50RWxlbWVudD1lLHRoaXMuX2NvbnRleHQ9aSxsLnByb3BzPXQsbC5zdGF0ZT1uLGwuY29udGV4dD1yLHRoaXMuX3VwZGF0ZVJlbmRlcmVkQ29tcG9uZW50KG8saSksYyYmby5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGwuY29tcG9uZW50RGlkVXBkYXRlLmJpbmQobCxhLHUscyksbCl9LF91cGRhdGVSZW5kZXJlZENvbXBvbmVudDpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMuX3JlbmRlcmVkQ29tcG9uZW50LHI9bi5fY3VycmVudEVsZW1lbnQsbz10aGlzLl9yZW5kZXJWYWxpZGF0ZWRDb21wb25lbnQoKTtpZihDKHIsbykpdi5yZWNlaXZlQ29tcG9uZW50KG4sbyxlLHRoaXMuX3Byb2Nlc3NDaGlsZENvbnRleHQodCkpO2Vsc2V7dmFyIGk9di5nZXROYXRpdmVOb2RlKG4pO3YudW5tb3VudENvbXBvbmVudChuLCExKSx0aGlzLl9yZW5kZXJlZE5vZGVUeXBlPWYuZ2V0VHlwZShvKSx0aGlzLl9yZW5kZXJlZENvbXBvbmVudD10aGlzLl9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50KG8pO3ZhciBhPXYubW91bnRDb21wb25lbnQodGhpcy5fcmVuZGVyZWRDb21wb25lbnQsZSx0aGlzLl9uYXRpdmVQYXJlbnQsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbyx0aGlzLl9wcm9jZXNzQ2hpbGRDb250ZXh0KHQpKTt0aGlzLl9yZXBsYWNlTm9kZVdpdGhNYXJrdXAoaSxhLG4pfX0sX3JlcGxhY2VOb2RlV2l0aE1hcmt1cDpmdW5jdGlvbihlLHQsbil7cy5yZXBsYWNlTm9kZVdpdGhNYXJrdXAoZSx0LG4pfSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5faW5zdGFuY2UsdD1lLnJlbmRlcigpO3JldHVybiB0fSxfcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50OmZ1bmN0aW9uKCl7dmFyIGU7bC5jdXJyZW50PXRoaXM7dHJ5e2U9dGhpcy5fcmVuZGVyVmFsaWRhdGVkQ29tcG9uZW50V2l0aG91dE93bmVyT3JDb250ZXh0KCl9ZmluYWxseXtsLmN1cnJlbnQ9bnVsbH1yZXR1cm4gbnVsbD09PWV8fGU9PT0hMXx8Yy5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6eSghMSksZX0sYXR0YWNoUmVmOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5nZXRQdWJsaWNJbnN0YW5jZSgpO251bGw9PW4/eSghMSk6dm9pZCAwO3ZhciByPXQuZ2V0UHVibGljSW5zdGFuY2UoKSxvPW4ucmVmcz09PWc/bi5yZWZzPXt9Om4ucmVmcztvW2VdPXJ9LGRldGFjaFJlZjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmdldFB1YmxpY0luc3RhbmNlKCkucmVmcztkZWxldGUgdFtlXX0sZ2V0TmFtZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2N1cnJlbnRFbGVtZW50LnR5cGUsdD10aGlzLl9pbnN0YW5jZSYmdGhpcy5faW5zdGFuY2UuY29uc3RydWN0b3I7cmV0dXJuIGUuZGlzcGxheU5hbWV8fHQmJnQuZGlzcGxheU5hbWV8fGUubmFtZXx8dCYmdC5uYW1lfHxudWxsfSxnZXRQdWJsaWNJbnN0YW5jZTpmdW5jdGlvbigpe3ZhciBlPXRoaXMuX2luc3RhbmNlO3JldHVybiBlIGluc3RhbmNlb2Ygbz9udWxsOmV9LF9pbnN0YW50aWF0ZVJlYWN0Q29tcG9uZW50Om51bGx9LEU9e01peGluOl99O3QuZXhwb3J0cz1FfSx7MTM2OjEzNiwxNDc6MTQ3LDE1NDoxNTQsMTY0OjE2NCwxNjU6MTY1LDMzOjMzLDM1OjM1LDYwOjYwLDYzOjYzLDY5OjY5LDcwOjcwLDc2Ojc2LDc5Ojc5LDgwOjgwLDgzOjgzLDg5Ojg5fV0sMzU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJlbnQ6bnVsbH07dC5leHBvcnRzPXJ9LHt9XSwzNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQwKSxvPWUoNTkpLGk9ZSg3MiksYT1lKDgzKSx1PWUoOTApLHM9ZSg5MSksbD1lKDExNiksYz1lKDEyNCkscD1lKDEzMyk7ZSgxNjQpO28uaW5qZWN0KCk7dmFyIGQ9e2ZpbmRET01Ob2RlOmwscmVuZGVyOmkucmVuZGVyLHVubW91bnRDb21wb25lbnRBdE5vZGU6aS51bm1vdW50Q29tcG9uZW50QXROb2RlLHZlcnNpb246cyx1bnN0YWJsZV9iYXRjaGVkVXBkYXRlczp1LmJhdGNoZWRVcGRhdGVzLHVuc3RhYmxlX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyOnB9OyJ1bmRlZmluZWQiIT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fJiYiZnVuY3Rpb24iPT10eXBlb2YgX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCYmX19SRUFDVF9ERVZUT09MU19HTE9CQUxfSE9PS19fLmluamVjdCh7Q29tcG9uZW50VHJlZTp7Z2V0Q2xvc2VzdEluc3RhbmNlRnJvbU5vZGU6ci5nZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZSxnZXROb2RlRnJvbUluc3RhbmNlOmZ1bmN0aW9uKGUpe3JldHVybiBlLl9yZW5kZXJlZENvbXBvbmVudCYmKGU9YyhlKSksZT9yLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk6bnVsbH19LE1vdW50OmksUmVjb25jaWxlcjphfSk7dC5leHBvcnRzPWR9LHsxMTY6MTE2LDEyNDoxMjQsMTMzOjEzMywxNjQ6MTY0LDQwOjQwLDU5OjU5LDcyOjcyLDgzOjgzLDkwOjkwLDkxOjkxfV0sMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNCksbz17Z2V0TmF0aXZlUHJvcHM6ci5nZXROYXRpdmVQcm9wc307dC5leHBvcnRzPW99LHsxNDoxNH1dLDM4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXt0JiYoWFtlLl90YWddJiYobnVsbCE9dC5jaGlsZHJlbnx8bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTD9PKCExKTp2b2lkIDApLG51bGwhPXQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJihudWxsIT10LmNoaWxkcmVuP08oITEpOnZvaWQgMCwib2JqZWN0Ij09dHlwZW9mIHQuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJksgaW4gdC5kYW5nZXJvdXNseVNldElubmVySFRNTD92b2lkIDA6TyghMSkpLG51bGwhPXQuc3R5bGUmJiJvYmplY3QiIT10eXBlb2YgdC5zdHlsZT9PKCExKTp2b2lkIDApfWZ1bmN0aW9uIG8oZSx0LG4scil7aWYoIShyIGluc3RhbmNlb2YgRCkpe3ZhciBvPWUuX25hdGl2ZUNvbnRhaW5lckluZm8sYT1vLl9ub2RlJiZvLl9ub2RlLm5vZGVUeXBlPT09cSx1PWE/by5fbm9kZTpvLl9vd25lckRvY3VtZW50O1YodCx1KSxyLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUoaSx7aW5zdDplLHJlZ2lzdHJhdGlvbk5hbWU6dCxsaXN0ZW5lcjpufSl9fWZ1bmN0aW9uIGkoKXt2YXIgZT10aGlzO2IucHV0TGlzdGVuZXIoZS5pbnN0LGUucmVnaXN0cmF0aW9uTmFtZSxlLmxpc3RlbmVyKX1mdW5jdGlvbiBhKCl7dmFyIGU9dGhpcztTLnBvc3RNb3VudFdyYXBwZXIoZSl9ZnVuY3Rpb24gdSgpe3ZhciBlPXRoaXM7ZS5fcm9vdE5vZGVJRD92b2lkIDA6TyghMSk7dmFyIHQ9RihlKTtzd2l0Y2godD92b2lkIDA6TyghMSksZS5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wTG9hZCwibG9hZCIsdCldO2JyZWFrO2Nhc2UidmlkZW8iOmNhc2UiYXVkaW8iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W107Zm9yKHZhciBuIGluIFkpWS5oYXNPd25Qcm9wZXJ0eShuKSYmZS5fd3JhcHBlclN0YXRlLmxpc3RlbmVycy5wdXNoKEUudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXNbbl0sWVtuXSx0KSk7YnJlYWs7Y2FzZSJpbWciOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wRXJyb3IsImVycm9yIix0KSxFLnRyYXBCdWJibGVkRXZlbnQoQy50b3BMZXZlbFR5cGVzLnRvcExvYWQsImxvYWQiLHQpXTticmVhaztjYXNlImZvcm0iOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wUmVzZXQsInJlc2V0Iix0KSxFLnRyYXBCdWJibGVkRXZlbnQoQy50b3BMZXZlbFR5cGVzLnRvcFN1Ym1pdCwic3VibWl0Iix0KV07YnJlYWs7Y2FzZSJpbnB1dCI6Y2FzZSJzZWxlY3QiOmNhc2UidGV4dGFyZWEiOmUuX3dyYXBwZXJTdGF0ZS5saXN0ZW5lcnM9W0UudHJhcEJ1YmJsZWRFdmVudChDLnRvcExldmVsVHlwZXMudG9wSW52YWxpZCwiaW52YWxpZCIsdCldfX1mdW5jdGlvbiBzKCl7TS5wb3N0VXBkYXRlV3JhcHBlcih0aGlzKX1mdW5jdGlvbiBsKGUpe1ouY2FsbCgkLGUpfHwoUS50ZXN0KGUpP3ZvaWQgMDpPKCExKSwkW2VdPSEwKX1mdW5jdGlvbiBjKGUsdCl7cmV0dXJuIGUuaW5kZXhPZigiLSIpPj0wfHxudWxsIT10LmlzfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9ZS50eXBlO2wodCksdGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLl90YWc9dC50b0xvd2VyQ2FzZSgpLHRoaXMuX25hbWVzcGFjZVVSST1udWxsLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbCx0aGlzLl9wcmV2aW91c1N0eWxlPW51bGwsdGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCx0aGlzLl9uYXRpdmVOb2RlPW51bGwsdGhpcy5fbmF0aXZlUGFyZW50PW51bGwsdGhpcy5fcm9vdE5vZGVJRD1udWxsLHRoaXMuX2RvbUlEPW51bGwsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbz1udWxsLHRoaXMuX3dyYXBwZXJTdGF0ZT1udWxsLHRoaXMuX3RvcExldmVsV3JhcHBlcj1udWxsLHRoaXMuX2ZsYWdzPTB9dmFyIGQ9ZSgxNjUpLGY9ZSgxKSxoPWUoNCksdj1lKDgpLG09ZSg5KSxnPWUoMTApLHk9ZSgxMSksQz1lKDE2KSxiPWUoMTcpLF89ZSgxOCksRT1lKDI3KSx4PWUoMzIpLE49ZSgzNyksVD1lKDM5KSxQPWUoNDApLHc9ZSg0NyksUz1lKDQ5KSxNPWUoNTApLGs9ZSg1NCksUj0oZSg3MCksZSg3MykpLEQ9ZSg4NyksST0oZSgxNDYpLGUoMTE1KSksTz1lKDE1NCksQT0oZSgxMjkpLGUoMTU4KSksTD0oZSgxNjMpLGUoMTM4KSxlKDE2NCksVCksVT1iLmRlbGV0ZUxpc3RlbmVyLEY9UC5nZXROb2RlRnJvbUluc3RhbmNlLFY9RS5saXN0ZW5UbyxCPV8ucmVnaXN0cmF0aW9uTmFtZU1vZHVsZXMsaj17c3RyaW5nOiEwLG51bWJlcjohMH0sVz1BKHtzdHlsZTpudWxsfSksSz1BKHtfX2h0bWw6bnVsbH0pLEg9e2NoaWxkcmVuOm51bGwsZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw6bnVsbCxzdXBwcmVzc0NvbnRlbnRFZGl0YWJsZVdhcm5pbmc6bnVsbH0scT0xMSxZPXt0b3BBYm9ydDoiYWJvcnQiLHRvcENhblBsYXk6ImNhbnBsYXkiLHRvcENhblBsYXlUaHJvdWdoOiJjYW5wbGF5dGhyb3VnaCIsdG9wRHVyYXRpb25DaGFuZ2U6ImR1cmF0aW9uY2hhbmdlIix0b3BFbXB0aWVkOiJlbXB0aWVkIix0b3BFbmNyeXB0ZWQ6ImVuY3J5cHRlZCIsdG9wRW5kZWQ6ImVuZGVkIix0b3BFcnJvcjoiZXJyb3IiLHRvcExvYWRlZERhdGE6ImxvYWRlZGRhdGEiLHRvcExvYWRlZE1ldGFkYXRhOiJsb2FkZWRtZXRhZGF0YSIsdG9wTG9hZFN0YXJ0OiJsb2Fkc3RhcnQiLHRvcFBhdXNlOiJwYXVzZSIsdG9wUGxheToicGxheSIsdG9wUGxheWluZzoicGxheWluZyIsdG9wUHJvZ3Jlc3M6InByb2dyZXNzIix0b3BSYXRlQ2hhbmdlOiJyYXRlY2hhbmdlIix0b3BTZWVrZWQ6InNlZWtlZCIsdG9wU2Vla2luZzoic2Vla2luZyIsdG9wU3RhbGxlZDoic3RhbGxlZCIsdG9wU3VzcGVuZDoic3VzcGVuZCIsdG9wVGltZVVwZGF0ZToidGltZXVwZGF0ZSIsdG9wVm9sdW1lQ2hhbmdlOiJ2b2x1bWVjaGFuZ2UiLHRvcFdhaXRpbmc6IndhaXRpbmcifSx6PXthcmVhOiEwLGJhc2U6ITAsYnI6ITAsY29sOiEwLGVtYmVkOiEwLGhyOiEwLGltZzohMCxpbnB1dDohMCxrZXlnZW46ITAsbGluazohMCxtZXRhOiEwLHBhcmFtOiEwLHNvdXJjZTohMCx0cmFjazohMCx3YnI6ITB9LEc9e2xpc3Rpbmc6ITAscHJlOiEwLHRleHRhcmVhOiEwfSxYPWQoe21lbnVpdGVtOiEwfSx6KSxRPS9eW2EtekEtWl1bYS16QS1aOl9cLlwtXGRdKiQvLCQ9e30sWj17fS5oYXNPd25Qcm9wZXJ0eSxKPTE7cC5kaXNwbGF5TmFtZT0iUmVhY3RET01Db21wb25lbnQiLHAuTWl4aW49e21vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8pe3RoaXMuX3Jvb3ROb2RlSUQ9SisrLHRoaXMuX2RvbUlEPW4uX2lkQ291bnRlcisrLHRoaXMuX25hdGl2ZVBhcmVudD10LHRoaXMuX25hdGl2ZUNvbnRhaW5lckluZm89bjt2YXIgaT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImlmcmFtZSI6Y2FzZSJvYmplY3QiOmNhc2UiaW1nIjpjYXNlImZvcm0iOmNhc2UidmlkZW8iOmNhc2UiYXVkaW8iOnRoaXMuX3dyYXBwZXJTdGF0ZT17bGlzdGVuZXJzOm51bGx9LGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh1LHRoaXMpO2JyZWFrO2Nhc2UiYnV0dG9uIjppPU4uZ2V0TmF0aXZlUHJvcHModGhpcyxpLHQpO2JyZWFrO2Nhc2UiaW5wdXQiOncubW91bnRXcmFwcGVyKHRoaXMsaSx0KSxpPXcuZ2V0TmF0aXZlUHJvcHModGhpcyxpKSxlLmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUodSx0aGlzKTticmVhaztjYXNlIm9wdGlvbiI6Uy5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9Uy5nZXROYXRpdmVQcm9wcyh0aGlzLGkpO2JyZWFrO2Nhc2Uic2VsZWN0IjpNLm1vdW50V3JhcHBlcih0aGlzLGksdCksaT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHUsdGhpcyk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ay5tb3VudFdyYXBwZXIodGhpcyxpLHQpLGk9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZSh1LHRoaXMpfXIodGhpcyxpKTt2YXIgcyxsO251bGwhPXQ/KHM9dC5fbmFtZXNwYWNlVVJJLGw9dC5fdGFnKTpuLl90YWcmJihzPW4uX25hbWVzcGFjZVVSSSxsPW4uX3RhZyksKG51bGw9PXN8fHM9PT1tLnN2ZyYmImZvcmVpZ25vYmplY3QiPT09bCkmJihzPW0uaHRtbCkscz09PW0uaHRtbCYmKCJzdmciPT09dGhpcy5fdGFnP3M9bS5zdmc6Im1hdGgiPT09dGhpcy5fdGFnJiYocz1tLm1hdGhtbCkpLHRoaXMuX25hbWVzcGFjZVVSST1zO3ZhciBjO2lmKGUudXNlQ3JlYXRlRWxlbWVudCl7dmFyIHAsZD1uLl9vd25lckRvY3VtZW50O2lmKHM9PT1tLmh0bWwpaWYoInNjcmlwdCI9PT10aGlzLl90YWcpe3ZhciBoPWQuY3JlYXRlRWxlbWVudCgiZGl2IiksZz10aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2guaW5uZXJIVE1MPSI8IitnKyI+PC8iK2crIj4iLHA9aC5yZW1vdmVDaGlsZChoLmZpcnN0Q2hpbGQpfWVsc2UgcD1kLmNyZWF0ZUVsZW1lbnQodGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSxpLmlzfHxudWxsKTtlbHNlIHA9ZC5jcmVhdGVFbGVtZW50TlMocyx0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlKTtQLnByZWNhY2hlTm9kZSh0aGlzLHApLHRoaXMuX2ZsYWdzfD1MLmhhc0NhY2hlZENoaWxkTm9kZXMsdGhpcy5fbmF0aXZlUGFyZW50fHx5LnNldEF0dHJpYnV0ZUZvclJvb3QocCksdGhpcy5fdXBkYXRlRE9NUHJvcGVydGllcyhudWxsLGksZSk7dmFyIEM9dihwKTt0aGlzLl9jcmVhdGVJbml0aWFsQ2hpbGRyZW4oZSxpLG8sQyksYz1DfWVsc2V7dmFyIGI9dGhpcy5fY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVycyhlLGkpLF89dGhpcy5fY3JlYXRlQ29udGVudE1hcmt1cChlLGksbyk7Yz0hXyYmelt0aGlzLl90YWddP2IrIi8+IjpiKyI+IitfKyI8LyIrdGhpcy5fY3VycmVudEVsZW1lbnQudHlwZSsiPiJ9c3dpdGNoKHRoaXMuX3RhZyl7Y2FzZSJidXR0b24iOmNhc2UiaW5wdXQiOmNhc2Uic2VsZWN0IjpjYXNlInRleHRhcmVhIjppLmF1dG9Gb2N1cyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKGYuZm9jdXNET01Db21wb25lbnQsdGhpcyk7YnJlYWs7Y2FzZSJvcHRpb24iOmUuZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShhLHRoaXMpfXJldHVybiBjfSxfY3JlYXRlT3BlblRhZ01hcmt1cEFuZFB1dExpc3RlbmVyczpmdW5jdGlvbihlLHQpe3ZhciBuPSI8Iit0aGlzLl9jdXJyZW50RWxlbWVudC50eXBlO2Zvcih2YXIgciBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkocikpe3ZhciBpPXRbcl07aWYobnVsbCE9aSlpZihCLmhhc093blByb3BlcnR5KHIpKWkmJm8odGhpcyxyLGksZSk7ZWxzZXtyPT09VyYmKGkmJihpPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PWQoe30sdC5zdHlsZSkpLGk9aC5jcmVhdGVNYXJrdXBGb3JTdHlsZXMoaSx0aGlzKSk7dmFyIGE9bnVsbDtudWxsIT10aGlzLl90YWcmJmModGhpcy5fdGFnLHQpP0guaGFzT3duUHJvcGVydHkocil8fChhPXkuY3JlYXRlTWFya3VwRm9yQ3VzdG9tQXR0cmlidXRlKHIsaSkpOmE9eS5jcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eShyLGkpLGEmJihuKz0iICIrYSl9fXJldHVybiBlLnJlbmRlclRvU3RhdGljTWFya3VwP246KHRoaXMuX25hdGl2ZVBhcmVudHx8KG4rPSIgIit5LmNyZWF0ZU1hcmt1cEZvclJvb3QoKSksbis9IiAiK3kuY3JlYXRlTWFya3VwRm9ySUQodGhpcy5fZG9tSUQpKX0sX2NyZWF0ZUNvbnRlbnRNYXJrdXA6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPSIiLG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiYocj1vLl9faHRtbCk7ZWxzZXt2YXIgaT1qW3R5cGVvZiB0LmNoaWxkcmVuXT90LmNoaWxkcmVuOm51bGwsYT1udWxsIT1pP251bGw6dC5jaGlsZHJlbjtpZihudWxsIT1pKXI9SShpKTtlbHNlIGlmKG51bGwhPWEpe3ZhciB1PXRoaXMubW91bnRDaGlsZHJlbihhLGUsbik7cj11LmpvaW4oIiIpfX1yZXR1cm4gR1t0aGlzLl90YWddJiYiXG4iPT09ci5jaGFyQXQoMCk/IlxuIityOnJ9LF9jcmVhdGVJbml0aWFsQ2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89dC5kYW5nZXJvdXNseVNldElubmVySFRNTDtpZihudWxsIT1vKW51bGwhPW8uX19odG1sJiZ2LnF1ZXVlSFRNTChyLG8uX19odG1sKTtlbHNle3ZhciBpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuO2lmKG51bGwhPWkpdi5xdWV1ZVRleHQocixpKTtlbHNlIGlmKG51bGwhPWEpZm9yKHZhciB1PXRoaXMubW91bnRDaGlsZHJlbihhLGUsbikscz0wO3M8dS5sZW5ndGg7cysrKXYucXVldWVDaGlsZChyLHVbc10pfX0scmVjZWl2ZUNvbXBvbmVudDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fY3VycmVudEVsZW1lbnQ7dGhpcy5fY3VycmVudEVsZW1lbnQ9ZSx0aGlzLnVwZGF0ZUNvbXBvbmVudCh0LHIsZSxuKX0sdXBkYXRlQ29tcG9uZW50OmZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXQucHJvcHMsYT10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcztzd2l0Y2godGhpcy5fdGFnKXtjYXNlImJ1dHRvbiI6aT1OLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksYT1OLmdldE5hdGl2ZVByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJpbnB1dCI6dy51cGRhdGVXcmFwcGVyKHRoaXMpLGk9dy5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGE9dy5nZXROYXRpdmVQcm9wcyh0aGlzLGEpO2JyZWFrO2Nhc2Uib3B0aW9uIjppPVMuZ2V0TmF0aXZlUHJvcHModGhpcyxpKSxhPVMuZ2V0TmF0aXZlUHJvcHModGhpcyxhKTticmVhaztjYXNlInNlbGVjdCI6aT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsaSksYT1NLmdldE5hdGl2ZVByb3BzKHRoaXMsYSk7YnJlYWs7Y2FzZSJ0ZXh0YXJlYSI6ay51cGRhdGVXcmFwcGVyKHRoaXMpLGk9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGkpLGE9ay5nZXROYXRpdmVQcm9wcyh0aGlzLGEpfXIodGhpcyxhKSx0aGlzLl91cGRhdGVET01Qcm9wZXJ0aWVzKGksYSxlKSx0aGlzLl91cGRhdGVET01DaGlsZHJlbihpLGEsZSxvKSwic2VsZWN0Ij09PXRoaXMuX3RhZyYmZS5nZXRSZWFjdE1vdW50UmVhZHkoKS5lbnF1ZXVlKHMsdGhpcyl9LF91cGRhdGVET01Qcm9wZXJ0aWVzOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixpLGE7Zm9yKHIgaW4gZSlpZighdC5oYXNPd25Qcm9wZXJ0eShyKSYmZS5oYXNPd25Qcm9wZXJ0eShyKSYmbnVsbCE9ZVtyXSlpZihyPT09Vyl7dmFyIHU9dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk7Zm9yKGkgaW4gdSl1Lmhhc093blByb3BlcnR5KGkpJiYoYT1hfHx7fSxhW2ldPSIiKTt0aGlzLl9wcmV2aW91c1N0eWxlQ29weT1udWxsfWVsc2UgQi5oYXNPd25Qcm9wZXJ0eShyKT9lW3JdJiZVKHRoaXMscik6KGcucHJvcGVydGllc1tyXXx8Zy5pc0N1c3RvbUF0dHJpYnV0ZShyKSkmJnkuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShGKHRoaXMpLHIpO2ZvcihyIGluIHQpe3ZhciBzPXRbcl0sbD1yPT09Vz90aGlzLl9wcmV2aW91c1N0eWxlQ29weTpudWxsIT1lP2Vbcl06dm9pZCAwO2lmKHQuaGFzT3duUHJvcGVydHkocikmJnMhPT1sJiYobnVsbCE9c3x8bnVsbCE9bCkpaWYocj09PVcpaWYocz9zPXRoaXMuX3ByZXZpb3VzU3R5bGVDb3B5PWQoe30scyk6dGhpcy5fcHJldmlvdXNTdHlsZUNvcHk9bnVsbCxsKXtmb3IoaSBpbiBsKSFsLmhhc093blByb3BlcnR5KGkpfHxzJiZzLmhhc093blByb3BlcnR5KGkpfHwoYT1hfHx7fSxhW2ldPSIiKTtmb3IoaSBpbiBzKXMuaGFzT3duUHJvcGVydHkoaSkmJmxbaV0hPT1zW2ldJiYoYT1hfHx7fSxhW2ldPXNbaV0pfWVsc2UgYT1zO2Vsc2UgaWYoQi5oYXNPd25Qcm9wZXJ0eShyKSlzP28odGhpcyxyLHMsbik6bCYmVSh0aGlzLHIpO2Vsc2UgaWYoYyh0aGlzLl90YWcsdCkpSC5oYXNPd25Qcm9wZXJ0eShyKXx8eS5zZXRWYWx1ZUZvckF0dHJpYnV0ZShGKHRoaXMpLHIscyk7ZWxzZSBpZihnLnByb3BlcnRpZXNbcl18fGcuaXNDdXN0b21BdHRyaWJ1dGUocikpe3ZhciBwPUYodGhpcyk7bnVsbCE9cz95LnNldFZhbHVlRm9yUHJvcGVydHkocCxyLHMpOnkuZGVsZXRlVmFsdWVGb3JQcm9wZXJ0eShwLHIpfX1hJiZoLnNldFZhbHVlRm9yU3R5bGVzKEYodGhpcyksYSx0aGlzKX0sX3VwZGF0ZURPTUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPWpbdHlwZW9mIGUuY2hpbGRyZW5dP2UuY2hpbGRyZW46bnVsbCxpPWpbdHlwZW9mIHQuY2hpbGRyZW5dP3QuY2hpbGRyZW46bnVsbCxhPWUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwmJmUuZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwuX19odG1sLHU9dC5kYW5nZXJvdXNseVNldElubmVySFRNTCYmdC5kYW5nZXJvdXNseVNldElubmVySFRNTC5fX2h0bWwscz1udWxsIT1vP251bGw6ZS5jaGlsZHJlbixsPW51bGwhPWk/bnVsbDp0LmNoaWxkcmVuLGM9bnVsbCE9b3x8bnVsbCE9YSxwPW51bGwhPWl8fG51bGwhPXU7bnVsbCE9cyYmbnVsbD09bD90aGlzLnVwZGF0ZUNoaWxkcmVuKG51bGwsbixyKTpjJiYhcCYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIiksbnVsbCE9aT9vIT09aSYmdGhpcy51cGRhdGVUZXh0Q29udGVudCgiIitpKTpudWxsIT11P2EhPT11JiZ0aGlzLnVwZGF0ZU1hcmt1cCgiIit1KTpudWxsIT1sJiZ0aGlzLnVwZGF0ZUNoaWxkcmVuKGwsbixyKX0sZ2V0TmF0aXZlTm9kZTpmdW5jdGlvbigpe3JldHVybiBGKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe3N3aXRjaCh0aGlzLl90YWcpe2Nhc2UiaWZyYW1lIjpjYXNlIm9iamVjdCI6Y2FzZSJpbWciOmNhc2UiZm9ybSI6Y2FzZSJ2aWRlbyI6Y2FzZSJhdWRpbyI6dmFyIHQ9dGhpcy5fd3JhcHBlclN0YXRlLmxpc3RlbmVycztpZih0KWZvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXRbbl0ucmVtb3ZlKCk7YnJlYWs7Y2FzZSJodG1sIjpjYXNlImhlYWQiOmNhc2UiYm9keSI6TyghMSl9dGhpcy51bm1vdW50Q2hpbGRyZW4oZSksUC51bmNhY2hlTm9kZSh0aGlzKSxiLmRlbGV0ZUFsbExpc3RlbmVycyh0aGlzKSx4LnVubW91bnRJREZyb21FbnZpcm9ubWVudCh0aGlzLl9yb290Tm9kZUlEKSx0aGlzLl9yb290Tm9kZUlEPW51bGwsdGhpcy5fZG9tSUQ9bnVsbCx0aGlzLl93cmFwcGVyU3RhdGU9bnVsbH0sZ2V0UHVibGljSW5zdGFuY2U6ZnVuY3Rpb24oKXtyZXR1cm4gRih0aGlzKX19LGQocC5wcm90b3R5cGUscC5NaXhpbixSLk1peGluKSx0LmV4cG9ydHM9cH0sezE6MSwxMDoxMCwxMToxMSwxMTU6MTE1LDEyOToxMjksMTM4OjEzOCwxNDY6MTQ2LDE1NDoxNTQsMTU4OjE1OCwxNjoxNiwxNjM6MTYzLDE2NDoxNjQsMTY1OjE2NSwxNzoxNywxODoxOCwyNzoyNywzMjozMiwzNzozNywzOTozOSw0OjQsNDA6NDAsNDc6NDcsNDk6NDksNTA6NTAsNTQ6NTQsNzA6NzAsNzM6NzMsODo4LDg3Ojg3LDk6OX1dLDM5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXtoYXNDYWNoZWRDaGlsZE5vZGVzOjF9O3QuZXhwb3J0cz1yfSx7fV0sNDA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ7dD1lLl9yZW5kZXJlZENvbXBvbmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIG8oZSx0KXt2YXIgbj1yKGUpO24uX25hdGl2ZU5vZGU9dCx0W3ZdPW59ZnVuY3Rpb24gaShlKXt2YXIgdD1lLl9uYXRpdmVOb2RlO3QmJihkZWxldGUgdFt2XSxlLl9uYXRpdmVOb2RlPW51bGwpfWZ1bmN0aW9uIGEoZSx0KXtpZighKGUuX2ZsYWdzJmguaGFzQ2FjaGVkQ2hpbGROb2Rlcykpe3ZhciBuPWUuX3JlbmRlcmVkQ2hpbGRyZW4saT10LmZpcnN0Q2hpbGQ7ZTpmb3IodmFyIGEgaW4gbilpZihuLmhhc093blByb3BlcnR5KGEpKXt2YXIgdT1uW2FdLHM9cih1KS5fZG9tSUQ7aWYobnVsbCE9cyl7Zm9yKDtudWxsIT09aTtpPWkubmV4dFNpYmxpbmcpaWYoMT09PWkubm9kZVR5cGUmJmkuZ2V0QXR0cmlidXRlKGYpPT09U3RyaW5nKHMpfHw4PT09aS5ub2RlVHlwZSYmaS5ub2RlVmFsdWU9PT0iIHJlYWN0LXRleHQ6ICIrcysiICJ8fDg9PT1pLm5vZGVUeXBlJiZpLm5vZGVWYWx1ZT09PSIgcmVhY3QtZW1wdHk6ICIrcysiICIpe28odSxpKTtjb250aW51ZSBlfWQoITEpfX1lLl9mbGFnc3w9aC5oYXNDYWNoZWRDaGlsZE5vZGVzfX1mdW5jdGlvbiB1KGUpe2lmKGVbdl0pcmV0dXJuIGVbdl07Zm9yKHZhciB0PVtdOyFlW3ZdOyl7aWYodC5wdXNoKGUpLCFlLnBhcmVudE5vZGUpcmV0dXJuIG51bGw7ZT1lLnBhcmVudE5vZGV9Zm9yKHZhciBuLHI7ZSYmKHI9ZVt2XSk7ZT10LnBvcCgpKW49cix0Lmxlbmd0aCYmYShyLGUpO3JldHVybiBufWZ1bmN0aW9uIHMoZSl7dmFyIHQ9dShlKTtyZXR1cm4gbnVsbCE9dCYmdC5fbmF0aXZlTm9kZT09PWU/dDpudWxsfWZ1bmN0aW9uIGwoZSl7aWYodm9pZCAwPT09ZS5fbmF0aXZlTm9kZT9kKCExKTp2b2lkIDAsZS5fbmF0aXZlTm9kZSlyZXR1cm4gZS5fbmF0aXZlTm9kZTtmb3IodmFyIHQ9W107IWUuX25hdGl2ZU5vZGU7KXQucHVzaChlKSxlLl9uYXRpdmVQYXJlbnQ/dm9pZCAwOmQoITEpLGU9ZS5fbmF0aXZlUGFyZW50O2Zvcig7dC5sZW5ndGg7ZT10LnBvcCgpKWEoZSxlLl9uYXRpdmVOb2RlKTtyZXR1cm4gZS5fbmF0aXZlTm9kZX12YXIgYz1lKDEwKSxwPWUoMzkpLGQ9ZSgxNTQpLGY9Yy5JRF9BVFRSSUJVVEVfTkFNRSxoPXAsdj0iX19yZWFjdEludGVybmFsSW5zdGFuY2UkIitNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKSxtPXtnZXRDbG9zZXN0SW5zdGFuY2VGcm9tTm9kZTp1LGdldEluc3RhbmNlRnJvbU5vZGU6cyxnZXROb2RlRnJvbUluc3RhbmNlOmwscHJlY2FjaGVDaGlsZE5vZGVzOmEscHJlY2FjaGVOb2RlOm8sdW5jYWNoZU5vZGU6aX07dC5leHBvcnRzPW19LHsxMDoxMCwxNTQ6MTU0LDM5OjM5fV0sNDE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXtfdG9wTGV2ZWxXcmFwcGVyOmUsX2lkQ291bnRlcjoxLF9vd25lckRvY3VtZW50OnQ/dC5ub2RlVHlwZT09PW8/dDp0Lm93bmVyRG9jdW1lbnQ6bnVsbCxfbm9kZTp0LF90YWc6dD90Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk6bnVsbCxfbmFtZXNwYWNlVVJJOnQ/dC5uYW1lc3BhY2VVUkk6bnVsbH07cmV0dXJuIG59dmFyIG89KGUoMTM4KSw5KTt0LmV4cG9ydHM9cn0sezEzODoxMzh9XSw0MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIsbyxpKXt9dmFyIG89ZSg1NiksaT0oZSgxNjQpLFtdKSxhPXthZGREZXZ0b29sOmZ1bmN0aW9uKGUpe2kucHVzaChlKX0scmVtb3ZlRGV2dG9vbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGkubGVuZ3RoO3QrKylpW3RdPT09ZSYmKGkuc3BsaWNlKHQsMSksdC0tKX0sb25DcmVhdGVNYXJrdXBGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IoIm9uQ3JlYXRlTWFya3VwRm9yUHJvcGVydHkiLGUsdCl9LG9uU2V0VmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQsbil7cigib25TZXRWYWx1ZUZvclByb3BlcnR5IixlLHQsbil9LG9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IoIm9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eSIsZSx0KX19O2EuYWRkRGV2dG9vbChvKSx0LmV4cG9ydHM9YX0sezE2NDoxNjQsNTY6NTZ9XSw0MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2NSksbz1lKDgpLGk9ZSg0MCksYT1mdW5jdGlvbihlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX25hdGl2ZU5vZGU9bnVsbCx0aGlzLl9uYXRpdmVQYXJlbnQ9bnVsbCx0aGlzLl9uYXRpdmVDb250YWluZXJJbmZvPW51bGwsdGhpcy5fZG9tSUQ9bnVsbH07cihhLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIGE9bi5faWRDb3VudGVyKys7dGhpcy5fZG9tSUQ9YSx0aGlzLl9uYXRpdmVQYXJlbnQ9dCx0aGlzLl9uYXRpdmVDb250YWluZXJJbmZvPW47dmFyIHU9IiByZWFjdC1lbXB0eTogIit0aGlzLl9kb21JRCsiICI7aWYoZS51c2VDcmVhdGVFbGVtZW50KXt2YXIgcz1uLl9vd25lckRvY3VtZW50LGw9cy5jcmVhdGVDb21tZW50KHUpO3JldHVybiBpLnByZWNhY2hlTm9kZSh0aGlzLGwpLG8obCl9cmV0dXJuIGUucmVuZGVyVG9TdGF0aWNNYXJrdXA/IiI6IjwhLS0iK3UrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oKXt9LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXtyZXR1cm4gaS5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpfSx1bm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKCl7aS51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9YX0sezE2NToxNjUsNDA6NDAsODo4fV0sNDQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gby5jcmVhdGVGYWN0b3J5KGUpfXZhciBvPWUoNjApLGk9KGUoNjEpLGUoMTU5KSksYT1pKHthOiJhIixhYmJyOiJhYmJyIixhZGRyZXNzOiJhZGRyZXNzIixhcmVhOiJhcmVhIixhcnRpY2xlOiJhcnRpY2xlIixhc2lkZToiYXNpZGUiLGF1ZGlvOiJhdWRpbyIsCmI6ImIiLGJhc2U6ImJhc2UiLGJkaToiYmRpIixiZG86ImJkbyIsYmlnOiJiaWciLGJsb2NrcXVvdGU6ImJsb2NrcXVvdGUiLGJvZHk6ImJvZHkiLGJyOiJiciIsYnV0dG9uOiJidXR0b24iLGNhbnZhczoiY2FudmFzIixjYXB0aW9uOiJjYXB0aW9uIixjaXRlOiJjaXRlIixjb2RlOiJjb2RlIixjb2w6ImNvbCIsY29sZ3JvdXA6ImNvbGdyb3VwIixkYXRhOiJkYXRhIixkYXRhbGlzdDoiZGF0YWxpc3QiLGRkOiJkZCIsZGVsOiJkZWwiLGRldGFpbHM6ImRldGFpbHMiLGRmbjoiZGZuIixkaWFsb2c6ImRpYWxvZyIsZGl2OiJkaXYiLGRsOiJkbCIsZHQ6ImR0IixlbToiZW0iLGVtYmVkOiJlbWJlZCIsZmllbGRzZXQ6ImZpZWxkc2V0IixmaWdjYXB0aW9uOiJmaWdjYXB0aW9uIixmaWd1cmU6ImZpZ3VyZSIsZm9vdGVyOiJmb290ZXIiLGZvcm06ImZvcm0iLGgxOiJoMSIsaDI6ImgyIixoMzoiaDMiLGg0OiJoNCIsaDU6Img1IixoNjoiaDYiLGhlYWQ6ImhlYWQiLGhlYWRlcjoiaGVhZGVyIixoZ3JvdXA6Imhncm91cCIsaHI6ImhyIixodG1sOiJodG1sIixpOiJpIixpZnJhbWU6ImlmcmFtZSIsaW1nOiJpbWciLGlucHV0OiJpbnB1dCIsaW5zOiJpbnMiLGtiZDoia2JkIixrZXlnZW46ImtleWdlbiIsbGFiZWw6ImxhYmVsIixsZWdlbmQ6ImxlZ2VuZCIsbGk6ImxpIixsaW5rOiJsaW5rIixtYWluOiJtYWluIixtYXA6Im1hcCIsbWFyazoibWFyayIsbWVudToibWVudSIsbWVudWl0ZW06Im1lbnVpdGVtIixtZXRhOiJtZXRhIixtZXRlcjoibWV0ZXIiLG5hdjoibmF2Iixub3NjcmlwdDoibm9zY3JpcHQiLG9iamVjdDoib2JqZWN0IixvbDoib2wiLG9wdGdyb3VwOiJvcHRncm91cCIsb3B0aW9uOiJvcHRpb24iLG91dHB1dDoib3V0cHV0IixwOiJwIixwYXJhbToicGFyYW0iLHBpY3R1cmU6InBpY3R1cmUiLHByZToicHJlIixwcm9ncmVzczoicHJvZ3Jlc3MiLHE6InEiLHJwOiJycCIscnQ6InJ0IixydWJ5OiJydWJ5IixzOiJzIixzYW1wOiJzYW1wIixzY3JpcHQ6InNjcmlwdCIsc2VjdGlvbjoic2VjdGlvbiIsc2VsZWN0OiJzZWxlY3QiLHNtYWxsOiJzbWFsbCIsc291cmNlOiJzb3VyY2UiLHNwYW46InNwYW4iLHN0cm9uZzoic3Ryb25nIixzdHlsZToic3R5bGUiLHN1Yjoic3ViIixzdW1tYXJ5OiJzdW1tYXJ5IixzdXA6InN1cCIsdGFibGU6InRhYmxlIix0Ym9keToidGJvZHkiLHRkOiJ0ZCIsdGV4dGFyZWE6InRleHRhcmVhIix0Zm9vdDoidGZvb3QiLHRoOiJ0aCIsdGhlYWQ6InRoZWFkIix0aW1lOiJ0aW1lIix0aXRsZToidGl0bGUiLHRyOiJ0ciIsdHJhY2s6InRyYWNrIix1OiJ1Iix1bDoidWwiLCJ2YXIiOiJ2YXIiLHZpZGVvOiJ2aWRlbyIsd2JyOiJ3YnIiLGNpcmNsZToiY2lyY2xlIixjbGlwUGF0aDoiY2xpcFBhdGgiLGRlZnM6ImRlZnMiLGVsbGlwc2U6ImVsbGlwc2UiLGc6ImciLGltYWdlOiJpbWFnZSIsbGluZToibGluZSIsbGluZWFyR3JhZGllbnQ6ImxpbmVhckdyYWRpZW50IixtYXNrOiJtYXNrIixwYXRoOiJwYXRoIixwYXR0ZXJuOiJwYXR0ZXJuIixwb2x5Z29uOiJwb2x5Z29uIixwb2x5bGluZToicG9seWxpbmUiLHJhZGlhbEdyYWRpZW50OiJyYWRpYWxHcmFkaWVudCIscmVjdDoicmVjdCIsc3RvcDoic3RvcCIsc3ZnOiJzdmciLHRleHQ6InRleHQiLHRzcGFuOiJ0c3BhbiJ9LHIpO3QuZXhwb3J0cz1hfSx7MTU5OjE1OSw2MDo2MCw2MTo2MX1dLDQ1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt1c2VDcmVhdGVFbGVtZW50OiEwfTt0LmV4cG9ydHM9cn0se31dLDQ2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoNyksbz1lKDQwKSxpPXtkYW5nZXJvdXNseVByb2Nlc3NDaGlsZHJlblVwZGF0ZXM6ZnVuY3Rpb24oZSx0KXt2YXIgbj1vLmdldE5vZGVGcm9tSW5zdGFuY2UoZSk7ci5wcm9jZXNzVXBkYXRlcyhuLHQpfX07dC5leHBvcnRzPWl9LHs0MDo0MCw3Ojd9XSw0NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5fcm9vdE5vZGVJRCYmZC51cGRhdGVXcmFwcGVyKHRoaXMpfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsbj1zLmV4ZWN1dGVPbkNoYW5nZSh0LGUpO2MuYXNhcChyLHRoaXMpO3ZhciBvPXQubmFtZTtpZigicmFkaW8iPT09dC50eXBlJiZudWxsIT1vKXtmb3IodmFyIGk9bC5nZXROb2RlRnJvbUluc3RhbmNlKHRoaXMpLGE9aTthLnBhcmVudE5vZGU7KWE9YS5wYXJlbnROb2RlO2Zvcih2YXIgdT1hLnF1ZXJ5U2VsZWN0b3JBbGwoImlucHV0W25hbWU9IitKU09OLnN0cmluZ2lmeSgiIitvKSsnXVt0eXBlPSJyYWRpbyJdJyksZD0wO2Q8dS5sZW5ndGg7ZCsrKXt2YXIgZj11W2RdO2lmKGYhPT1pJiZmLmZvcm09PT1pLmZvcm0pe3ZhciBoPWwuZ2V0SW5zdGFuY2VGcm9tTm9kZShmKTtoP3ZvaWQgMDpwKCExKSxjLmFzYXAocixoKX19fXJldHVybiBufXZhciBpPWUoMTY1KSxhPWUoMTQpLHU9ZSgxMSkscz1lKDI0KSxsPWUoNDApLGM9ZSg5MCkscD1lKDE1NCksZD0oZSgxNjQpLHtnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCkscj1zLmdldENoZWNrZWQodCksbz1pKHt0eXBlOnZvaWQgMH0sYS5nZXROYXRpdmVQcm9wcyhlLHQpLHtkZWZhdWx0Q2hlY2tlZDp2b2lkIDAsZGVmYXVsdFZhbHVlOnZvaWQgMCx2YWx1ZTpudWxsIT1uP246ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZSxjaGVja2VkOm51bGwhPXI/cjplLl93cmFwcGVyU3RhdGUuaW5pdGlhbENoZWNrZWQsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSk7cmV0dXJuIG99LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlO2UuX3dyYXBwZXJTdGF0ZT17aW5pdGlhbENoZWNrZWQ6dC5kZWZhdWx0Q2hlY2tlZHx8ITEsaW5pdGlhbFZhbHVlOm51bGwhPW4/bjpudWxsLGxpc3RlbmVyczpudWxsLG9uQ2hhbmdlOm8uYmluZChlKX19LHVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsbj10LmNoZWNrZWQ7bnVsbCE9biYmdS5zZXRWYWx1ZUZvclByb3BlcnR5KGwuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwiY2hlY2tlZCIsbnx8ITEpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9ciYmdS5zZXRWYWx1ZUZvclByb3BlcnR5KGwuZ2V0Tm9kZUZyb21JbnN0YW5jZShlKSwidmFsdWUiLCIiK3IpfX0pO3QuZXhwb3J0cz1kfSx7MTE6MTEsMTQ6MTQsMTU0OjE1NCwxNjQ6MTY0LDE2NToxNjUsMjQ6MjQsNDA6NDAsOTA6OTB9XSw0ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDQyKTt0LmV4cG9ydHM9e2RlYnVnVG9vbDpyfX0sezQyOjQyfV0sNDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgyOSksaT1lKDQwKSxhPWUoNTApLHU9KGUoMTY0KSx7bW91bnRXcmFwcGVyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1udWxsO2lmKG51bGwhPW4pe3ZhciBvPW47Im9wdGdyb3VwIj09PW8uX3RhZyYmKG89by5fbmF0aXZlUGFyZW50KSxudWxsIT1vJiYic2VsZWN0Ij09PW8uX3RhZyYmKHI9YS5nZXRTZWxlY3RWYWx1ZUNvbnRleHQobykpfXZhciBpPW51bGw7aWYobnVsbCE9cilpZihpPSExLEFycmF5LmlzQXJyYXkocikpe2Zvcih2YXIgdT0wO3U8ci5sZW5ndGg7dSsrKWlmKCIiK3JbdV09PSIiK3QudmFsdWUpe2k9ITA7YnJlYWt9fWVsc2UgaT0iIityPT0iIit0LnZhbHVlO2UuX3dyYXBwZXJTdGF0ZT17c2VsZWN0ZWQ6aX19LHBvc3RNb3VudFdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7aWYobnVsbCE9dC52YWx1ZSl7dmFyIG49aS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO24uc2V0QXR0cmlidXRlKCJ2YWx1ZSIsdC52YWx1ZSl9fSxnZXROYXRpdmVQcm9wczpmdW5jdGlvbihlLHQpe3ZhciBuPXIoe3NlbGVjdGVkOnZvaWQgMCxjaGlsZHJlbjp2b2lkIDB9LHQpO251bGwhPWUuX3dyYXBwZXJTdGF0ZS5zZWxlY3RlZCYmKG4uc2VsZWN0ZWQ9ZS5fd3JhcHBlclN0YXRlLnNlbGVjdGVkKTt2YXIgaT0iIjtyZXR1cm4gby5mb3JFYWNoKHQuY2hpbGRyZW4sZnVuY3Rpb24oZSl7bnVsbCE9ZSYmKCJzdHJpbmciIT10eXBlb2YgZSYmIm51bWJlciIhPXR5cGVvZiBlfHwoaSs9ZSkpfSksaSYmKG4uY2hpbGRyZW49aSksbn19KTt0LmV4cG9ydHM9dX0sezE2NDoxNjQsMTY1OjE2NSwyOToyOSw0MDo0MCw1MDo1MH1dLDUwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZih0aGlzLl9yb290Tm9kZUlEJiZ0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZSl7dGhpcy5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITE7dmFyIGU9dGhpcy5fY3VycmVudEVsZW1lbnQucHJvcHMsdD1zLmdldFZhbHVlKGUpO251bGwhPXQmJm8odGhpcyxCb29sZWFuKGUubXVsdGlwbGUpLHQpfX1mdW5jdGlvbiBvKGUsdCxuKXt2YXIgcixvLGk9bC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLm9wdGlvbnM7aWYodCl7Zm9yKHI9e30sbz0wO288bi5sZW5ndGg7bysrKXJbIiIrbltvXV09ITA7Zm9yKG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9ci5oYXNPd25Qcm9wZXJ0eShpW29dLnZhbHVlKTtpW29dLnNlbGVjdGVkIT09YSYmKGlbb10uc2VsZWN0ZWQ9YSl9fWVsc2V7Zm9yKHI9IiIrbixvPTA7bzxpLmxlbmd0aDtvKyspaWYoaVtvXS52YWx1ZT09PXIpcmV0dXJuIHZvaWQoaVtvXS5zZWxlY3RlZD0hMCk7aS5sZW5ndGgmJihpWzBdLnNlbGVjdGVkPSEwKX19ZnVuY3Rpb24gaShlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIHRoaXMuX3Jvb3ROb2RlSUQmJih0aGlzLl93cmFwcGVyU3RhdGUucGVuZGluZ1VwZGF0ZT0hMCksYy5hc2FwKHIsdGhpcyksbn12YXIgYT1lKDE2NSksdT1lKDE0KSxzPWUoMjQpLGw9ZSg0MCksYz1lKDkwKSxwPShlKDE2NCksITEpLGQ9e2dldE5hdGl2ZVByb3BzOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGEoe30sdS5nZXROYXRpdmVQcm9wcyhlLHQpLHtvbkNoYW5nZTplLl93cmFwcGVyU3RhdGUub25DaGFuZ2UsdmFsdWU6dm9pZCAwfSl9LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0YXRlPXtwZW5kaW5nVXBkYXRlOiExLGluaXRpYWxWYWx1ZTpudWxsIT1uP246dC5kZWZhdWx0VmFsdWUsbGlzdGVuZXJzOm51bGwsb25DaGFuZ2U6aS5iaW5kKGUpLHdhc011bHRpcGxlOkJvb2xlYW4odC5tdWx0aXBsZSl9LHZvaWQgMD09PXQudmFsdWV8fHZvaWQgMD09PXQuZGVmYXVsdFZhbHVlfHxwfHwocD0hMCl9LGdldFNlbGVjdFZhbHVlQ29udGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZX0scG9zdFVwZGF0ZVdyYXBwZXI6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5fY3VycmVudEVsZW1lbnQucHJvcHM7ZS5fd3JhcHBlclN0YXRlLmluaXRpYWxWYWx1ZT12b2lkIDA7dmFyIG49ZS5fd3JhcHBlclN0YXRlLndhc011bHRpcGxlO2UuX3dyYXBwZXJTdGF0ZS53YXNNdWx0aXBsZT1Cb29sZWFuKHQubXVsdGlwbGUpO3ZhciByPXMuZ2V0VmFsdWUodCk7bnVsbCE9cj8oZS5fd3JhcHBlclN0YXRlLnBlbmRpbmdVcGRhdGU9ITEsbyhlLEJvb2xlYW4odC5tdWx0aXBsZSkscikpOm4hPT1Cb29sZWFuKHQubXVsdGlwbGUpJiYobnVsbCE9dC5kZWZhdWx0VmFsdWU/byhlLEJvb2xlYW4odC5tdWx0aXBsZSksdC5kZWZhdWx0VmFsdWUpOm8oZSxCb29sZWFuKHQubXVsdGlwbGUpLHQubXVsdGlwbGU/W106IiIpKX19O3QuZXhwb3J0cz1kfSx7MTQ6MTQsMTY0OjE2NCwxNjU6MTY1LDI0OjI0LDQwOjQwLDkwOjkwfV0sNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gZT09PW4mJnQ9PT1yfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ZG9jdW1lbnQuc2VsZWN0aW9uLG49dC5jcmVhdGVSYW5nZSgpLHI9bi50ZXh0Lmxlbmd0aCxvPW4uZHVwbGljYXRlKCk7by5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0IixuKTt2YXIgaT1vLnRleHQubGVuZ3RoLGE9aStyO3JldHVybntzdGFydDppLGVuZDphfX1mdW5jdGlvbiBpKGUpe3ZhciB0PXdpbmRvdy5nZXRTZWxlY3Rpb24mJndpbmRvdy5nZXRTZWxlY3Rpb24oKTtpZighdHx8MD09PXQucmFuZ2VDb3VudClyZXR1cm4gbnVsbDt2YXIgbj10LmFuY2hvck5vZGUsbz10LmFuY2hvck9mZnNldCxpPXQuZm9jdXNOb2RlLGE9dC5mb2N1c09mZnNldCx1PXQuZ2V0UmFuZ2VBdCgwKTt0cnl7dS5zdGFydENvbnRhaW5lci5ub2RlVHlwZSx1LmVuZENvbnRhaW5lci5ub2RlVHlwZX1jYXRjaChzKXtyZXR1cm4gbnVsbH12YXIgbD1yKHQuYW5jaG9yTm9kZSx0LmFuY2hvck9mZnNldCx0LmZvY3VzTm9kZSx0LmZvY3VzT2Zmc2V0KSxjPWw/MDp1LnRvU3RyaW5nKCkubGVuZ3RoLHA9dS5jbG9uZVJhbmdlKCk7cC5zZWxlY3ROb2RlQ29udGVudHMoZSkscC5zZXRFbmQodS5zdGFydENvbnRhaW5lcix1LnN0YXJ0T2Zmc2V0KTt2YXIgZD1yKHAuc3RhcnRDb250YWluZXIscC5zdGFydE9mZnNldCxwLmVuZENvbnRhaW5lcixwLmVuZE9mZnNldCksZj1kPzA6cC50b1N0cmluZygpLmxlbmd0aCxoPWYrYyx2PWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7di5zZXRTdGFydChuLG8pLHYuc2V0RW5kKGksYSk7dmFyIG09di5jb2xsYXBzZWQ7cmV0dXJue3N0YXJ0Om0/aDpmLGVuZDptP2Y6aH19ZnVuY3Rpb24gYShlLHQpe3ZhciBuLHIsbz1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKS5kdXBsaWNhdGUoKTt2b2lkIDA9PT10LmVuZD8obj10LnN0YXJ0LHI9bik6dC5zdGFydD50LmVuZD8obj10LmVuZCxyPXQuc3RhcnQpOihuPXQuc3RhcnQscj10LmVuZCksby5tb3ZlVG9FbGVtZW50VGV4dChlKSxvLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxvLnNldEVuZFBvaW50KCJFbmRUb1N0YXJ0IixvKSxvLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxvLnNlbGVjdCgpfWZ1bmN0aW9uIHUoZSx0KXtpZih3aW5kb3cuZ2V0U2VsZWN0aW9uKXt2YXIgbj13aW5kb3cuZ2V0U2VsZWN0aW9uKCkscj1lW2MoKV0ubGVuZ3RoLG89TWF0aC5taW4odC5zdGFydCxyKSxpPXZvaWQgMD09PXQuZW5kP286TWF0aC5taW4odC5lbmQscik7aWYoIW4uZXh0ZW5kJiZvPmkpe3ZhciBhPWk7aT1vLG89YX12YXIgdT1sKGUsbykscz1sKGUsaSk7aWYodSYmcyl7dmFyIHA9ZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTtwLnNldFN0YXJ0KHUubm9kZSx1Lm9mZnNldCksbi5yZW1vdmVBbGxSYW5nZXMoKSxvPmk/KG4uYWRkUmFuZ2UocCksbi5leHRlbmQocy5ub2RlLHMub2Zmc2V0KSk6KHAuc2V0RW5kKHMubm9kZSxzLm9mZnNldCksbi5hZGRSYW5nZShwKSl9fX12YXIgcz1lKDE0MCksbD1lKDEyNSksYz1lKDEyNikscD1zLmNhblVzZURPTSYmInNlbGVjdGlvbiJpbiBkb2N1bWVudCYmISgiZ2V0U2VsZWN0aW9uImluIHdpbmRvdyksZD17Z2V0T2Zmc2V0czpwP286aSxzZXRPZmZzZXRzOnA/YTp1fTt0LmV4cG9ydHM9ZH0sezEyNToxMjUsMTI2OjEyNiwxNDA6MTQwfV0sNTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg1OSksbz1lKDg2KSxpPWUoOTEpO3IuaW5qZWN0KCk7dmFyIGE9e3JlbmRlclRvU3RyaW5nOm8ucmVuZGVyVG9TdHJpbmcscmVuZGVyVG9TdGF0aWNNYXJrdXA6by5yZW5kZXJUb1N0YXRpY01hcmt1cCx2ZXJzaW9uOml9O3QuZXhwb3J0cz1hfSx7NTk6NTksODY6ODYsOTE6OTF9XSw1MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2NSksbz1lKDcpLGk9ZSg4KSxhPWUoNDApLHU9KGUoNzApLGUoMTE1KSkscz1lKDE1NCksbD0oZSgxMzgpLGZ1bmN0aW9uKGUpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWUsdGhpcy5fc3RyaW5nVGV4dD0iIitlLHRoaXMuX25hdGl2ZU5vZGU9bnVsbCx0aGlzLl9uYXRpdmVQYXJlbnQ9bnVsbCx0aGlzLl9kb21JRD1udWxsLHRoaXMuX21vdW50SW5kZXg9MCx0aGlzLl9jbG9zaW5nQ29tbWVudD1udWxsLHRoaXMuX2NvbW1lbnROb2Rlcz1udWxsfSk7cihsLnByb3RvdHlwZSx7bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7dmFyIG89bi5faWRDb3VudGVyKysscz0iIHJlYWN0LXRleHQ6ICIrbysiICIsbD0iIC9yZWFjdC10ZXh0ICI7aWYodGhpcy5fZG9tSUQ9byx0aGlzLl9uYXRpdmVQYXJlbnQ9dCxlLnVzZUNyZWF0ZUVsZW1lbnQpe3ZhciBjPW4uX293bmVyRG9jdW1lbnQscD1jLmNyZWF0ZUNvbW1lbnQocyksZD1jLmNyZWF0ZUNvbW1lbnQobCksZj1pKGMuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKTtyZXR1cm4gaS5xdWV1ZUNoaWxkKGYsaShwKSksdGhpcy5fc3RyaW5nVGV4dCYmaS5xdWV1ZUNoaWxkKGYsaShjLmNyZWF0ZVRleHROb2RlKHRoaXMuX3N0cmluZ1RleHQpKSksaS5xdWV1ZUNoaWxkKGYsaShkKSksYS5wcmVjYWNoZU5vZGUodGhpcyxwKSx0aGlzLl9jbG9zaW5nQ29tbWVudD1kLGZ9dmFyIGg9dSh0aGlzLl9zdHJpbmdUZXh0KTtyZXR1cm4gZS5yZW5kZXJUb1N0YXRpY01hcmt1cD9oOiI8IS0tIitzKyItLT4iK2grIjwhLS0iK2wrIi0tPiJ9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0KXtpZihlIT09dGhpcy5fY3VycmVudEVsZW1lbnQpe3RoaXMuX2N1cnJlbnRFbGVtZW50PWU7dmFyIG49IiIrZTtpZihuIT09dGhpcy5fc3RyaW5nVGV4dCl7dGhpcy5fc3RyaW5nVGV4dD1uO3ZhciByPXRoaXMuZ2V0TmF0aXZlTm9kZSgpO28ucmVwbGFjZURlbGltaXRlZFRleHQoclswXSxyWzFdLG4pfX19LGdldE5hdGl2ZU5vZGU6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9jb21tZW50Tm9kZXM7aWYoZSlyZXR1cm4gZTtpZighdGhpcy5fY2xvc2luZ0NvbW1lbnQpZm9yKHZhciB0PWEuZ2V0Tm9kZUZyb21JbnN0YW5jZSh0aGlzKSxuPXQubmV4dFNpYmxpbmc7Oyl7aWYobnVsbD09bj9zKCExKTp2b2lkIDAsOD09PW4ubm9kZVR5cGUmJiIgL3JlYWN0LXRleHQgIj09PW4ubm9kZVZhbHVlKXt0aGlzLl9jbG9zaW5nQ29tbWVudD1uO2JyZWFrfW49bi5uZXh0U2libGluZ31yZXR1cm4gZT1bdGhpcy5fbmF0aXZlTm9kZSx0aGlzLl9jbG9zaW5nQ29tbWVudF0sdGhpcy5fY29tbWVudE5vZGVzPWUsZX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbigpe3RoaXMuX2Nsb3NpbmdDb21tZW50PW51bGwsdGhpcy5fY29tbWVudE5vZGVzPW51bGwsYS51bmNhY2hlTm9kZSh0aGlzKX19KSx0LmV4cG9ydHM9bH0sezExNToxMTUsMTM4OjEzOCwxNTQ6MTU0LDE2NToxNjUsNDA6NDAsNzo3LDcwOjcwLDg6OH1dLDU0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXt0aGlzLl9yb290Tm9kZUlEJiZkLnVwZGF0ZVdyYXBwZXIodGhpcyl9ZnVuY3Rpb24gbyhlKXt2YXIgdD10aGlzLl9jdXJyZW50RWxlbWVudC5wcm9wcyxuPXMuZXhlY3V0ZU9uQ2hhbmdlKHQsZSk7cmV0dXJuIGMuYXNhcChyLHRoaXMpLG59dmFyIGk9ZSgxNjUpLGE9ZSgxNCksdT1lKDExKSxzPWUoMjQpLGw9ZSg0MCksYz1lKDkwKSxwPWUoMTU0KSxkPShlKDE2NCkse2dldE5hdGl2ZVByb3BzOmZ1bmN0aW9uKGUsdCl7bnVsbCE9dC5kYW5nZXJvdXNseVNldElubmVySFRNTD9wKCExKTp2b2lkIDA7dmFyIG49aSh7fSxhLmdldE5hdGl2ZVByb3BzKGUsdCkse2RlZmF1bHRWYWx1ZTp2b2lkIDAsdmFsdWU6dm9pZCAwLGNoaWxkcmVuOmUuX3dyYXBwZXJTdGF0ZS5pbml0aWFsVmFsdWUsb25DaGFuZ2U6ZS5fd3JhcHBlclN0YXRlLm9uQ2hhbmdlfSk7cmV0dXJuIG59LG1vdW50V3JhcHBlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXQuZGVmYXVsdFZhbHVlLHI9dC5jaGlsZHJlbjtudWxsIT1yJiYobnVsbCE9bj9wKCExKTp2b2lkIDAsQXJyYXkuaXNBcnJheShyKSYmKHIubGVuZ3RoPD0xP3ZvaWQgMDpwKCExKSxyPXJbMF0pLG49IiIrciksbnVsbD09biYmKG49IiIpO3ZhciBpPXMuZ2V0VmFsdWUodCk7ZS5fd3JhcHBlclN0YXRlPXtpbml0aWFsVmFsdWU6IiIrKG51bGwhPWk/aTpuKSxsaXN0ZW5lcnM6bnVsbCxvbkNoYW5nZTpvLmJpbmQoZSl9fSx1cGRhdGVXcmFwcGVyOmZ1bmN0aW9uKGUpe3ZhciB0PWUuX2N1cnJlbnRFbGVtZW50LnByb3BzLG49cy5nZXRWYWx1ZSh0KTtudWxsIT1uJiZ1LnNldFZhbHVlRm9yUHJvcGVydHkobC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLCJ2YWx1ZSIsIiIrbil9fSk7dC5leHBvcnRzPWR9LHsxMToxMSwxNDoxNCwxNTQ6MTU0LDE2NDoxNjQsMTY1OjE2NSwyNDoyNCw0MDo0MCw5MDo5MH1dLDU1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXsiX25hdGl2ZU5vZGUiaW4gZT92b2lkIDA6cyghMSksIl9uYXRpdmVOb2RlImluIHQ/dm9pZCAwOnMoITEpO2Zvcih2YXIgbj0wLHI9ZTtyO3I9ci5fbmF0aXZlUGFyZW50KW4rKztmb3IodmFyIG89MCxpPXQ7aTtpPWkuX25hdGl2ZVBhcmVudClvKys7Zm9yKDtuLW8+MDspZT1lLl9uYXRpdmVQYXJlbnQsbi0tO2Zvcig7by1uPjA7KXQ9dC5fbmF0aXZlUGFyZW50LG8tLTtmb3IodmFyIGE9bjthLS07KXtpZihlPT09dClyZXR1cm4gZTtlPWUuX25hdGl2ZVBhcmVudCx0PXQuX25hdGl2ZVBhcmVudH1yZXR1cm4gbnVsbH1mdW5jdGlvbiBvKGUsdCl7Il9uYXRpdmVOb2RlImluIGU/dm9pZCAwOnMoITEpLCJfbmF0aXZlTm9kZSJpbiB0P3ZvaWQgMDpzKCExKTtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQuX25hdGl2ZVBhcmVudH1yZXR1cm4hMX1mdW5jdGlvbiBpKGUpe3JldHVybiJfbmF0aXZlTm9kZSJpbiBlP3ZvaWQgMDpzKCExKSxlLl9uYXRpdmVQYXJlbnR9ZnVuY3Rpb24gYShlLHQsbil7Zm9yKHZhciByPVtdO2U7KXIucHVzaChlKSxlPWUuX25hdGl2ZVBhcmVudDt2YXIgbztmb3Iobz1yLmxlbmd0aDtvLS0gPjA7KXQocltvXSwhMSxuKTtmb3Iobz0wO288ci5sZW5ndGg7bysrKXQocltvXSwhMCxuKX1mdW5jdGlvbiB1KGUsdCxuLG8saSl7Zm9yKHZhciBhPWUmJnQ/cihlLHQpOm51bGwsdT1bXTtlJiZlIT09YTspdS5wdXNoKGUpLGU9ZS5fbmF0aXZlUGFyZW50O2Zvcih2YXIgcz1bXTt0JiZ0IT09YTspcy5wdXNoKHQpLHQ9dC5fbmF0aXZlUGFyZW50O3ZhciBsO2ZvcihsPTA7bDx1Lmxlbmd0aDtsKyspbih1W2xdLCEwLG8pO2ZvcihsPXMubGVuZ3RoO2wtLSA+MDspbihzW2xdLCExLGkpfXZhciBzPWUoMTU0KTt0LmV4cG9ydHM9e2lzQW5jZXN0b3I6byxnZXRMb3dlc3RDb21tb25BbmNlc3RvcjpyLGdldFBhcmVudEluc3RhbmNlOmksdHJhdmVyc2VUd29QaGFzZTphLHRyYXZlcnNlRW50ZXJMZWF2ZTp1fX0sezE1NDoxNTR9XSw1NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPShlKDEwKSxlKDE4KSxlKDE2NCkse29uQ3JlYXRlTWFya3VwRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0KXtyKGUpfSxvblNldFZhbHVlRm9yUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe3IodCl9LG9uRGVsZXRlVmFsdWVGb3JQcm9wZXJ0eTpmdW5jdGlvbihlLHQpe3IodCl9fSk7dC5leHBvcnRzPW99LHsxMDoxMCwxNjQ6MTY0LDE4OjE4fV0sNTc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyLG8saSl7fWZ1bmN0aW9uIG8oZSl7fXZhciBpPShlKDE0MCksZSgxNjIpLGUoMTY0KSxbXSksYT17YWRkRGV2dG9vbDpmdW5jdGlvbihlKXtpLnB1c2goZSl9LHJlbW92ZURldnRvb2w6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxpLmxlbmd0aDt0KyspaVt0XT09PWUmJihpLnNwbGljZSh0LDEpLHQtLSl9LGJlZ2luUHJvZmlsaW5nOmZ1bmN0aW9uKCl7fSxlbmRQcm9maWxpbmc6ZnVuY3Rpb24oKXt9LGdldEZsdXNoSGlzdG9yeTpmdW5jdGlvbigpe30sb25CZWdpbkZsdXNoOmZ1bmN0aW9uKCl7cigib25CZWdpbkZsdXNoIil9LG9uRW5kRmx1c2g6ZnVuY3Rpb24oKXtyKCJvbkVuZEZsdXNoIil9LG9uQmVnaW5MaWZlQ3ljbGVUaW1lcjpmdW5jdGlvbihlLHQpe28oZSkscigib25CZWdpbkxpZmVDeWNsZVRpbWVyIixlLHQpfSxvbkVuZExpZmVDeWNsZVRpbWVyOmZ1bmN0aW9uKGUsdCl7byhlKSxyKCJvbkVuZExpZmVDeWNsZVRpbWVyIixlLHQpfSxvbkJlZ2luUmVjb25jaWxlclRpbWVyOmZ1bmN0aW9uKGUsdCl7byhlKSxyKCJvbkJlZ2luUmVjb25jaWxlclRpbWVyIixlLHQpfSxvbkVuZFJlY29uY2lsZXJUaW1lcjpmdW5jdGlvbihlLHQpe28oZSkscigib25FbmRSZWNvbmNpbGVyVGltZXIiLGUsdCl9LG9uQmVnaW5Qcm9jZXNzaW5nQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKCl7cigib25CZWdpblByb2Nlc3NpbmdDaGlsZENvbnRleHQiKX0sb25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0OmZ1bmN0aW9uKCl7cigib25FbmRQcm9jZXNzaW5nQ2hpbGRDb250ZXh0Iil9LG9uTmF0aXZlT3BlcmF0aW9uOmZ1bmN0aW9uKGUsdCxuKXtvKGUpLHIoIm9uTmF0aXZlT3BlcmF0aW9uIixlLHQsbil9LG9uU2V0U3RhdGU6ZnVuY3Rpb24oKXtyKCJvblNldFN0YXRlIil9LG9uU2V0RGlzcGxheU5hbWU6ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0RGlzcGxheU5hbWUiLGUsdCl9LG9uU2V0Q2hpbGRyZW46ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0Q2hpbGRyZW4iLGUsdCl9LG9uU2V0T3duZXI6ZnVuY3Rpb24oZSx0KXtvKGUpLHIoIm9uU2V0T3duZXIiLGUsdCl9LG9uU2V0VGV4dDpmdW5jdGlvbihlLHQpe28oZSkscigib25TZXRUZXh0IixlLHQpfSxvbk1vdW50Um9vdENvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uTW91bnRSb290Q29tcG9uZW50IixlKX0sb25Nb3VudENvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uTW91bnRDb21wb25lbnQiLGUpfSxvblVwZGF0ZUNvbXBvbmVudDpmdW5jdGlvbihlKXtvKGUpLHIoIm9uVXBkYXRlQ29tcG9uZW50IixlKX0sb25Vbm1vdW50Q29tcG9uZW50OmZ1bmN0aW9uKGUpe28oZSkscigib25Vbm1vdW50Q29tcG9uZW50IixlKX19O3QuZXhwb3J0cz1hfSx7MTQwOjE0MCwxNjI6MTYyLDE2NDoxNjR9XSw1ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpfXZhciBvPWUoMTY1KSxpPWUoOTApLGE9ZSgxMDgpLHU9ZSgxNDYpLHM9e2luaXRpYWxpemU6dSxjbG9zZTpmdW5jdGlvbigpe2QuaXNCYXRjaGluZ1VwZGF0ZXM9ITF9fSxsPXtpbml0aWFsaXplOnUsY2xvc2U6aS5mbHVzaEJhdGNoZWRVcGRhdGVzLmJpbmQoaSl9LGM9W2wsc107byhyLnByb3RvdHlwZSxhLk1peGluLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGN9fSk7dmFyIHA9bmV3IHIsZD17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSx0LG4scixvLGkpe3ZhciBhPWQuaXNCYXRjaGluZ1VwZGF0ZXM7ZC5pc0JhdGNoaW5nVXBkYXRlcz0hMCxhP2UodCxuLHIsbyxpKTpwLnBlcmZvcm0oZSxudWxsLHQsbixyLG8saSl9fTt0LmV4cG9ydHM9ZH0sezEwODoxMDgsMTQ2OjE0NiwxNjU6MTY1LDkwOjkwfV0sNTk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe0V8fChFPSEwLGcuRXZlbnRFbWl0dGVyLmluamVjdFJlYWN0RXZlbnRMaXN0ZW5lcihtKSxnLkV2ZW50UGx1Z2luSHViLmluamVjdEV2ZW50UGx1Z2luT3JkZXIoYSksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdENvbXBvbmVudFRyZWUocCksZy5FdmVudFBsdWdpblV0aWxzLmluamVjdFRyZWVUcmF2ZXJzYWwoZiksZy5FdmVudFBsdWdpbkh1Yi5pbmplY3RFdmVudFBsdWdpbnNCeU5hbWUoe1NpbXBsZUV2ZW50UGx1Z2luOl8sRW50ZXJMZWF2ZUV2ZW50UGx1Z2luOnUsQ2hhbmdlRXZlbnRQbHVnaW46aSxTZWxlY3RFdmVudFBsdWdpbjpiLEJlZm9yZUlucHV0RXZlbnRQbHVnaW46b30pLGcuTmF0aXZlQ29tcG9uZW50LmluamVjdEdlbmVyaWNDb21wb25lbnRDbGFzcyhjKSxnLk5hdGl2ZUNvbXBvbmVudC5pbmplY3RUZXh0Q29tcG9uZW50Q2xhc3MoaCksZy5ET01Qcm9wZXJ0eS5pbmplY3RET01Qcm9wZXJ0eUNvbmZpZyhzKSxnLkRPTVByb3BlcnR5LmluamVjdERPTVByb3BlcnR5Q29uZmlnKEMpLGcuRW1wdHlDb21wb25lbnQuaW5qZWN0RW1wdHlDb21wb25lbnRGYWN0b3J5KGZ1bmN0aW9uKGUpe3JldHVybiBuZXcgZChlKX0pLGcuVXBkYXRlcy5pbmplY3RSZWNvbmNpbGVUcmFuc2FjdGlvbih5KSxnLlVwZGF0ZXMuaW5qZWN0QmF0Y2hpbmdTdHJhdGVneSh2KSxnLkNvbXBvbmVudC5pbmplY3RFbnZpcm9ubWVudChsKSl9dmFyIG89ZSgyKSxpPWUoNiksYT1lKDEzKSx1PWUoMTUpLHM9ZSgyMiksbD1lKDMyKSxjPWUoMzgpLHA9ZSg0MCksZD1lKDQzKSxmPWUoNTUpLGg9ZSg1Myksdj1lKDU4KSxtPWUoNjUpLGc9ZSg2NykseT1lKDgyKSxDPWUoOTIpLGI9ZSg5MyksXz1lKDk0KSxFPSExO3QuZXhwb3J0cz17aW5qZWN0OnJ9fSx7MTM6MTMsMTU6MTUsMjoyLDIyOjIyLDMyOjMyLDM4OjM4LDQwOjQwLDQzOjQzLDUzOjUzLDU1OjU1LDU4OjU4LDY6Niw2NTo2NSw2Nzo2Nyw4Mjo4Miw5Mjo5Miw5Mzo5Myw5NDo5NH1dLDYwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTY1KSxvPWUoMzUpLGk9KGUoMTY0KSxlKDExMiksImZ1bmN0aW9uIj09dHlwZW9mIFN5bWJvbCYmU3ltYm9sWyJmb3IiXSYmU3ltYm9sWyJmb3IiXSgicmVhY3QuZWxlbWVudCIpfHw2MDEwMyksYT17a2V5OiEwLHJlZjohMCxfX3NlbGY6ITAsX19zb3VyY2U6ITB9LHU9ZnVuY3Rpb24oZSx0LG4scixvLGEsdSl7dmFyIHM9eyQkdHlwZW9mOmksdHlwZTplLGtleTp0LHJlZjpuLHByb3BzOnUsX293bmVyOmF9O3JldHVybiBzfTt1LmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLGk9e30scz1udWxsLGw9bnVsbCxjPW51bGwscD1udWxsO2lmKG51bGwhPXQpe2w9dm9pZCAwPT09dC5yZWY/bnVsbDp0LnJlZixzPXZvaWQgMD09PXQua2V5P251bGw6IiIrdC5rZXksYz12b2lkIDA9PT10Ll9fc2VsZj9udWxsOnQuX19zZWxmLHA9dm9pZCAwPT09dC5fX3NvdXJjZT9udWxsOnQuX19zb3VyY2U7Zm9yKHIgaW4gdCl0Lmhhc093blByb3BlcnR5KHIpJiYhYS5oYXNPd25Qcm9wZXJ0eShyKSYmKGlbcl09dFtyXSl9dmFyIGQ9YXJndW1lbnRzLmxlbmd0aC0yO2lmKDE9PT1kKWkuY2hpbGRyZW49bjtlbHNlIGlmKGQ+MSl7Zm9yKHZhciBmPUFycmF5KGQpLGg9MDtkPmg7aCsrKWZbaF09YXJndW1lbnRzW2grMl07aS5jaGlsZHJlbj1mfWlmKGUmJmUuZGVmYXVsdFByb3BzKXt2YXIgdj1lLmRlZmF1bHRQcm9wcztmb3IociBpbiB2KXZvaWQgMD09PWlbcl0mJihpW3JdPXZbcl0pfXJldHVybiB1KGUscyxsLGMscCxvLmN1cnJlbnQsaSl9LHUuY3JlYXRlRmFjdG9yeT1mdW5jdGlvbihlKXt2YXIgdD11LmNyZWF0ZUVsZW1lbnQuYmluZChudWxsLGUpO3JldHVybiB0LnR5cGU9ZSx0fSx1LmNsb25lQW5kUmVwbGFjZUtleT1mdW5jdGlvbihlLHQpe3ZhciBuPXUoZS50eXBlLHQsZS5yZWYsZS5fc2VsZixlLl9zb3VyY2UsZS5fb3duZXIsZS5wcm9wcyk7cmV0dXJuIG59LHUuY2xvbmVFbGVtZW50PWZ1bmN0aW9uKGUsdCxuKXt2YXIgaSxzPXIoe30sZS5wcm9wcyksbD1lLmtleSxjPWUucmVmLHA9ZS5fc2VsZixkPWUuX3NvdXJjZSxmPWUuX293bmVyO2lmKG51bGwhPXQpe3ZvaWQgMCE9PXQucmVmJiYoYz10LnJlZixmPW8uY3VycmVudCksdm9pZCAwIT09dC5rZXkmJihsPSIiK3Qua2V5KTt2YXIgaDtlLnR5cGUmJmUudHlwZS5kZWZhdWx0UHJvcHMmJihoPWUudHlwZS5kZWZhdWx0UHJvcHMpO2ZvcihpIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShpKSYmIWEuaGFzT3duUHJvcGVydHkoaSkmJih2b2lkIDA9PT10W2ldJiZ2b2lkIDAhPT1oP3NbaV09aFtpXTpzW2ldPXRbaV0pfXZhciB2PWFyZ3VtZW50cy5sZW5ndGgtMjtpZigxPT09dilzLmNoaWxkcmVuPW47ZWxzZSBpZih2PjEpe2Zvcih2YXIgbT1BcnJheSh2KSxnPTA7dj5nO2crKyltW2ddPWFyZ3VtZW50c1tnKzJdO3MuY2hpbGRyZW49bX1yZXR1cm4gdShlLnR5cGUsbCxjLHAsZCxmLHMpfSx1LmlzVmFsaWRFbGVtZW50PWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZSYmbnVsbCE9PWUmJmUuJCR0eXBlb2Y9PT1pfSx0LmV4cG9ydHM9dX0sezExMjoxMTIsMTY0OjE2NCwxNjU6MTY1LDM1OjM1fV0sNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcigpe2lmKHAuY3VycmVudCl7dmFyIGU9cC5jdXJyZW50LmdldE5hbWUoKTtpZihlKXJldHVybiIgQ2hlY2sgdGhlIHJlbmRlciBtZXRob2Qgb2YgYCIrZSsiYC4ifXJldHVybiIifWZ1bmN0aW9uIG8oZSx0KXtlLl9zdG9yZSYmIWUuX3N0b3JlLnZhbGlkYXRlZCYmbnVsbD09ZS5rZXkmJihlLl9zdG9yZS52YWxpZGF0ZWQ9ITAsaSgidW5pcXVlS2V5IixlLHQpKX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgbz1yKCk7aWYoIW8pe3ZhciBpPSJzdHJpbmciPT10eXBlb2Ygbj9uOm4uZGlzcGxheU5hbWV8fG4ubmFtZTtpJiYobz0iIENoZWNrIHRoZSB0b3AtbGV2ZWwgcmVuZGVyIGNhbGwgdXNpbmcgPCIraSsiPi4iKX12YXIgYT1oW2VdfHwoaFtlXT17fSk7aWYoYVtvXSlyZXR1cm4gbnVsbDthW29dPSEwO3ZhciB1PXtwYXJlbnRPck93bmVyOm8sdXJsOiIgU2VlIGh0dHBzOi8vZmIubWUvcmVhY3Qtd2FybmluZy1rZXlzIGZvciBtb3JlIGluZm9ybWF0aW9uLiIsY2hpbGRPd25lcjpudWxsfTtyZXR1cm4gdCYmdC5fb3duZXImJnQuX293bmVyIT09cC5jdXJyZW50JiYodS5jaGlsZE93bmVyPSIgSXQgd2FzIHBhc3NlZCBhIGNoaWxkIGZyb20gIit0Ll9vd25lci5nZXROYW1lKCkrIi4iKSx1fWZ1bmN0aW9uIGEoZSx0KXtpZigib2JqZWN0Ij09dHlwZW9mIGUpaWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIHI9ZVtuXTtsLmlzVmFsaWRFbGVtZW50KHIpJiZvKHIsdCl9ZWxzZSBpZihsLmlzVmFsaWRFbGVtZW50KGUpKWUuX3N0b3JlJiYoZS5fc3RvcmUudmFsaWRhdGVkPSEwKTtlbHNlIGlmKGUpe3ZhciBpPWQoZSk7aWYoaSYmaSE9PWUuZW50cmllcylmb3IodmFyIGEsdT1pLmNhbGwoZSk7IShhPXUubmV4dCgpKS5kb25lOylsLmlzVmFsaWRFbGVtZW50KGEudmFsdWUpJiZvKGEudmFsdWUsdCl9fWZ1bmN0aW9uIHUoZSx0LG4sbyl7Zm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIGE7dHJ5eyJmdW5jdGlvbiIhPXR5cGVvZiB0W2ldP2YoITEpOnZvaWQgMCxhPXRbaV0obixpLGUsbyl9Y2F0Y2godSl7YT11fWEgaW5zdGFuY2VvZiBFcnJvciYmIShhLm1lc3NhZ2UgaW4gdikmJih2W2EubWVzc2FnZV09ITAscigpKX19ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLnR5cGU7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQpe3ZhciBuPXQuZGlzcGxheU5hbWV8fHQubmFtZTt0LnByb3BUeXBlcyYmdShuLHQucHJvcFR5cGVzLGUucHJvcHMsYy5wcm9wKSwiZnVuY3Rpb24iPT10eXBlb2YgdC5nZXREZWZhdWx0UHJvcHN9fXZhciBsPWUoNjApLGM9ZSg4MCkscD0oZSg3OSksZSgzNSkpLGQ9KGUoMTEyKSxlKDEyMykpLGY9ZSgxNTQpLGg9KGUoMTY0KSx7fSksdj17fSxtPXtjcmVhdGVFbGVtZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj0ic3RyaW5nIj09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlLG89bC5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtpZihudWxsPT1vKXJldHVybiBvO2lmKHIpZm9yKHZhciBpPTI7aTxhcmd1bWVudHMubGVuZ3RoO2krKylhKGFyZ3VtZW50c1tpXSxlKTtyZXR1cm4gcyhvKSxvfSxjcmVhdGVGYWN0b3J5OmZ1bmN0aW9uKGUpe3ZhciB0PW0uY3JlYXRlRWxlbWVudC5iaW5kKG51bGwsZSk7cmV0dXJuIHQudHlwZT1lLHR9LGNsb25lRWxlbWVudDpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPWwuY2xvbmVFbGVtZW50LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxvPTI7bzxhcmd1bWVudHMubGVuZ3RoO28rKylhKGFyZ3VtZW50c1tvXSxyLnR5cGUpO3JldHVybiBzKHIpLHJ9fTt0LmV4cG9ydHM9bX0sezExMjoxMTIsMTIzOjEyMywxNTQ6MTU0LDE2NDoxNjQsMzU6MzUsNjA6NjAsNzk6NzksODA6ODB9XSw2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPXtpbmplY3RFbXB0eUNvbXBvbmVudEZhY3Rvcnk6ZnVuY3Rpb24oZSl7cj1lfX0saT17Y3JlYXRlOmZ1bmN0aW9uKGUpe3JldHVybiByKGUpfX07aS5pbmplY3Rpb249byx0LmV4cG9ydHM9aX0se31dLDYzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7dHJ5e3JldHVybiB0KG4scil9Y2F0Y2goaSl7cmV0dXJuIHZvaWQobnVsbD09PW8mJihvPWkpKX19dmFyIG89bnVsbCxpPXtpbnZva2VHdWFyZGVkQ2FsbGJhY2s6cixpbnZva2VHdWFyZGVkQ2FsbGJhY2tXaXRoQ2F0Y2g6cixyZXRocm93Q2F1Z2h0RXJyb3I6ZnVuY3Rpb24oKXtpZihvKXt2YXIgZT1vO3Rocm93IG89bnVsbCxlfX19O3QuZXhwb3J0cz1pfSx7fV0sNjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtvLmVucXVldWVFdmVudHMoZSksby5wcm9jZXNzRXZlbnRRdWV1ZSghMSl9dmFyIG89ZSgxNyksaT17aGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9by5leHRyYWN0RXZlbnRzKGUsdCxuLGkpO3IoYSl9fTt0LmV4cG9ydHM9aX0sezE3OjE3fV0sNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IoO2UuX25hdGl2ZVBhcmVudDspZT1lLl9uYXRpdmVQYXJlbnQ7dmFyIHQ9cC5nZXROb2RlRnJvbUluc3RhbmNlKGUpLG49dC5wYXJlbnROb2RlO3JldHVybiBwLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKG4pfWZ1bmN0aW9uIG8oZSx0KXt0aGlzLnRvcExldmVsVHlwZT1lLHRoaXMubmF0aXZlRXZlbnQ9dCx0aGlzLmFuY2VzdG9ycz1bXX1mdW5jdGlvbiBpKGUpe3ZhciB0PWYoZS5uYXRpdmVFdmVudCksbj1wLmdldENsb3Nlc3RJbnN0YW5jZUZyb21Ob2RlKHQpLG89bjtkbyBlLmFuY2VzdG9ycy5wdXNoKG8pLG89byYmcihvKTt3aGlsZShvKTtmb3IodmFyIGk9MDtpPGUuYW5jZXN0b3JzLmxlbmd0aDtpKyspbj1lLmFuY2VzdG9yc1tpXSx2Ll9oYW5kbGVUb3BMZXZlbChlLnRvcExldmVsVHlwZSxuLGUubmF0aXZlRXZlbnQsZihlLm5hdGl2ZUV2ZW50KSl9ZnVuY3Rpb24gYShlKXt2YXIgdD1oKHdpbmRvdyk7ZSh0KX12YXIgdT1lKDE2NSkscz1lKDEzOSksbD1lKDE0MCksYz1lKDI1KSxwPWUoNDApLGQ9ZSg5MCksZj1lKDEyMiksaD1lKDE1MSk7dShvLnByb3RvdHlwZSx7ZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3RoaXMudG9wTGV2ZWxUeXBlPW51bGwsdGhpcy5uYXRpdmVFdmVudD1udWxsLHRoaXMuYW5jZXN0b3JzLmxlbmd0aD0wfX0pLGMuYWRkUG9vbGluZ1RvKG8sYy50d29Bcmd1bWVudFBvb2xlcik7dmFyIHY9e19lbmFibGVkOiEwLF9oYW5kbGVUb3BMZXZlbDpudWxsLFdJTkRPV19IQU5ETEU6bC5jYW5Vc2VET00/d2luZG93Om51bGwsc2V0SGFuZGxlVG9wTGV2ZWw6ZnVuY3Rpb24oZSl7di5faGFuZGxlVG9wTGV2ZWw9ZX0sc2V0RW5hYmxlZDpmdW5jdGlvbihlKXt2Ll9lbmFibGVkPSEhZX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIHYuX2VuYWJsZWR9LHRyYXBCdWJibGVkRXZlbnQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPW47cmV0dXJuIHI/cy5saXN0ZW4ocix0LHYuZGlzcGF0Y2hFdmVudC5iaW5kKG51bGwsZSkpOm51bGx9LHRyYXBDYXB0dXJlZEV2ZW50OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uO3JldHVybiByP3MuY2FwdHVyZShyLHQsdi5kaXNwYXRjaEV2ZW50LmJpbmQobnVsbCxlKSk6bnVsbH0sbW9uaXRvclNjcm9sbFZhbHVlOmZ1bmN0aW9uKGUpe3ZhciB0PWEuYmluZChudWxsLGUpO3MubGlzdGVuKHdpbmRvdywic2Nyb2xsIix0KX0sZGlzcGF0Y2hFdmVudDpmdW5jdGlvbihlLHQpe2lmKHYuX2VuYWJsZWQpe3ZhciBuPW8uZ2V0UG9vbGVkKGUsdCk7dHJ5e2QuYmF0Y2hlZFVwZGF0ZXMoaSxuKX1maW5hbGx5e28ucmVsZWFzZShuKX19fX07dC5leHBvcnRzPXZ9LHsxMjI6MTIyLDEzOToxMzksMTQwOjE0MCwxNTE6MTUxLDE2NToxNjUsMjU6MjUsNDA6NDAsOTA6OTB9XSw2NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17bG9nVG9wTGV2ZWxSZW5kZXJzOiExfTt0LmV4cG9ydHM9cn0se31dLDY3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTApLG89ZSgxNyksaT1lKDE5KSxhPWUoMzMpLHU9ZSgzMCkscz1lKDYyKSxsPWUoMjcpLGM9ZSg3NSkscD1lKDkwKSxkPXtDb21wb25lbnQ6YS5pbmplY3Rpb24sQ2xhc3M6dS5pbmplY3Rpb24sRE9NUHJvcGVydHk6ci5pbmplY3Rpb24sRW1wdHlDb21wb25lbnQ6cy5pbmplY3Rpb24sRXZlbnRQbHVnaW5IdWI6by5pbmplY3Rpb24sRXZlbnRQbHVnaW5VdGlsczppLmluamVjdGlvbixFdmVudEVtaXR0ZXI6bC5pbmplY3Rpb24sTmF0aXZlQ29tcG9uZW50OmMuaW5qZWN0aW9uLFVwZGF0ZXM6cC5pbmplY3Rpb259O3QuZXhwb3J0cz1kfSx7MTA6MTAsMTc6MTcsMTk6MTksMjc6MjcsMzA6MzAsMzM6MzMsNjI6NjIsNzU6NzUsOTA6OTB9XSw2ODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBpKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlKX12YXIgbz1lKDUxKSxpPWUoMTQzKSxhPWUoMTQ4KSx1PWUoMTQ5KSxzPXtoYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXM6ZnVuY3Rpb24oZSl7dmFyIHQ9ZSYmZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiB0JiYoImlucHV0Ij09PXQmJiJ0ZXh0Ij09PWUudHlwZXx8InRleHRhcmVhIj09PXR8fCJ0cnVlIj09PWUuY29udGVudEVkaXRhYmxlKX0sZ2V0U2VsZWN0aW9uSW5mb3JtYXRpb246ZnVuY3Rpb24oKXt2YXIgZT11KCk7cmV0dXJue2ZvY3VzZWRFbGVtOmUsc2VsZWN0aW9uUmFuZ2U6cy5oYXNTZWxlY3Rpb25DYXBhYmlsaXRpZXMoZSk/cy5nZXRTZWxlY3Rpb24oZSk6bnVsbH19LHJlc3RvcmVTZWxlY3Rpb246ZnVuY3Rpb24oZSl7dmFyIHQ9dSgpLG49ZS5mb2N1c2VkRWxlbSxvPWUuc2VsZWN0aW9uUmFuZ2U7dCE9PW4mJnIobikmJihzLmhhc1NlbGVjdGlvbkNhcGFiaWxpdGllcyhuKSYmcy5zZXRTZWxlY3Rpb24obixvKSxhKG4pKX0sZ2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKCJzZWxlY3Rpb25TdGFydCJpbiBlKXQ9e3N0YXJ0OmUuc2VsZWN0aW9uU3RhcnQsZW5kOmUuc2VsZWN0aW9uRW5kfTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7bi5wYXJlbnRFbGVtZW50KCk9PT1lJiYodD17c3RhcnQ6LW4ubW92ZVN0YXJ0KCJjaGFyYWN0ZXIiLC1lLnZhbHVlLmxlbmd0aCksZW5kOi1uLm1vdmVFbmQoImNoYXJhY3RlciIsLWUudmFsdWUubGVuZ3RoKX0pfWVsc2UgdD1vLmdldE9mZnNldHMoZSk7cmV0dXJuIHR8fHtzdGFydDowLGVuZDowfX0sc2V0U2VsZWN0aW9uOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5zdGFydCxyPXQuZW5kO2lmKHZvaWQgMD09PXImJihyPW4pLCJzZWxlY3Rpb25TdGFydCJpbiBlKWUuc2VsZWN0aW9uU3RhcnQ9bixlLnNlbGVjdGlvbkVuZD1NYXRoLm1pbihyLGUudmFsdWUubGVuZ3RoKTtlbHNlIGlmKGRvY3VtZW50LnNlbGVjdGlvbiYmZS5ub2RlTmFtZSYmImlucHV0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7dmFyIGk9ZS5jcmVhdGVUZXh0UmFuZ2UoKTtpLmNvbGxhcHNlKCEwKSxpLm1vdmVTdGFydCgiY2hhcmFjdGVyIixuKSxpLm1vdmVFbmQoImNoYXJhY3RlciIsci1uKSxpLnNlbGVjdCgpfWVsc2Ugby5zZXRPZmZzZXRzKGUsdCl9fTt0LmV4cG9ydHM9c30sezE0MzoxNDMsMTQ4OjE0OCwxNDk6MTQ5LDUxOjUxfV0sNjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e3JlbW92ZTpmdW5jdGlvbihlKXtlLl9yZWFjdEludGVybmFsSW5zdGFuY2U9dm9pZCAwfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZX0saGFzOmZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lLl9yZWFjdEludGVybmFsSW5zdGFuY2V9LHNldDpmdW5jdGlvbihlLHQpe2UuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT10fX07dC5leHBvcnRzPXJ9LHt9XSw3MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDU3KTt0LmV4cG9ydHM9e2RlYnVnVG9vbDpyfX0sezU3OjU3fV0sNzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxMTEpLG89L1wvPz4vLGk9L148XCFcLVwtLyxhPXtDSEVDS1NVTV9BVFRSX05BTUU6ImRhdGEtcmVhY3QtY2hlY2tzdW0iLGFkZENoZWNrc3VtVG9NYXJrdXA6ZnVuY3Rpb24oZSl7dmFyIHQ9cihlKTtyZXR1cm4gaS50ZXN0KGUpP2U6ZS5yZXBsYWNlKG8sIiAiK2EuQ0hFQ0tTVU1fQVRUUl9OQU1FKyc9IicrdCsnIiQmJyl9LGNhblJldXNlTWFya3VwOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5nZXRBdHRyaWJ1dGUoYS5DSEVDS1NVTV9BVFRSX05BTUUpO249biYmcGFyc2VJbnQobiwxMCk7dmFyIG89cihlKTtyZXR1cm4gbz09PW59fTt0LmV4cG9ydHM9YX0sezExMToxMTF9XSw3MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7Zm9yKHZhciBuPU1hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKSxyPTA7bj5yO3IrKylpZihlLmNoYXJBdChyKSE9PXQuY2hhckF0KHIpKXJldHVybiByO3JldHVybiBlLmxlbmd0aD09PXQubGVuZ3RoPy0xOm59ZnVuY3Rpb24gbyhlKXtyZXR1cm4gZT9lLm5vZGVUeXBlPT09RD9lLmRvY3VtZW50RWxlbWVudDplLmZpcnN0Q2hpbGQ6bnVsbH1mdW5jdGlvbiBpKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoTSl8fCIifWZ1bmN0aW9uIGEoZSx0LG4scixvKXt2YXIgaTtpZihDLmxvZ1RvcExldmVsUmVuZGVycyl7dmFyIGE9ZS5fY3VycmVudEVsZW1lbnQucHJvcHMsdT1hLnR5cGU7aT0iUmVhY3QgbW91bnQ6ICIrKCJzdHJpbmciPT10eXBlb2YgdT91OnUuZGlzcGxheU5hbWV8fHUubmFtZSksY29uc29sZS50aW1lKGkpfXZhciBzPV8ubW91bnRDb21wb25lbnQoZSxuLG51bGwsbShlLHQpLG8pO2kmJmNvbnNvbGUudGltZUVuZChpKSxlLl9yZW5kZXJlZENvbXBvbmVudC5fdG9wTGV2ZWxXcmFwcGVyPWUsVS5fbW91bnRJbWFnZUludG9Ob2RlKHMsdCxlLHIsbil9ZnVuY3Rpb24gdShlLHQsbixyKXt2YXIgbz14LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCFuJiZnLnVzZUNyZWF0ZUVsZW1lbnQpO28ucGVyZm9ybShhLG51bGwsZSx0LG8sbixyKSx4LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24ucmVsZWFzZShvKX1mdW5jdGlvbiBzKGUsdCxuKXtmb3IoXy51bm1vdW50Q29tcG9uZW50KGUsbiksdC5ub2RlVHlwZT09PUQmJih0PXQuZG9jdW1lbnRFbGVtZW50KTt0Lmxhc3RDaGlsZDspdC5yZW1vdmVDaGlsZCh0Lmxhc3RDaGlsZCl9ZnVuY3Rpb24gbChlKXt2YXIgdD1vKGUpO2lmKHQpe3ZhciBuPXYuZ2V0SW5zdGFuY2VGcm9tTm9kZSh0KTtyZXR1cm4hKCFufHwhbi5fbmF0aXZlUGFyZW50KX19ZnVuY3Rpb24gYyhlKXt2YXIgdD1vKGUpLG49dCYmdi5nZXRJbnN0YW5jZUZyb21Ob2RlKHQpO3JldHVybiBuJiYhbi5fbmF0aXZlUGFyZW50P246bnVsbH1mdW5jdGlvbiBwKGUpe3ZhciB0PWMoZSk7cmV0dXJuIHQ/dC5fbmF0aXZlQ29udGFpbmVySW5mby5fdG9wTGV2ZWxXcmFwcGVyOm51bGx9dmFyIGQ9ZSg4KSxmPWUoMTApLGg9ZSgyNyksdj0oZSgzNSksZSg0MCkpLG09ZSg0MSksZz1lKDQ1KSx5PWUoNjApLEM9ZSg2NiksYj0oZSg3MCksZSg3MSkpLF89ZSg4MyksRT1lKDg5KSx4PWUoOTApLE49ZSgxNDcpLFQ9ZSgxMjgpLFA9ZSgxNTQpLHc9ZSgxMzQpLFM9ZSgxMzYpLE09KGUoMTY0KSxmLklEX0FUVFJJQlVURV9OQU1FKSxrPWYuUk9PVF9BVFRSSUJVVEVfTkFNRSxSPTEsRD05LEk9MTEsTz17fSxBPTEsTD1mdW5jdGlvbigpe3RoaXMucm9vdElEPUErK307TC5wcm90b3R5cGUuaXNSZWFjdENvbXBvbmVudD17fSxMLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wc307dmFyIFU9e1RvcExldmVsV3JhcHBlcjpMLF9pbnN0YW5jZXNCeVJlYWN0Um9vdElEOk8sc2Nyb2xsTW9uaXRvcjpmdW5jdGlvbihlLHQpe3QoKX0sX3VwZGF0ZVJvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIFUuc2Nyb2xsTW9uaXRvcihuLGZ1bmN0aW9uKCl7RS5lbnF1ZXVlRWxlbWVudEludGVybmFsKGUsdCksciYmRS5lbnF1ZXVlQ2FsbGJhY2tJbnRlcm5hbChlLHIpfSksZX0sX3JlbmRlck5ld1Jvb3RDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4scil7IXR8fHQubm9kZVR5cGUhPT1SJiZ0Lm5vZGVUeXBlIT09RCYmdC5ub2RlVHlwZSE9PUk/UCghMSk6dm9pZCAwLGguZW5zdXJlU2Nyb2xsVmFsdWVNb25pdG9yaW5nKCk7dmFyIG89VChlKTt4LmJhdGNoZWRVcGRhdGVzKHUsbyx0LG4scik7dmFyIGk9by5faW5zdGFuY2Uucm9vdElEO3JldHVybiBPW2ldPW8sb30scmVuZGVyU3VidHJlZUludG9Db250YWluZXI6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIG51bGw9PWV8fG51bGw9PWUuX3JlYWN0SW50ZXJuYWxJbnN0YW5jZT9QKCExKTp2b2lkIDAsVS5fcmVuZGVyU3VidHJlZUludG9Db250YWluZXIoZSx0LG4scil9LF9yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcjpmdW5jdGlvbihlLHQsbixyKXtFLnZhbGlkYXRlQ2FsbGJhY2sociwiUmVhY3RET00ucmVuZGVyIikseS5pc1ZhbGlkRWxlbWVudCh0KT92b2lkIDA6UCghMSk7dmFyIGE9eShMLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCx0KSx1PXAobik7aWYodSl7dmFyIHM9dS5fY3VycmVudEVsZW1lbnQsYz1zLnByb3BzO2lmKFMoYyx0KSl7dmFyIGQ9dS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKSxmPXImJmZ1bmN0aW9uKCl7ci5jYWxsKGQpfTtyZXR1cm4gVS5fdXBkYXRlUm9vdENvbXBvbmVudCh1LGEsbixmKSxkfVUudW5tb3VudENvbXBvbmVudEF0Tm9kZShuKX12YXIgaD1vKG4pLHY9aCYmISFpKGgpLG09bChuKSxnPXYmJiF1JiYhbSxDPVUuX3JlbmRlck5ld1Jvb3RDb21wb25lbnQoYSxuLGcsbnVsbCE9ZT9lLl9yZWFjdEludGVybmFsSW5zdGFuY2UuX3Byb2Nlc3NDaGlsZENvbnRleHQoZS5fcmVhY3RJbnRlcm5hbEluc3RhbmNlLl9jb250ZXh0KTpOKS5fcmVuZGVyZWRDb21wb25lbnQuZ2V0UHVibGljSW5zdGFuY2UoKTtyZXR1cm4gciYmci5jYWxsKEMpLEN9LHJlbmRlcjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFUuX3JlbmRlclN1YnRyZWVJbnRvQ29udGFpbmVyKG51bGwsZSx0LG4pfSx1bm1vdW50Q29tcG9uZW50QXROb2RlOmZ1bmN0aW9uKGUpeyFlfHxlLm5vZGVUeXBlIT09UiYmZS5ub2RlVHlwZSE9PUQmJmUubm9kZVR5cGUhPT1JP1AoITEpOnZvaWQgMDt2YXIgdD1wKGUpO3JldHVybiB0PyhkZWxldGUgT1t0Ll9pbnN0YW5jZS5yb290SURdLHguYmF0Y2hlZFVwZGF0ZXMocyx0LGUsITEpLCEwKToobChlKSwxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoayksITEpfSxfbW91bnRJbWFnZUludG9Ob2RlOmZ1bmN0aW9uKGUsdCxuLGksYSl7aWYoIXR8fHQubm9kZVR5cGUhPT1SJiZ0Lm5vZGVUeXBlIT09RCYmdC5ub2RlVHlwZSE9PUk/UCghMSk6dm9pZCAwLGkpe3ZhciB1PW8odCk7aWYoYi5jYW5SZXVzZU1hcmt1cChlLHUpKXJldHVybiB2b2lkIHYucHJlY2FjaGVOb2RlKG4sdSk7dmFyIHM9dS5nZXRBdHRyaWJ1dGUoYi5DSEVDS1NVTV9BVFRSX05BTUUpO3UucmVtb3ZlQXR0cmlidXRlKGIuQ0hFQ0tTVU1fQVRUUl9OQU1FKTt2YXIgbD11Lm91dGVySFRNTDt1LnNldEF0dHJpYnV0ZShiLkNIRUNLU1VNX0FUVFJfTkFNRSxzKTt2YXIgYz1lLHA9cihjLGwpOyIgKGNsaWVudCkgIitjLnN1YnN0cmluZyhwLTIwLHArMjApKyJcbiAoc2VydmVyKSAiK2wuc3Vic3RyaW5nKHAtMjAscCsyMCksdC5ub2RlVHlwZT09PUQ/UCghMSk6dm9pZCAwfWlmKHQubm9kZVR5cGU9PT1EP1AoITEpOnZvaWQgMCxhLnVzZUNyZWF0ZUVsZW1lbnQpe2Zvcig7dC5sYXN0Q2hpbGQ7KXQucmVtb3ZlQ2hpbGQodC5sYXN0Q2hpbGQpO2QuaW5zZXJ0VHJlZUJlZm9yZSh0LGUsbnVsbCl9ZWxzZSB3KHQsZSksdi5wcmVjYWNoZU5vZGUobix0LmZpcnN0Q2hpbGQpfX07dC5leHBvcnRzPVV9LHsxMDoxMCwxMjg6MTI4LDEzNDoxMzQsMTM2OjEzNiwxNDc6MTQ3LDE1NDoxNTQsMTY0OjE2NCwyNzoyNywzNTozNSw0MDo0MCw0MTo0MSw0NTo0NSw2MDo2MCw2Njo2Niw3MDo3MCw3MTo3MSw4OjgsODM6ODMsODk6ODksOTA6OTB9XSw3MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtyZXR1cm57dHlwZTpwLklOU0VSVF9NQVJLVVAsY29udGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpuLGFmdGVyTm9kZTp0fX1mdW5jdGlvbiBvKGUsdCxuKXtyZXR1cm57dHlwZTpwLk1PVkVfRVhJU1RJTkcsY29udGVudDpudWxsLGZyb21JbmRleDplLl9tb3VudEluZGV4LGZyb21Ob2RlOmQuZ2V0TmF0aXZlTm9kZShlKSx0b0luZGV4Om4sYWZ0ZXJOb2RlOnR9fWZ1bmN0aW9uIGkoZSx0KXtyZXR1cm57dHlwZTpwLlJFTU9WRV9OT0RFLGNvbnRlbnQ6bnVsbCxmcm9tSW5kZXg6ZS5fbW91bnRJbmRleCxmcm9tTm9kZTp0LHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gYShlKXtyZXR1cm57dHlwZTpwLlNFVF9NQVJLVVAsY29udGVudDplLGZyb21JbmRleDpudWxsLGZyb21Ob2RlOm51bGwsdG9JbmRleDpudWxsLGFmdGVyTm9kZTpudWxsfX1mdW5jdGlvbiB1KGUpe3JldHVybnt0eXBlOnAuVEVYVF9DT05URU5ULGNvbnRlbnQ6ZSxmcm9tSW5kZXg6bnVsbCxmcm9tTm9kZTpudWxsLHRvSW5kZXg6bnVsbCxhZnRlck5vZGU6bnVsbH19ZnVuY3Rpb24gcyhlLHQpe3JldHVybiB0JiYoZT1lfHxbXSxlLnB1c2godCkpLGV9ZnVuY3Rpb24gbChlLHQpe2MucHJvY2Vzc0NoaWxkcmVuVXBkYXRlcyhlLHQpfXZhciBjPWUoMzMpLHA9KGUoNzApLGUoNzQpKSxkPShlKDM1KSxlKDgzKSksZj1lKDI4KSxoPShlKDE0NiksZSgxMTcpKSx2PWUoMTU0KSxtPXtNaXhpbjp7X3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZi5pbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKX0sX3JlY29uY2lsZXJVcGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpO3JldHVybiBpPWgodCksZi51cGRhdGVDaGlsZHJlbihlLGksbixyLG8pLGl9LG1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMuX3JlY29uY2lsZXJJbnN0YW50aWF0ZUNoaWxkcmVuKGUsdCxuKTt0aGlzLl9yZW5kZXJlZENoaWxkcmVuPXI7dmFyIG89W10saT0wO2Zvcih2YXIgYSBpbiByKWlmKHIuaGFzT3duUHJvcGVydHkoYSkpe3ZhciB1PXJbYV0scz1kLm1vdW50Q29tcG9uZW50KHUsdCx0aGlzLHRoaXMuX25hdGl2ZUNvbnRhaW5lckluZm8sbik7dS5fbW91bnRJbmRleD1pKyssby5wdXNoKHMpfXJldHVybiBvfSx1cGRhdGVUZXh0Q29udGVudDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJnYoITEpO3ZhciByPVt1KGUpXTtsKHRoaXMscil9LHVwZGF0ZU1hcmt1cDpmdW5jdGlvbihlKXt2YXIgdD10aGlzLl9yZW5kZXJlZENoaWxkcmVuO2YudW5tb3VudENoaWxkcmVuKHQsITEpO2Zvcih2YXIgbiBpbiB0KXQuaGFzT3duUHJvcGVydHkobikmJnYoITEpO3ZhciByPVthKGUpXTtsKHRoaXMscil9LHVwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKGUsdCxuKXt0aGlzLl91cGRhdGVDaGlsZHJlbihlLHQsbil9LF91cGRhdGVDaGlsZHJlbjpmdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbixvPXt9LGk9dGhpcy5fcmVjb25jaWxlclVwZGF0ZUNoaWxkcmVuKHIsZSxvLHQsbik7aWYoaXx8cil7dmFyIGEsdT1udWxsLGM9MCxwPTAsZj1udWxsO2ZvcihhIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGg9ciYmclthXSx2PWlbYV07aD09PXY/KHU9cyh1LHRoaXMubW92ZUNoaWxkKGgsZixwLGMpKSxjPU1hdGgubWF4KGguX21vdW50SW5kZXgsYyksaC5fbW91bnRJbmRleD1wKTooaCYmKGM9TWF0aC5tYXgoaC5fbW91bnRJbmRleCxjKSksdT1zKHUsdGhpcy5fbW91bnRDaGlsZEF0SW5kZXgodixmLHAsdCxuKSkpLHArKyxmPWQuZ2V0TmF0aXZlTm9kZSh2KX1mb3IoYSBpbiBvKW8uaGFzT3duUHJvcGVydHkoYSkmJih1PXModSx0aGlzLl91bm1vdW50Q2hpbGQoclthXSxvW2FdKSkpO3UmJmwodGhpcyx1KSx0aGlzLl9yZW5kZXJlZENoaWxkcmVuPWl9fSx1bm1vdW50Q2hpbGRyZW46ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fcmVuZGVyZWRDaGlsZHJlbjtmLnVubW91bnRDaGlsZHJlbih0LGUpLHRoaXMuX3JlbmRlcmVkQ2hpbGRyZW49bnVsbH0sbW92ZUNoaWxkOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBlLl9tb3VudEluZGV4PHI/byhlLHQsbik6dm9pZCAwfSxjcmVhdGVDaGlsZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHIobix0LGUuX21vdW50SW5kZXgpfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe3JldHVybiBpKGUsdCl9LF9tb3VudENoaWxkQXRJbmRleDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPWQubW91bnRDb21wb25lbnQoZSxyLHRoaXMsdGhpcy5fbmF0aXZlQ29udGFpbmVySW5mbyxvKTtyZXR1cm4gZS5fbW91bnRJbmRleD1uLHRoaXMuY3JlYXRlQ2hpbGQoZSx0LGkpfSxfdW5tb3VudENoaWxkOmZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5yZW1vdmVDaGlsZChlLHQpO3JldHVybiBlLl9tb3VudEluZGV4PW51bGwsbn19fTt0LmV4cG9ydHM9bX0sezExNzoxMTcsMTQ2OjE0NiwxNTQ6MTU0LDI4OjI4LDMzOjMzLDM1OjM1LDcwOjcwLDc0Ojc0LDgzOjgzfV0sNzQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNTcpLG89cih7SU5TRVJUX01BUktVUDpudWxsLE1PVkVfRVhJU1RJTkc6bnVsbCxSRU1PVkVfTk9ERTpudWxsLFNFVF9NQVJLVVA6bnVsbCxURVhUX0NPTlRFTlQ6bnVsbH0pO3QuZXhwb3J0cz1vfSx7MTU3OjE1N31dLDc1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUudHlwZSlyZXR1cm4gZS50eXBlO3ZhciB0PWUudHlwZSxuPXBbdF07cmV0dXJuIG51bGw9PW4mJihwW3RdPW49bCh0KSksbn1mdW5jdGlvbiBvKGUpe3JldHVybiBjP3ZvaWQgMDpzKCExKSxuZXcgYyhlKX1mdW5jdGlvbiBpKGUpe3JldHVybiBuZXcgZChlKX1mdW5jdGlvbiBhKGUpe3JldHVybiBlIGluc3RhbmNlb2YgZH12YXIgdT1lKDE2NSkscz1lKDE1NCksbD1udWxsLGM9bnVsbCxwPXt9LGQ9bnVsbCxmPXtpbmplY3RHZW5lcmljQ29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7Yz1lfSxpbmplY3RUZXh0Q29tcG9uZW50Q2xhc3M6ZnVuY3Rpb24oZSl7ZD1lfSxpbmplY3RDb21wb25lbnRDbGFzc2VzOmZ1bmN0aW9uKGUpe3UocCxlKX19LGg9e2dldENvbXBvbmVudENsYXNzRm9yRWxlbWVudDpyLGNyZWF0ZUludGVybmFsQ29tcG9uZW50Om8sY3JlYXRlSW5zdGFuY2VGb3JUZXh0OmksaXNUZXh0Q29tcG9uZW50OmEsaW5qZWN0aW9uOmZ9O3QuZXhwb3J0cz1ofSx7MTU0OjE1NCwxNjU6MTY1fV0sNzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSg2MCksbz1lKDE1NCksaT17TkFUSVZFOjAsQ09NUE9TSVRFOjEsRU1QVFk6MixnZXRUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZXx8ZT09PSExP2kuRU1QVFk6ci5pc1ZhbGlkRWxlbWVudChlKT8iZnVuY3Rpb24iPT10eXBlb2YgZS50eXBlP2kuQ09NUE9TSVRFOmkuTkFUSVZFOnZvaWQgbyghMSl9fTt0LmV4cG9ydHM9aX0sezE1NDoxNTQsNjA6NjB9XSw3NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7fXZhciBvPShlKDE2NCkse2lzTW91bnRlZDpmdW5jdGlvbihlKXtyZXR1cm4hMX0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCl7fSxlbnF1ZXVlRm9yY2VVcGRhdGU6ZnVuY3Rpb24oZSl7cihlLCJmb3JjZVVwZGF0ZSIpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCl7cihlLCJyZXBsYWNlU3RhdGUiKX0sZW5xdWV1ZVNldFN0YXRlOmZ1bmN0aW9uKGUsdCl7cihlLCJzZXRTdGF0ZSIpfX0pO3QuZXhwb3J0cz1vfSx7MTY0OjE2NH1dLDc4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPXtpc1ZhbGlkT3duZXI6ZnVuY3Rpb24oZSl7cmV0dXJuISghZXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGUuYXR0YWNoUmVmfHwiZnVuY3Rpb24iIT10eXBlb2YgZS5kZXRhY2hSZWYpfSxhZGRDb21wb25lbnRBc1JlZlRvOmZ1bmN0aW9uKGUsdCxuKXtvLmlzVmFsaWRPd25lcihuKT92b2lkIDA6cighMSksbi5hdHRhY2hSZWYodCxlKX0scmVtb3ZlQ29tcG9uZW50QXNSZWZGcm9tOmZ1bmN0aW9uKGUsdCxuKXtvLmlzVmFsaWRPd25lcihuKT92b2lkIDA6cighMSk7dmFyIGk9bi5nZXRQdWJsaWNJbnN0YW5jZSgpO2kmJmkucmVmc1t0XT09PWUuZ2V0UHVibGljSW5zdGFuY2UoKSYmbi5kZXRhY2hSZWYodCl9fTt0LmV4cG9ydHM9b30sezE1NDoxNTR9XSw3OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17fTt0LmV4cG9ydHM9cn0se31dLDgwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU3KSxvPXIoe3Byb3A6bnVsbCxjb250ZXh0Om51bGwsY2hpbGRDb250ZXh0Om51bGx9KTt0LmV4cG9ydHM9b30sezE1NzoxNTd9XSw4MTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwxL2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSl7ZnVuY3Rpb24gdCh0LG4scixvLGksYSl7aWYobz1vfHx4LGE9YXx8cixudWxsPT1uW3JdKXt2YXIgdT1iW2ldO3JldHVybiB0P25ldyBFcnJvcigiUmVxdWlyZWQgIit1KyIgYCIrYSsiYCB3YXMgbm90IHNwZWNpZmllZCBpbiAiKygiYCIrbysiYC4iKSk6bnVsbH1yZXR1cm4gZShuLHIsbyxpLGEpfXZhciBuPXQuYmluZChudWxsLCExKTtyZXR1cm4gbi5pc1JlcXVpcmVkPXQuYmluZChudWxsLCEwKSxufWZ1bmN0aW9uIGkoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe3ZhciBhPXRbbl0sdT1tKGEpO2lmKHUhPT1lKXt2YXIgcz1iW29dLGw9ZyhhKTtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkICIrcysiIGAiK2krImAgb2YgdHlwZSAiKygiYCIrbCsiYCBzdXBwbGllZCB0byBgIityKyJgLCBleHBlY3RlZCAiKSsoImAiK2UrImAuIikpfXJldHVybiBudWxsfXJldHVybiBvKHQpfWZ1bmN0aW9uIGEoKXtyZXR1cm4gbyhfLnRoYXRSZXR1cm5zKG51bGwpKX1mdW5jdGlvbiB1KGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4gbmV3IEVycm9yKCJQcm9wZXJ0eSBgIitpKyJgIG9mIGNvbXBvbmVudCBgIityKyJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBhcnJheU9mLiIpO3ZhciBhPXRbbl07aWYoIUFycmF5LmlzQXJyYXkoYSkpe3ZhciB1PWJbb10scz1tKGEpO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIit1KyIgYCIraSsiYCBvZiB0eXBlICIrKCJgIitzKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkIGFuIGFycmF5LiIpKX1mb3IodmFyIGw9MDtsPGEubGVuZ3RoO2wrKyl7dmFyIGM9ZShhLGwscixvLGkrIlsiK2wrIl0iKTtpZihjIGluc3RhbmNlb2YgRXJyb3IpcmV0dXJuIGN9cmV0dXJuIG51bGx9cmV0dXJuIG8odCl9ZnVuY3Rpb24gcygpe2Z1bmN0aW9uIGUoZSx0LG4scixvKXsKaWYoIUMuaXNWYWxpZEVsZW1lbnQoZVt0XSkpe3ZhciBpPWJbcl07cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK2krIiBgIitvKyJgIHN1cHBsaWVkIHRvICIrKCJgIituKyJgLCBleHBlY3RlZCBhIHNpbmdsZSBSZWFjdEVsZW1lbnQuIikpfXJldHVybiBudWxsfXJldHVybiBvKGUpfWZ1bmN0aW9uIGwoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe2lmKCEodFtuXWluc3RhbmNlb2YgZSkpe3ZhciBhPWJbb10sdT1lLm5hbWV8fHgscz15KHRbbl0pO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIithKyIgYCIraSsiYCBvZiB0eXBlICIrKCJgIitzKyJgIHN1cHBsaWVkIHRvIGAiK3IrImAsIGV4cGVjdGVkICIpKygiaW5zdGFuY2Ugb2YgYCIrdSsiYC4iKSl9cmV0dXJuIG51bGx9cmV0dXJuIG8odCl9ZnVuY3Rpb24gYyhlKXtmdW5jdGlvbiB0KHQsbixvLGksYSl7Zm9yKHZhciB1PXRbbl0scz0wO3M8ZS5sZW5ndGg7cysrKWlmKHIodSxlW3NdKSlyZXR1cm4gbnVsbDt2YXIgbD1iW2ldLGM9SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK2wrIiBgIithKyJgIG9mIHZhbHVlIGAiK3UrImAgIisoInN1cHBsaWVkIHRvIGAiK28rImAsIGV4cGVjdGVkIG9uZSBvZiAiK2MrIi4iKSl9cmV0dXJuIG8oQXJyYXkuaXNBcnJheShlKT90OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZiwgZXhwZWN0ZWQgYW4gaW5zdGFuY2Ugb2YgYXJyYXkuIil9KX1mdW5jdGlvbiBwKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSlyZXR1cm4gbmV3IEVycm9yKCJQcm9wZXJ0eSBgIitpKyJgIG9mIGNvbXBvbmVudCBgIityKyJgIGhhcyBpbnZhbGlkIFByb3BUeXBlIG5vdGF0aW9uIGluc2lkZSBvYmplY3RPZi4iKTt2YXIgYT10W25dLHU9bShhKTtpZigib2JqZWN0IiE9PXUpe3ZhciBzPWJbb107cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK3MrIiBgIitpKyJgIG9mIHR5cGUgIisoImAiK3UrImAgc3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYW4gb2JqZWN0LiIpKX1mb3IodmFyIGwgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGwpKXt2YXIgYz1lKGEsbCxyLG8saSsiLiIrbCk7aWYoYyBpbnN0YW5jZW9mIEVycm9yKXJldHVybiBjfXJldHVybiBudWxsfXJldHVybiBvKHQpfWZ1bmN0aW9uIGQoZSl7ZnVuY3Rpb24gdCh0LG4scixvLGkpe2Zvcih2YXIgYT0wO2E8ZS5sZW5ndGg7YSsrKXt2YXIgdT1lW2FdO2lmKG51bGw9PXUodCxuLHIsbyxpKSlyZXR1cm4gbnVsbH12YXIgcz1iW29dO3JldHVybiBuZXcgRXJyb3IoIkludmFsaWQgIitzKyIgYCIraSsiYCBzdXBwbGllZCB0byAiKygiYCIrcisiYC4iKSl9cmV0dXJuIG8oQXJyYXkuaXNBcnJheShlKT90OmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCBhcmd1bWVudCBzdXBwbGllZCB0byBvbmVPZlR5cGUsIGV4cGVjdGVkIGFuIGluc3RhbmNlIG9mIGFycmF5LiIpfSl9ZnVuY3Rpb24gZigpe2Z1bmN0aW9uIGUoZSx0LG4scixvKXtpZighdihlW3RdKSl7dmFyIGk9YltyXTtyZXR1cm4gbmV3IEVycm9yKCJJbnZhbGlkICIraSsiIGAiK28rImAgc3VwcGxpZWQgdG8gIisoImAiK24rImAsIGV4cGVjdGVkIGEgUmVhY3ROb2RlLiIpKX1yZXR1cm4gbnVsbH1yZXR1cm4gbyhlKX1mdW5jdGlvbiBoKGUpe2Z1bmN0aW9uIHQodCxuLHIsbyxpKXt2YXIgYT10W25dLHU9bShhKTtpZigib2JqZWN0IiE9PXUpe3ZhciBzPWJbb107cmV0dXJuIG5ldyBFcnJvcigiSW52YWxpZCAiK3MrIiBgIitpKyJgIG9mIHR5cGUgYCIrdSsiYCAiKygic3VwcGxpZWQgdG8gYCIrcisiYCwgZXhwZWN0ZWQgYG9iamVjdGAuIikpfWZvcih2YXIgbCBpbiBlKXt2YXIgYz1lW2xdO2lmKGMpe3ZhciBwPWMoYSxsLHIsbyxpKyIuIitsKTtpZihwKXJldHVybiBwfX1yZXR1cm4gbnVsbH1yZXR1cm4gbyh0KX1mdW5jdGlvbiB2KGUpe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJudW1iZXIiOmNhc2Uic3RyaW5nIjpjYXNlInVuZGVmaW5lZCI6cmV0dXJuITA7Y2FzZSJib29sZWFuIjpyZXR1cm4hZTtjYXNlIm9iamVjdCI6aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gZS5ldmVyeSh2KTtpZihudWxsPT09ZXx8Qy5pc1ZhbGlkRWxlbWVudChlKSlyZXR1cm4hMDt2YXIgdD1FKGUpO2lmKCF0KXJldHVybiExO3ZhciBuLHI9dC5jYWxsKGUpO2lmKHQhPT1lLmVudHJpZXMpe2Zvcig7IShuPXIubmV4dCgpKS5kb25lOylpZighdihuLnZhbHVlKSlyZXR1cm4hMX1lbHNlIGZvcig7IShuPXIubmV4dCgpKS5kb25lOyl7dmFyIG89bi52YWx1ZTtpZihvJiYhdihvWzFdKSlyZXR1cm4hMX1yZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBtKGUpe3ZhciB0PXR5cGVvZiBlO3JldHVybiBBcnJheS5pc0FycmF5KGUpPyJhcnJheSI6ZSBpbnN0YW5jZW9mIFJlZ0V4cD8ib2JqZWN0Ijp0fWZ1bmN0aW9uIGcoZSl7dmFyIHQ9bShlKTtpZigib2JqZWN0Ij09PXQpe2lmKGUgaW5zdGFuY2VvZiBEYXRlKXJldHVybiJkYXRlIjtpZihlIGluc3RhbmNlb2YgUmVnRXhwKXJldHVybiJyZWdleHAifXJldHVybiB0fWZ1bmN0aW9uIHkoZSl7cmV0dXJuIGUuY29uc3RydWN0b3ImJmUuY29uc3RydWN0b3IubmFtZT9lLmNvbnN0cnVjdG9yLm5hbWU6eH12YXIgQz1lKDYwKSxiPWUoNzkpLF89ZSgxNDYpLEU9ZSgxMjMpLHg9Ijw8YW5vbnltb3VzPj4iLE49e2FycmF5OmkoImFycmF5IiksYm9vbDppKCJib29sZWFuIiksZnVuYzppKCJmdW5jdGlvbiIpLG51bWJlcjppKCJudW1iZXIiKSxvYmplY3Q6aSgib2JqZWN0Iiksc3RyaW5nOmkoInN0cmluZyIpLGFueTphKCksYXJyYXlPZjp1LGVsZW1lbnQ6cygpLGluc3RhbmNlT2Y6bCxub2RlOmYoKSxvYmplY3RPZjpwLG9uZU9mOmMsb25lT2ZUeXBlOmQsc2hhcGU6aH07dC5leHBvcnRzPU59LHsxMjM6MTIzLDE0NjoxNDYsNjA6NjAsNzk6Nzl9XSw4MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPSExLHRoaXMucmVhY3RNb3VudFJlYWR5PWkuZ2V0UG9vbGVkKG51bGwpLHRoaXMudXNlQ3JlYXRlRWxlbWVudD1lfXZhciBvPWUoMTY1KSxpPWUoNSksYT1lKDI1KSx1PWUoMjcpLHM9ZSg2OCksbD1lKDEwOCksYz17aW5pdGlhbGl6ZTpzLmdldFNlbGVjdGlvbkluZm9ybWF0aW9uLGNsb3NlOnMucmVzdG9yZVNlbGVjdGlvbn0scD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3ZhciBlPXUuaXNFbmFibGVkKCk7cmV0dXJuIHUuc2V0RW5hYmxlZCghMSksZX0sY2xvc2U6ZnVuY3Rpb24oZSl7dS5zZXRFbmFibGVkKGUpfX0sZD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMucmVhY3RNb3VudFJlYWR5LnJlc2V0KCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5yZWFjdE1vdW50UmVhZHkubm90aWZ5QWxsKCl9fSxmPVtjLHAsZF0saD17Z2V0VHJhbnNhY3Rpb25XcmFwcGVyczpmdW5jdGlvbigpe3JldHVybiBmfSxnZXRSZWFjdE1vdW50UmVhZHk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHl9LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWFjdE1vdW50UmVhZHkuY2hlY2twb2ludCgpfSxyb2xsYmFjazpmdW5jdGlvbihlKXt0aGlzLnJlYWN0TW91bnRSZWFkeS5yb2xsYmFjayhlKX0sZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe2kucmVsZWFzZSh0aGlzLnJlYWN0TW91bnRSZWFkeSksdGhpcy5yZWFjdE1vdW50UmVhZHk9bnVsbH19O28oci5wcm90b3R5cGUsbC5NaXhpbixoKSxhLmFkZFBvb2xpbmdUbyhyKSx0LmV4cG9ydHM9cn0sezEwODoxMDgsMTY1OjE2NSwyNToyNSwyNzoyNyw1OjUsNjg6Njh9XSw4MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7by5hdHRhY2hSZWZzKHRoaXMsdGhpcy5fY3VycmVudEVsZW1lbnQpfXZhciBvPWUoODQpLGk9KGUoNzApLGUoMTU0KSksYT17bW91bnRDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4sbyxpKXt2YXIgYT1lLm1vdW50Q29tcG9uZW50KHQsbixvLGkpO3JldHVybiBlLl9jdXJyZW50RWxlbWVudCYmbnVsbCE9ZS5fY3VycmVudEVsZW1lbnQucmVmJiZ0LmdldFJlYWN0TW91bnRSZWFkeSgpLmVucXVldWUocixlKSxhfSxnZXROYXRpdmVOb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBlLmdldE5hdGl2ZU5vZGUoKX0sdW5tb3VudENvbXBvbmVudDpmdW5jdGlvbihlLHQpe28uZGV0YWNoUmVmcyhlLGUuX2N1cnJlbnRFbGVtZW50KSxlLnVubW91bnRDb21wb25lbnQodCl9LHJlY2VpdmVDb21wb25lbnQ6ZnVuY3Rpb24oZSx0LG4saSl7dmFyIGE9ZS5fY3VycmVudEVsZW1lbnQ7aWYodCE9PWF8fGkhPT1lLl9jb250ZXh0KXt2YXIgdT1vLnNob3VsZFVwZGF0ZVJlZnMoYSx0KTt1JiZvLmRldGFjaFJlZnMoZSxhKSxlLnJlY2VpdmVDb21wb25lbnQodCxuLGkpLHUmJmUuX2N1cnJlbnRFbGVtZW50JiZudWxsIT1lLl9jdXJyZW50RWxlbWVudC5yZWYmJm4uZ2V0UmVhY3RNb3VudFJlYWR5KCkuZW5xdWV1ZShyLGUpfX0scGVyZm9ybVVwZGF0ZUlmTmVjZXNzYXJ5OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5fdXBkYXRlQmF0Y2hOdW1iZXIhPT1uP3ZvaWQobnVsbCE9ZS5fdXBkYXRlQmF0Y2hOdW1iZXImJmUuX3VwZGF0ZUJhdGNoTnVtYmVyIT09bisxP2koITEpOnZvaWQgMCk6dm9pZCBlLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeSh0KX19O3QuZXhwb3J0cz1hfSx7MTU0OjE1NCw3MDo3MCw4NDo4NH1dLDg0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UodC5nZXRQdWJsaWNJbnN0YW5jZSgpKTppLmFkZENvbXBvbmVudEFzUmVmVG8odCxlLG4pfWZ1bmN0aW9uIG8oZSx0LG4peyJmdW5jdGlvbiI9PXR5cGVvZiBlP2UobnVsbCk6aS5yZW1vdmVDb21wb25lbnRBc1JlZkZyb20odCxlLG4pfXZhciBpPWUoNzgpLGE9e307YS5hdHRhY2hSZWZzPWZ1bmN0aW9uKGUsdCl7aWYobnVsbCE9PXQmJnQhPT0hMSl7dmFyIG49dC5yZWY7bnVsbCE9biYmcihuLGUsdC5fb3duZXIpfX0sYS5zaG91bGRVcGRhdGVSZWZzPWZ1bmN0aW9uKGUsdCl7dmFyIG49bnVsbD09PWV8fGU9PT0hMSxyPW51bGw9PT10fHx0PT09ITE7cmV0dXJuIG58fHJ8fHQuX293bmVyIT09ZS5fb3duZXJ8fHQucmVmIT09ZS5yZWZ9LGEuZGV0YWNoUmVmcz1mdW5jdGlvbihlLHQpe2lmKG51bGwhPT10JiZ0IT09ITEpe3ZhciBuPXQucmVmO251bGwhPW4mJm8obixlLHQuX293bmVyKX19LHQuZXhwb3J0cz1hfSx7Nzg6Nzh9XSw4NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj17aXNCYXRjaGluZ1VwZGF0ZXM6ITEsYmF0Y2hlZFVwZGF0ZXM6ZnVuY3Rpb24oZSl7fX07dC5leHBvcnRzPXJ9LHt9XSw4NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7dmFyIG47dHJ5e3JldHVybiBmLmluamVjdGlvbi5pbmplY3RCYXRjaGluZ1N0cmF0ZWd5KHApLG49ZC5nZXRQb29sZWQodCksbi5wZXJmb3JtKGZ1bmN0aW9uKCl7dmFyIHI9dihlKSxvPWMubW91bnRDb21wb25lbnQocixuLG51bGwsYSgpLGgpO3JldHVybiB0fHwobz1sLmFkZENoZWNrc3VtVG9NYXJrdXAobykpLG99LG51bGwpfWZpbmFsbHl7ZC5yZWxlYXNlKG4pLGYuaW5qZWN0aW9uLmluamVjdEJhdGNoaW5nU3RyYXRlZ3kodSl9fWZ1bmN0aW9uIG8oZSl7cmV0dXJuIHMuaXNWYWxpZEVsZW1lbnQoZSk/dm9pZCAwOm0oITEpLHIoZSwhMSl9ZnVuY3Rpb24gaShlKXtyZXR1cm4gcy5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6bSghMSkscihlLCEwKX12YXIgYT1lKDQxKSx1PWUoNTgpLHM9ZSg2MCksbD0oZSg3MCksZSg3MSkpLGM9ZSg4MykscD1lKDg1KSxkPWUoODcpLGY9ZSg5MCksaD1lKDE0Nyksdj1lKDEyOCksbT1lKDE1NCk7dC5leHBvcnRzPXtyZW5kZXJUb1N0cmluZzpvLHJlbmRlclRvU3RhdGljTWFya3VwOml9fSx7MTI4OjEyOCwxNDc6MTQ3LDE1NDoxNTQsNDE6NDEsNTg6NTgsNjA6NjAsNzA6NzAsNzE6NzEsODM6ODMsODU6ODUsODc6ODcsOTA6OTB9XSw4NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3RoaXMucmVpbml0aWFsaXplVHJhbnNhY3Rpb24oKSx0aGlzLnJlbmRlclRvU3RhdGljTWFya3VwPWUsdGhpcy51c2VDcmVhdGVFbGVtZW50PSExfXZhciBvPWUoMTY1KSxpPWUoMjUpLGE9ZSgxMDgpLHU9W10scz17ZW5xdWV1ZTpmdW5jdGlvbigpe319LGw9e2dldFRyYW5zYWN0aW9uV3JhcHBlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdX0sZ2V0UmVhY3RNb3VudFJlYWR5OmZ1bmN0aW9uKCl7cmV0dXJuIHN9LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt9LGNoZWNrcG9pbnQ6ZnVuY3Rpb24oKXt9LHJvbGxiYWNrOmZ1bmN0aW9uKCl7fX07byhyLnByb3RvdHlwZSxhLk1peGluLGwpLGkuYWRkUG9vbGluZ1RvKHIpLHQuZXhwb3J0cz1yfSx7MTA4OjEwOCwxNjU6MTY1LDI1OjI1fV0sODg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNjUpLG89ZSgzNiksaT1lKDUyKSxhPWUoMjYpLHU9cih7X19TRUNSRVRfRE9NX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6byxfX1NFQ1JFVF9ET01fU0VSVkVSX0RPX05PVF9VU0VfT1JfWU9VX1dJTExfQkVfRklSRUQ6aX0sYSk7dC5leHBvcnRzPXV9LHsxNjU6MTY1LDI2OjI2LDM2OjM2LDUyOjUyfV0sODk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXthLmVucXVldWVVcGRhdGUoZSl9ZnVuY3Rpb24gbyhlLHQpe3ZhciBuPWkuZ2V0KGUpO3JldHVybiBuP246bnVsbH12YXIgaT0oZSgzNSksZSg2OSkpLGE9ZSg5MCksdT1lKDE1NCkscz0oZSgxNjQpLHtpc01vdW50ZWQ6ZnVuY3Rpb24oZSl7dmFyIHQ9aS5nZXQoZSk7cmV0dXJuIHQ/ISF0Ll9yZW5kZXJlZENvbXBvbmVudDohMX0sZW5xdWV1ZUNhbGxiYWNrOmZ1bmN0aW9uKGUsdCxuKXtzLnZhbGlkYXRlQ2FsbGJhY2sodCxuKTt2YXIgaT1vKGUpO3JldHVybiBpPyhpLl9wZW5kaW5nQ2FsbGJhY2tzP2kuX3BlbmRpbmdDYWxsYmFja3MucHVzaCh0KTppLl9wZW5kaW5nQ2FsbGJhY2tzPVt0XSx2b2lkIHIoaSkpOm51bGx9LGVucXVldWVDYWxsYmFja0ludGVybmFsOmZ1bmN0aW9uKGUsdCl7ZS5fcGVuZGluZ0NhbGxiYWNrcz9lLl9wZW5kaW5nQ2FsbGJhY2tzLnB1c2godCk6ZS5fcGVuZGluZ0NhbGxiYWNrcz1bdF0scihlKX0sZW5xdWV1ZUZvcmNlVXBkYXRlOmZ1bmN0aW9uKGUpe3ZhciB0PW8oZSwiZm9yY2VVcGRhdGUiKTt0JiYodC5fcGVuZGluZ0ZvcmNlVXBkYXRlPSEwLHIodCkpfSxlbnF1ZXVlUmVwbGFjZVN0YXRlOmZ1bmN0aW9uKGUsdCl7dmFyIG49byhlLCJyZXBsYWNlU3RhdGUiKTtuJiYobi5fcGVuZGluZ1N0YXRlUXVldWU9W3RdLG4uX3BlbmRpbmdSZXBsYWNlU3RhdGU9ITAscihuKSl9LGVucXVldWVTZXRTdGF0ZTpmdW5jdGlvbihlLHQpe3ZhciBuPW8oZSwic2V0U3RhdGUiKTtpZihuKXt2YXIgaT1uLl9wZW5kaW5nU3RhdGVRdWV1ZXx8KG4uX3BlbmRpbmdTdGF0ZVF1ZXVlPVtdKTtpLnB1c2godCkscihuKX19LGVucXVldWVFbGVtZW50SW50ZXJuYWw6ZnVuY3Rpb24oZSx0KXtlLl9wZW5kaW5nRWxlbWVudD10LHIoZSl9LHZhbGlkYXRlQ2FsbGJhY2s6ZnVuY3Rpb24oZSx0KXtlJiYiZnVuY3Rpb24iIT10eXBlb2YgZT91KCExKTp2b2lkIDB9fSk7dC5leHBvcnRzPXN9LHsxNTQ6MTU0LDE2NDoxNjQsMzU6MzUsNjk6NjksOTA6OTB9XSw5MDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7dy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uJiZfP3ZvaWQgMDptKCExKX1mdW5jdGlvbiBvKCl7dGhpcy5yZWluaXRpYWxpemVUcmFuc2FjdGlvbigpLHRoaXMuZGlydHlDb21wb25lbnRzTGVuZ3RoPW51bGwsdGhpcy5jYWxsYmFja1F1ZXVlPXAuZ2V0UG9vbGVkKCksdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbj13LlJlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb24uZ2V0UG9vbGVkKCEwKX1mdW5jdGlvbiBpKGUsdCxuLG8saSxhKXtyKCksXy5iYXRjaGVkVXBkYXRlcyhlLHQsbixvLGksYSl9ZnVuY3Rpb24gYShlLHQpe3JldHVybiBlLl9tb3VudE9yZGVyLXQuX21vdW50T3JkZXJ9ZnVuY3Rpb24gdShlKXt2YXIgdD1lLmRpcnR5Q29tcG9uZW50c0xlbmd0aDt0IT09Zy5sZW5ndGg/bSghMSk6dm9pZCAwLGcuc29ydChhKSx5Kys7Zm9yKHZhciBuPTA7dD5uO24rKyl7dmFyIHI9Z1tuXSxvPXIuX3BlbmRpbmdDYWxsYmFja3M7ci5fcGVuZGluZ0NhbGxiYWNrcz1udWxsO3ZhciBpO2lmKGYubG9nVG9wTGV2ZWxSZW5kZXJzKXt2YXIgdT1yO3IuX2N1cnJlbnRFbGVtZW50LnByb3BzPT09ci5fcmVuZGVyZWRDb21wb25lbnQuX2N1cnJlbnRFbGVtZW50JiYodT1yLl9yZW5kZXJlZENvbXBvbmVudCksaT0iUmVhY3QgdXBkYXRlOiAiK3UuZ2V0TmFtZSgpLGNvbnNvbGUudGltZShpKX1pZihoLnBlcmZvcm1VcGRhdGVJZk5lY2Vzc2FyeShyLGUucmVjb25jaWxlVHJhbnNhY3Rpb24seSksaSYmY29uc29sZS50aW1lRW5kKGkpLG8pZm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZS5jYWxsYmFja1F1ZXVlLmVucXVldWUob1tzXSxyLmdldFB1YmxpY0luc3RhbmNlKCkpfX1mdW5jdGlvbiBzKGUpe3JldHVybiByKCksXy5pc0JhdGNoaW5nVXBkYXRlcz8oZy5wdXNoKGUpLHZvaWQobnVsbD09ZS5fdXBkYXRlQmF0Y2hOdW1iZXImJihlLl91cGRhdGVCYXRjaE51bWJlcj15KzEpKSk6dm9pZCBfLmJhdGNoZWRVcGRhdGVzKHMsZSl9ZnVuY3Rpb24gbChlLHQpe18uaXNCYXRjaGluZ1VwZGF0ZXM/dm9pZCAwOm0oITEpLEMuZW5xdWV1ZShlLHQpLGI9ITB9dmFyIGM9ZSgxNjUpLHA9ZSg1KSxkPWUoMjUpLGY9ZSg2NiksaD0oZSg3MCksZSg4MykpLHY9ZSgxMDgpLG09ZSgxNTQpLGc9W10seT0wLEM9cC5nZXRQb29sZWQoKSxiPSExLF89bnVsbCxFPXtpbml0aWFsaXplOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGg9Zy5sZW5ndGh9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXJ0eUNvbXBvbmVudHNMZW5ndGghPT1nLmxlbmd0aD8oZy5zcGxpY2UoMCx0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aCksVCgpKTpnLmxlbmd0aD0wfX0seD17aW5pdGlhbGl6ZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5yZXNldCgpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuY2FsbGJhY2tRdWV1ZS5ub3RpZnlBbGwoKX19LE49W0UseF07YyhvLnByb3RvdHlwZSx2Lk1peGluLHtnZXRUcmFuc2FjdGlvbldyYXBwZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIE59LGRlc3RydWN0b3I6ZnVuY3Rpb24oKXt0aGlzLmRpcnR5Q29tcG9uZW50c0xlbmd0aD1udWxsLHAucmVsZWFzZSh0aGlzLmNhbGxiYWNrUXVldWUpLHRoaXMuY2FsbGJhY2tRdWV1ZT1udWxsLHcuUmVhY3RSZWNvbmNpbGVUcmFuc2FjdGlvbi5yZWxlYXNlKHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24pLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb249bnVsbH0scGVyZm9ybTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHYuTWl4aW4ucGVyZm9ybS5jYWxsKHRoaXMsdGhpcy5yZWNvbmNpbGVUcmFuc2FjdGlvbi5wZXJmb3JtLHRoaXMucmVjb25jaWxlVHJhbnNhY3Rpb24sZSx0LG4pfX0pLGQuYWRkUG9vbGluZ1RvKG8pO3ZhciBUPWZ1bmN0aW9uKCl7Zm9yKDtnLmxlbmd0aHx8Yjspe2lmKGcubGVuZ3RoKXt2YXIgZT1vLmdldFBvb2xlZCgpO2UucGVyZm9ybSh1LG51bGwsZSksby5yZWxlYXNlKGUpfWlmKGIpe2I9ITE7dmFyIHQ9QztDPXAuZ2V0UG9vbGVkKCksdC5ub3RpZnlBbGwoKSxwLnJlbGVhc2UodCl9fX0sUD17aW5qZWN0UmVjb25jaWxlVHJhbnNhY3Rpb246ZnVuY3Rpb24oZSl7ZT92b2lkIDA6bSghMSksdy5SZWFjdFJlY29uY2lsZVRyYW5zYWN0aW9uPWV9LGluamVjdEJhdGNoaW5nU3RyYXRlZ3k6ZnVuY3Rpb24oZSl7ZT92b2lkIDA6bSghMSksImZ1bmN0aW9uIiE9dHlwZW9mIGUuYmF0Y2hlZFVwZGF0ZXM/bSghMSk6dm9pZCAwLCJib29sZWFuIiE9dHlwZW9mIGUuaXNCYXRjaGluZ1VwZGF0ZXM/bSghMSk6dm9pZCAwLF89ZX19LHc9e1JlYWN0UmVjb25jaWxlVHJhbnNhY3Rpb246bnVsbCxiYXRjaGVkVXBkYXRlczppLGVucXVldWVVcGRhdGU6cyxmbHVzaEJhdGNoZWRVcGRhdGVzOlQsaW5qZWN0aW9uOlAsYXNhcDpsfTt0LmV4cG9ydHM9d30sezEwODoxMDgsMTU0OjE1NCwxNjU6MTY1LDI1OjI1LDU6NSw2Njo2Niw3MDo3MCw4Mzo4M31dLDkxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3QuZXhwb3J0cz0iMTUuMS4wIn0se31dLDkyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UifSxvPXthY2NlbnRIZWlnaHQ6ImFjY2VudC1oZWlnaHQiLGFjY3VtdWxhdGU6MCxhZGRpdGl2ZTowLGFsaWdubWVudEJhc2VsaW5lOiJhbGlnbm1lbnQtYmFzZWxpbmUiLGFsbG93UmVvcmRlcjoiYWxsb3dSZW9yZGVyIixhbHBoYWJldGljOjAsYW1wbGl0dWRlOjAsYXJhYmljRm9ybToiYXJhYmljLWZvcm0iLGFzY2VudDowLGF0dHJpYnV0ZU5hbWU6ImF0dHJpYnV0ZU5hbWUiLGF0dHJpYnV0ZVR5cGU6ImF0dHJpYnV0ZVR5cGUiLGF1dG9SZXZlcnNlOiJhdXRvUmV2ZXJzZSIsYXppbXV0aDowLGJhc2VGcmVxdWVuY3k6ImJhc2VGcmVxdWVuY3kiLGJhc2VQcm9maWxlOiJiYXNlUHJvZmlsZSIsYmFzZWxpbmVTaGlmdDoiYmFzZWxpbmUtc2hpZnQiLGJib3g6MCxiZWdpbjowLGJpYXM6MCxieTowLGNhbGNNb2RlOiJjYWxjTW9kZSIsY2FwSGVpZ2h0OiJjYXAtaGVpZ2h0IixjbGlwOjAsY2xpcFBhdGg6ImNsaXAtcGF0aCIsY2xpcFJ1bGU6ImNsaXAtcnVsZSIsY2xpcFBhdGhVbml0czoiY2xpcFBhdGhVbml0cyIsY29sb3JJbnRlcnBvbGF0aW9uOiJjb2xvci1pbnRlcnBvbGF0aW9uIixjb2xvckludGVycG9sYXRpb25GaWx0ZXJzOiJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLGNvbG9yUHJvZmlsZToiY29sb3ItcHJvZmlsZSIsY29sb3JSZW5kZXJpbmc6ImNvbG9yLXJlbmRlcmluZyIsY29udGVudFNjcmlwdFR5cGU6ImNvbnRlbnRTY3JpcHRUeXBlIixjb250ZW50U3R5bGVUeXBlOiJjb250ZW50U3R5bGVUeXBlIixjdXJzb3I6MCxjeDowLGN5OjAsZDowLGRlY2VsZXJhdGU6MCxkZXNjZW50OjAsZGlmZnVzZUNvbnN0YW50OiJkaWZmdXNlQ29uc3RhbnQiLGRpcmVjdGlvbjowLGRpc3BsYXk6MCxkaXZpc29yOjAsZG9taW5hbnRCYXNlbGluZToiZG9taW5hbnQtYmFzZWxpbmUiLGR1cjowLGR4OjAsZHk6MCxlZGdlTW9kZToiZWRnZU1vZGUiLGVsZXZhdGlvbjowLGVuYWJsZUJhY2tncm91bmQ6ImVuYWJsZS1iYWNrZ3JvdW5kIixlbmQ6MCxleHBvbmVudDowLGV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQ6ImV4dGVybmFsUmVzb3VyY2VzUmVxdWlyZWQiLGZpbGw6MCxmaWxsT3BhY2l0eToiZmlsbC1vcGFjaXR5IixmaWxsUnVsZToiZmlsbC1ydWxlIixmaWx0ZXI6MCxmaWx0ZXJSZXM6ImZpbHRlclJlcyIsZmlsdGVyVW5pdHM6ImZpbHRlclVuaXRzIixmbG9vZENvbG9yOiJmbG9vZC1jb2xvciIsZmxvb2RPcGFjaXR5OiJmbG9vZC1vcGFjaXR5Iixmb2N1c2FibGU6MCxmb250RmFtaWx5OiJmb250LWZhbWlseSIsZm9udFNpemU6ImZvbnQtc2l6ZSIsZm9udFNpemVBZGp1c3Q6ImZvbnQtc2l6ZS1hZGp1c3QiLGZvbnRTdHJldGNoOiJmb250LXN0cmV0Y2giLGZvbnRTdHlsZToiZm9udC1zdHlsZSIsZm9udFZhcmlhbnQ6ImZvbnQtdmFyaWFudCIsZm9udFdlaWdodDoiZm9udC13ZWlnaHQiLGZvcm1hdDowLGZyb206MCxmeDowLGZ5OjAsZzE6MCxnMjowLGdseXBoTmFtZToiZ2x5cGgtbmFtZSIsZ2x5cGhPcmllbnRhdGlvbkhvcml6b250YWw6ImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLGdseXBoT3JpZW50YXRpb25WZXJ0aWNhbDoiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLGdseXBoUmVmOiJnbHlwaFJlZiIsZ3JhZGllbnRUcmFuc2Zvcm06ImdyYWRpZW50VHJhbnNmb3JtIixncmFkaWVudFVuaXRzOiJncmFkaWVudFVuaXRzIixoYW5naW5nOjAsaG9yaXpBZHZYOiJob3Jpei1hZHYteCIsaG9yaXpPcmlnaW5YOiJob3Jpei1vcmlnaW4teCIsaWRlb2dyYXBoaWM6MCxpbWFnZVJlbmRlcmluZzoiaW1hZ2UtcmVuZGVyaW5nIiwiaW4iOjAsaW4yOjAsaW50ZXJjZXB0OjAsazowLGsxOjAsazI6MCxrMzowLGs0OjAsa2VybmVsTWF0cml4OiJrZXJuZWxNYXRyaXgiLGtlcm5lbFVuaXRMZW5ndGg6Imtlcm5lbFVuaXRMZW5ndGgiLGtlcm5pbmc6MCxrZXlQb2ludHM6ImtleVBvaW50cyIsa2V5U3BsaW5lczoia2V5U3BsaW5lcyIsa2V5VGltZXM6ImtleVRpbWVzIixsZW5ndGhBZGp1c3Q6Imxlbmd0aEFkanVzdCIsbGV0dGVyU3BhY2luZzoibGV0dGVyLXNwYWNpbmciLGxpZ2h0aW5nQ29sb3I6ImxpZ2h0aW5nLWNvbG9yIixsaW1pdGluZ0NvbmVBbmdsZToibGltaXRpbmdDb25lQW5nbGUiLGxvY2FsOjAsbWFya2VyRW5kOiJtYXJrZXItZW5kIixtYXJrZXJNaWQ6Im1hcmtlci1taWQiLG1hcmtlclN0YXJ0OiJtYXJrZXItc3RhcnQiLG1hcmtlckhlaWdodDoibWFya2VySGVpZ2h0IixtYXJrZXJVbml0czoibWFya2VyVW5pdHMiLG1hcmtlcldpZHRoOiJtYXJrZXJXaWR0aCIsbWFzazowLG1hc2tDb250ZW50VW5pdHM6Im1hc2tDb250ZW50VW5pdHMiLG1hc2tVbml0czoibWFza1VuaXRzIixtYXRoZW1hdGljYWw6MCxtb2RlOjAsbnVtT2N0YXZlczoibnVtT2N0YXZlcyIsb2Zmc2V0OjAsb3BhY2l0eTowLG9wZXJhdG9yOjAsb3JkZXI6MCxvcmllbnQ6MCxvcmllbnRhdGlvbjowLG9yaWdpbjowLG92ZXJmbG93OjAsb3ZlcmxpbmVQb3NpdGlvbjoib3ZlcmxpbmUtcG9zaXRpb24iLG92ZXJsaW5lVGhpY2tuZXNzOiJvdmVybGluZS10aGlja25lc3MiLHBhaW50T3JkZXI6InBhaW50LW9yZGVyIixwYW5vc2UxOiJwYW5vc2UtMSIscGF0aExlbmd0aDoicGF0aExlbmd0aCIscGF0dGVybkNvbnRlbnRVbml0czoicGF0dGVybkNvbnRlbnRVbml0cyIscGF0dGVyblRyYW5zZm9ybToicGF0dGVyblRyYW5zZm9ybSIscGF0dGVyblVuaXRzOiJwYXR0ZXJuVW5pdHMiLHBvaW50ZXJFdmVudHM6InBvaW50ZXItZXZlbnRzIixwb2ludHM6MCxwb2ludHNBdFg6InBvaW50c0F0WCIscG9pbnRzQXRZOiJwb2ludHNBdFkiLHBvaW50c0F0WjoicG9pbnRzQXRaIixwcmVzZXJ2ZUFscGhhOiJwcmVzZXJ2ZUFscGhhIixwcmVzZXJ2ZUFzcGVjdFJhdGlvOiJwcmVzZXJ2ZUFzcGVjdFJhdGlvIixwcmltaXRpdmVVbml0czoicHJpbWl0aXZlVW5pdHMiLHI6MCxyYWRpdXM6MCxyZWZYOiJyZWZYIixyZWZZOiJyZWZZIixyZW5kZXJpbmdJbnRlbnQ6InJlbmRlcmluZy1pbnRlbnQiLHJlcGVhdENvdW50OiJyZXBlYXRDb3VudCIscmVwZWF0RHVyOiJyZXBlYXREdXIiLHJlcXVpcmVkRXh0ZW5zaW9uczoicmVxdWlyZWRFeHRlbnNpb25zIixyZXF1aXJlZEZlYXR1cmVzOiJyZXF1aXJlZEZlYXR1cmVzIixyZXN0YXJ0OjAscmVzdWx0OjAscm90YXRlOjAscng6MCxyeTowLHNjYWxlOjAsc2VlZDowLHNoYXBlUmVuZGVyaW5nOiJzaGFwZS1yZW5kZXJpbmciLHNsb3BlOjAsc3BhY2luZzowLHNwZWN1bGFyQ29uc3RhbnQ6InNwZWN1bGFyQ29uc3RhbnQiLHNwZWN1bGFyRXhwb25lbnQ6InNwZWN1bGFyRXhwb25lbnQiLHNwZWVkOjAsc3ByZWFkTWV0aG9kOiJzcHJlYWRNZXRob2QiLHN0YXJ0T2Zmc2V0OiJzdGFydE9mZnNldCIsc3RkRGV2aWF0aW9uOiJzdGREZXZpYXRpb24iLHN0ZW1oOjAsc3RlbXY6MCxzdGl0Y2hUaWxlczoic3RpdGNoVGlsZXMiLHN0b3BDb2xvcjoic3RvcC1jb2xvciIsc3RvcE9wYWNpdHk6InN0b3Atb3BhY2l0eSIsc3RyaWtldGhyb3VnaFBvc2l0aW9uOiJzdHJpa2V0aHJvdWdoLXBvc2l0aW9uIixzdHJpa2V0aHJvdWdoVGhpY2tuZXNzOiJzdHJpa2V0aHJvdWdoLXRoaWNrbmVzcyIsc3RyaW5nOjAsc3Ryb2tlOjAsc3Ryb2tlRGFzaGFycmF5OiJzdHJva2UtZGFzaGFycmF5IixzdHJva2VEYXNob2Zmc2V0OiJzdHJva2UtZGFzaG9mZnNldCIsc3Ryb2tlTGluZWNhcDoic3Ryb2tlLWxpbmVjYXAiLHN0cm9rZUxpbmVqb2luOiJzdHJva2UtbGluZWpvaW4iLHN0cm9rZU1pdGVybGltaXQ6InN0cm9rZS1taXRlcmxpbWl0IixzdHJva2VPcGFjaXR5OiJzdHJva2Utb3BhY2l0eSIsc3Ryb2tlV2lkdGg6InN0cm9rZS13aWR0aCIsc3VyZmFjZVNjYWxlOiJzdXJmYWNlU2NhbGUiLHN5c3RlbUxhbmd1YWdlOiJzeXN0ZW1MYW5ndWFnZSIsdGFibGVWYWx1ZXM6InRhYmxlVmFsdWVzIix0YXJnZXRYOiJ0YXJnZXRYIix0YXJnZXRZOiJ0YXJnZXRZIix0ZXh0QW5jaG9yOiJ0ZXh0LWFuY2hvciIsdGV4dERlY29yYXRpb246InRleHQtZGVjb3JhdGlvbiIsdGV4dFJlbmRlcmluZzoidGV4dC1yZW5kZXJpbmciLHRleHRMZW5ndGg6InRleHRMZW5ndGgiLHRvOjAsdHJhbnNmb3JtOjAsdTE6MCx1MjowLHVuZGVybGluZVBvc2l0aW9uOiJ1bmRlcmxpbmUtcG9zaXRpb24iLHVuZGVybGluZVRoaWNrbmVzczoidW5kZXJsaW5lLXRoaWNrbmVzcyIsdW5pY29kZTowLHVuaWNvZGVCaWRpOiJ1bmljb2RlLWJpZGkiLHVuaWNvZGVSYW5nZToidW5pY29kZS1yYW5nZSIsdW5pdHNQZXJFbToidW5pdHMtcGVyLWVtIix2QWxwaGFiZXRpYzoidi1hbHBoYWJldGljIix2SGFuZ2luZzoidi1oYW5naW5nIix2SWRlb2dyYXBoaWM6InYtaWRlb2dyYXBoaWMiLHZNYXRoZW1hdGljYWw6InYtbWF0aGVtYXRpY2FsIix2YWx1ZXM6MCx2ZWN0b3JFZmZlY3Q6InZlY3Rvci1lZmZlY3QiLHZlcnNpb246MCx2ZXJ0QWR2WToidmVydC1hZHYteSIsdmVydE9yaWdpblg6InZlcnQtb3JpZ2luLXgiLHZlcnRPcmlnaW5ZOiJ2ZXJ0LW9yaWdpbi15Iix2aWV3Qm94OiJ2aWV3Qm94Iix2aWV3VGFyZ2V0OiJ2aWV3VGFyZ2V0Iix2aXNpYmlsaXR5OjAsd2lkdGhzOjAsd29yZFNwYWNpbmc6IndvcmQtc3BhY2luZyIsd3JpdGluZ01vZGU6IndyaXRpbmctbW9kZSIseDowLHhIZWlnaHQ6IngtaGVpZ2h0Iix4MTowLHgyOjAseENoYW5uZWxTZWxlY3RvcjoieENoYW5uZWxTZWxlY3RvciIseGxpbmtBY3R1YXRlOiJ4bGluazphY3R1YXRlIix4bGlua0FyY3JvbGU6InhsaW5rOmFyY3JvbGUiLHhsaW5rSHJlZjoieGxpbms6aHJlZiIseGxpbmtSb2xlOiJ4bGluazpyb2xlIix4bGlua1Nob3c6InhsaW5rOnNob3ciLHhsaW5rVGl0bGU6InhsaW5rOnRpdGxlIix4bGlua1R5cGU6InhsaW5rOnR5cGUiLHhtbEJhc2U6InhtbDpiYXNlIix4bWxMYW5nOiJ4bWw6bGFuZyIseG1sU3BhY2U6InhtbDpzcGFjZSIseTowLHkxOjAseTI6MCx5Q2hhbm5lbFNlbGVjdG9yOiJ5Q2hhbm5lbFNlbGVjdG9yIix6OjAsem9vbUFuZFBhbjoiem9vbUFuZFBhbiJ9LGk9e1Byb3BlcnRpZXM6e30sRE9NQXR0cmlidXRlTmFtZXNwYWNlczp7eGxpbmtBY3R1YXRlOnIueGxpbmsseGxpbmtBcmNyb2xlOnIueGxpbmsseGxpbmtIcmVmOnIueGxpbmsseGxpbmtSb2xlOnIueGxpbmsseGxpbmtTaG93OnIueGxpbmsseGxpbmtUaXRsZTpyLnhsaW5rLHhsaW5rVHlwZTpyLnhsaW5rLHhtbEJhc2U6ci54bWwseG1sTGFuZzpyLnhtbCx4bWxTcGFjZTpyLnhtbH0sRE9NQXR0cmlidXRlTmFtZXM6e319O09iamVjdC5rZXlzKG8pLmZvckVhY2goZnVuY3Rpb24oZSl7aS5Qcm9wZXJ0aWVzW2VdPTAsb1tlXSYmKGkuRE9NQXR0cmlidXRlTmFtZXNbZV09b1tlXSl9KSx0LmV4cG9ydHM9aX0se31dLDkzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYoInNlbGVjdGlvblN0YXJ0ImluIGUmJmwuaGFzU2VsZWN0aW9uQ2FwYWJpbGl0aWVzKGUpKXJldHVybntzdGFydDplLnNlbGVjdGlvblN0YXJ0LGVuZDplLnNlbGVjdGlvbkVuZH07aWYod2luZG93LmdldFNlbGVjdGlvbil7dmFyIHQ9d2luZG93LmdldFNlbGVjdGlvbigpO3JldHVybnthbmNob3JOb2RlOnQuYW5jaG9yTm9kZSxhbmNob3JPZmZzZXQ6dC5hbmNob3JPZmZzZXQsZm9jdXNOb2RlOnQuZm9jdXNOb2RlLGZvY3VzT2Zmc2V0OnQuZm9jdXNPZmZzZXR9fWlmKGRvY3VtZW50LnNlbGVjdGlvbil7dmFyIG49ZG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7cmV0dXJue3BhcmVudEVsZW1lbnQ6bi5wYXJlbnRFbGVtZW50KCksdGV4dDpuLnRleHQsdG9wOm4uYm91bmRpbmdUb3AsbGVmdDpuLmJvdW5kaW5nTGVmdH19fWZ1bmN0aW9uIG8oZSx0KXtpZihffHxudWxsPT15fHx5IT09cCgpKXJldHVybiBudWxsO3ZhciBuPXIoeSk7aWYoIWJ8fCFoKGIsbikpe2I9bjt2YXIgbz1jLmdldFBvb2xlZChnLnNlbGVjdCxDLGUsdCk7cmV0dXJuIG8udHlwZT0ic2VsZWN0IixvLnRhcmdldD15LGEuYWNjdW11bGF0ZVR3b1BoYXNlRGlzcGF0Y2hlcyhvKSxvfXJldHVybiBudWxsfXZhciBpPWUoMTYpLGE9ZSgyMCksdT1lKDE0MCkscz1lKDQwKSxsPWUoNjgpLGM9ZSg5OSkscD1lKDE0OSksZD1lKDEzMCksZj1lKDE1OCksaD1lKDE2Myksdj1pLnRvcExldmVsVHlwZXMsbT11LmNhblVzZURPTSYmImRvY3VtZW50TW9kZSJpbiBkb2N1bWVudCYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlPD0xMSxnPXtzZWxlY3Q6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOmYoe29uU2VsZWN0Om51bGx9KSxjYXB0dXJlZDpmKHtvblNlbGVjdENhcHR1cmU6bnVsbH0pfSxkZXBlbmRlbmNpZXM6W3YudG9wQmx1cix2LnRvcENvbnRleHRNZW51LHYudG9wRm9jdXMsdi50b3BLZXlEb3duLHYudG9wTW91c2VEb3duLHYudG9wTW91c2VVcCx2LnRvcFNlbGVjdGlvbkNoYW5nZV19fSx5PW51bGwsQz1udWxsLGI9bnVsbCxfPSExLEU9ITEseD1mKHtvblNlbGVjdDpudWxsfSksTj17ZXZlbnRUeXBlczpnLGV4dHJhY3RFdmVudHM6ZnVuY3Rpb24oZSx0LG4scil7aWYoIUUpcmV0dXJuIG51bGw7dmFyIGk9dD9zLmdldE5vZGVGcm9tSW5zdGFuY2UodCk6d2luZG93O3N3aXRjaChlKXtjYXNlIHYudG9wRm9jdXM6KGQoaSl8fCJ0cnVlIj09PWkuY29udGVudEVkaXRhYmxlKSYmKHk9aSxDPXQsYj1udWxsKTticmVhaztjYXNlIHYudG9wQmx1cjp5PW51bGwsQz1udWxsLGI9bnVsbDticmVhaztjYXNlIHYudG9wTW91c2VEb3duOl89ITA7YnJlYWs7Y2FzZSB2LnRvcENvbnRleHRNZW51OmNhc2Ugdi50b3BNb3VzZVVwOnJldHVybiBfPSExLG8obixyKTtjYXNlIHYudG9wU2VsZWN0aW9uQ2hhbmdlOmlmKG0pYnJlYWs7Y2FzZSB2LnRvcEtleURvd246Y2FzZSB2LnRvcEtleVVwOnJldHVybiBvKG4scil9cmV0dXJuIG51bGx9LGRpZFB1dExpc3RlbmVyOmZ1bmN0aW9uKGUsdCxuKXt0PT09eCYmKEU9ITApfX07dC5leHBvcnRzPU59LHsxMzA6MTMwLDE0MDoxNDAsMTQ5OjE0OSwxNTg6MTU4LDE2OjE2LDE2MzoxNjMsMjA6MjAsNDA6NDAsNjg6NjgsOTk6OTl9XSw5NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE2KSxvPWUoMTM5KSxpPWUoMjApLGE9ZSg0MCksdT1lKDk1KSxzPWUoOTYpLGw9ZSg5OSksYz1lKDEwMCkscD1lKDEwMiksZD1lKDEwMyksZj1lKDk4KSxoPWUoMTA0KSx2PWUoMTA1KSxtPWUoMTA2KSxnPWUoMTA3KSx5PWUoMTQ2KSxDPWUoMTE5KSxiPWUoMTU0KSxfPWUoMTU4KSxFPXIudG9wTGV2ZWxUeXBlcyx4PXthYm9ydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25BYm9ydDohMH0pLGNhcHR1cmVkOl8oe29uQWJvcnRDYXB0dXJlOiEwfSl9fSxhbmltYXRpb25FbmQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQW5pbWF0aW9uRW5kOiEwfSksY2FwdHVyZWQ6Xyh7b25BbmltYXRpb25FbmRDYXB0dXJlOiEwfSl9fSxhbmltYXRpb25JdGVyYXRpb246e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQW5pbWF0aW9uSXRlcmF0aW9uOiEwfSksY2FwdHVyZWQ6Xyh7b25BbmltYXRpb25JdGVyYXRpb25DYXB0dXJlOiEwfSl9fSxhbmltYXRpb25TdGFydDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25BbmltYXRpb25TdGFydDohMH0pLGNhcHR1cmVkOl8oe29uQW5pbWF0aW9uU3RhcnRDYXB0dXJlOiEwfSl9fSxibHVyOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkJsdXI6ITB9KSxjYXB0dXJlZDpfKHtvbkJsdXJDYXB0dXJlOiEwfSl9fSxjYW5QbGF5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkNhblBsYXk6ITB9KSxjYXB0dXJlZDpfKHtvbkNhblBsYXlDYXB0dXJlOiEwfSl9fSxjYW5QbGF5VGhyb3VnaDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25DYW5QbGF5VGhyb3VnaDohMH0pLGNhcHR1cmVkOl8oe29uQ2FuUGxheVRocm91Z2hDYXB0dXJlOiEwfSl9fSxjbGljazp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25DbGljazohMH0pLGNhcHR1cmVkOl8oe29uQ2xpY2tDYXB0dXJlOiEwfSl9fSxjb250ZXh0TWVudTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Db250ZXh0TWVudTohMH0pLGNhcHR1cmVkOl8oe29uQ29udGV4dE1lbnVDYXB0dXJlOiEwfSl9fSxjb3B5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkNvcHk6ITB9KSxjYXB0dXJlZDpfKHtvbkNvcHlDYXB0dXJlOiEwfSl9fSxjdXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uQ3V0OiEwfSksY2FwdHVyZWQ6Xyh7b25DdXRDYXB0dXJlOiEwfSl9fSxkb3VibGVDbGljazp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Eb3VibGVDbGljazohMH0pLGNhcHR1cmVkOl8oe29uRG91YmxlQ2xpY2tDYXB0dXJlOiEwfSl9fSxkcmFnOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyYWc6ITB9KSxjYXB0dXJlZDpfKHtvbkRyYWdDYXB0dXJlOiEwfSl9fSxkcmFnRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyYWdFbmQ6ITB9KSxjYXB0dXJlZDpfKHtvbkRyYWdFbmRDYXB0dXJlOiEwfSl9fSxkcmFnRW50ZXI6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ0VudGVyOiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnRW50ZXJDYXB0dXJlOiEwfSl9fSxkcmFnRXhpdDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EcmFnRXhpdDohMH0pLGNhcHR1cmVkOl8oe29uRHJhZ0V4aXRDYXB0dXJlOiEwfSl9fSxkcmFnTGVhdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ0xlYXZlOiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnTGVhdmVDYXB0dXJlOiEwfSl9fSxkcmFnT3Zlcjp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EcmFnT3ZlcjohMH0pLGNhcHR1cmVkOl8oe29uRHJhZ092ZXJDYXB0dXJlOiEwfSl9fSxkcmFnU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRHJhZ1N0YXJ0OiEwfSksY2FwdHVyZWQ6Xyh7b25EcmFnU3RhcnRDYXB0dXJlOiEwfSl9fSxkcm9wOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkRyb3A6ITB9KSxjYXB0dXJlZDpfKHtvbkRyb3BDYXB0dXJlOiEwfSl9fSxkdXJhdGlvbkNoYW5nZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25EdXJhdGlvbkNoYW5nZTohMH0pLGNhcHR1cmVkOl8oe29uRHVyYXRpb25DaGFuZ2VDYXB0dXJlOiEwfSl9fSxlbXB0aWVkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkVtcHRpZWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkVtcHRpZWRDYXB0dXJlOiEwfSl9fSxlbmNyeXB0ZWQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uRW5jcnlwdGVkOiEwfSksY2FwdHVyZWQ6Xyh7b25FbmNyeXB0ZWRDYXB0dXJlOiEwfSl9fSxlbmRlZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25FbmRlZDohMH0pLGNhcHR1cmVkOl8oe29uRW5kZWRDYXB0dXJlOiEwfSl9fSxlcnJvcjp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25FcnJvcjohMH0pLGNhcHR1cmVkOl8oe29uRXJyb3JDYXB0dXJlOiEwfSl9fSxmb2N1czp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Gb2N1czohMH0pLGNhcHR1cmVkOl8oe29uRm9jdXNDYXB0dXJlOiEwfSl9fSxpbnB1dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25JbnB1dDohMH0pLGNhcHR1cmVkOl8oe29uSW5wdXRDYXB0dXJlOiEwfSl9fSxpbnZhbGlkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkludmFsaWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkludmFsaWRDYXB0dXJlOiEwfSl9fSxrZXlEb3duOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbktleURvd246ITB9KSxjYXB0dXJlZDpfKHtvbktleURvd25DYXB0dXJlOiEwfSl9fSxrZXlQcmVzczp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25LZXlQcmVzczohMH0pLGNhcHR1cmVkOl8oe29uS2V5UHJlc3NDYXB0dXJlOiEwfSl9fSxrZXlVcDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25LZXlVcDohMH0pLGNhcHR1cmVkOl8oe29uS2V5VXBDYXB0dXJlOiEwfSl9fSxsb2FkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkxvYWQ6ITB9KSxjYXB0dXJlZDpfKHtvbkxvYWRDYXB0dXJlOiEwfSl9fSxsb2FkZWREYXRhOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbkxvYWRlZERhdGE6ITB9KSxjYXB0dXJlZDpfKHtvbkxvYWRlZERhdGFDYXB0dXJlOiEwfSl9fSxsb2FkZWRNZXRhZGF0YTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Mb2FkZWRNZXRhZGF0YTohMH0pLGNhcHR1cmVkOl8oe29uTG9hZGVkTWV0YWRhdGFDYXB0dXJlOiEwfSl9fSxsb2FkU3RhcnQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTG9hZFN0YXJ0OiEwfSksY2FwdHVyZWQ6Xyh7b25Mb2FkU3RhcnRDYXB0dXJlOiEwfSl9fSxtb3VzZURvd246e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VEb3duOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZURvd25DYXB0dXJlOiEwfSl9fSxtb3VzZU1vdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VNb3ZlOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZU1vdmVDYXB0dXJlOiEwfSl9fSxtb3VzZU91dDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Nb3VzZU91dDohMH0pLGNhcHR1cmVkOl8oe29uTW91c2VPdXRDYXB0dXJlOiEwfSl9fSxtb3VzZU92ZXI6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uTW91c2VPdmVyOiEwfSksY2FwdHVyZWQ6Xyh7b25Nb3VzZU92ZXJDYXB0dXJlOiEwfSl9fSxtb3VzZVVwOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbk1vdXNlVXA6ITB9KSxjYXB0dXJlZDpfKHtvbk1vdXNlVXBDYXB0dXJlOiEwfSl9fSxwYXN0ZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25QYXN0ZTohMH0pLGNhcHR1cmVkOl8oe29uUGFzdGVDYXB0dXJlOiEwfSl9fSxwYXVzZTp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25QYXVzZTohMH0pLGNhcHR1cmVkOl8oe29uUGF1c2VDYXB0dXJlOiEwfSl9fSxwbGF5OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblBsYXk6ITB9KSxjYXB0dXJlZDpfKHtvblBsYXlDYXB0dXJlOiEwfSl9fSxwbGF5aW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblBsYXlpbmc6ITB9KSxjYXB0dXJlZDpfKHtvblBsYXlpbmdDYXB0dXJlOiEwfSl9fSxwcm9ncmVzczp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Qcm9ncmVzczohMH0pLGNhcHR1cmVkOl8oe29uUHJvZ3Jlc3NDYXB0dXJlOiEwfSl9fSxyYXRlQ2hhbmdlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblJhdGVDaGFuZ2U6ITB9KSxjYXB0dXJlZDpfKHtvblJhdGVDaGFuZ2VDYXB0dXJlOiEwfSl9fSxyZXNldDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25SZXNldDohMH0pLGNhcHR1cmVkOl8oe29uUmVzZXRDYXB0dXJlOiEwfSl9fSxzY3JvbGw6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU2Nyb2xsOiEwfSksY2FwdHVyZWQ6Xyh7b25TY3JvbGxDYXB0dXJlOiEwfSl9fSxzZWVrZWQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU2Vla2VkOiEwfSksY2FwdHVyZWQ6Xyh7b25TZWVrZWRDYXB0dXJlOiEwfSl9fSxzZWVraW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblNlZWtpbmc6ITB9KSxjYXB0dXJlZDpfKHtvblNlZWtpbmdDYXB0dXJlOiEwfSl9fSxzdGFsbGVkOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblN0YWxsZWQ6ITB9KSxjYXB0dXJlZDpfKHtvblN0YWxsZWRDYXB0dXJlOiEwfSl9fSxzdWJtaXQ6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uU3VibWl0OiEwfSksY2FwdHVyZWQ6Xyh7b25TdWJtaXRDYXB0dXJlOiEwfSl9fSxzdXNwZW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblN1c3BlbmQ6ITB9KSxjYXB0dXJlZDpfKHtvblN1c3BlbmRDYXB0dXJlOiEwfSl9fSx0aW1lVXBkYXRlOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRpbWVVcGRhdGU6ITB9KSxjYXB0dXJlZDpfKHtvblRpbWVVcGRhdGVDYXB0dXJlOiEwfSl9fSx0b3VjaENhbmNlbDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Ub3VjaENhbmNlbDohMH0pLGNhcHR1cmVkOl8oe29uVG91Y2hDYW5jZWxDYXB0dXJlOiEwfSl9fSx0b3VjaEVuZDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25Ub3VjaEVuZDohMH0pLGNhcHR1cmVkOl8oe29uVG91Y2hFbmRDYXB0dXJlOiEwfSl9fSx0b3VjaE1vdmU6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uVG91Y2hNb3ZlOiEwfSksY2FwdHVyZWQ6Xyh7b25Ub3VjaE1vdmVDYXB0dXJlOiEwfSl9fSx0b3VjaFN0YXJ0OntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRvdWNoU3RhcnQ6ITB9KSxjYXB0dXJlZDpfKHtvblRvdWNoU3RhcnRDYXB0dXJlOiEwfSl9fSx0cmFuc2l0aW9uRW5kOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvblRyYW5zaXRpb25FbmQ6ITB9KSxjYXB0dXJlZDpfKHtvblRyYW5zaXRpb25FbmRDYXB0dXJlOiEwfSl9fSx2b2x1bWVDaGFuZ2U6e3BoYXNlZFJlZ2lzdHJhdGlvbk5hbWVzOntidWJibGVkOl8oe29uVm9sdW1lQ2hhbmdlOiEwfSksY2FwdHVyZWQ6Xyh7b25Wb2x1bWVDaGFuZ2VDYXB0dXJlOiEwfSl9fSx3YWl0aW5nOntwaGFzZWRSZWdpc3RyYXRpb25OYW1lczp7YnViYmxlZDpfKHtvbldhaXRpbmc6ITB9KSxjYXB0dXJlZDpfKHtvbldhaXRpbmdDYXB0dXJlOiEwfSl9fSx3aGVlbDp7cGhhc2VkUmVnaXN0cmF0aW9uTmFtZXM6e2J1YmJsZWQ6Xyh7b25XaGVlbDohMH0pLGNhcHR1cmVkOl8oe29uV2hlZWxDYXB0dXJlOiEwfSl9fX0sTj17dG9wQWJvcnQ6eC5hYm9ydCx0b3BBbmltYXRpb25FbmQ6eC5hbmltYXRpb25FbmQsdG9wQW5pbWF0aW9uSXRlcmF0aW9uOnguYW5pbWF0aW9uSXRlcmF0aW9uLHRvcEFuaW1hdGlvblN0YXJ0OnguYW5pbWF0aW9uU3RhcnQsdG9wQmx1cjp4LmJsdXIsdG9wQ2FuUGxheTp4LmNhblBsYXksdG9wQ2FuUGxheVRocm91Z2g6eC5jYW5QbGF5VGhyb3VnaCx0b3BDbGljazp4LmNsaWNrLHRvcENvbnRleHRNZW51OnguY29udGV4dE1lbnUsdG9wQ29weTp4LmNvcHksdG9wQ3V0OnguY3V0LHRvcERvdWJsZUNsaWNrOnguZG91YmxlQ2xpY2ssdG9wRHJhZzp4LmRyYWcsdG9wRHJhZ0VuZDp4LmRyYWdFbmQsdG9wRHJhZ0VudGVyOnguZHJhZ0VudGVyLHRvcERyYWdFeGl0OnguZHJhZ0V4aXQsdG9wRHJhZ0xlYXZlOnguZHJhZ0xlYXZlLHRvcERyYWdPdmVyOnguZHJhZ092ZXIsdG9wRHJhZ1N0YXJ0OnguZHJhZ1N0YXJ0LHRvcERyb3A6eC5kcm9wLHRvcER1cmF0aW9uQ2hhbmdlOnguZHVyYXRpb25DaGFuZ2UsdG9wRW1wdGllZDp4LmVtcHRpZWQsdG9wRW5jcnlwdGVkOnguZW5jcnlwdGVkLHRvcEVuZGVkOnguZW5kZWQsdG9wRXJyb3I6eC5lcnJvcix0b3BGb2N1czp4LmZvY3VzLHRvcElucHV0OnguaW5wdXQsdG9wSW52YWxpZDp4LmludmFsaWQsdG9wS2V5RG93bjp4LmtleURvd24sdG9wS2V5UHJlc3M6eC5rZXlQcmVzcyx0b3BLZXlVcDp4LmtleVVwLHRvcExvYWQ6eC5sb2FkLHRvcExvYWRlZERhdGE6eC5sb2FkZWREYXRhLHRvcExvYWRlZE1ldGFkYXRhOngubG9hZGVkTWV0YWRhdGEsdG9wTG9hZFN0YXJ0OngubG9hZFN0YXJ0LHRvcE1vdXNlRG93bjp4Lm1vdXNlRG93bix0b3BNb3VzZU1vdmU6eC5tb3VzZU1vdmUsdG9wTW91c2VPdXQ6eC5tb3VzZU91dCx0b3BNb3VzZU92ZXI6eC5tb3VzZU92ZXIsdG9wTW91c2VVcDp4Lm1vdXNlVXAsdG9wUGFzdGU6eC5wYXN0ZSx0b3BQYXVzZTp4LnBhdXNlLHRvcFBsYXk6eC5wbGF5LHRvcFBsYXlpbmc6eC5wbGF5aW5nLHRvcFByb2dyZXNzOngucHJvZ3Jlc3MsdG9wUmF0ZUNoYW5nZTp4LnJhdGVDaGFuZ2UsdG9wUmVzZXQ6eC5yZXNldCx0b3BTY3JvbGw6eC5zY3JvbGwsdG9wU2Vla2VkOnguc2Vla2VkLHRvcFNlZWtpbmc6eC5zZWVraW5nLHRvcFN0YWxsZWQ6eC5zdGFsbGVkLHRvcFN1Ym1pdDp4LnN1Ym1pdCx0b3BTdXNwZW5kOnguc3VzcGVuZCx0b3BUaW1lVXBkYXRlOngudGltZVVwZGF0ZSx0b3BUb3VjaENhbmNlbDp4LnRvdWNoQ2FuY2VsLHRvcFRvdWNoRW5kOngudG91Y2hFbmQsdG9wVG91Y2hNb3ZlOngudG91Y2hNb3ZlLHRvcFRvdWNoU3RhcnQ6eC50b3VjaFN0YXJ0LHRvcFRyYW5zaXRpb25FbmQ6eC50cmFuc2l0aW9uRW5kLHRvcFZvbHVtZUNoYW5nZTp4LnZvbHVtZUNoYW5nZSx0b3BXYWl0aW5nOngud2FpdGluZyx0b3BXaGVlbDp4LndoZWVsfTtmb3IodmFyIFQgaW4gTilOW1RdLmRlcGVuZGVuY2llcz1bVF07dmFyIFA9Xyh7b25DbGljazpudWxsfSksdz17fSxTPXtldmVudFR5cGVzOngsZXh0cmFjdEV2ZW50czpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1OW2VdO2lmKCFvKXJldHVybiBudWxsO3ZhciBhO3N3aXRjaChlKXtjYXNlIEUudG9wQWJvcnQ6Y2FzZSBFLnRvcENhblBsYXk6Y2FzZSBFLnRvcENhblBsYXlUaHJvdWdoOmNhc2UgRS50b3BEdXJhdGlvbkNoYW5nZTpjYXNlIEUudG9wRW1wdGllZDpjYXNlIEUudG9wRW5jcnlwdGVkOmNhc2UgRS50b3BFbmRlZDpjYXNlIEUudG9wRXJyb3I6Y2FzZSBFLnRvcElucHV0OmNhc2UgRS50b3BJbnZhbGlkOmNhc2UgRS50b3BMb2FkOmNhc2UgRS50b3BMb2FkZWREYXRhOmNhc2UgRS50b3BMb2FkZWRNZXRhZGF0YTpjYXNlIEUudG9wTG9hZFN0YXJ0OmNhc2UgRS50b3BQYXVzZTpjYXNlIEUudG9wUGxheTpjYXNlIEUudG9wUGxheWluZzpjYXNlIEUudG9wUHJvZ3Jlc3M6Y2FzZSBFLnRvcFJhdGVDaGFuZ2U6Y2FzZSBFLnRvcFJlc2V0OmNhc2UgRS50b3BTZWVrZWQ6Y2FzZSBFLnRvcFNlZWtpbmc6Y2FzZSBFLnRvcFN0YWxsZWQ6Y2FzZSBFLnRvcFN1Ym1pdDpjYXNlIEUudG9wU3VzcGVuZDpjYXNlIEUudG9wVGltZVVwZGF0ZTpjYXNlIEUudG9wVm9sdW1lQ2hhbmdlOmNhc2UgRS50b3BXYWl0aW5nOmE9bDticmVhaztjYXNlIEUudG9wS2V5UHJlc3M6aWYoMD09PUMobikpcmV0dXJuIG51bGw7Y2FzZSBFLnRvcEtleURvd246Y2FzZSBFLnRvcEtleVVwOmE9cDticmVhaztjYXNlIEUudG9wQmx1cjpjYXNlIEUudG9wRm9jdXM6YT1jO2JyZWFrO2Nhc2UgRS50b3BDbGljazppZigyPT09bi5idXR0b24pcmV0dXJuIG51bGw7Y2FzZSBFLnRvcENvbnRleHRNZW51OmNhc2UgRS50b3BEb3VibGVDbGljazpjYXNlIEUudG9wTW91c2VEb3duOmNhc2UgRS50b3BNb3VzZU1vdmU6Y2FzZSBFLnRvcE1vdXNlT3V0OmNhc2UgRS50b3BNb3VzZU92ZXI6Y2FzZSBFLnRvcE1vdXNlVXA6YT1kO2JyZWFrO2Nhc2UgRS50b3BEcmFnOmNhc2UgRS50b3BEcmFnRW5kOmNhc2UgRS50b3BEcmFnRW50ZXI6Y2FzZSBFLnRvcERyYWdFeGl0OmNhc2UgRS50b3BEcmFnTGVhdmU6Y2FzZSBFLnRvcERyYWdPdmVyOmNhc2UgRS50b3BEcmFnU3RhcnQ6Y2FzZSBFLnRvcERyb3A6YT1mO2JyZWFrO2Nhc2UgRS50b3BUb3VjaENhbmNlbDpjYXNlIEUudG9wVG91Y2hFbmQ6Y2FzZSBFLnRvcFRvdWNoTW92ZTpjYXNlIEUudG9wVG91Y2hTdGFydDphPWg7YnJlYWs7Y2FzZSBFLnRvcEFuaW1hdGlvbkVuZDpjYXNlIEUudG9wQW5pbWF0aW9uSXRlcmF0aW9uOmNhc2UgRS50b3BBbmltYXRpb25TdGFydDphPXU7YnJlYWs7Y2FzZSBFLnRvcFRyYW5zaXRpb25FbmQ6YT12O2JyZWFrO2Nhc2UgRS50b3BTY3JvbGw6YT1tO2JyZWFrO2Nhc2UgRS50b3BXaGVlbDphPWc7YnJlYWs7Y2FzZSBFLnRvcENvcHk6Y2FzZSBFLnRvcEN1dDpjYXNlIEUudG9wUGFzdGU6YT1zfWE/dm9pZCAwOmIoITEpO3ZhciB5PWEuZ2V0UG9vbGVkKG8sdCxuLHIpO3JldHVybiBpLmFjY3VtdWxhdGVUd29QaGFzZURpc3BhdGNoZXMoeSkseX0sZGlkUHV0TGlzdGVuZXI6ZnVuY3Rpb24oZSx0LG4pe2lmKHQ9PT1QKXt2YXIgcj1lLl9yb290Tm9kZUlELGk9YS5nZXROb2RlRnJvbUluc3RhbmNlKGUpO3dbcl18fCh3W3JdPW8ubGlzdGVuKGksImNsaWNrIix5KSl9fSx3aWxsRGVsZXRlTGlzdGVuZXI6ZnVuY3Rpb24oZSx0KXtpZih0PT09UCl7dmFyIG49ZS5fcm9vdE5vZGVJRDt3W25dLnJlbW92ZSgpLGRlbGV0ZSB3W25dfX19O3QuZXhwb3J0cz1TfSx7MTAwOjEwMCwxMDI6MTAyLDEwMzoxMDMsMTA0OjEwNCwxMDU6MTA1LDEwNjoxMDYsMTA3OjEwNywxMTk6MTE5LDEzOToxMzksMTQ2OjE0NiwxNTQ6MTU0LDE1ODoxNTgsMTY6MTYsMjA6MjAsNDA6NDAsOTU6OTUsOTY6OTYsOTg6OTgsOTk6OTl9XSw5NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXthbmltYXRpb25OYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDk2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoOTkpLGk9e2NsaXBib2FyZERhdGE6ZnVuY3Rpb24oZSl7cmV0dXJuImNsaXBib2FyZERhdGEiaW4gZT9lLmNsaXBib2FyZERhdGE6d2luZG93LmNsaXBib2FyZERhdGF9fTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7OTk6OTl9XSw5NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDk4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoMTAzKSxpPXtkYXRhVHJhbnNmZXI6bnVsbH07by5hdWdtZW50Q2xhc3MocixpKSx0LmV4cG9ydHM9cn0sezEwMzoxMDN9XSw5OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3RoaXMuZGlzcGF0Y2hDb25maWc9ZSx0aGlzLl90YXJnZXRJbnN0PXQsdGhpcy5uYXRpdmVFdmVudD1uO3ZhciBvPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgaSBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkoaSkpe3ZhciB1PW9baV07dT90aGlzW2ldPXUobik6InRhcmdldCI9PT1pP3RoaXMudGFyZ2V0PXI6dGhpc1tpXT1uW2ldfXZhciBzPW51bGwhPW4uZGVmYXVsdFByZXZlbnRlZD9uLmRlZmF1bHRQcmV2ZW50ZWQ6bi5yZXR1cm5WYWx1ZT09PSExO3JldHVybiBzP3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNUcnVlOnRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWEudGhhdFJldHVybnNGYWxzZSx0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPWEudGhhdFJldHVybnNGYWxzZSx0aGlzfXZhciBvPWUoMTY1KSxpPWUoMjUpLGE9ZSgxNDYpLHU9KGUoMTY0KSwiZnVuY3Rpb24iPT10eXBlb2YgUHJveHksWyJkaXNwYXRjaENvbmZpZyIsIl90YXJnZXRJbnN0IiwibmF0aXZlRXZlbnQiLCJpc0RlZmF1bHRQcmV2ZW50ZWQiLCJpc1Byb3BhZ2F0aW9uU3RvcHBlZCIsIl9kaXNwYXRjaExpc3RlbmVycyIsIl9kaXNwYXRjaEluc3RhbmNlcyJdKSxzPXt0eXBlOm51bGwsdGFyZ2V0Om51bGwsY3VycmVudFRhcmdldDphLnRoYXRSZXR1cm5zTnVsbCxldmVudFBoYXNlOm51bGwsYnViYmxlczpudWxsLGNhbmNlbGFibGU6bnVsbCx0aW1lU3RhbXA6ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGltZVN0YW1wfHxEYXRlLm5vdygpfSxkZWZhdWx0UHJldmVudGVkOm51bGwsaXNUcnVzdGVkOm51bGx9O28oci5wcm90b3R5cGUse3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dGhpcy5kZWZhdWx0UHJldmVudGVkPSEwO3ZhciBlPXRoaXMubmF0aXZlRXZlbnQ7ZSYmKGUucHJldmVudERlZmF1bHQ/ZS5wcmV2ZW50RGVmYXVsdCgpOmUucmV0dXJuVmFsdWU9ITEsdGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQ9YS50aGF0UmV0dXJuc1RydWUpfSxzdG9wUHJvcGFnYXRpb246ZnVuY3Rpb24oKXt2YXIgZT10aGlzLm5hdGl2ZUV2ZW50O2UmJihlLnN0b3BQcm9wYWdhdGlvbj9lLnN0b3BQcm9wYWdhdGlvbigpOmUuY2FuY2VsQnViYmxlPSEwLHRoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9YS50aGF0UmV0dXJuc1RydWUpfSxwZXJzaXN0OmZ1bmN0aW9uKCl7dGhpcy5pc1BlcnNpc3RlbnQ9YS50aGF0UmV0dXJuc1RydWV9LGlzUGVyc2lzdGVudDphLnRoYXRSZXR1cm5zRmFsc2UsZGVzdHJ1Y3RvcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuY29uc3RydWN0b3IuSW50ZXJmYWNlO2Zvcih2YXIgdCBpbiBlKXRoaXNbdF09bnVsbDtmb3IodmFyIG49MDtuPHUubGVuZ3RoO24rKyl0aGlzW3Vbbl1dPW51bGx9fSksci5JbnRlcmZhY2U9cyxyLmF1Z21lbnRDbGFzcz1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1mdW5jdGlvbigpe307ci5wcm90b3R5cGU9bi5wcm90b3R5cGU7dmFyIGE9bmV3IHI7byhhLGUucHJvdG90eXBlKSxlLnByb3RvdHlwZT1hLGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWUsZS5JbnRlcmZhY2U9byh7fSxuLkludGVyZmFjZSx0KSxlLmF1Z21lbnRDbGFzcz1uLmF1Z21lbnRDbGFzcyxpLmFkZFBvb2xpbmdUbyhlLGkuZm91ckFyZ3VtZW50UG9vbGVyKX0saS5hZGRQb29saW5nVG8ocixpLmZvdXJBcmd1bWVudFBvb2xlciksdC5leHBvcnRzPXJ9LHsxNDY6MTQ2LDE2NDoxNjQsMTY1OjE2NSwyNToyNX1dLDEwMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT17cmVsYXRlZFRhcmdldDpudWxsfTtvLmF1Z21lbnRDbGFzcyhyLGkpLHQuZXhwb3J0cz1yfSx7MTA2OjEwNn1dLDEwMTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPXtkYXRhOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDEwMjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT1lKDExOSksYT1lKDEyMCksdT1lKDEyMSkscz17a2V5OmEsbG9jYXRpb246bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxhbHRLZXk6bnVsbCxtZXRhS2V5Om51bGwscmVwZWF0Om51bGwsbG9jYWxlOm51bGwsZ2V0TW9kaWZpZXJTdGF0ZTp1LGNoYXJDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlwcmVzcyI9PT1lLnR5cGU/aShlKTowfSxrZXlDb2RlOmZ1bmN0aW9uKGUpe3JldHVybiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH0sd2hpY2g6ZnVuY3Rpb24oZSl7cmV0dXJuImtleXByZXNzIj09PWUudHlwZT9pKGUpOiJrZXlkb3duIj09PWUudHlwZXx8ImtleXVwIj09PWUudHlwZT9lLmtleUNvZGU6MH19O28uYXVnbWVudENsYXNzKHIscyksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDExOToxMTksMTIwOjEyMCwxMjE6MTIxfV0sMTAzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4scil7cmV0dXJuIG8uY2FsbCh0aGlzLGUsdCxuLHIpfXZhciBvPWUoMTA2KSxpPWUoMTA5KSxhPWUoMTIxKSx1PXtzY3JlZW5YOm51bGwsc2NyZWVuWTpudWxsLGNsaWVudFg6bnVsbCxjbGllbnRZOm51bGwsY3RybEtleTpudWxsLHNoaWZ0S2V5Om51bGwsYWx0S2V5Om51bGwsbWV0YUtleTpudWxsLGdldE1vZGlmaWVyU3RhdGU6YSxidXR0b246ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5idXR0b247cmV0dXJuIndoaWNoImluIGU/dDoyPT09dD8yOjQ9PT10PzE6MH0sYnV0dG9uczpudWxsLHJlbGF0ZWRUYXJnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVsYXRlZFRhcmdldHx8KGUuZnJvbUVsZW1lbnQ9PT1lLnNyY0VsZW1lbnQ/ZS50b0VsZW1lbnQ6ZS5mcm9tRWxlbWVudCl9LHBhZ2VYOmZ1bmN0aW9uKGUpe3JldHVybiJwYWdlWCJpbiBlP2UucGFnZVg6ZS5jbGllbnRYK2kuY3VycmVudFNjcm9sbExlZnR9LHBhZ2VZOmZ1bmN0aW9uKGUpe3JldHVybiJwYWdlWSJpbiBlP2UucGFnZVk6ZS5jbGllbnRZK2kuY3VycmVudFNjcm9sbFRvcH19O28uYXVnbWVudENsYXNzKHIsdSksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDEwOToxMDksMTIxOjEyMX1dLDEwNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDEwNiksaT1lKDEyMSksYT17dG91Y2hlczpudWxsLHRhcmdldFRvdWNoZXM6bnVsbCxjaGFuZ2VkVG91Y2hlczpudWxsLGFsdEtleTpudWxsLG1ldGFLZXk6bnVsbCxjdHJsS2V5Om51bGwsc2hpZnRLZXk6bnVsbCxnZXRNb2RpZmllclN0YXRlOml9O28uYXVnbWVudENsYXNzKHIsYSksdC5leHBvcnRzPXJ9LHsxMDY6MTA2LDEyMToxMjF9XSwxMDU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyKXtyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSg5OSksaT17cHJvcGVydHlOYW1lOm51bGwsZWxhcHNlZFRpbWU6bnVsbCxwc2V1ZG9FbGVtZW50Om51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHs5OTo5OX1dLDEwNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpe3JldHVybiBvLmNhbGwodGhpcyxlLHQsbixyKX12YXIgbz1lKDk5KSxpPWUoMTIyKSxhPXt2aWV3OmZ1bmN0aW9uKGUpe2lmKGUudmlldylyZXR1cm4gZS52aWV3O3ZhciB0PWkoZSk7aWYobnVsbCE9dCYmdC53aW5kb3c9PT10KXJldHVybiB0O3ZhciBuPXQub3duZXJEb2N1bWVudDtyZXR1cm4gbj9uLmRlZmF1bHRWaWV3fHxuLnBhcmVudFdpbmRvdzp3aW5kb3d9LGRldGFpbDpmdW5jdGlvbihlKXtyZXR1cm4gZS5kZXRhaWx8fDB9fTtvLmF1Z21lbnRDbGFzcyhyLGEpLHQuZXhwb3J0cz1yfSx7MTIyOjEyMiw5OTo5OX1dLDEwNzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuLHIpewpyZXR1cm4gby5jYWxsKHRoaXMsZSx0LG4scil9dmFyIG89ZSgxMDMpLGk9e2RlbHRhWDpmdW5jdGlvbihlKXtyZXR1cm4iZGVsdGFYImluIGU/ZS5kZWx0YVg6IndoZWVsRGVsdGFYImluIGU/LWUud2hlZWxEZWx0YVg6MH0sZGVsdGFZOmZ1bmN0aW9uKGUpe3JldHVybiJkZWx0YVkiaW4gZT9lLmRlbHRhWToid2hlZWxEZWx0YVkiaW4gZT8tZS53aGVlbERlbHRhWToid2hlZWxEZWx0YSJpbiBlPy1lLndoZWVsRGVsdGE6MH0sZGVsdGFaOm51bGwsZGVsdGFNb2RlOm51bGx9O28uYXVnbWVudENsYXNzKHIsaSksdC5leHBvcnRzPXJ9LHsxMDM6MTAzfV0sMTA4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTU0KSxvPXtyZWluaXRpYWxpemVUcmFuc2FjdGlvbjpmdW5jdGlvbigpe3RoaXMudHJhbnNhY3Rpb25XcmFwcGVycz10aGlzLmdldFRyYW5zYWN0aW9uV3JhcHBlcnMoKSx0aGlzLndyYXBwZXJJbml0RGF0YT90aGlzLndyYXBwZXJJbml0RGF0YS5sZW5ndGg9MDp0aGlzLndyYXBwZXJJbml0RGF0YT1bXSx0aGlzLl9pc0luVHJhbnNhY3Rpb249ITF9LF9pc0luVHJhbnNhY3Rpb246ITEsZ2V0VHJhbnNhY3Rpb25XcmFwcGVyczpudWxsLGlzSW5UcmFuc2FjdGlvbjpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5faXNJblRyYW5zYWN0aW9ufSxwZXJmb3JtOmZ1bmN0aW9uKGUsdCxuLG8saSxhLHUscyl7dGhpcy5pc0luVHJhbnNhY3Rpb24oKT9yKCExKTp2b2lkIDA7dmFyIGwsYzt0cnl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSEwLGw9ITAsdGhpcy5pbml0aWFsaXplQWxsKDApLGM9ZS5jYWxsKHQsbixvLGksYSx1LHMpLGw9ITF9ZmluYWxseXt0cnl7aWYobCl0cnl7dGhpcy5jbG9zZUFsbCgwKX1jYXRjaChwKXt9ZWxzZSB0aGlzLmNsb3NlQWxsKDApfWZpbmFsbHl7dGhpcy5faXNJblRyYW5zYWN0aW9uPSExfX1yZXR1cm4gY30saW5pdGlhbGl6ZUFsbDpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIHI9dFtuXTt0cnl7dGhpcy53cmFwcGVySW5pdERhdGFbbl09aS5PQlNFUlZFRF9FUlJPUix0aGlzLndyYXBwZXJJbml0RGF0YVtuXT1yLmluaXRpYWxpemU/ci5pbml0aWFsaXplLmNhbGwodGhpcyk6bnVsbH1maW5hbGx5e2lmKHRoaXMud3JhcHBlckluaXREYXRhW25dPT09aS5PQlNFUlZFRF9FUlJPUil0cnl7dGhpcy5pbml0aWFsaXplQWxsKG4rMSl9Y2F0Y2gobyl7fX19fSxjbG9zZUFsbDpmdW5jdGlvbihlKXt0aGlzLmlzSW5UcmFuc2FjdGlvbigpP3ZvaWQgMDpyKCExKTtmb3IodmFyIHQ9dGhpcy50cmFuc2FjdGlvbldyYXBwZXJzLG49ZTtuPHQubGVuZ3RoO24rKyl7dmFyIG8sYT10W25dLHU9dGhpcy53cmFwcGVySW5pdERhdGFbbl07dHJ5e289ITAsdSE9PWkuT0JTRVJWRURfRVJST1ImJmEuY2xvc2UmJmEuY2xvc2UuY2FsbCh0aGlzLHUpLG89ITF9ZmluYWxseXtpZihvKXRyeXt0aGlzLmNsb3NlQWxsKG4rMSl9Y2F0Y2gocyl7fX19dGhpcy53cmFwcGVySW5pdERhdGEubGVuZ3RoPTB9fSxpPXtNaXhpbjpvLE9CU0VSVkVEX0VSUk9SOnt9fTt0LmV4cG9ydHM9aX0sezE1NDoxNTR9XSwxMDk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9e2N1cnJlbnRTY3JvbGxMZWZ0OjAsY3VycmVudFNjcm9sbFRvcDowLHJlZnJlc2hTY3JvbGxWYWx1ZXM6ZnVuY3Rpb24oZSl7ci5jdXJyZW50U2Nyb2xsTGVmdD1lLngsci5jdXJyZW50U2Nyb2xsVG9wPWUueX19O3QuZXhwb3J0cz1yfSx7fV0sMTEwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtpZihudWxsPT10P28oITEpOnZvaWQgMCxudWxsPT1lKXJldHVybiB0O3ZhciBuPUFycmF5LmlzQXJyYXkoZSkscj1BcnJheS5pc0FycmF5KHQpO3JldHVybiBuJiZyPyhlLnB1c2guYXBwbHkoZSx0KSxlKTpuPyhlLnB1c2godCksZSk6cj9bZV0uY29uY2F0KHQpOltlLHRdfXZhciBvPWUoMTU0KTt0LmV4cG9ydHM9cn0sezE1NDoxNTR9XSwxMTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtmb3IodmFyIHQ9MSxuPTAscj0wLGk9ZS5sZW5ndGgsYT0tNCZpO2E+cjspe2Zvcih2YXIgdT1NYXRoLm1pbihyKzQwOTYsYSk7dT5yO3IrPTQpbis9KHQrPWUuY2hhckNvZGVBdChyKSkrKHQrPWUuY2hhckNvZGVBdChyKzEpKSsodCs9ZS5jaGFyQ29kZUF0KHIrMikpKyh0Kz1lLmNoYXJDb2RlQXQociszKSk7dCU9byxuJT1vfWZvcig7aT5yO3IrKyluKz10Kz1lLmNoYXJDb2RlQXQocik7cmV0dXJuIHQlPW8sbiU9byx0fG48PDE2fXZhciBvPTY1NTIxO3QuZXhwb3J0cz1yfSx7fV0sMTEyOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSExO3QuZXhwb3J0cz1yfSx7fV0sMTEzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWZ1bmN0aW9uKGUpe3JldHVybiJ1bmRlZmluZWQiIT10eXBlb2YgTVNBcHAmJk1TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uP2Z1bmN0aW9uKHQsbixyLG8pe01TQXBwLmV4ZWNVbnNhZmVMb2NhbEZ1bmN0aW9uKGZ1bmN0aW9uKCl7cmV0dXJuIGUodCxuLHIsbyl9KX06ZX07dC5leHBvcnRzPXJ9LHt9XSwxMTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbil7dmFyIHI9bnVsbD09dHx8ImJvb2xlYW4iPT10eXBlb2YgdHx8IiI9PT10O2lmKHIpcmV0dXJuIiI7dmFyIG89aXNOYU4odCk7cmV0dXJuIG98fDA9PT10fHxpLmhhc093blByb3BlcnR5KGUpJiZpW2VdPyIiK3Q6KCJzdHJpbmciPT10eXBlb2YgdCYmKHQ9dC50cmltKCkpLHQrInB4Iil9dmFyIG89ZSgzKSxpPShlKDE2NCksby5pc1VuaXRsZXNzTnVtYmVyKTt0LmV4cG9ydHM9cn0sezE2NDoxNjQsMzozfV0sMTE1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGlbZV19ZnVuY3Rpb24gbyhlKXtyZXR1cm4oIiIrZSkucmVwbGFjZShhLHIpfXZhciBpPXsiJiI6IiZhbXA7IiwiPiI6IiZndDsiLCI8IjoiJmx0OyIsJyInOiImcXVvdDsiLCInIjoiJiN4Mjc7In0sYT0vWyY+PCInXS9nO3QuZXhwb3J0cz1vfSx7fV0sMTE2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7aWYobnVsbD09ZSlyZXR1cm4gbnVsbDtpZigxPT09ZS5ub2RlVHlwZSlyZXR1cm4gZTt2YXIgdD1pLmdldChlKTtyZXR1cm4gdD8odD1hKHQpLHQ/by5nZXROb2RlRnJvbUluc3RhbmNlKHQpOm51bGwpOnZvaWQgdSgoImZ1bmN0aW9uIj09dHlwZW9mIGUucmVuZGVyLCExKSl9dmFyIG89KGUoMzUpLGUoNDApKSxpPWUoNjkpLGE9ZSgxMjQpLHU9ZSgxNTQpO2UoMTY0KTt0LmV4cG9ydHM9cn0sezEyNDoxMjQsMTU0OjE1NCwxNjQ6MTY0LDM1OjM1LDQwOjQwLDY5OjY5fV0sMTE3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0LG4pe3ZhciByPWUsbz12b2lkIDA9PT1yW25dO28mJm51bGwhPXQmJihyW25dPXQpfWZ1bmN0aW9uIG8oZSl7aWYobnVsbD09ZSlyZXR1cm4gZTt2YXIgdD17fTtyZXR1cm4gaShlLHIsdCksdH12YXIgaT0oZSgyMyksZSgxMzcpKTtlKDE2NCk7dC5leHBvcnRzPW99LHsxMzc6MTM3LDE2NDoxNjQsMjM6MjN9XSwxMTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSx0LG4pe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKHQsbik6ZSYmdC5jYWxsKG4sZSl9O3QuZXhwb3J0cz1yfSx7fV0sMTE5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQsbj1lLmtleUNvZGU7cmV0dXJuImNoYXJDb2RlImluIGU/KHQ9ZS5jaGFyQ29kZSwwPT09dCYmMTM9PT1uJiYodD0xMykpOnQ9bix0Pj0zMnx8MTM9PT10P3Q6MH10LmV4cG9ydHM9cn0se31dLDEyMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2lmKGUua2V5KXt2YXIgdD1pW2Uua2V5XXx8ZS5rZXk7aWYoIlVuaWRlbnRpZmllZCIhPT10KXJldHVybiB0fWlmKCJrZXlwcmVzcyI9PT1lLnR5cGUpe3ZhciBuPW8oZSk7cmV0dXJuIDEzPT09bj8iRW50ZXIiOlN0cmluZy5mcm9tQ2hhckNvZGUobil9cmV0dXJuImtleWRvd24iPT09ZS50eXBlfHwia2V5dXAiPT09ZS50eXBlP2FbZS5rZXlDb2RlXXx8IlVuaWRlbnRpZmllZCI6IiJ9dmFyIG89ZSgxMTkpLGk9e0VzYzoiRXNjYXBlIixTcGFjZWJhcjoiICIsTGVmdDoiQXJyb3dMZWZ0IixVcDoiQXJyb3dVcCIsUmlnaHQ6IkFycm93UmlnaHQiLERvd246IkFycm93RG93biIsRGVsOiJEZWxldGUiLFdpbjoiT1MiLE1lbnU6IkNvbnRleHRNZW51IixBcHBzOiJDb250ZXh0TWVudSIsU2Nyb2xsOiJTY3JvbGxMb2NrIixNb3pQcmludGFibGVLZXk6IlVuaWRlbnRpZmllZCJ9LGE9ezg6IkJhY2tzcGFjZSIsOToiVGFiIiwxMjoiQ2xlYXIiLDEzOiJFbnRlciIsMTY6IlNoaWZ0IiwxNzoiQ29udHJvbCIsMTg6IkFsdCIsMTk6IlBhdXNlIiwyMDoiQ2Fwc0xvY2siLDI3OiJFc2NhcGUiLDMyOiIgIiwzMzoiUGFnZVVwIiwzNDoiUGFnZURvd24iLDM1OiJFbmQiLDM2OiJIb21lIiwzNzoiQXJyb3dMZWZ0IiwzODoiQXJyb3dVcCIsMzk6IkFycm93UmlnaHQiLDQwOiJBcnJvd0Rvd24iLDQ1OiJJbnNlcnQiLDQ2OiJEZWxldGUiLDExMjoiRjEiLDExMzoiRjIiLDExNDoiRjMiLDExNToiRjQiLDExNjoiRjUiLDExNzoiRjYiLDExODoiRjciLDExOToiRjgiLDEyMDoiRjkiLDEyMToiRjEwIiwxMjI6IkYxMSIsMTIzOiJGMTIiLDE0NDoiTnVtTG9jayIsMTQ1OiJTY3JvbGxMb2NrIiwyMjQ6Ik1ldGEifTt0LmV4cG9ydHM9cn0sezExOToxMTl9XSwxMjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD10aGlzLG49dC5uYXRpdmVFdmVudDtpZihuLmdldE1vZGlmaWVyU3RhdGUpcmV0dXJuIG4uZ2V0TW9kaWZpZXJTdGF0ZShlKTt2YXIgcj1pW2VdO3JldHVybiByPyEhbltyXTohMX1mdW5jdGlvbiBvKGUpe3JldHVybiByfXZhciBpPXtBbHQ6ImFsdEtleSIsQ29udHJvbDoiY3RybEtleSIsTWV0YToibWV0YUtleSIsU2hpZnQ6InNoaWZ0S2V5In07dC5leHBvcnRzPW99LHt9XSwxMjI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXt2YXIgdD1lLnRhcmdldHx8ZS5zcmNFbGVtZW50fHx3aW5kb3c7cmV0dXJuIHQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQmJih0PXQuY29ycmVzcG9uZGluZ1VzZUVsZW1lbnQpLDM9PT10Lm5vZGVUeXBlP3QucGFyZW50Tm9kZTp0fXQuZXhwb3J0cz1yfSx7fV0sMTIzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9ZSYmKG8mJmVbb118fGVbaV0pO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6dm9pZCAwfXZhciBvPSJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJlN5bWJvbC5pdGVyYXRvcixpPSJAQGl0ZXJhdG9yIjt0LmV4cG9ydHM9cn0se31dLDEyNDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcih2YXIgdDsodD1lLl9yZW5kZXJlZE5vZGVUeXBlKT09PW8uQ09NUE9TSVRFOyllPWUuX3JlbmRlcmVkQ29tcG9uZW50O3JldHVybiB0PT09by5OQVRJVkU/ZS5fcmVuZGVyZWRDb21wb25lbnQ6dD09PW8uRU1QVFk/bnVsbDp2b2lkIDB9dmFyIG89ZSg3Nik7dC5leHBvcnRzPXJ9LHs3Njo3Nn1dLDEyNTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe2Zvcig7ZSYmZS5maXJzdENoaWxkOyllPWUuZmlyc3RDaGlsZDtyZXR1cm4gZX1mdW5jdGlvbiBvKGUpe2Zvcig7ZTspe2lmKGUubmV4dFNpYmxpbmcpcmV0dXJuIGUubmV4dFNpYmxpbmc7ZT1lLnBhcmVudE5vZGV9fWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49cihlKSxpPTAsYT0wO247KXtpZigzPT09bi5ub2RlVHlwZSl7aWYoYT1pK24udGV4dENvbnRlbnQubGVuZ3RoLHQ+PWkmJmE+PXQpcmV0dXJue25vZGU6bixvZmZzZXQ6dC1pfTtpPWF9bj1yKG8obikpfX10LmV4cG9ydHM9aX0se31dLDEyNjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKCl7cmV0dXJuIWkmJm8uY2FuVXNlRE9NJiYoaT0idGV4dENvbnRlbnQiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50PyJ0ZXh0Q29udGVudCI6ImlubmVyVGV4dCIpLGl9dmFyIG89ZSgxNDApLGk9bnVsbDt0LmV4cG9ydHM9cn0sezE0MDoxNDB9XSwxMjc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPXt9O3JldHVybiBuW2UudG9Mb3dlckNhc2UoKV09dC50b0xvd2VyQ2FzZSgpLG5bIldlYmtpdCIrZV09IndlYmtpdCIrdCxuWyJNb3oiK2VdPSJtb3oiK3QsblsibXMiK2VdPSJNUyIrdCxuWyJPIitlXT0ibyIrdC50b0xvd2VyQ2FzZSgpLG59ZnVuY3Rpb24gbyhlKXtpZih1W2VdKXJldHVybiB1W2VdO2lmKCFhW2VdKXJldHVybiBlO3ZhciB0PWFbZV07Zm9yKHZhciBuIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShuKSYmbiBpbiBzKXJldHVybiB1W2VdPXRbbl07cmV0dXJuIiJ9dmFyIGk9ZSgxNDApLGE9e2FuaW1hdGlvbmVuZDpyKCJBbmltYXRpb24iLCJBbmltYXRpb25FbmQiKSxhbmltYXRpb25pdGVyYXRpb246cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uSXRlcmF0aW9uIiksYW5pbWF0aW9uc3RhcnQ6cigiQW5pbWF0aW9uIiwiQW5pbWF0aW9uU3RhcnQiKSx0cmFuc2l0aW9uZW5kOnIoIlRyYW5zaXRpb24iLCJUcmFuc2l0aW9uRW5kIil9LHU9e30scz17fTtpLmNhblVzZURPTSYmKHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsIkFuaW1hdGlvbkV2ZW50ImluIHdpbmRvd3x8KGRlbGV0ZSBhLmFuaW1hdGlvbmVuZC5hbmltYXRpb24sZGVsZXRlIGEuYW5pbWF0aW9uaXRlcmF0aW9uLmFuaW1hdGlvbixkZWxldGUgYS5hbmltYXRpb25zdGFydC5hbmltYXRpb24pLCJUcmFuc2l0aW9uRXZlbnQiaW4gd2luZG93fHxkZWxldGUgYS50cmFuc2l0aW9uZW5kLnRyYW5zaXRpb24pLHQuZXhwb3J0cz1vfSx7MTQwOjE0MH1dLDEyODpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYidW5kZWZpbmVkIiE9dHlwZW9mIGUucHJvdG90eXBlJiYiZnVuY3Rpb24iPT10eXBlb2YgZS5wcm90b3R5cGUubW91bnRDb21wb25lbnQmJiJmdW5jdGlvbiI9PXR5cGVvZiBlLnByb3RvdHlwZS5yZWNlaXZlQ29tcG9uZW50fWZ1bmN0aW9uIG8oZSl7dmFyIHQsbj1udWxsPT09ZXx8ZT09PSExO2lmKG4pdD11LmNyZWF0ZShvKTtlbHNlIGlmKCJvYmplY3QiPT10eXBlb2YgZSl7dmFyIGk9ZTshaXx8ImZ1bmN0aW9uIiE9dHlwZW9mIGkudHlwZSYmInN0cmluZyIhPXR5cGVvZiBpLnR5cGU/bCghMSk6dm9pZCAwLHQ9InN0cmluZyI9PXR5cGVvZiBpLnR5cGU/cy5jcmVhdGVJbnRlcm5hbENvbXBvbmVudChpKTpyKGkudHlwZSk/bmV3IGkudHlwZShpKTpuZXcgYyhpKX1lbHNlInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGU/dD1zLmNyZWF0ZUluc3RhbmNlRm9yVGV4dChlKTpsKCExKTtyZXR1cm4gdC5fbW91bnRJbmRleD0wLHQuX21vdW50SW1hZ2U9bnVsbCx0fXZhciBpPWUoMTY1KSxhPWUoMzQpLHU9ZSg2Mikscz1lKDc1KSxsPShlKDcwKSxlKDE1NCkpLGM9KGUoMTY0KSxmdW5jdGlvbihlKXt0aGlzLmNvbnN0cnVjdChlKX0pO2koYy5wcm90b3R5cGUsYS5NaXhpbix7X2luc3RhbnRpYXRlUmVhY3RDb21wb25lbnQ6b30pO3QuZXhwb3J0cz1vfSx7MTU0OjE1NCwxNjQ6MTY0LDE2NToxNjUsMzQ6MzQsNjI6NjIsNzA6NzAsNzU6NzV9XSwxMjk6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe2lmKCFpLmNhblVzZURPTXx8dCYmISgiYWRkRXZlbnRMaXN0ZW5lciJpbiBkb2N1bWVudCkpcmV0dXJuITE7dmFyIG49Im9uIitlLHI9biBpbiBkb2N1bWVudDtpZighcil7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7YS5zZXRBdHRyaWJ1dGUobiwicmV0dXJuOyIpLHI9ImZ1bmN0aW9uIj09dHlwZW9mIGFbbl19cmV0dXJuIXImJm8mJiJ3aGVlbCI9PT1lJiYocj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5oYXNGZWF0dXJlKCJFdmVudHMud2hlZWwiLCIzLjAiKSkscn12YXIgbyxpPWUoMTQwKTtpLmNhblVzZURPTSYmKG89ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24mJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUmJmRvY3VtZW50LmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoIiIsIiIpIT09ITApLHQuZXhwb3J0cz1yfSx7MTQwOjE0MH1dLDEzMDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUmJmUubm9kZU5hbWUmJmUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4gdCYmKCJpbnB1dCI9PT10JiZvW2UudHlwZV18fCJ0ZXh0YXJlYSI9PT10KX12YXIgbz17Y29sb3I6ITAsZGF0ZTohMCxkYXRldGltZTohMCwiZGF0ZXRpbWUtbG9jYWwiOiEwLGVtYWlsOiEwLG1vbnRoOiEwLG51bWJlcjohMCxwYXNzd29yZDohMCxyYW5nZTohMCxzZWFyY2g6ITAsdGVsOiEwLHRleHQ6ITAsdGltZTohMCx1cmw6ITAsd2VlazohMH07dC5leHBvcnRzPXJ9LHt9XSwxMzE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gby5pc1ZhbGlkRWxlbWVudChlKT92b2lkIDA6aSghMSksZX12YXIgbz1lKDYwKSxpPWUoMTU0KTt0LmV4cG9ydHM9cn0sezE1NDoxNTQsNjA6NjB9XSwxMzI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4nIicrbyhlKSsnIid9dmFyIG89ZSgxMTUpO3QuZXhwb3J0cz1yfSx7MTE1OjExNX1dLDEzMzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDcyKTt0LmV4cG9ydHM9ci5yZW5kZXJTdWJ0cmVlSW50b0NvbnRhaW5lcn0sezcyOjcyfV0sMTM0OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQwKSxvPS9eWyBcclxuXHRcZl0vLGk9LzwoIS0tfGxpbmt8bm9zY3JpcHR8bWV0YXxzY3JpcHR8c3R5bGUpWyBcclxuXHRcZlwvPl0vLGE9ZSgxMTMpLHU9YShmdW5jdGlvbihlLHQpe2UuaW5uZXJIVE1MPXR9KTtpZihyLmNhblVzZURPTSl7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5pbm5lckhUTUw9IiAiLCIiPT09cy5pbm5lckhUTUwmJih1PWZ1bmN0aW9uKGUsdCl7aWYoZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGUsZSksby50ZXN0KHQpfHwiPCI9PT10WzBdJiZpLnRlc3QodCkpe2UuaW5uZXJIVE1MPVN0cmluZy5mcm9tQ2hhckNvZGUoNjUyNzkpK3Q7dmFyIG49ZS5maXJzdENoaWxkOzE9PT1uLmRhdGEubGVuZ3RoP2UucmVtb3ZlQ2hpbGQobik6bi5kZWxldGVEYXRhKDAsMSl9ZWxzZSBlLmlubmVySFRNTD10fSkscz1udWxsfXQuZXhwb3J0cz11fSx7MTEzOjExMywxNDA6MTQwfV0sMTM1OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQwKSxvPWUoMTE1KSxpPWUoMTM0KSxhPWZ1bmN0aW9uKGUsdCl7ZS50ZXh0Q29udGVudD10fTtyLmNhblVzZURPTSYmKCJ0ZXh0Q29udGVudCJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChhPWZ1bmN0aW9uKGUsdCl7aShlLG8odCkpfSkpLHQuZXhwb3J0cz1hfSx7MTE1OjExNSwxMzQ6MTM0LDE0MDoxNDB9XSwxMzY6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3ZhciBuPW51bGw9PT1lfHxlPT09ITEscj1udWxsPT09dHx8dD09PSExO2lmKG58fHIpcmV0dXJuIG49PT1yO3ZhciBvPXR5cGVvZiBlLGk9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PT1vfHwibnVtYmVyIj09PW8/InN0cmluZyI9PT1pfHwibnVtYmVyIj09PWk6Im9iamVjdCI9PT1pJiZlLnR5cGU9PT10LnR5cGUmJmUua2V5PT09dC5rZXl9dC5leHBvcnRzPXJ9LHt9XSwxMzc6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe3JldHVybiBlJiYib2JqZWN0Ij09dHlwZW9mIGUmJm51bGwhPWUua2V5P2wuZXNjYXBlKGUua2V5KTp0LnRvU3RyaW5nKDM2KX1mdW5jdGlvbiBvKGUsdCxuLGkpe3ZhciBkPXR5cGVvZiBlO2lmKCJ1bmRlZmluZWQiIT09ZCYmImJvb2xlYW4iIT09ZHx8KGU9bnVsbCksbnVsbD09PWV8fCJzdHJpbmciPT09ZHx8Im51bWJlciI9PT1kfHxhLmlzVmFsaWRFbGVtZW50KGUpKXJldHVybiBuKGksZSwiIj09PXQ/YytyKGUsMCk6dCksMTt2YXIgZixoLHY9MCxtPSIiPT09dD9jOnQrcDtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgZz0wO2c8ZS5sZW5ndGg7ZysrKWY9ZVtnXSxoPW0rcihmLGcpLHYrPW8oZixoLG4saSk7ZWxzZXt2YXIgeT11KGUpO2lmKHkpe3ZhciBDLGI9eS5jYWxsKGUpO2lmKHkhPT1lLmVudHJpZXMpZm9yKHZhciBfPTA7IShDPWIubmV4dCgpKS5kb25lOylmPUMudmFsdWUsaD1tK3IoZixfKyspLHYrPW8oZixoLG4saSk7ZWxzZSBmb3IoOyEoQz1iLm5leHQoKSkuZG9uZTspe3ZhciBFPUMudmFsdWU7RSYmKGY9RVsxXSxoPW0rbC5lc2NhcGUoRVswXSkrcCtyKGYsMCksdis9byhmLGgsbixpKSl9fWVsc2Uib2JqZWN0Ij09PWQmJihTdHJpbmcoZSkscyghMSkpfXJldHVybiB2fWZ1bmN0aW9uIGkoZSx0LG4pe3JldHVybiBudWxsPT1lPzA6byhlLCIiLHQsbil9dmFyIGE9KGUoMzUpLGUoNjApKSx1PWUoMTIzKSxzPWUoMTU0KSxsPWUoMjMpLGM9KGUoMTY0KSwiLiIpLHA9IjoiO3QuZXhwb3J0cz1pfSx7MTIzOjEyMywxNTQ6MTU0LDE2NDoxNjQsMjM6MjMsMzU6MzUsNjA6NjB9XSwxMzg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9KGUoMTY1KSxlKDE0NikpLG89KGUoMTY0KSxyKTt0LmV4cG9ydHM9b30sezE0NjoxNDYsMTY0OjE2NCwxNjU6MTY1fV0sMTM5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPWUoMTQ2KSxvPXtsaXN0ZW46ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlLmFkZEV2ZW50TGlzdGVuZXI/KGUuYWRkRXZlbnRMaXN0ZW5lcih0LG4sITEpLHtyZW1vdmU6ZnVuY3Rpb24oKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuLCExKX19KTplLmF0dGFjaEV2ZW50PyhlLmF0dGFjaEV2ZW50KCJvbiIrdCxuKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5kZXRhY2hFdmVudCgib24iK3Qsbil9fSk6dm9pZCAwfSxjYXB0dXJlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZS5hZGRFdmVudExpc3RlbmVyPyhlLmFkZEV2ZW50TGlzdGVuZXIodCxuLCEwKSx7cmVtb3ZlOmZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHQsbiwhMCl9fSk6e3JlbW92ZTpyfX0scmVnaXN0ZXJEZWZhdWx0OmZ1bmN0aW9uKCl7fX07dC5leHBvcnRzPW99LHsxNDY6MTQ2fV0sMTQwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPSEoInVuZGVmaW5lZCI9PXR5cGVvZiB3aW5kb3d8fCF3aW5kb3cuZG9jdW1lbnR8fCF3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCksbz17Y2FuVXNlRE9NOnIsY2FuVXNlV29ya2VyczoidW5kZWZpbmVkIiE9dHlwZW9mIFdvcmtlcixjYW5Vc2VFdmVudExpc3RlbmVyczpyJiYhKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciYmIXdpbmRvdy5hdHRhY2hFdmVudCksY2FuVXNlVmlld3BvcnQ6ciYmISF3aW5kb3cuc2NyZWVuLGlzSW5Xb3JrZXI6IXJ9O3QuZXhwb3J0cz1vfSx7fV0sMTQxOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIGUucmVwbGFjZShvLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQudG9VcHBlckNhc2UoKX0pfXZhciBvPS8tKC4pL2c7dC5leHBvcnRzPXJ9LHt9XSwxNDI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gbyhlLnJlcGxhY2UoaSwibXMtIikpfXZhciBvPWUoMTQxKSxpPS9eLW1zLS87dC5leHBvcnRzPXJ9LHsxNDE6MTQxfV0sMTQzOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSx0KXtyZXR1cm4gZSYmdD9lPT09dD8hMDpvKGUpPyExOm8odCk/cihlLHQucGFyZW50Tm9kZSk6ZS5jb250YWlucz9lLmNvbnRhaW5zKHQpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24/ISEoMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0KSk6ITE6ITF9dmFyIG89ZSgxNTYpO3QuZXhwb3J0cz1yfSx7MTU2OjE1Nn1dLDE0NDpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubGVuZ3RoO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJvYmplY3QiIT10eXBlb2YgZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGU/YSghMSk6dm9pZCAwLCJudW1iZXIiIT10eXBlb2YgdD9hKCExKTp2b2lkIDAsMD09PXR8fHQtMSBpbiBlP3ZvaWQgMDphKCExKSwiZnVuY3Rpb24iPT10eXBlb2YgZS5jYWxsZWU/YSghMSk6dm9pZCAwLGUuaGFzT3duUHJvcGVydHkpdHJ5e3JldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlKX1jYXRjaChuKXt9Zm9yKHZhciByPUFycmF5KHQpLG89MDt0Pm87bysrKXJbb109ZVtvXTtyZXR1cm4gcn1mdW5jdGlvbiBvKGUpe3JldHVybiEhZSYmKCJvYmplY3QiPT10eXBlb2YgZXx8ImZ1bmN0aW9uIj09dHlwZW9mIGUpJiYibGVuZ3RoImluIGUmJiEoInNldEludGVydmFsImluIGUpJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJihBcnJheS5pc0FycmF5KGUpfHwiY2FsbGVlImluIGV8fCJpdGVtImluIGUpfWZ1bmN0aW9uIGkoZSl7cmV0dXJuIG8oZSk/QXJyYXkuaXNBcnJheShlKT9lLnNsaWNlKCk6cihlKTpbZV19dmFyIGE9ZSgxNTQpO3QuZXhwb3J0cz1pfSx7MTU0OjE1NH1dLDE0NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3ZhciB0PWUubWF0Y2goYyk7cmV0dXJuIHQmJnRbMV0udG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBvKGUsdCl7dmFyIG49bDtsP3ZvaWQgMDpzKCExKTt2YXIgbz1yKGUpLGk9byYmdShvKTtpZihpKXtuLmlubmVySFRNTD1pWzFdK2UraVsyXTtmb3IodmFyIGM9aVswXTtjLS07KW49bi5sYXN0Q2hpbGR9ZWxzZSBuLmlubmVySFRNTD1lO3ZhciBwPW4uZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpO3AubGVuZ3RoJiYodD92b2lkIDA6cyghMSksYShwKS5mb3JFYWNoKHQpKTtmb3IodmFyIGQ9QXJyYXkuZnJvbShuLmNoaWxkTm9kZXMpO24ubGFzdENoaWxkOyluLnJlbW92ZUNoaWxkKG4ubGFzdENoaWxkKTtyZXR1cm4gZH12YXIgaT1lKDE0MCksYT1lKDE0NCksdT1lKDE1MCkscz1lKDE1NCksbD1pLmNhblVzZURPTT9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTpudWxsLGM9L15ccyo8KFx3KykvO3QuZXhwb3J0cz1vfSx7MTQwOjE0MCwxNDQ6MTQ0LDE1MDoxNTAsMTU0OjE1NH1dLDE0NjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlfX1mdW5jdGlvbiBvKCl7fW8udGhhdFJldHVybnM9cixvLnRoYXRSZXR1cm5zRmFsc2U9cighMSksby50aGF0UmV0dXJuc1RydWU9cighMCksby50aGF0UmV0dXJuc051bGw9cihudWxsKSxvLnRoYXRSZXR1cm5zVGhpcz1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxvLnRoYXRSZXR1cm5zQXJndW1lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHQuZXhwb3J0cz1vfSx7fV0sMTQ3OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPXt9O3QuZXhwb3J0cz1yfSx7fV0sMTQ4OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dHJ5e2UuZm9jdXMoKX1jYXRjaCh0KXt9fXQuZXhwb3J0cz1yfSx7fV0sMTQ5OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoKXtpZigidW5kZWZpbmVkIj09dHlwZW9mIGRvY3VtZW50KXJldHVybiBudWxsO3RyeXtyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYm9keX1jYXRjaChlKXtyZXR1cm4gZG9jdW1lbnQuYm9keX19dC5leHBvcnRzPXJ9LHt9XSwxNTA6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gYT92b2lkIDA6aSghMSksZC5oYXNPd25Qcm9wZXJ0eShlKXx8KGU9IioiKSx1Lmhhc093blByb3BlcnR5KGUpfHwoIioiPT09ZT9hLmlubmVySFRNTD0iPGxpbmsgLz4iOmEuaW5uZXJIVE1MPSI8IitlKyI+PC8iK2UrIj4iLHVbZV09IWEuZmlyc3RDaGlsZCksdVtlXT9kW2VdOm51bGx9dmFyIG89ZSgxNDApLGk9ZSgxNTQpLGE9by5jYW5Vc2VET00/ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik6bnVsbCx1PXt9LHM9WzEsJzxzZWxlY3QgbXVsdGlwbGU9InRydWUiPicsIjwvc2VsZWN0PiJdLGw9WzEsIjx0YWJsZT4iLCI8L3RhYmxlPiJdLGM9WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLHA9WzEsJzxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4nLCI8L3N2Zz4iXSxkPXsiKiI6WzEsIj88ZGl2PiIsIjwvZGl2PiJdLGFyZWE6WzEsIjxtYXA+IiwiPC9tYXA+Il0sY29sOlsyLCI8dGFibGU+PHRib2R5PjwvdGJvZHk+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSxsZWdlbmQ6WzEsIjxmaWVsZHNldD4iLCI8L2ZpZWxkc2V0PiJdLHBhcmFtOlsxLCI8b2JqZWN0PiIsIjwvb2JqZWN0PiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSxvcHRncm91cDpzLG9wdGlvbjpzLGNhcHRpb246bCxjb2xncm91cDpsLHRib2R5OmwsdGZvb3Q6bCx0aGVhZDpsLHRkOmMsdGg6Y30sZj1bImNpcmNsZSIsImNsaXBQYXRoIiwiZGVmcyIsImVsbGlwc2UiLCJnIiwiaW1hZ2UiLCJsaW5lIiwibGluZWFyR3JhZGllbnQiLCJtYXNrIiwicGF0aCIsInBhdHRlcm4iLCJwb2x5Z29uIiwicG9seWxpbmUiLCJyYWRpYWxHcmFkaWVudCIsInJlY3QiLCJzdG9wIiwidGV4dCIsInRzcGFuIl07Zi5mb3JFYWNoKGZ1bmN0aW9uKGUpe2RbZV09cCx1W2VdPSEwfSksdC5leHBvcnRzPXJ9LHsxNDA6MTQwLDE1NDoxNTR9XSwxNTE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZT09PXdpbmRvdz97eDp3aW5kb3cucGFnZVhPZmZzZXR8fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0LHk6d2luZG93LnBhZ2VZT2Zmc2V0fHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wfTp7eDplLnNjcm9sbExlZnQseTplLnNjcm9sbFRvcH19dC5leHBvcnRzPXJ9LHt9XSwxNTI6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtyZXR1cm4gZS5yZXBsYWNlKG8sIi0kMSIpLnRvTG93ZXJDYXNlKCl9dmFyIG89LyhbQS1aXSkvZzt0LmV4cG9ydHM9cn0se31dLDE1MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiBvKGUpLnJlcGxhY2UoaSwiLW1zLSIpfXZhciBvPWUoMTUyKSxpPS9ebXMtLzt0LmV4cG9ydHM9cn0sezE1MjoxNTJ9XSwxNTQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQsbixyLG8saSxhLHUpe2lmKCFlKXt2YXIgcztpZih2b2lkIDA9PT10KXM9bmV3IEVycm9yKCJNaW5pZmllZCBleGNlcHRpb24gb2NjdXJyZWQ7IHVzZSB0aGUgbm9uLW1pbmlmaWVkIGRldiBlbnZpcm9ubWVudCBmb3IgdGhlIGZ1bGwgZXJyb3IgbWVzc2FnZSBhbmQgYWRkaXRpb25hbCBoZWxwZnVsIHdhcm5pbmdzLiIpO2Vsc2V7dmFyIGw9W24scixvLGksYSx1XSxjPTA7cz1uZXcgRXJyb3IodC5yZXBsYWNlKC8lcy9nLGZ1bmN0aW9uKCl7cmV0dXJuIGxbYysrXX0pKSxzLm5hbWU9IkludmFyaWFudCBWaW9sYXRpb24ifXRocm93IHMuZnJhbWVzVG9Qb3A9MSxzfX10LmV4cG9ydHM9cn0se31dLDE1NTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUpe3JldHVybiEoIWV8fCEoImZ1bmN0aW9uIj09dHlwZW9mIE5vZGU/ZSBpbnN0YW5jZW9mIE5vZGU6Im9iamVjdCI9PXR5cGVvZiBlJiYibnVtYmVyIj09dHlwZW9mIGUubm9kZVR5cGUmJiJzdHJpbmciPT10eXBlb2YgZS5ub2RlTmFtZSkpfXQuZXhwb3J0cz1yfSx7fV0sMTU2OltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7cmV0dXJuIG8oZSkmJjM9PWUubm9kZVR5cGV9dmFyIG89ZSgxNTUpO3QuZXhwb3J0cz1yfSx7MTU1OjE1NX1dLDE1NzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1lKDE1NCksbz1mdW5jdGlvbihlKXt2YXIgdCxuPXt9O2UgaW5zdGFuY2VvZiBPYmplY3QmJiFBcnJheS5pc0FycmF5KGUpP3ZvaWQgMDpyKCExKTtmb3IodCBpbiBlKWUuaGFzT3duUHJvcGVydHkodCkmJihuW3RdPXQpO3JldHVybiBufTt0LmV4cG9ydHM9b30sezE1NDoxNTR9XSwxNTg6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0O3JldHVybiBudWxsfTt0LmV4cG9ydHM9cn0se31dLDE1OTpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCxuKXtpZighZSlyZXR1cm4gbnVsbDt2YXIgcj17fTtmb3IodmFyIGkgaW4gZSlvLmNhbGwoZSxpKSYmKHJbaV09dC5jYWxsKG4sZVtpXSxpLGUpKTtyZXR1cm4gcn12YXIgbz1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1yfSx7fV0sMTYwOltmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7dmFyIHQ9e307cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lLmNhbGwodGhpcyxuKSksdFtuXX19dC5leHBvcnRzPXJ9LHt9XSwxNjE6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHIsbz1lKDE0MCk7by5jYW5Vc2VET00mJihyPXdpbmRvdy5wZXJmb3JtYW5jZXx8d2luZG93Lm1zUGVyZm9ybWFuY2V8fHdpbmRvdy53ZWJraXRQZXJmb3JtYW5jZSksdC5leHBvcnRzPXJ8fHt9fSx7MTQwOjE0MH1dLDE2MjpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcixvPWUoMTYxKTtyPW8ubm93P2Z1bmN0aW9uKCl7cmV0dXJuIG8ubm93KCl9OmZ1bmN0aW9uKCl7cmV0dXJuIERhdGUubm93KCl9LHQuZXhwb3J0cz1yfSx7MTYxOjE2MX1dLDE2MzpbZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiByKGUsdCl7cmV0dXJuIGU9PT10PzAhPT1lfHwxL2U9PT0xL3Q6ZSE9PWUmJnQhPT10fWZ1bmN0aW9uIG8oZSx0KXtpZihyKGUsdCkpcmV0dXJuITA7aWYoIm9iamVjdCIhPXR5cGVvZiBlfHxudWxsPT09ZXx8Im9iamVjdCIhPXR5cGVvZiB0fHxudWxsPT09dClyZXR1cm4hMTt2YXIgbj1PYmplY3Qua2V5cyhlKSxvPU9iamVjdC5rZXlzKHQpO2lmKG4ubGVuZ3RoIT09by5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspaWYoIWkuY2FsbCh0LG5bYV0pfHwhcihlW25bYV1dLHRbblthXV0pKXJldHVybiExO3JldHVybiEwfXZhciBpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dC5leHBvcnRzPW99LHt9XSwxNjQ6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9ZSgxNDYpLG89cjt0LmV4cG9ydHM9b30sezE0NjoxNDZ9XSwxNjU6W2Z1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlKXtpZihudWxsPT09ZXx8dm9pZCAwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCIpO3JldHVybiBPYmplY3QoZSl9ZnVuY3Rpb24gbygpe3RyeXtpZighT2JqZWN0LmFzc2lnbilyZXR1cm4hMTt2YXIgZT1uZXcgU3RyaW5nKCJhYmMiKTtpZihlWzVdPSJkZSIsIjUiPT09T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSlbMF0pcmV0dXJuITE7Zm9yKHZhciB0PXt9LG49MDsxMD5uO24rKyl0WyJfIitTdHJpbmcuZnJvbUNoYXJDb2RlKG4pXT1uO3ZhciByPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdFtlXX0pO2lmKCIwMTIzNDU2Nzg5IiE9PXIuam9pbigiIikpcmV0dXJuITE7dmFyIG89e307cmV0dXJuImFiY2RlZmdoaWprbG1ub3BxcnN0Ii5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXtvW2VdPWV9KSwiYWJjZGVmZ2hpamtsbW5vcHFyc3QiPT09T2JqZWN0LmtleXMoT2JqZWN0LmFzc2lnbih7fSxvKSkuam9pbigiIil9Y2F0Y2goaSl7cmV0dXJuITF9fXZhciBpPU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksYT1PYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlO3QuZXhwb3J0cz1vKCk/T2JqZWN0LmFzc2lnbjpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixvLHU9cihlKSxzPTE7czxhcmd1bWVudHMubGVuZ3RoO3MrKyl7bj1PYmplY3QoYXJndW1lbnRzW3NdKTtmb3IodmFyIGwgaW4gbilpLmNhbGwobixsKSYmKHVbbF09bltsXSk7aWYoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyl7bz1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG4pO2Zvcih2YXIgYz0wO2M8by5sZW5ndGg7YysrKWEuY2FsbChuLG9bY10pJiYodVtvW2NdXT1uW29bY11dKX19cmV0dXJuIHV9fSx7fV19LHt9LFs4OF0pKDg4KX0pOw=="></script>
<script src="data:application/x-javascript;base64,LyoqCiAqIFJlYWN0RE9NIHYxNS4xLjAKICoKICogQ29weXJpZ2h0IDIwMTMtcHJlc2VudCwgRmFjZWJvb2ssIEluYy4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlCiAqIExJQ0VOU0UgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhpcyBzb3VyY2UgdHJlZS4gQW4gYWRkaXRpb25hbCBncmFudAogKiBvZiBwYXRlbnQgcmlnaHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUgUEFURU5UUyBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeS4KICoKICovCiFmdW5jdGlvbihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlKW1vZHVsZS5leHBvcnRzPWUocmVxdWlyZSgicmVhY3QiKSk7ZWxzZSBpZigiZnVuY3Rpb24iPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kKWRlZmluZShbInJlYWN0Il0sZSk7ZWxzZXt2YXIgZjtmPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6dGhpcyxmLlJlYWN0RE9NPWUoZi5SZWFjdCl9fShmdW5jdGlvbihlKXtyZXR1cm4gZS5fX1NFQ1JFVF9ET01fRE9fTk9UX1VTRV9PUl9ZT1VfV0lMTF9CRV9GSVJFRH0pOw=="></script>
<link href="data:text/css;charset=utf-8,%0A%0A%2EjsonEditor%20%2A%20%7B%0Avertical%2Dalign%3A%20top%3B%0A%7D%0A%2EjsonEditor%20%3E%20%2EjsonObject%20%3E%20%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%200%3B%0Aborder%2Dleft%3A%200%3B%0Apadding%3A%200%3B%0A%7D%0A%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%2020px%3B%0Adisplay%3A%20none%3B%0Afont%2Dweight%3A%20normal%3B%0Aborder%2Dleft%3A%201px%20dotted%20%23ddd%3B%0A%7D%0A%2EjsonFlex%20%2EjsonChildren%20%7B%0Amargin%2Dleft%3A%20%2D20px%3B%0A%7D%0A%2EjsonCompound%2Eopen%20%3E%20%2EjsonChildren%20%7B%0Adisplay%3A%20block%3B%0A%7D%0A%2EjsonAdd%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2EjsonFlex%20%2EjsonField%20%7B%0Adisplay%3A%20%2Dms%2Dflexbox%3B%0Adisplay%3A%20%2Dwebkit%2Dflex%3B%0Adisplay%3A%20flex%3B%0A%2Dwebkit%2Dflex%2Ddirection%3A%20row%3B%0A%2Dms%2Dflex%2Ddirection%3A%20row%3B%0Aflex%2Ddirection%3A%20row%3B%0A%2Dwebkit%2Dflex%2Dwrap%3A%20nowrap%3B%0A%2Dms%2Dflex%2Dwrap%3A%20nowrap%3B%0Aflex%2Dwrap%3A%20nowrap%3B%0A%2Dwebkit%2Djustify%2Dcontent%3A%20flex%2Dstart%3B%0A%2Dms%2Dflex%2Dpack%3A%20start%3B%0Ajustify%2Dcontent%3A%20flex%2Dstart%3B%0A%2Dwebkit%2Dalign%2Dcontent%3A%20stretch%3B%0A%2Dms%2Dflex%2Dline%2Dpack%3A%20stretch%3B%0Aalign%2Dcontent%3A%20stretch%3B%0A%7D%0A%2EjsonFieldAdder%20%7B%0Amargin%2Dleft%3A%2013px%3B%0A%7D%0A%2EjsonFieldAdder%20select%20%7B%0Amargin%2Dleft%3A%205px%3B%0A%7D%0A%2EcompoundToggle%3Abefore%20%7B%0Acontent%3A%20%27%E2%96%B8%27%3B%0Acolor%3A%20%23333%3B%0Aline%2Dheight%3A%201em%3B%0Amargin%2Dright%3A%203px%3B%0A%7D%0A%2Eopen%20%3E%20%2EcompoundToggle%3Abefore%20%7B%0Acontent%3A%20%27%E2%96%BE%27%3B%0A%7D%0A%2EjsonName%20%7B%0Afont%2Dstyle%3A%20italic%3B%0Atext%2Dalign%3A%20right%3B%0Aposition%3A%20relative%3B%0Apadding%2Dleft%3A%2015px%3B%0Awhite%2Dspace%3A%20nowrap%3B%0A%7D%0A%2EjsonValue%20%7B%0Apadding%2Dleft%3A%205px%3B%0Aflex%2Dgrow%3A%201%3B%0A%7D%0A%2EjsonValue%20%3E%20input%2C%0A%2EjsonValue%20%3E%20textarea%2C%0A%2EjsonValue%20%3E%20select%20%7B%0Amargin%2Dbottom%3A%205px%3B%0A%7D%0A%2EjsonFlex%20input%5Btype%3Dtext%5D%2C%0A%2EjsonFlex%20input%5Btype%3Dnumber%5D%2C%0A%2EjsonFlex%20input%5Btype%3Dpassword%5D%2C%0A%2EjsonFlex%20textarea%20%7B%0Awidth%3A%20100%25%3B%0A%7D%0A%2EjsonRemove%2C%20%2EjsonFixed%20%7B%0Avisibility%3A%20hidden%3B%0Amargin%2Dright%3A%205px%3B%0Atext%2Ddecoration%3A%20none%3B%0Awidth%3A%20%2E6em%3B%0Adisplay%3A%20inline%2Dblock%3B%0Aposition%3A%20absolute%3B%0Aleft%3A%200%3B%0A%7D%0A%2EjsonName%3Ahover%20%3E%20%2EjsonRemove%20%7B%0Avisibility%3A%20visible%3B%0A%7D%0Apre%20%7B%0Abackground%3A%20%23eee%3B%0Aborder%3A%201px%20solid%20%23ddd%3B%0Apadding%3A%205px%3B%0Afloat%3A%20left%3B%0Awidth%3A%20180px%3B%0Amargin%3A%200%2010px%200%200%3B%0A%7D%0A%2EcompoundToggle%2C%20%2EjsonString%7B%0Acursor%3A%20pointer%3B%0A%7D%0A%2EbooleanField%20%2A%20%7B%0Avertical%2Dalign%3A%20middle%3B%0A%7D%0A%2EbooleanField%20input%20%7B%0Amargin%2Dbottom%3A%200%3B%0A%7D%0A%2EjsonError%20%3E%20%2EjsonName%2C%0A%2EjsonError%20%2EjsonErrorMsg%20%7B%0Acolor%3A%20%23f36%3B%0A%7D%0A%2EjsonError%20%2EjsonErrorMsg%20%7B%0Amargin%3A%200%200%2010px%2010px%3B%0Afont%2Dsize%3A%200%2E9em%3B%0Avertical%2Dalign%3A%20bottom%3B%0Adisplay%3A%20block%3B%0A%7D%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20input%2C%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20select%2C%0A%2EjsonError%20%3E%20%2EjsonValue%20%3E%20textarea%20%7B%0Abackground%2Dcolor%3A%20%23fff8f8%3B%0A%7D%0A%2EjsonNovalue%20%7B%0Acolor%3A%20%23999%3B%0Afont%2Dstyle%3A%20italic%3B%0A%7D%0A%2EjsonGroup%20%7B%0Amargin%2Dbottom%3A%2010px%3B%0A%7D%0A" rel="stylesheet" />
<script src="data:application/x-javascript;base64,LyoNCnJlYWN0LWpzb24gdjAuMC4xDQpodHRwczovL2dpdGh1Yi5jb20vYXJxZXgvcmVhY3QtanNvbg0KTUlUOiBodHRwczovL2dpdGh1Yi5jb20vYXJxZXgvcmVhY3QtanNvbi9yYXcvbWFzdGVyL0xJQ0VOU0UNCiovDQooZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkgew0KCWlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09PSAnb2JqZWN0JykNCgkJbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUodW5kZWZpbmVkKSk7DQoJZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpDQoJCWRlZmluZShbXSwgZmFjdG9yeSk7DQoJZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpDQoJCWV4cG9ydHNbIkpzb24iXSA9IGZhY3RvcnkocmVxdWlyZSh1bmRlZmluZWQpKTsNCgllbHNlDQoJCXJvb3RbIkpzb24iXSA9IGZhY3Rvcnkocm9vdFsiUmVhY3QiXSk7DQp9KSh0aGlzLCBmdW5jdGlvbihfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzFfXykgew0KcmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXANCi8qKioqKiovIAkvLyBUaGUgbW9kdWxlIGNhY2hlDQovKioqKioqLyAJdmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTsNCg0KLyoqKioqKi8gCS8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uDQovKioqKioqLyAJZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkgew0KDQovKioqKioqLyAJCS8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZQ0KLyoqKioqKi8gCQlpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkNCi8qKioqKiovIAkJCXJldHVybiBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXS5leHBvcnRzOw0KDQovKioqKioqLyAJCS8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpDQovKioqKioqLyAJCXZhciBtb2R1bGUgPSBpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSA9IHsNCi8qKioqKiovIAkJCWV4cG9ydHM6IHt9LA0KLyoqKioqKi8gCQkJaWQ6IG1vZHVsZUlkLA0KLyoqKioqKi8gCQkJbG9hZGVkOiBmYWxzZQ0KLyoqKioqKi8gCQl9Ow0KDQovKioqKioqLyAJCS8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvbg0KLyoqKioqKi8gCQltb2R1bGVzW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTsNCg0KLyoqKioqKi8gCQkvLyBGbGFnIHRoZSBtb2R1bGUgYXMgbG9hZGVkDQovKioqKioqLyAJCW1vZHVsZS5sb2FkZWQgPSB0cnVlOw0KDQovKioqKioqLyAJCS8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlDQovKioqKioqLyAJCXJldHVybiBtb2R1bGUuZXhwb3J0czsNCi8qKioqKiovIAl9DQoNCg0KLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlczsNCg0KLyoqKioqKi8gCS8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlczsNCg0KLyoqKioqKi8gCS8vIF9fd2VicGFja19wdWJsaWNfcGF0aF9fDQovKioqKioqLyAJX193ZWJwYWNrX3JlcXVpcmVfXy5wID0gIiI7DQoNCi8qKioqKiovIAkvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHMNCi8qKioqKiovIAlyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTsNCi8qKioqKiovIH0pDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqKioqKi8gKFsNCi8qIDAgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgidmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RnJlZXplciA9IF9fd2VicGFja19yZXF1aXJlX18oMTMpLFxuXHRvYmplY3RBc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSxcblx0VHlwZUZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKSxcblx0T2JqZWN0RmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDMpLFxuXHRBcnJheUZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KSxcblx0U3RyaW5nRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpLFxuXHRCb29sZWFuRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDYpLFxuXHROdW1iZXJGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oNyksXG5cdFRleHRGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oOCksXG5cdFBhc3N3b3JkRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDkpLFxuXHRTZWxlY3RGaWVsZCA9IF9fd2VicGFja19yZXF1aXJlX18oMTApLFxuXHRkZWVwU2V0dGluZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKVxuO1xuXG5cbi8qKlxuICogVGhlIG1haW4gY29tcG9uZW50LiBJdCB3aWxsIHJlZnJlc2ggdGhlIHByb3BzIHdoZW4gdGhlIHN0b3JlIGNoYW5nZXMuXG4gKlxuICogQHByb3AgIHtPYmplY3R8RnJlZXplck5vZGV9IHZhbHVlIFRoZSBKU09OIG9iamVjdCwgdmFsdWUgb2YgdGhlIGZvcm0uXG4gKiBAcHJvcCAge09iamVjdH0gc2V0dGluZ3MgQ3VzdG9taXphdGlvbiBzZXR0aW5nc1xuICovXG52YXIgSnNvbiA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuXHRnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB7fSxcblx0XHRcdGVycm9yczogZmFsc2UsXG5cdFx0XHR1cGRhdGluZzogZmFsc2Vcblx0XHR9O1xuXHR9LFxuXG5cdGNoaWxkQ29udGV4dFR5cGVzOiB7XG5cdFx0dHlwZURlZmF1bHRzOiBSZWFjdC5Qcm9wVHlwZXMub2JqZWN0XG5cdH0sXG5cblx0Z2V0Q2hpbGRDb250ZXh0OiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7XG5cdFx0XHR0eXBlRGVmYXVsdHM6IHRoaXMuc3RhdGUuZGVmYXVsdHNcblx0XHR9O1xuXHR9LFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0dmFsdWUgPSB0aGlzLnByb3BzLnZhbHVlLFxuXHRcdFx0bGlzdGVuZXJcblx0XHQ7XG5cblx0XHQvLyBJZiBpdCBpcyBhIGZyZWV6ZXIgbm9kZVxuXHRcdGlmKCAhdmFsdWUuZ2V0TGlzdGVuZXIgKVxuXHRcdFx0dmFsdWUgPSBuZXcgRnJlZXplciggdmFsdWUgKS5nZXQoKTtcblxuXHRcdC8vIExpc3RlbiB0byBjaGFuZ2VzXG5cdFx0dmFsdWUuZ2V0TGlzdGVuZXIoKS5vbigndXBkYXRlJywgZnVuY3Rpb24oIHVwZGF0ZWQgKXtcblx0XHRcdGlmKCBtZS5zdGF0ZS51cGRhdGluZyApXG5cdFx0XHRcdHJldHVybiBtZS5zZXRTdGF0ZSh7IHVwZGF0aW5nOiBmYWxzZSB9KTtcblxuXHRcdFx0bWUuc2V0U3RhdGUoe3ZhbHVlOiB1cGRhdGVkfSk7XG5cblx0XHRcdGlmKCBtZS5zdGF0ZS5lcnJvcnMgKVxuXHRcdFx0XHRtZS5nZXRWYWxpZGF0aW9uRXJyb3JzKCk7XG5cblx0XHRcdGlmKCBtZS5wcm9wcy5vbkNoYW5nZSApXG5cdFx0XHRcdG1lLnByb3BzLm9uQ2hhbmdlKCB1cGRhdGVkLnRvSlMoKSApO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGRlZmF1bHRzOiB0aGlzLmNyZWF0ZURlZmF1bHRzKCksXG5cdFx0XHRpZDogdGhpcy5nZXRJZCgpXG5cdFx0fTtcblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV3UHJvcHMgKXtcblx0XHRpZiggIW5ld1Byb3BzLnZhbHVlLmdldExpc3RlbmVyICl7XG5cdFx0XHR0aGlzLnNldFN0YXRlKHt1cGRhdGluZzogdHJ1ZSwgdmFsdWU6IHRoaXMuc3RhdGUudmFsdWUucmVzZXQoIG5ld1Byb3BzLnZhbHVlICl9KTtcblx0XHR9XG5cblx0XHR0aGlzLnNldFN0YXRlKCB7ZGVmYXVsdHM6IHRoaXMuY3JlYXRlRGVmYXVsdHMoKX0gKTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5wcm9wcy5zZXR0aW5ncyB8fCB7fSxcblx0XHRcdG9iID0gUmVhY3QuY3JlYXRlRWxlbWVudCggVHlwZUZpZWxkLCB7XG5cdFx0XHRcdHR5cGU6ICdvYmplY3QnLFxuXHRcdFx0XHR2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcblx0XHRcdFx0c2V0dGluZ3M6IG9iamVjdEFzc2lnbigge30sIHRoaXMuc3RhdGUuZGVmYXVsdHMub2JqZWN0LCB7XG5cdFx0XHRcdFx0ZmllbGRzOiBzZXR0aW5ncy5maWVsZHMsXG5cdFx0XHRcdFx0ZWRpdGluZzogdGhpcy5nZXRGb3JtU2V0dGluZyggc2V0dGluZ3MsICdlZGl0aW5nJywgJ2Fsd2F5cycpLFxuXHRcdFx0XHRcdGZpeGVkRmllbGRzOiB0aGlzLmdldEZvcm1TZXR0aW5nKCBzZXR0aW5ncywgJ2ZpeGVkRmllbGRzJywgdHJ1ZSksXG5cdFx0XHRcdFx0YWRkZXI6ICB0aGlzLmdldEZvcm1TZXR0aW5nKCBzZXR0aW5ncywgJ2FkZGVyJywgZmFsc2UpLFxuXHRcdFx0XHRcdGhlYWRlcjogZmFsc2UsXG5cdFx0XHRcdFx0b3JkZXI6IHNldHRpbmdzLm9yZGVyXG5cdFx0XHRcdH0pLFxuXHRcdFx0XHRyZWY6ICd2YWx1ZScsXG5cdFx0XHRcdGRlZmF1bHRzOiB0aGlzLnN0YXRlLmRlZmF1bHRzLFxuXHRcdFx0XHRpZDogdGhpcy5zdGF0ZS5pZFxuXHRcdFx0fSlcblx0XHQ7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmRpdih7Y2xhc3NOYW1lOiBcImpzb25FZGl0b3JcIn0sIG9iKTtcblx0fSxcblxuXHRnZXRWYWx1ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5zdGF0ZS52YWx1ZS50b0pTKCk7XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oKXtcblx0XHR2YXIganNvblZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpLFxuXHRcdFx0ZXJyb3JzID0gdGhpcy5yZWZzLnZhbHVlLmdldFZhbGlkYXRpb25FcnJvcnMoIGpzb25WYWx1ZSApXG5cdFx0O1xuXG5cdFx0dGhpcy5zZXRTdGF0ZSgge2Vycm9yczogZXJyb3JzLmxlbmd0aH0gKTtcblx0XHRyZXR1cm4gZXJyb3JzLmxlbmd0aCA/IGVycm9ycyA6IGZhbHNlO1xuXHR9LFxuXHRnZXREZWVwU2V0dGluZ3M6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIHNldHRpbmdzID0ge307XG5cblx0XHRmb3IoIHZhciBrZXkgaW4gZGVlcFNldHRpbmdzICl7XG5cdFx0XHRzZXR0aW5nc1sga2V5IF0gPSBkZWVwU2V0dGluZ3NbIGtleSBdKCB0aGlzLCBzZXR0aW5nc1trZXldICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHNldHRpbmdzO1xuXHR9LFxuXHRjcmVhdGVEZWZhdWx0czogZnVuY3Rpb24oKXtcblx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLnByb3BzLnNldHRpbmdzIHx8IHt9LFxuXHRcdFx0Y29tcG9uZW50cyA9IFR5cGVGaWVsZC5wcm90b3R5cGUuY29tcG9uZW50cyxcblx0XHRcdHByb3BEZWZhdWx0cyA9IHNldHRpbmdzLmRlZmF1bHRzIHx8IHt9LFxuXHRcdFx0ZGVmYXVsdHMgPSB7fVxuXHRcdDtcblxuXHRcdGZvciggdmFyIHR5cGUgaW4gY29tcG9uZW50cyApe1xuXHRcdFx0ZGVmYXVsdHNbIHR5cGUgXSA9IG9iamVjdEFzc2lnbigge30sIGNvbXBvbmVudHNbIHR5cGUgXS5wcm90b3R5cGUuZGVmYXVsdHMgfHwge30sIHByb3BEZWZhdWx0c1sgdHlwZSBdIHx8IHt9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdH0sXG5cblx0Z2V0SWQ6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIGJ0b2EoIHBhcnNlSW50KCBNYXRoLnJhbmRvbSgpICogMTAwMDAgKSApLnJlcGxhY2UoLz0vZywgJycpO1xuXHR9LFxuXG5cdGdldEZvcm1TZXR0aW5nOiBmdW5jdGlvbiggc2V0dGluZ3MsIGZpZWxkLCBkZWYgKXtcblx0XHRpZiggdHlwZW9mIHNldHRpbmdzWyBmaWVsZCBdICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiBzZXR0aW5nc1sgZmllbGQgXTtcblx0XHRpZiggc2V0dGluZ3MuZm9ybSApXG5cdFx0XHRyZXR1cm4gZGVmO1xuXHR9XG59KTtcblxuLy8gQWRkIGdsb2JhbCBtb2RpZmllciBmdW5jdGlvbnNcbkpzb24ucmVnaXN0ZXJUeXBlID0gVHlwZUZpZWxkLnJlZ2lzdGVyVHlwZS5iaW5kKCBUeXBlRmllbGQgKTtcblxuLy8gUmVnaXN0ZXIgYmFzaWMgdHlwZXNcbkpzb24ucmVnaXN0ZXJUeXBlKCAnb2JqZWN0JywgT2JqZWN0RmllbGQgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnYXJyYXknLCBBcnJheUZpZWxkLCB0cnVlICk7XG5Kc29uLnJlZ2lzdGVyVHlwZSggJ3N0cmluZycsIFN0cmluZ0ZpZWxkLCB0cnVlICk7XG5Kc29uLnJlZ2lzdGVyVHlwZSggJ3RleHQnLCBUZXh0RmllbGQsIHRydWUgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnbnVtYmVyJywgTnVtYmVyRmllbGQsIHRydWUgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnYm9vbGVhbicsIEJvb2xlYW5GaWVsZCwgdHJ1ZSApO1xuSnNvbi5yZWdpc3RlclR5cGUoICdwYXNzd29yZCcsIFBhc3N3b3JkRmllbGQgKTtcbkpzb24ucmVnaXN0ZXJUeXBlKCAnc2VsZWN0JywgU2VsZWN0RmllbGQgKTtcblxubW9kdWxlLmV4cG9ydHMgPSBKc29uO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9Kc29uLmpzXG4gKiogbW9kdWxlIGlkID0gMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9Kc29uLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJtb2R1bGUuZXhwb3J0cyA9IF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMV9fO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIHtcInJvb3RcIjpcIlJlYWN0XCJ9XG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vZXh0ZXJuYWxfJTdCJTIycm9vdCUyMjolMjJSZWFjdCUyMiU3RD8iKTsNCg0KLyoqKi8gfSwNCi8qIDIgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRkZWVwU2V0dGluZ3MgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDExKSxcblx0b2JqZWN0QXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMilcbjtcblxudmFyIGNvbXBvbmVudHMgPSB7fTtcbnZhciB0eXBlQ2hlY2tPcmRlciA9IFtdO1xuXG52YXIgVHlwZUZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRjb21wb25lbnRzOiB7fSxcblx0dHlwZUNoZWNrT3JkZXI6IFtdLFxuXG5cdGNvbnRleHRUeXBlczoge1xuXHRcdHR5cGVEZWZhdWx0czogUmVhY3QuUHJvcFR5cGVzLm9iamVjdFxuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIENvbXBvbmVudCA9IHRoaXMuZ2V0Q29tcG9uZW50KCksXG5cdFx0XHRzZXR0aW5ncyA9IG9iamVjdEFzc2lnbihcblx0XHRcdFx0e30sXG5cdFx0XHRcdHRoaXMuY29udGV4dC50eXBlRGVmYXVsdHNbIHRoaXMucHJvcHMudHlwZSBdLFxuXHRcdFx0XHR0aGlzLnByb3BzLnNldHRpbmdzXG5cdFx0XHQpXG5cdFx0O1xuXG5cdFx0dGhpcy5hZGREZWVwU2V0dGluZ3MoIHNldHRpbmdzICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCggQ29tcG9uZW50LCB7XG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdHNldHRpbmdzOiBzZXR0aW5ncyxcblx0XHRcdG9uVXBkYXRlZDogdGhpcy5wcm9wcy5vblVwZGF0ZWQsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdHJlZjogJ2ZpZWxkJ1xuXHRcdH0pO1xuXHR9LFxuXG5cdGdldENvbXBvbmVudDogZnVuY3Rpb24oKXtcblx0XHR2YXIgdHlwZSA9IHRoaXMucHJvcHMudHlwZTtcblx0XHRpZiggIXR5cGUgKVxuXHRcdFx0dHlwZSA9IHRoaXMuZ3Vlc3NUeXBlKCB0aGlzLnByb3BzLnZhbHVlICk7XG5cblx0XHR0aGlzLmZpZWxkVHlwZSA9IHR5cGU7XG5cblx0XHRyZXR1cm4gdGhpcy5jb21wb25lbnRzWyB0eXBlIF07XG5cdH0sXG5cblx0Z3Vlc3NUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHR2YXIgdHlwZSA9IGZhbHNlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHR0eXBlcyA9IHRoaXMudHlwZUNoZWNrT3JkZXIsXG5cdFx0XHRjb21wb25lbnRcblx0XHQ7XG5cblx0XHR3aGlsZSggIXR5cGUgJiYgaSA8IHR5cGVzLmxlbmd0aCApe1xuXHRcdFx0Y29tcG9uZW50ID0gdGhpcy5jb21wb25lbnRzWyB0eXBlc1tpXSBdLnByb3RvdHlwZTtcblx0XHRcdGlmKCBjb21wb25lbnQuaXNUeXBlICYmIGNvbXBvbmVudC5pc1R5cGUoIHZhbHVlICkgKVxuXHRcdFx0XHR0eXBlID0gdHlwZXNbaSsrXTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiB0eXBlIHx8ICdvYmplY3QnO1xuXHR9LFxuXG5cdGdldFZhbGlkYXRpb25FcnJvcnM6IGZ1bmN0aW9uKCBqc29uVmFsdWUgKXtcblx0XHRyZXR1cm4gdGhpcy5yZWZzLmZpZWxkLmdldFZhbGlkYXRpb25FcnJvcnMoIGpzb25WYWx1ZSApO1xuXHR9LFxuXG5cdGFkZERlZXBTZXR0aW5nczogZnVuY3Rpb24oIHNldHRpbmdzICl7XG5cdFx0dmFyIHBhcmVudFNldHRpbmdzID0gdGhpcy5wcm9wcy5wYXJlbnRTZXR0aW5ncyB8fCB7fSxcblx0XHRcdGRlZXBcblx0XHQ7XG5cblx0XHRmb3IoIHZhciBrZXkgaW4gZGVlcFNldHRpbmdzICl7XG5cdFx0XHRkZWVwID0gZGVlcFNldHRpbmdzWyBrZXkgXSggcGFyZW50U2V0dGluZ3Nba2V5XSwgc2V0dGluZ3Nba2V5XSApO1xuXHRcdFx0aWYoIHR5cGVvZiBkZWVwICE9ICd1bmRlZmluZWQnIClcblx0XHRcdFx0c2V0dGluZ3NbIGtleSBdID0gZGVlcDtcblx0XHR9XG4gXHR9XG59KTtcblxuVHlwZUZpZWxkLnJlZ2lzdGVyVHlwZSA9IGZ1bmN0aW9uKCBuYW1lLCBDb21wb25lbnQsIHNlbGVjdGFibGUgKXtcblx0dmFyIHByb3RvID0gVHlwZUZpZWxkLnByb3RvdHlwZTtcblx0cHJvdG8uY29tcG9uZW50c1sgbmFtZSBdID0gQ29tcG9uZW50O1xuXHRpZiggc2VsZWN0YWJsZSApXG5cdFx0cHJvdG8udHlwZUNoZWNrT3JkZXIudW5zaGlmdCggbmFtZSApO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUeXBlRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy9UeXBlRmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSAyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9UeXBlRmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiAzICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE0KSxcblx0YXNzaWduID0gX193ZWJwYWNrX3JlcXVpcmVfXygxMiksXG5cdENvbXBvdW5kRmllbGRNaXhpbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTUpXG47XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgaGFzaC5cbiAqIEBwYXJhbSAge0ZyZWV6ZXJOb2RlfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG9iamVjdC5cbiAqIEBwYXJhbSAge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpdCB0aGUgb3JpZ2luYWwganNvbi5cbiAqL1xudmFyIE9iamVjdEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtDb21wb3VuZEZpZWxkTWl4aW5dLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdGdldFN0YXRlRnJvbVByb3BzOiBmdW5jdGlvbiggcHJvcHMgKXtcblx0XHRyZXR1cm4ge1xuXHRcdFx0ZWRpdGluZzogcHJvcHMuc2V0dGluZ3MuZWRpdGluZyB8fCBmYWxzZSxcblx0XHRcdGZpZWxkczogYXNzaWduKHt9LCBwcm9wcy5zZXR0aW5ncyAmJiBwcm9wcy5zZXR0aW5ncy5maWVsZHMgfHwge30pXG5cdFx0fTtcblx0fSxcblxuXHRkZWZhdWx0VmFsdWU6IHt9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0c2V0dGluZ3MgPSB0aGlzLnByb3BzLnNldHRpbmdzLFxuXHRcdFx0Y2xhc3NOYW1lID0gdGhpcy5zdGF0ZS5lZGl0aW5nIHx8IHNldHRpbmdzLmhlYWRlciA9PT0gZmFsc2UgPyAnb3BlbiBqc29uT2JqZWN0IGpzb25Db21wb3VuZCcgOiAnanNvbk9iamVjdCBqc29uQ29tcG91bmQnLFxuXHRcdFx0b3Blbkhhc2ggPSAnJyxcblx0XHRcdGRlZmluaXRpb25zID0gdGhpcy5zdGF0ZS5maWVsZHMsXG5cdFx0XHRhdHRycyA9IFtdLFxuXHRcdFx0dmFsdWUgPSBhc3NpZ24oe30sIHRoaXMucHJvcHMudmFsdWUgKSxcblx0XHRcdGZpeGVkRmllbGRzID0gdGhpcy5nZXRGaXhlZEZpZWxkcygpLFxuXHRcdFx0Z3JvdXBDb3VudCA9IDAsXG5cdFx0XHRkZWZpbml0aW9uXG5cdFx0O1xuXG5cdFx0dGhpcy5nZXRGaWVsZE9yZGVyKCkuZm9yRWFjaCggZnVuY3Rpb24oIGZpZWxkICl7XG5cdFx0XHQvLyBJZiB0aGUgZmllbGQgaXMgYW4gYXJyYXkgaGFuZGxlIGdyb3VwaW5nXG5cdFx0XHRpZiggZmllbGQuY29uc3RydWN0b3IgPT09IEFycmF5IClcblx0XHRcdFx0YXR0cnMucHVzaCggbWUucmVuZGVyR3JvdXAoIGZpZWxkLCBmaXhlZEZpZWxkcywgKytncm91cENvdW50ICkgKTtcblx0XHRcdGVsc2Vcblx0XHRcdFx0YXR0cnMucHVzaCggbWUucmVuZGVyRmllbGQoIGZpZWxkLCBmaXhlZEZpZWxkcyApICk7XG5cdFx0fSk7XG5cblx0XHR2YXIgb3Blbkhhc2hDaGlsZHJlbiA9IFsgYXR0cnMgXTtcblx0XHRpZiggc2V0dGluZ3MuYWRkZXIgIT09IGZhbHNlICl7XG5cdFx0XHRvcGVuSGFzaENoaWxkcmVuLnB1c2goIHRoaXMucmVuZGVyQWRkZXIoKSApO1xuXHRcdH1cblxuXHRcdG9wZW5IYXNoID0gUmVhY3QuRE9NLmRpdih7IGtleTogJ28nLCBjbGFzc05hbWU6ICdqc29uQ2hpbGRyZW4nfSwgb3Blbkhhc2hDaGlsZHJlbik7XG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5zcGFuKHtjbGFzc05hbWU6IGNsYXNzTmFtZX0sIFtcblx0XHRcdHRoaXMucmVuZGVySGVhZGVyKCksXG5cdFx0XHRvcGVuSGFzaFxuXHRcdF0pO1xuXHR9LFxuXG5cdHJlbmRlckZpZWxkOiBmdW5jdGlvbigga2V5LCBmaXhlZEZpZWxkcyApe1xuXHRcdHZhciB2YWx1ZSA9IHRoaXMucHJvcHMudmFsdWVbIGtleSBdLFxuXHRcdFx0ZGVmaW5pdGlvbiA9IHRoaXMuc3RhdGUuZmllbGRzWyBrZXkgXSB8fCB7fSxcblx0XHRcdGZpeGVkID0gZml4ZWRGaWVsZHMgPT09IHRydWUgfHwgdHlwZW9mIGZpeGVkRmllbGRzID09ICdvYmplY3QnICYmIGZpeGVkRmllbGRzWyBrZXkgXVxuXHRcdDtcblxuXHRcdGlmKCAhZGVmaW5pdGlvbi5zZXR0aW5ncyApXG5cdFx0XHRkZWZpbml0aW9uLnNldHRpbmdzID0ge307XG5cblx0XHRyZXR1cm4gUmVhY3QuY3JlYXRlRWxlbWVudCggRmllbGQsIHtcblx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdGtleToga2V5LFxuXHRcdFx0bmFtZToga2V5LFxuXHRcdFx0cmVmOiBrZXksXG5cdFx0XHRmaXhlZDogZml4ZWQsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdGRlZmluaXRpb246IGRlZmluaXRpb24sXG5cdFx0XHRvblVwZGF0ZWQ6IHRoaXMudXBkYXRlRmllbGQsXG5cdFx0XHRvbkRlbGV0ZWQ6IHRoaXMuZGVsZXRlRmllbGQsXG5cdFx0XHRwYXJlbnRTZXR0aW5nczogdGhpcy5wcm9wcy5zZXR0aW5nc1xuXHRcdH0pO1xuXHR9LFxuXG5cdHJlbmRlckdyb3VwOiBmdW5jdGlvbiggZmllbGROYW1lcywgZml4ZWRGaWVsZHMsIGdyb3VwTnVtYmVyICl7XG5cdFx0dmFyIG1lID0gdGhpcyxcblx0XHRcdGZpZWxkcyA9IFtdXG5cdFx0O1xuXG5cdFx0ZmllbGROYW1lcy5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKXtcblx0XHRcdGZpZWxkcy5wdXNoKCBtZS5yZW5kZXJGaWVsZCggZmllbGQsIGZpeGVkRmllbGRzICkgKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBSZWFjdC5ET00uZGl2KHsgY2xhc3NOYW1lOiAnanNvbkdyb3VwIGpzb25Hcm91cF8nICsgZ3JvdXBOdW1iZXIgfSwgZmllbGRzICk7XG5cdH0sXG5cblx0Z2V0RGVmYXVsdEhlYWRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gJ01hcCBbJyArIE9iamVjdC5rZXlzKCB0aGlzLnByb3BzLnZhbHVlICkubGVuZ3RoICsgJ10nO1xuXHR9LFxuXG5cdGdldERlZmF1bHRBZGRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gJysgQWRkIGZpZWxkJztcblx0fSxcblxuXHR1cGRhdGVGaWVsZDogZnVuY3Rpb24oIGtleSwgdmFsdWUgKXtcblx0XHR0aGlzLmNoZWNrRWRpdGluZ1NldHRpbmcoIGtleSApO1xuXHRcdHRoaXMucHJvcHMudmFsdWUuc2V0KCBrZXksIHZhbHVlICk7XG5cdH0sXG5cblx0ZGVsZXRlRmllbGQ6IGZ1bmN0aW9uKCBrZXkgKXtcblx0XHR0aGlzLnByb3BzLnZhbHVlLnJlbW92ZSgga2V5ICk7XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oIGpzb25WYWx1ZSApe1xuXHRcdHZhciBtZSA9IHRoaXMsXG5cdFx0XHRlcnJvcnMgPSBbXSxcblx0XHRcdGF0dHJzID0gT2JqZWN0LmtleXMoIHRoaXMucmVmcyApXG5cdFx0O1xuXG5cdFx0YXR0cnMuZm9yRWFjaCggZnVuY3Rpb24oIGF0dHIgKXtcblx0XHRcdHZhciBlcnJvciA9IG1lLnJlZnNbYXR0cl0uZ2V0VmFsaWRhdGlvbkVycm9ycygpO1xuXHRcdFx0aWYoIGVycm9yIClcblx0XHRcdFx0ZXJyb3JzID0gZXJyb3JzLmNvbmNhdCggZXJyb3IgKTtcblx0XHR9KTtcblxuXHRcdHJldHVybiBlcnJvcnM7XG5cdH0sXG5cblx0Z2V0RmllbGRPcmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgbWUgPSB0aGlzLFxuXHRcdFx0c2V0dGluZ3NPcmRlciA9IHRoaXMucHJvcHMuc2V0dGluZ3Mub3JkZXIsXG5cdFx0XHRvcmRlclR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NPcmRlcixcblx0XHRcdGZpZWxkcyA9IHRoaXMucHJvcHMuc2V0dGluZ3MuZmllbGRzIHx8IHt9LFxuXHRcdFx0Z3JvdXBcblx0XHQ7XG5cblx0XHRpZiggIXNldHRpbmdzT3JkZXIgfHwgKG9yZGVyVHlwZSAhPSAnZnVuY3Rpb24nICYmIHNldHRpbmdzT3JkZXIuY29uc3RydWN0b3IgIT09IEFycmF5KSApXG5cdFx0XHRyZXR1cm4gT2JqZWN0LmtleXMoIHRoaXMucHJvcHMudmFsdWUgKTtcblxuXHRcdHZhciB2YWx1ZSA9IGFzc2lnbigge30sIHRoaXMucHJvcHMudmFsdWUgKSxcblx0XHRcdG9yZGVyID0gW11cblx0XHQ7XG5cblx0XHRpZiggb3JkZXJUeXBlID09ICdmdW5jdGlvbicgKVxuXHRcdFx0cmV0dXJuIHNldHRpbmdzT3JkZXIoIHZhbHVlICk7XG5cblx0XHQvLyBBZGQgZmllbGRzIGluIHRoZSBhcnJheVxuXHRcdGlmKCBzZXR0aW5nc09yZGVyLmNvbnN0cnVjdG9yID09PSBBcnJheSApe1xuXHRcdFx0c2V0dGluZ3NPcmRlci5mb3JFYWNoKCBmdW5jdGlvbiggZmllbGQgKXtcblxuXHRcdFx0XHQvLyBBbiBhcnJheSwgaGFuZGxlIGdyb3VwXG5cdFx0XHRcdGlmKCBmaWVsZC5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xuXHRcdFx0XHRcdGdyb3VwID0gW107XG5cdFx0XHRcdFx0ZmllbGQuZm9yRWFjaCggZnVuY3Rpb24oIGdyb3VwRmllbGQgKXtcblx0XHRcdFx0XHRcdGlmKCBtZS5hZGRGaWVsZFRvT3JkZXIoIGdyb3VwRmllbGQsIHZhbHVlLCBmaWVsZHMgKSApe1xuXHRcdFx0XHRcdFx0XHRncm91cC5wdXNoKCBncm91cEZpZWxkICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRGVsZXRlIHRoZW0gZnJvbSBjdXJyZW50IHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdmFsdWVbIGdyb3VwRmllbGQgXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiggZ3JvdXAubGVuZ3RoIClcblx0XHRcdFx0XHRcdG9yZGVyLnB1c2goIGdyb3VwICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZWxzZSBpZiggbWUuYWRkRmllbGRUb09yZGVyKCBmaWVsZCwgdmFsdWUsIGZpZWxkcyApICl7XG5cdFx0XHRcdFx0b3JkZXIucHVzaCggZmllbGQgKTtcblxuXHRcdFx0XHRcdC8vIERlbGV0ZSB0aGVtIGZyb20gY3VycmVudCB2YWx1ZXNcblx0XHRcdFx0XHRkZWxldGUgdmFsdWVbIGZpZWxkIF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUga2V5cyBsZWZ0IGluIHRoZSB2YWx1ZVxuXHRcdGZvciggdmFyIGtleSBpbiB2YWx1ZSApe1xuXHRcdFx0aWYoIG9yZGVyLmluZGV4T2YoIGtleSApID09IC0xIClcblx0XHRcdFx0b3JkZXIucHVzaCgga2V5ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG9yZGVyO1xuXHR9LFxuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hlbiBhIGZpZWxkIHRoYXQgYXBwZWFycyBpbiB0aGUgc29ydCBzZXR0aW5ncyBuZWVkcyB0byBiZSBhZGRlZCB0b1xuXHQgKiB0aGUgZmllbGRPcmRlciBhcnJheVxuXHQgKlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZmllbGQgVGhlIGZpZWxkIG5hbWVcblx0ICovXG5cdGFkZEZpZWxkVG9PcmRlcjogZnVuY3Rpb24oIGZpZWxkLCB2YWx1ZSwgZmllbGRzICl7XG5cdFx0cmV0dXJuIHR5cGVvZiB2YWx1ZVsgZmllbGQgXSAhPSAndW5kZWZpbmVkJyB8fCBmaWVsZHNbIGZpZWxkIF0gJiYgZmllbGRzWyBmaWVsZCBdLnR5cGUgPT0gJ3JlYWN0Jztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0RmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy90eXBlcy9PYmplY3RGaWVsZC5qc1xuICoqIG1vZHVsZSBpZCA9IDNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL3R5cGVzL09iamVjdEZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNCAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSksXG5cdEZpZWxkID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNCksXG5cdGFzc2lnbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTIpLFxuXHRDb21wb3VuZEZpZWxkTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE1KVxuO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZWRpdGluZyBhbiBhcnJheS5cbiAqIEBwYXJhbSAge0ZyZWV6ZXJOb2RlfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGFycmF5LlxuICogQHBhcmFtICB7TWl4ZWR9IG9yaWdpbmFsIFRoZSB2YWx1ZSBvZiB0aGUgY29tcG9uZW50IGl0IHRoZSBvcmlnaW5hbCBqc29uLlxuICovXG52YXIgQXJyYXlGaWVsZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0bWl4aW5zOiBbQ29tcG91bmRGaWVsZE1peGluXSxcblxuXHRnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0U3RhdGVGcm9tUHJvcHMoIHRoaXMucHJvcHMgKTtcblx0fSxcblxuXHRnZXRTdGF0ZUZyb21Qcm9wczogZnVuY3Rpb24oIHByb3BzICl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGVkaXRpbmc6IHByb3BzLnNldHRpbmdzLmVkaXRpbmcgfHwgZmFsc2UsXG5cdFx0XHRmaWVsZHM6IHRoaXMuc3RhdGUgJiYgdGhpcy5zdGF0ZS5maWVsZHMgfHwge31cblx0XHR9O1xuXHR9LFxuXG5cdGRlZmF1bHRWYWx1ZTogW10sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMucHJvcHMuc2V0dGluZ3MsXG5cdFx0XHRjbGFzc05hbWUgPSB0aGlzLnN0YXRlLmVkaXRpbmcgPyAnb3BlbiBqc29uQXJyYXkganNvbkNvbXBvdW5kJyA6ICdqc29uQXJyYXkganNvbkNvbXBvdW5kJyxcblx0XHRcdG9wZW5BcnJheSA9ICcnLFxuXHRcdFx0Zml4ZWRGaWVsZHMgPSB0aGlzLmdldEZpeGVkRmllbGRzKCksXG5cdFx0XHRkZWZpbml0aW9ucyA9IHRoaXMuc3RhdGUuZmllbGRzXG5cdFx0O1xuXG5cdFx0dmFyIGF0dHJzID0gW10sXG5cdFx0XHRkZWZpbml0aW9uLCBmaXhlZFxuXHRcdDtcblx0XHRmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucHJvcHMudmFsdWUubGVuZ3RoOyBpKyspIHtcblx0XHRcdGRlZmluaXRpb24gPSBkZWZpbml0aW9uc1sgaSBdIHx8IHt9O1xuXHRcdFx0aWYoICFkZWZpbml0aW9uLnNldHRpbmdzIClcblx0XHRcdFx0ZGVmaW5pdGlvbi5zZXR0aW5ncyA9IHt9O1xuXG5cdFx0XHRmaXhlZCA9IGZpeGVkRmllbGRzID09PSB0cnVlIHx8IHR5cGVvZiBmaXhlZEZpZWxkcyA9PSAnb2JqZWN0JyAmJiBmaXhlZEZpZWxkc1sgaSBdO1xuXG5cdFx0XHRhdHRycy5wdXNoKCBSZWFjdC5jcmVhdGVFbGVtZW50KCBGaWVsZCwge1xuXHRcdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZVtpXSxcblx0XHRcdFx0a2V5OiBpLFxuXHRcdFx0XHRuYW1lOiBpLFxuXHRcdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdFx0ZGVmaW5pdGlvbjogZGVmaW5pdGlvbixcblx0XHRcdFx0Zml4ZWQ6IGZpeGVkLFxuXHRcdFx0XHRvblVwZGF0ZWQ6IHRoaXMudXBkYXRlRmllbGQsXG5cdFx0XHRcdG9uRGVsZXRlZDogdGhpcy5kZWxldGVGaWVsZCxcblx0XHRcdFx0cGFyZW50U2V0dGluZ3M6IHRoaXMucHJvcHMuc2V0dGluZ3Ncblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHR2YXIgb3BlbkFycmF5Q2hpbGRyZW4gPSBbIGF0dHJzIF07XG5cdFx0aWYoIHNldHRpbmdzLmFkZGVyICE9PSBmYWxzZSApe1xuXHRcdFx0b3BlbkFycmF5Q2hpbGRyZW4ucHVzaCggdGhpcy5yZW5kZXJBZGRlciggdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggKSApO1xuXHRcdH1cblxuXHRcdG9wZW5BcnJheSA9IFJlYWN0LkRPTS5kaXYoeyBrZXk6J28nLCBjbGFzc05hbWU6ICdqc29uQ2hpbGRyZW4nIH0sIG9wZW5BcnJheUNoaWxkcmVuICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oe2NsYXNzTmFtZTogY2xhc3NOYW1lfSwgW1xuXHRcdFx0dGhpcy5yZW5kZXJIZWFkZXIoKSxcblx0XHRcdG9wZW5BcnJheVxuXHRcdF0pO1xuXHR9LFxuXG5cdGdldERlZmF1bHRIZWFkZXI6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuICdMaXN0IFsnICsgdGhpcy5wcm9wcy52YWx1ZS5sZW5ndGggKyAnXSc7XG5cdH0sXG5cblx0Z2V0RGVmYXVsdEFkZGVyOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiAnKyBBZGQgZWxlbWVudCc7XG5cdH0sXG5cblx0dXBkYXRlRmllbGQ6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICl7XG5cdFx0dGhpcy5jaGVja0VkaXRpbmdTZXR0aW5nKCBrZXkgKTtcblx0XHR0aGlzLnByb3BzLnZhbHVlLnNldCgga2V5LCB2YWx1ZSApO1xuXHR9LFxuXG5cdGRlbGV0ZUZpZWxkOiBmdW5jdGlvbigga2V5ICl7XG5cdFx0dmFyIGZpZWxkcyA9IHt9O1xuXG5cdFx0Zm9yKCB2YXIgaW5kZXggaW4gdGhpcy5zdGF0ZS5maWVsZHMgKXtcblx0XHRcdGlmKCBpbmRleCA+IGtleSApe1xuXHRcdFx0XHRmaWVsZHNbIGluZGV4IC0gMSBdID0gdGhpcy5zdGF0ZS5maWVsZHNbIGluZGV4IF07XG5cdFx0XHR9XG5cdFx0XHRlbHNlIGlmKCBpbmRleCA8IGtleSApe1xuXHRcdFx0XHRmaWVsZHNbIGluZGV4IF0gPSB0aGlzLnN0YXRlLmZpZWxkc1sgaW5kZXggXTtcblx0XHRcdH1cblx0XHRcdC8vIElmIHRoZXkgYXJlIGVxdWFsIHdlIGFyZSBkZWxldGluZyB0aGUgZWxlbWVudCwgZG8gbm90aGluZ1xuXHRcdH1cblxuXHRcdHRoaXMucHJvcHMudmFsdWUuc3BsaWNlKCBrZXksIDEgKTtcblx0XHR0aGlzLnNldFN0YXRlKCB7IGZpZWxkczogZmllbGRzIH0gKTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PSBBcnJheTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQXJyYXlGaWVsZDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vc3JjL3R5cGVzL0FycmF5RmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSA0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy90eXBlcy9BcnJheUZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgc3RyaW5nLlxuICogQHBhcmFtICB7c3RyaW5nfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSAge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGNvbXBvbmVudCBpdCB0aGUgb3JpZ2luYWwganNvbi5cbiAqIEBwYXJhbSB7RnJlZXplck5vZGV9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUgdG8gbGV0IHRoZSBzdHJpbmcgY29tcG9uZW50IHVwZGF0ZSBpdHMgdmFsdWUuXG4gKi9cbnZhciBTdHJpbmdGaWVsZCA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblx0bWl4aW5zOiBbTGVhZk1peGluXSxcblx0dHlwZUNsYXNzOiAnanNvblN0cmluZycsXG5cdGlucHV0VHlwZTogJ3RleHQnLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJJbnB1dCgpO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH0sXG5cblx0aXNUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlICE9ICdvYmplY3QnO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTdHJpbmdGaWVsZDtcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vc3JjL3R5cGVzL1N0cmluZ0ZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvU3RyaW5nRmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiA2ICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBib29sZWFuLlxuICovXG52YXIgQm9vbGVhbkZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXG5cdGRlZmF1bHRWYWx1ZTogZmFsc2UsXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBjbGFzc05hbWUgPSAnanNvbkJvb2xlYW4nO1xuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5pbnB1dCh7XG5cdFx0XHR0eXBlOiBcImNoZWNrYm94XCIsXG5cdFx0XHRjbGFzc05hbWU6IGNsYXNzTmFtZSxcblx0XHRcdGlkOiB0aGlzLnByb3BzLmlkLFxuXHRcdFx0Y2hlY2tlZDogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdG9uQ2hhbmdlOiB0aGlzLnVwZGF0ZVZhbHVlXG5cdFx0fSk7XG5cdH0sXG5cblx0dXBkYXRlVmFsdWU6IGZ1bmN0aW9uKCBlICl7XG5cdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIGUudGFyZ2V0LmNoZWNrZWQgKTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Jvb2xlYW4nO1xuXHR9LFxuXG5cdGNvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHM6IGZ1bmN0aW9uKCBuZXh0UHJvcHMgKXtcblx0XHRpZiggdGhpcy5wcm9wcy52YWx1ZSAhPSBuZXh0UHJvcHMudmFsdWUgKVxuXHRcdFx0dGhpcy5zZXRTdGF0ZSggeyB2YWx1ZTogbmV4dFByb3BzLnZhbHVlIH0gKTtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gQm9vbGVhbkZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvQm9vbGVhbkZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvQm9vbGVhbkZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogNyAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG4vKipcbiAqIENvbXBvbmVudCBmb3IgZWRpdGluZyBhIG51bWJlci5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgc3RyaW5nIGNvbXBvbmVudCB1cGRhdGUgaXRzIHZhbHVlLlxuICovXG52YXIgTnVtYmVyRmllbGQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdG1peGluczogW0xlYWZNaXhpbl0sXG5cdHR5cGVDbGFzczogJ2pzb25OdW1iZXInLFxuXHRpbnB1dFR5cGU6ICdudW1iZXInLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5yZW5kZXJJbnB1dCgpO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogcGFyc2VGbG9hdCggZS50YXJnZXQudmFsdWUgKSB9KTtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcic7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IE51bWJlckZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvTnVtYmVyRmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSA3XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy90eXBlcy9OdW1iZXJGaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDggKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgidmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0TGVhZk1peGluID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNilcbjtcblxuLyoqXG4gKiBDb21wb25lbnQgZm9yIGVkaXRpbmcgYSBsb25nIHN0cmluZy5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgc3RyaW5nIGNvbXBvbmVudCB1cGRhdGUgaXRzIHZhbHVlLlxuICovXG52YXIgVGV4dEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtMZWFmTWl4aW5dLFxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gdGhpcy5nZXRTdGF0ZUZyb21Qcm9wcyggdGhpcy5wcm9wcyApO1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgY2xhc3NOYW1lID0gJ2pzb25UZXh0JztcblxuXHRcdGlmKCAhdGhpcy5zdGF0ZS5lZGl0aW5nIClcblx0XHRcdHJldHVybiBSZWFjdC5ET00uc3Bhbigge29uQ2xpY2s6IHRoaXMuc2V0RWRpdE1vZGUsIGNsYXNzTmFtZTogY2xhc3NOYW1lfSwgdGhpcy5wcm9wcy52YWx1ZSApO1xuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS50ZXh0YXJlYSh7XG5cdFx0XHR2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSxcblx0XHRcdGlkOiB0aGlzLnByb3BzLmlkLFxuXHRcdFx0b25DaGFuZ2U6IHRoaXMudXBkYXRlVmFsdWUsXG5cdFx0XHRwbGFjZWhvbGRlcjogdGhpcy5wcm9wcy5zZXR0aW5ncy5wbGFjZWhvbGRlciB8fCAnJyxcblx0XHRcdG9uQmx1cjogdGhpcy5zZXRWYWx1ZSxcblx0XHRcdHJlZjogJ2lucHV0J1xuXHRcdH0pO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH0sXG5cblx0aXNUeXBlOiBmdW5jdGlvbiggdmFsdWUgKXtcblx0XHRyZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnICYmIHZhbHVlLmxlbmd0aCA+IDEwMDtcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gVGV4dEZpZWxkO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvVGV4dEZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gOFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvVGV4dEZpZWxkLmpzPyIpOw0KDQovKioqLyB9LA0KLyogOSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRMZWFmTWl4aW4gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDE2KVxuO1xuXG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgcGFzc3dvcmQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgcGFzc3dvcmQuXG4gKiBAcGFyYW0gIHtNaXhlZH0gb3JpZ2luYWwgVGhlIHZhbHVlIG9mIHRoZSBjb21wb25lbnQgaXQgdGhlIG9yaWdpbmFsIGpzb24uXG4gKiBAcGFyYW0ge0ZyZWV6ZXJOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBub2RlIHRvIGxldCB0aGUgcGFzc3dvcmQgY29tcG9uZW50IHVwZGF0ZSBpdHMgdmFsdWUuXG4gKi9cbnZhciBQYXNzd29yZEZpZWxkID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRtaXhpbnM6IFtMZWFmTWl4aW5dLFxuXHR0eXBlQ2xhc3M6ICdqc29uUGFzc3dvcmQnLFxuXHRpbnB1dFR5cGU6ICdwYXNzd29yZCcsXG5cdGRlZmF1bHRWYWx1ZTogJycsXG5cblx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB0aGlzLmdldFN0YXRlRnJvbVByb3BzKCB0aGlzLnByb3BzICk7XG5cdH0sXG5cblx0cmVuZGVyOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB0aGlzLnJlbmRlcklucHV0KCk7XG5cdH0sXG5cblx0Z2V0RGlzcGxheU1vZGVTdHJpbmc6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0V2lsZGNhcmRzKCk7XG5cdH0sXG5cblx0Z2V0V2lsZGNhcmRzOiBmdW5jdGlvbigpe1xuXHRcdHZhciBvdXQgPSAnJztcblx0XHRmb3IgKHZhciBpID0gdGhpcy5zdGF0ZS52YWx1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0b3V0ICs9ICcqJztcblx0XHR9XG5cdFx0cmV0dXJuIG91dDtcblx0fSxcblxuXHRpc1R5cGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9LFxuXG5cdHVwZGF0ZVZhbHVlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMuc2V0U3RhdGUoeyB2YWx1ZTogZS50YXJnZXQudmFsdWUgfSk7XG5cdH1cbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3N3b3JkRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy90eXBlcy9QYXNzd29yZEZpZWxkLmpzXG4gKiogbW9kdWxlIGlkID0gOVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvUGFzc3dvcmRGaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEwICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBSZWFjdCA9IF9fd2VicGFja19yZXF1aXJlX18oMSk7XG5cbi8qKlxuICogQ29tcG9uZW50IGZvciBlZGl0aW5nIGEgYm9vbGVhbi5cbiAqIEBwYXJhbSAge3N0cmluZ30gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBib29sZWFuLlxuICovXG52YXIgU2VsZWN0VHlwZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcblxuXHRkZWZhdWx0VmFsdWU6ICcnLFxuXG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gIHtcblx0XHRcdHZhbHVlOiB0aGlzLnByb3BzLnZhbHVlXG5cdFx0fTtcblx0fSxcblxuXHRyZW5kZXI6IGZ1bmN0aW9uKCl7XG5cdFx0dmFyIGNsYXNzTmFtZSA9ICdqc29uU2VsZWN0JztcblxuXHRcdHJldHVybiBSZWFjdC5ET00uc2VsZWN0KHtcblx0XHRcdGNsYXNzTmFtZTogY2xhc3NOYW1lLFxuXHRcdFx0aWQ6IHRoaXMucHJvcHMuaWQsXG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdG9uQ2hhbmdlOiB0aGlzLnVwZGF0ZVZhbHVlXG5cdFx0fSwgdGhpcy5yZW5kZXJPcHRpb25zKCkgKTtcblx0fSxcblxuXHRyZW5kZXJPcHRpb25zOiBmdW5jdGlvbigpe1xuXHRcdHZhciBvcHRzID0gdGhpcy5wcm9wcy5zZXR0aW5ncy5vcHRpb25zLFxuXHRcdFx0b3B0aW9ucyA9IFtdXG5cdFx0O1xuXG5cdFx0aWYoICFvcHRzIHx8ICFvcHRzLmxlbmd0aCApXG5cdFx0XHRyZXR1cm4gb3B0aW9ucztcblxuXHRcdG9wdHMuZm9yRWFjaCggZnVuY3Rpb24oIG9wdCApe1xuXHRcdFx0dmFyIGRhdGEgPSBvcHQ7XG5cdFx0XHRpZiggdHlwZW9mIG9wdCAhPSAnb2JqZWN0JyApXG5cdFx0XHRcdGRhdGEgPSB7IHZhbHVlOiBvcHQsIGxhYmVsOiBvcHQgfTtcblxuXHRcdFx0b3B0aW9ucy5wdXNoKFxuXHRcdFx0XHRSZWFjdC5ET00ub3B0aW9uKHt2YWx1ZTogZGF0YS52YWx1ZX0sIGRhdGEubGFiZWwpXG5cdFx0XHQpO1xuXHRcdH0pO1xuXG5cdFx0cmV0dXJuIG9wdGlvbnM7XG5cdH0sXG5cblx0dXBkYXRlVmFsdWU6IGZ1bmN0aW9uKCBlICl7XG5cdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIGUudGFyZ2V0LnZhbHVlICk7XG5cdH0sXG5cblx0Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24oIG5leHRQcm9wcyApe1xuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlICE9IG5leHRQcm9wcy52YWx1ZSApXG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7IHZhbHVlOiBuZXh0UHJvcHMudmFsdWUgfSApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBTZWxlY3RUeXBlO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvdHlwZXMvU2VsZWN0RmllbGQuanNcbiAqKiBtb2R1bGUgaWQgPSAxMFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9zcmMvdHlwZXMvU2VsZWN0RmllbGQuanM/Iik7DQoNCi8qKiovIH0sDQovKiAxMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJtb2R1bGUuZXhwb3J0cyA9IHtcblx0ZWRpdGluZzogZnVuY3Rpb24oIHBhcmVudFZhbHVlLCB2YWx1ZSApe1xuXHRcdGlmKCB0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgKVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYoIHBhcmVudFZhbHVlID09ICdhbHdheXMnIClcblx0XHRcdHJldHVybiAnYWx3YXlzJztcblxuXHRcdC8vIGVsc2UgcmV0dXJuIHVuZGVmaW5lZDogZG8gbm90IG92ZXJyaWRlXG5cdH0sXG5cdGFkZGVyOiBmdW5jdGlvbiggcGFyZW50VmFsdWUsIHZhbHVlICl7XG5cblx0XHRpZiggdHlwZW9mIHZhbHVlICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRpZiggdHlwZW9mIHBhcmVudFZhbHVlICE9ICd1bmRlZmluZWQnIClcblx0XHRcdHJldHVybiBwYXJlbnRWYWx1ZTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXHRmaXhlZEZpZWxkczogZnVuY3Rpb24oIHBhcmVudFZhbHVlLCB2YWx1ZSApe1xuXHRcdGlmKCB0eXBlb2YgdmFsdWUgIT0gJ3VuZGVmaW5lZCcgKVxuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXG5cdFx0aWYoIHR5cGVvZiBwYXJlbnRWYWx1ZSA9PSAnYm9vbGVhbicgKVxuXHRcdFx0cmV0dXJuIHBhcmVudFZhbHVlO1xuXHR9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvZGVlcFNldHRpbmdzLmpzXG4gKiogbW9kdWxlIGlkID0gMTFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL2RlZXBTZXR0aW5ncy5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEyICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gVG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT0gbnVsbCkge1xuXHRcdHRocm93IG5ldyBUeXBlRXJyb3IoJ09iamVjdC5hc3NpZ24gY2Fubm90IGJlIGNhbGxlZCB3aXRoIG51bGwgb3IgdW5kZWZpbmVkJyk7XG5cdH1cblxuXHRyZXR1cm4gT2JqZWN0KHZhbCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciBrZXlzO1xuXHR2YXIgdG8gPSBUb09iamVjdCh0YXJnZXQpO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IGFyZ3VtZW50c1tzXTtcblx0XHRrZXlzID0gT2JqZWN0LmtleXMoT2JqZWN0KGZyb20pKTtcblxuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0dG9ba2V5c1tpXV0gPSBmcm9tW2tleXNbaV1dO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0bztcbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qc1xuICoqIG1vZHVsZSBpZCA9IDEyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vb2JqZWN0LWFzc2lnbi9pbmRleC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDEzICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoInZhciBGcmVlemVyID0gX193ZWJwYWNrX3JlcXVpcmVfXygxNyk7XG5tb2R1bGUuZXhwb3J0cyA9IEZyZWV6ZXI7XG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvZnJlZXplci5qc1xuICoqIG1vZHVsZSBpZCA9IDEzXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9mcmVlemVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMTQgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRvYmplY3RBc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKSxcblx0VmFsaWRhdGlvbiA9IF9fd2VicGFja19yZXF1aXJlX18oMTgpLFxuXHRUeXBlRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG47XG5cbi8qKlxuICogRmllbGQgY29tcG9uZW50IHRoYXQgcmVwcmVzZW50IGVhY2ggQXJyYXkgZWxlbWVudCBvciBPYmplY3QgZmllbGQuXG4gKiBAcGFyYW0gIHtzdHJpbmd9IG5hbWUgVGhlIGtleSBvZiB0aGUgYXR0cmlidXRlIGluIHRoZSBwYXJlbnQuXG4gKiBAcGFyYW0gIHtNaXhlZH0gdmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuXG4gKiBAcGFyYW0ge01peGVkfSBvcmlnaW5hbCBUaGUgdmFsdWUgb2YgdGhlIGF0dGlidXRlIGluIHRoZSBvcmlnaW5hbCBqc29uIHRvIGhpZ2hsaWdodCB0aGUgY2hhbmdlcy5cbiAqIEBwYXJhbSB7RnJlZXplck5vZGV9IHBhcmVudCBUaGUgcGFyZW50IG5vZGUgdG8gbm90aWZ5IGF0dHJpYnV0ZSB1cGRhdGVzLlxuICovXG52YXIgRmllbGQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cblx0Z2V0SW5pdGlhbFN0YXRlOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7ZXJyb3I6IGZhbHNlfTtcblx0fSxcblx0Z2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbigpe1xuXHRcdHJldHVybiB7XG5cdFx0XHRkZWZpbml0aW9uOiB7fVxuXHRcdH07XG5cdH0sXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHR2YXIgZGVmaW5pdGlvbiA9IHRoaXMucHJvcHMuZGVmaW5pdGlvbiB8fCB7fSxcblx0XHRcdGNsYXNzTmFtZSA9ICdqc29uRmllbGQnLFxuXHRcdFx0dHlwZSA9IGRlZmluaXRpb24udHlwZSB8fCBUeXBlRmllbGQucHJvdG90eXBlLmd1ZXNzVHlwZSggdGhpcy5wcm9wcy52YWx1ZSApLFxuXHRcdFx0aWQgPSB0aGlzLnByb3BzLmlkICsgJ18nICsgdGhpcy5wcm9wcy5uYW1lLFxuXHRcdFx0ZXJyb3IgPSAnJyxcblx0XHRcdHR5cGVGaWVsZFxuXHRcdDtcblxuXHRcdGlmKCB0eXBlID09ICdyZWFjdCcgKVxuXHRcdFx0cmV0dXJuIHRoaXMucmVuZGVyUmVhY3RGaWVsZCggZGVmaW5pdGlvbiApO1xuXG5cdFx0dHlwZUZpZWxkID0gdGhpcy5yZW5kZXJUeXBlRmllbGQoIHR5cGUsIGlkICk7XG5cblx0XHRjbGFzc05hbWUgKz0gJyAnICsgdHlwZSArICdGaWVsZCc7XG5cblx0XHRpZiggdGhpcy5zdGF0ZS5lcnJvciApe1xuXHRcdFx0Y2xhc3NOYW1lICs9ICcganNvbkVycm9yJztcblx0XHRcdGlmKCB0aGlzLnN0YXRlLmVycm9yICE9PSB0cnVlIClcblx0XHRcdFx0ZXJyb3IgPSBSZWFjdC5ET00uc3Bhbih7IGtleTonZScsIGNsYXNzTmFtZTogJ2pzb25FcnJvck1zZycgfSwgdGhpcy5zdGF0ZS5lcnJvciApO1xuXHRcdH1cblxuXHRcdHZhciBqc29uTmFtZSA9IFsgUmVhY3QuRE9NLmxhYmVsKHsga2V5OiAnczEnLCBodG1sRm9yOiBpZCB9LCAoZGVmaW5pdGlvbi50aXRsZSB8fCB0aGlzLnByb3BzLm5hbWUpICsgJzonICkgXTtcblxuXHRcdGlmKCB0aGlzLnByb3BzLmZpeGVkICl7XG5cdFx0XHQvLyBJZiB0aGUgZmllbGQgY2Fubm90IGJlIHJlbW92ZWQsIGFkZCBhIHBsYWNlaG9sZGVyIHRvIG1haW50YWluIHRoZSBkZXNpZ25cblx0XHRcdGpzb25OYW1lLnVuc2hpZnQoIFJlYWN0LkRPTS5zcGFuKHsga2V5OidmJywgY2xhc3NOYW1lOiAnanNvbkZpeGVkJyB9KSApO1xuXHRcdH1cblx0XHRlbHNle1xuXHRcdFx0anNvbk5hbWUudW5zaGlmdCggUmVhY3QuRE9NLmEoeyBrZXk6J2EnLCBocmVmOiAnIycsIGNsYXNzTmFtZTogJ2pzb25SZW1vdmUnLCBvbkNsaWNrOiB0aGlzLmhhbmRsZVJlbW92ZX0sICd4JykgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmRpdih7Y2xhc3NOYW1lOiBjbGFzc05hbWV9LCBbXG5cdFx0XHRSZWFjdC5ET00uc3Bhbigge2NsYXNzTmFtZTogJ2pzb25OYW1lJywga2V5OiAnbid9LCBqc29uTmFtZSApLFxuXHRcdFx0UmVhY3QuRE9NLnNwYW4oIHtjbGFzc05hbWU6ICdqc29uVmFsdWUnLCBrZXk6ICd2J30sIHR5cGVGaWVsZCApLFxuXHRcdFx0ZXJyb3Jcblx0XHRdKTtcblx0fSxcblxuXHRyZW5kZXJUeXBlRmllbGQ6IGZ1bmN0aW9uKCB0eXBlLCBpZCApe1xuXHRcdHZhciBkZWZpbml0aW9uID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLFxuXHRcdFx0c2V0dGluZ3MgPSBvYmplY3RBc3NpZ24oIHt9LCBkZWZpbml0aW9uLnNldHRpbmdzIHx8IHt9ICksXG5cdFx0XHRjb21wb25lbnRcblx0XHQ7XG5cblx0XHRpZiggZGVmaW5pdGlvbi5maWVsZHMgKVxuXHRcdFx0c2V0dGluZ3MuZmllbGRzID0gZGVmaW5pdGlvbi5maWVsZHM7XG5cblx0XHRjb21wb25lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KCBUeXBlRmllbGQsIHtcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHR2YWx1ZTogdGhpcy5wcm9wcy52YWx1ZSxcblx0XHRcdHNldHRpbmdzOiBzZXR0aW5ncyxcblx0XHRcdG9uVXBkYXRlZDogdGhpcy5vblVwZGF0ZWQsXG5cdFx0XHRyZWY6ICd0eXBlRmllbGQnLFxuXHRcdFx0aWQ6IGlkLFxuXHRcdFx0cGFyZW50U2V0dGluZ3M6IHRoaXMucHJvcHMucGFyZW50U2V0dGluZ3Ncblx0XHR9KTtcblx0XHRyZXR1cm4gY29tcG9uZW50O1xuXHR9LFxuXG5cdHJlbmRlclJlYWN0RmllbGQ6IGZ1bmN0aW9uKCBkZWZpbml0aW9uICl7XG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5kaXYoIHsgY2xhc3NOYW1lOiAnanNvbkZpZWxkIHJlYWN0RmllbGQnIH0sIGRlZmluaXRpb24ub3V0cHV0ICk7XG5cdH0sXG5cblx0aGFuZGxlUmVtb3ZlOiBmdW5jdGlvbiggZSApe1xuXHRcdHRoaXMucHJvcHMub25EZWxldGVkKCB0aGlzLnByb3BzLm5hbWUgKTtcblx0fSxcblxuXHRzaG91bGRDb21wb25lbnRVcGRhdGU6IGZ1bmN0aW9uKCBuZXh0UHJvcHMsIG5leHRTdGF0ZSApe1xuXHRcdHJldHVybiBuZXh0UHJvcHMudmFsdWUgIT0gdGhpcy5wcm9wcy52YWx1ZSB8fCBuZXh0U3RhdGUuZXJyb3IgIT0gdGhpcy5zdGF0ZS5lcnJvcjtcblx0fSxcblxuXHRvblVwZGF0ZWQ6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuXHRcdHZhciBkZWZpbml0aW9uID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uO1xuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlICE9PSB2YWx1ZSApe1xuXHRcdFx0dGhpcy5wcm9wcy5vblVwZGF0ZWQoIHRoaXMucHJvcHMubmFtZSwgdmFsdWUgKTtcblx0XHRcdGlmKCBkZWZpbml0aW9uLm9uQ2hhbmdlIClcblx0XHRcdFx0ZGVmaW5pdGlvbi5vbkNoYW5nZSggdmFsdWUsIHRoaXMucHJvcHMudmFsdWUgKTtcblx0XHR9XG5cdH0sXG5cblx0Z2V0VmFsaWRhdGlvbkVycm9yczogZnVuY3Rpb24oIGpzb25WYWx1ZSApe1xuXHRcdHZhciBjaGlsZEVycm9ycyA9IFtdLFxuXHRcdFx0dmFsaWRhdGVzID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLnZhbGlkYXRlcyxcblx0XHRcdG5hbWUgPSB0aGlzLnByb3BzLm5hbWUsXG5cdFx0XHRmaWVsZCA9IHRoaXMucmVmcy50eXBlRmllbGRcblx0XHQ7XG5cblx0XHRpZiggIWZpZWxkIClcblx0XHRcdHJldHVybiBbXTtcblxuXHRcdGlmKCBmaWVsZC5maWVsZFR5cGUgPT0gJ29iamVjdCcgKXtcblx0XHRcdGNoaWxkRXJyb3JzID0gZmllbGQuZ2V0VmFsaWRhdGlvbkVycm9ycygganNvblZhbHVlICk7XG5cdFx0XHRjaGlsZEVycm9ycy5mb3JFYWNoKCBmdW5jdGlvbiggZXJyb3IgKXtcblx0XHRcdFx0aWYoICFlcnJvci5wYXRoIClcblx0XHRcdFx0XHRlcnJvci5wYXRoID0gbmFtZTtcblx0XHRcdFx0ZWxzZVxuXHRcdFx0XHRcdGVycm9yLnBhdGggPSBuYW1lICsgJy4nICsgZXJyb3IucGF0aDtcblx0XHRcdH0pO1xuXG5cdFx0XHRpZiggY2hpbGRFcnJvcnMubGVuZ3RoIClcblx0XHRcdFx0dGhpcy5zZXRTdGF0ZSgge2Vycm9yOiB0cnVlfSApO1xuXHRcdH1cblxuXHRcdGlmKCAhdmFsaWRhdGVzIClcblx0XHRcdHJldHVybiBjaGlsZEVycm9ycztcblxuXG5cdFx0dmFyIGVycm9yID0gVmFsaWRhdGlvbi5nZXRWYWxpZGF0aW9uRXJyb3IoIHRoaXMucHJvcHMudmFsdWUsIGpzb25WYWx1ZSwgdmFsaWRhdGVzICksXG5cdFx0XHRtZXNzYWdlXG5cdFx0O1xuXG5cdFx0aWYoIGVycm9yICl7XG5cdFx0XHRtZXNzYWdlID0gdGhpcy5wcm9wcy5kZWZpbml0aW9uLmVycm9yTWVzc2FnZTtcblx0XHRcdGlmKCAhbWVzc2FnZSApXG5cdFx0XHRcdG1lc3NhZ2UgPSAoIHRoaXMucHJvcHMuZGVmaW5pdGlvbi5sYWJlbCB8fCB0aGlzLnByb3BzLm5hbWUgKSArICcgdmFsdWUgaXMgbm90IHZhbGlkLic7XG5cblx0XHRcdGVycm9yLnBhdGggPSBuYW1lO1xuXHRcdFx0ZXJyb3IubWVzc2FnZSA9IG1lc3NhZ2U7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZXJyb3I6IG1lc3NhZ2V9ICk7XG5cdFx0XHRjaGlsZEVycm9ycyA9IGNoaWxkRXJyb3JzLmNvbmNhdCggW2Vycm9yXSApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB0aGlzLnN0YXRlLmVycm9yICl7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZXJyb3I6IGZhbHNlfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGlsZEVycm9ycztcblx0fVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gRmllbGQ7XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy9GaWVsZC5qc1xuICoqIG1vZHVsZSBpZCA9IDE0XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9GaWVsZC5qcz8iKTsNCg0KLyoqKi8gfSwNCi8qIDE1ICovDQovKioqLyBmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHsNCg0KCWV2YWwoIid1c2Ugc3RyaWN0JztcblxudmFyIFJlYWN0ID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKSxcblx0RmllbGRBZGRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMTkpLFxuXHRhc3NpZ24gPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEyKVxuO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0cmVuZGVySGVhZGVyOiBmdW5jdGlvbigpe1xuXHRcdHZhciBzZXR0aW5nc0hlYWRlciA9IHRoaXMucHJvcHMuc2V0dGluZ3MuaGVhZGVyO1xuXHRcdGlmKCBzZXR0aW5nc0hlYWRlciA9PT0gZmFsc2UgKVxuXHRcdFx0cmV0dXJuICcnO1xuXG5cdFx0dmFyIHR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NIZWFkZXIsXG5cdFx0XHRoZWFkZXJcblx0XHQ7XG5cblx0XHRpZiggdHlwZSA9PSAnZnVuY3Rpb24nICl7XG5cdFx0XHRoZWFkZXIgPSBzZXR0aW5nc0hlYWRlciggdGhpcy5wcm9wcy52YWx1ZS50b0pTKCkgKTtcblx0XHR9XG5cdFx0ZWxzZSBpZiggdHlwZSA9PSAndW5kZWZpbmVkJyApe1xuXHRcdFx0aGVhZGVyID0gdGhpcy5nZXREZWZhdWx0SGVhZGVyKCk7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0aGVhZGVyID0gc2V0dGluZ3NIZWFkZXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5zcGFuKHsga2V5OiAncycsIG9uQ2xpY2s6IHRoaXMudG9nZ2xlRWRpdGluZywgY2xhc3NOYW1lOiAnY29tcG91bmRUb2dnbGUnIH0sIGhlYWRlcik7XG5cdH0sXG5cblx0dG9nZ2xlRWRpdGluZzogZnVuY3Rpb24oKXtcblx0XHRpZiggdGhpcy5zdGF0ZS5lZGl0aW5nICE9ICdhbHdheXMnICYmIHRoaXMucHJvcHMuc2V0dGluZ3MuaGVhZGVyICE9PSBmYWxzZSApXG5cdFx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiAhdGhpcy5zdGF0ZS5lZGl0aW5nfSk7XG5cdH0sXG5cblx0Y29tcG9uZW50V2lsbFJlY2VpdmVQcm9wczogZnVuY3Rpb24oIG5leHRQcm9wcyApe1xuXHRcdGlmKCB0aGlzLnByb3BzLnNldHRpbmdzLmVkaXRpbmcgIT0gbmV4dFByb3BzLnNldHRpbmdzLmVkaXRpbmcgKVxuXHRcdFx0dGhpcy5zZXRTdGF0ZSh7IGVkaXRpbmc6IG5leHRQcm9wcy5lZGl0aW5nIH0pO1xuXHR9LFxuXG5cdHJlbmRlckFkZGVyOiBmdW5jdGlvbiggbmFtZSApe1xuXHRcdHZhciBzZXR0aW5nc0FkZGVyID0gdGhpcy5wcm9wcy5zZXR0aW5ncy5hZGRlcixcblx0XHRcdHR5cGUgPSB0eXBlb2Ygc2V0dGluZ3NBZGRlcixcblx0XHRcdGFkZGVyXG5cdFx0O1xuXG5cdFx0aWYoIHR5cGUgPT0gJ2Z1bmN0aW9uJyApe1xuXHRcdFx0YWRkZXIgPSBzZXR0aW5nc0FkZGVyKCB0aGlzLnByb3BzLnZhbHVlLnRvSlMoKSApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCBzZXR0aW5nc0FkZGVyID09PSB0cnVlIHx8IHR5cGUgPT0gJ3VuZGVmaW5lZCcgKXtcblx0XHRcdGFkZGVyID0gdGhpcy5nZXREZWZhdWx0QWRkZXIoKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRhZGRlciA9IHNldHRpbmdzQWRkZXI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LmNyZWF0ZUVsZW1lbnQoIEZpZWxkQWRkZXIsIHtcblx0XHRcdG9uQ3JlYXRlOiB0aGlzLmNyZWF0ZUZpZWxkLFxuXHRcdFx0bmFtZTogbmFtZSxcblx0XHRcdGtleTogJ2FkZCcsXG5cdFx0XHR0ZXh0OiBhZGRlclxuXHRcdH0pO1xuXHR9LFxuXG5cdGNyZWF0ZUZpZWxkOiBmdW5jdGlvbigga2V5LCB2YWx1ZSwgZGVmaW5pdGlvbiApe1xuXG5cdFx0aWYoIHRoaXMucHJvcHMudmFsdWVbIGtleSBdIClcblx0XHRcdHJldHVybiBjb25zb2xlLmxvZyggJ0ZpZWxkICcgKyBrZXkgKyAnIGFscmVhZHkgZXhpc3RzLicpO1xuXG5cdFx0Ly8gU3RhcnQgZWRpdGluZyBhbmQgZm9jdXNcblx0XHRkZWZpbml0aW9uLnNldHRpbmdzID0ge1xuXHRcdFx0ZWRpdGluZzogdGhpcy5zdGF0ZS5lZGl0aW5nID09ICdhbHdheXMnID8gJ2Fsd2F5cycgOiB0cnVlLFxuXHRcdFx0Zm9jdXM6IHRydWVcblx0XHR9O1xuXG5cdFx0dmFyIGZpZWxkcyA9IGFzc2lnbigge30sIHRoaXMuc3RhdGUuZmllbGRzICk7XG5cdFx0ZmllbGRzWyBrZXkgXSA9IGRlZmluaXRpb247XG5cblx0XHR0aGlzLnNldFN0YXRlKHtmaWVsZHM6IGZpZWxkc30pO1xuXHRcdHRoaXMucHJvcHMudmFsdWUuc2V0KCBrZXksIHZhbHVlICk7XG5cdH0sXG5cblx0LyoqXG5cdCAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBrZXkgZWRpdGluZyBzZXR0aW5nIGlzIHRydWVcblx0ICogYW5kIHNldCBpdCB0byBmYWxzZS4gVGhlIGVkaXRpbmcgc2V0dGluZyBpcyBzZXRcblx0ICogdG8gdHJ1ZSB3aGVuIGEgbmV3IGNoaWxkIGlzIGFkZGVkIHRvIGVkaXQgaXQgYXV0b21hdGljYWxseVxuXHQgKiBhZnRlciBpcyBlZGl0ZWQgaXQgbG9zZXMgdGhlIHBvaW50LlxuXHQgKlxuXHQgKiBAcGFyYW0gIHtTdHJpbmd9IGtleSBUaGUgY2hpbGQga2V5XG5cdCAqL1xuXHRjaGVja0VkaXRpbmdTZXR0aW5nOiBmdW5jdGlvbigga2V5ICl7XG5cdFx0dmFyIGZpZWxkcyA9IHRoaXMuc3RhdGUuZmllbGRzO1xuXHRcdGlmKCBmaWVsZHNbIGtleSBdICYmIGZpZWxkc1sga2V5IF0uc2V0dGluZ3MuZm9jdXMgPT09IHRydWUgKXtcblx0XHRcdGZpZWxkcyA9IGFzc2lnbih7fSwgZmllbGRzKTtcblx0XHRcdGZpZWxkc1trZXldLnNldHRpbmdzLmZvY3VzID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldFN0YXRlKCB7ZmllbGRzOiBmaWVsZHN9ICk7XG5cdFx0fVxuXHR9LFxuXG5cdGdldEZpeGVkRmllbGRzOiBmdW5jdGlvbigpe1xuXHRcdHZhciBmaWVsZHMgPSB0aGlzLnByb3BzLnNldHRpbmdzLmZpeGVkRmllbGRzLFxuXHRcdFx0Zml4ZWQgPSB7fVxuXHRcdDtcblx0XHRpZiggZmllbGRzICYmIGZpZWxkcy5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xuXHRcdFx0ZmllbGRzLmZvckVhY2goIGZ1bmN0aW9uKCBmICl7XG5cdFx0XHRcdGZpeGVkWyBmIF0gPSAxO1xuXHRcdFx0fSk7XG5cdFx0XHRyZXR1cm4gZml4ZWQ7XG5cdFx0fVxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cbn07XG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL21peGlucy9Db21wb3VuZEZpZWxkTWl4aW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxNVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9taXhpbnMvQ29tcG91bmRGaWVsZE1peGluLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMTYgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcblx0Z2V0U3RhdGVGcm9tUHJvcHM6IGZ1bmN0aW9uKCBwcm9wcyApe1xuXHRcdHJldHVybiB7XG5cdFx0XHRlZGl0aW5nOiBwcm9wcy5zZXR0aW5ncy5lZGl0aW5nIHx8IGZhbHNlLFxuXHRcdFx0dmFsdWU6IHByb3BzLnZhbHVlXG5cdFx0fTtcblx0fSxcblxuXHRyZW5kZXJJbnB1dDogZnVuY3Rpb24oKXtcblx0XHR2YXIgY2xhc3NOYW1lID0gdGhpcy50eXBlQ2xhc3M7XG5cblx0XHRpZiggIXRoaXMuc3RhdGUuZWRpdGluZyApXG5cdFx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oIHtvbkNsaWNrOiB0aGlzLnNldEVkaXRNb2RlLCBjbGFzc05hbWU6IGNsYXNzTmFtZX0sIHRoaXMuZ2V0RGlzcGxheVN0cmluZygpICk7XG5cblx0XHRyZXR1cm4gUmVhY3QuRE9NLmlucHV0KHtcblx0XHRcdHR5cGU6IHRoaXMuaW5wdXRUeXBlLFxuXHRcdFx0dmFsdWU6IHRoaXMuc3RhdGUudmFsdWUsXG5cdFx0XHRpZDogdGhpcy5wcm9wcy5pZCxcblx0XHRcdHBsYWNlaG9sZGVyOiB0aGlzLnByb3BzLnNldHRpbmdzLnBsYWNlaG9sZGVyIHx8ICcnLFxuXHRcdFx0b25DaGFuZ2U6IHRoaXMudXBkYXRlVmFsdWUsXG5cdFx0XHRvbkJsdXI6IHRoaXMuc2V0VmFsdWUsXG5cdFx0XHRyZWY6ICdpbnB1dCcsXG5cdFx0XHRvbktleURvd246IHRoaXMuaGFuZGxlS2V5RG93blxuXHRcdH0pO1xuXHR9LFxuXG5cdGdldERpc3BsYXlTdHJpbmc6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuZ2V0RGlzcGxheU1vZGVTdHJpbmcgKVxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0RGlzcGxheU1vZGVTdHJpbmcoKTtcblxuXHRcdGlmKCB0aGlzLnByb3BzLnZhbHVlID09PSAnJyApXG5cdFx0XHRyZXR1cm4gUmVhY3QuRE9NLnNwYW4oIHtjbGFzc05hbWU6ICdqc29uTm92YWx1ZSd9LCAnTm8gdmFsdWUnICk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9wcy52YWx1ZTtcblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV4dFByb3BzICl7XG5cdFx0dmFyIG5leHRTdGF0ZSA9IHt9LFxuXHRcdFx0dXBkYXRlID0gZmFsc2Vcblx0XHQ7XG5cblx0XHRpZiggdGhpcy5wcm9wcy52YWx1ZSAhPSBuZXh0UHJvcHMudmFsdWUgKXtcblx0XHRcdHVwZGF0ZSA9IHRydWU7XG5cdFx0XHRuZXh0U3RhdGUudmFsdWUgPSBuZXh0UHJvcHMudmFsdWU7XG5cdFx0fVxuXHRcdGlmKCB0aGlzLnByb3BzLnNldHRpbmdzLmVkaXRpbmcgIT0gbmV4dFByb3BzLnNldHRpbmdzLmVkaXRpbmcgKXtcblx0XHRcdHVwZGF0ZSA9IHRydWU7XG5cdFx0XHRuZXh0U3RhdGUuZWRpdGluZyA9IG5leHRQcm9wcy5lZGl0aW5nO1xuXHRcdH1cblx0XHRpZiggdXBkYXRlIClcblx0XHRcdHRoaXMuc2V0U3RhdGUoIG5leHRTdGF0ZSApO1xuXHR9LFxuXG5cdGNvbXBvbmVudERpZFVwZGF0ZTogZnVuY3Rpb24oIHByZXZQcm9wcywgcHJldlN0YXRlICl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyAmJiAhIHByZXZTdGF0ZS5lZGl0aW5nIHx8IHRoaXMucHJvcHMuc2V0dGluZ3MuZm9jdXMgKXtcblx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHR9XG5cdH0sXG5cblx0Y29tcG9uZW50RGlkTW91bnQ6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyA9PT0gdHJ1ZSB8fCB0aGlzLnByb3BzLnNldHRpbmdzLmZvY3VzIClcblx0XHRcdHRoaXMuZm9jdXMoKTtcblx0fSxcblxuXHRzZXRFZGl0TW9kZTogZnVuY3Rpb24oKXtcblx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiB0cnVlfSk7XG5cdH0sXG5cblx0c2V0VmFsdWU6IGZ1bmN0aW9uKCl7XG5cdFx0aWYoIHRoaXMuc3RhdGUuZWRpdGluZyAhPSAnYWx3YXlzJyApXG5cdFx0XHR0aGlzLnNldFN0YXRlKHtlZGl0aW5nOiBmYWxzZX0pO1xuXHRcdHRoaXMucHJvcHMub25VcGRhdGVkKCB0aGlzLnN0YXRlLnZhbHVlICk7XG5cdH0sXG5cblx0dG9nZ2xlRWRpdGluZzogZnVuY3Rpb24oKXtcblx0XHR0aGlzLnNldFN0YXRlKHsgZWRpdGluZzogIXRoaXMuc3RhdGUuZWRpdGluZyB9KTtcblx0fSxcblxuXHRoYW5kbGVLZXlEb3duOiBmdW5jdGlvbiggZSApe1xuXHRcdGlmKCBlLndoaWNoID09IDEzIClcblx0XHRcdHRoaXMuc2V0VmFsdWUoKTtcblx0fSxcblxuXHRmb2N1czogZnVuY3Rpb24oKXtcblx0XHR2YXIgbm9kZSA9IHRoaXMucmVmcy5pbnB1dC5nZXRET01Ob2RlKCk7XG5cdFx0bm9kZS5mb2N1cygpO1xuXHRcdG5vZGUudmFsdWUgPSBub2RlLnZhbHVlO1xuXHR9XG59O1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9taXhpbnMvTGVhZkZpZWxkTWl4aW4uanNcbiAqKiBtb2R1bGUgaWQgPSAxNlxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9taXhpbnMvTGVhZkZpZWxkTWl4aW4uanM/Iik7DQoNCi8qKiovIH0sDQovKiAxNyAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XHJcblxyXG52YXIgVXRpbHMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMCApLFxyXG5cdEVtaXR0ZXIgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMSApLFxyXG5cdE1peGlucyA9IF9fd2VicGFja19yZXF1aXJlX18oIDIyICksXHJcblx0RnJvemVuID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjMgKVxyXG47XHJcblxyXG4vLyNidWlsZFxyXG52YXIgRnJlZXplciA9IGZ1bmN0aW9uKCBpbml0aWFsVmFsdWUsIG11dGFibGUgKSB7XHJcblx0dmFyIG1lID0gdGhpcztcclxuXHJcblx0Ly8gSW1tdXRhYmxlIGRhdGFcclxuXHR2YXIgZnJvemVuO1xyXG5cclxuXHR2YXIgbm90aWZ5ID0gZnVuY3Rpb24gbm90aWZ5KCBldmVudE5hbWUsIG5vZGUsIG9wdGlvbnMgKXtcclxuXHRcdGlmKCBldmVudE5hbWUgPT0gJ2xpc3RlbmVyJyApXHJcblx0XHRcdHJldHVybiBGcm96ZW4uY3JlYXRlTGlzdGVuZXIoIG5vZGUgKTtcclxuXHJcblx0XHRyZXR1cm4gRnJvemVuLnVwZGF0ZSggZXZlbnROYW1lLCBub2RlLCBvcHRpb25zICk7XHJcblx0fTtcclxuXHJcblx0dmFyIGZyZWV6ZSA9IGZ1bmN0aW9uKCl7fTtcclxuXHRpZiggIW11dGFibGUgKVxyXG5cdFx0ZnJlZXplID0gZnVuY3Rpb24oIG9iaiApeyBPYmplY3QuZnJlZXplKCBvYmogKTsgfTtcclxuXHJcblx0Ly8gQ3JlYXRlIHRoZSBmcm96ZW4gb2JqZWN0XHJcblx0ZnJvemVuID0gRnJvemVuLmZyZWV6ZSggaW5pdGlhbFZhbHVlLCBub3RpZnksIGZyZWV6ZSApO1xyXG5cclxuXHQvLyBMaXN0ZW4gdG8gaXRzIGNoYW5nZXMgaW1tZWRpYXRlbHlcclxuXHR2YXIgbGlzdGVuZXIgPSBmcm96ZW4uZ2V0TGlzdGVuZXIoKTtcclxuXHJcblx0Ly8gVXBkYXRpbmcgZmxhZyB0byB0cmlnZ2VyIHRoZSBldmVudCBvbiBuZXh0VGlja1xyXG5cdHZhciB1cGRhdGluZyA9IGZhbHNlO1xyXG5cclxuXHRsaXN0ZW5lci5vbiggJ2ltbWVkaWF0ZScsIGZ1bmN0aW9uKCBwcmV2Tm9kZSwgdXBkYXRlZCApe1xyXG5cdFx0aWYoIHByZXZOb2RlICE9IGZyb3plbiApXHJcblx0XHRcdHJldHVybjtcclxuXHJcblx0XHRmcm96ZW4gPSB1cGRhdGVkO1xyXG5cclxuXHRcdC8vIFRyaWdnZXIgb24gbmV4dCB0aWNrXHJcblx0XHRpZiggIXVwZGF0aW5nICl7XHJcblx0XHRcdHVwZGF0aW5nID0gdHJ1ZTtcclxuXHRcdFx0VXRpbHMubmV4dFRpY2soIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0dXBkYXRpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRtZS50cmlnZ2VyKCAndXBkYXRlJywgZnJvemVuICk7XHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH0pO1xyXG5cclxuXHRVdGlscy5hZGRORSggdGhpcywge1xyXG5cdFx0Z2V0OiBmdW5jdGlvbigpe1xyXG5cdFx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdFx0fSxcclxuXHRcdHNldDogZnVuY3Rpb24oIG5vZGUgKXtcclxuXHRcdFx0dmFyIG5ld05vZGUgPSBub3RpZnkoICdyZXNldCcsIGZyb3plbiwgbm9kZSApO1xyXG5cdFx0XHRuZXdOb2RlLl9fLmxpc3RlbmVyLnRyaWdnZXIoICdpbW1lZGlhdGUnLCBmcm96ZW4sIG5ld05vZGUgKTtcclxuXHRcdH1cclxuXHR9KTtcclxuXHJcblx0VXRpbHMuYWRkTkUoIHRoaXMsIHsgZ2V0RGF0YTogdGhpcy5nZXQsIHNldERhdGE6IHRoaXMuc2V0IH0gKTtcclxuXHJcblx0Ly8gVGhlIGV2ZW50IHN0b3JlXHJcblx0dGhpcy5fZXZlbnRzID0gW107XHJcbn1cclxuXHJcbkZyZWV6ZXIucHJvdG90eXBlID0gVXRpbHMuY3JlYXRlTm9uRW51bWVyYWJsZSh7Y29uc3RydWN0b3I6IEZyZWV6ZXJ9LCBFbWl0dGVyKTtcclxuLy8jYnVpbGRcclxuXHJcbm1vZHVsZS5leHBvcnRzID0gRnJlZXplcjtcclxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvc3JjL2ZyZWV6ZXIuanNcbiAqKiBtb2R1bGUgaWQgPSAxN1xuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovXG4vLyMgc291cmNlVVJMPXdlYnBhY2s6Ly8vLi9+L2ZyZWV6ZXItanMvc3JjL2ZyZWV6ZXIuanM/Iik7DQoNCi8qKiovIH0sDQovKiAxOCAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBWYWxpZGF0aW9uTWV0aG9kcyA9IHtcbiAgcmVxdWlyZWQ6IGZ1bmN0aW9uKCB2YWx1ZSApe1xuICAgICAgaWYoICF2YWx1ZSApXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAvLyBFbXB0eSB0cmltbWVkIHN0cmluZyBkb2VzIG5vdCB2YWxpZGF0ZVxuICAgICAgaWYoIHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiAhdmFsdWUudHJpbSgpIClcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIGVtYWlsOiBmdW5jdGlvbiggdmFsdWUgKXtcblxuICAgICAgLy8gSWYgbm90aGluZyBnaXZlbiwgbWF5YmUgdGhlIGZpZWxkIGlzIG5vdCByZXF1aXJlZFxuICAgICAgLy8gc28gaXQgcGFzc2VzIHRoZSBjaGVjay5cbiAgICAgIGlmKCAhdmFsdWUgKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICAvKiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQ2MTU1L3ZhbGlkYXRlLWVtYWlsLWFkZHJlc3MtaW4tamF2YXNjcmlwdCAqL1xuICAgICAgdmFyIHJlID0gL14oKFtePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKFxcLltePD4oKVtcXF1cXFxcLiw7Olxcc0BcIl0rKSopfChcIi4rXCIpKUAoKFxcW1swLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcLlswLTldezEsM31dKXwoKFthLXpBLVpcXC0wLTldK1xcLikrW2EtekEtWl17Mix9KSkkLztcbiAgICAgIHJldHVybiByZS50ZXN0KCB2YWx1ZSApO1xuICB9LFxuXG4gIGxlbmd0aDogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIG1pbiwgbWF4ICl7XG4gICAgICBpZiggIW1pbiApXG4gICAgICAgICAgbWluID0gMDtcbiAgICAgIGlmKCAhbWF4IClcbiAgICAgICAgICBtYXggPSBJbmZpbml0eTtcblxuICAgICAgcmV0dXJuICggdmFsdWUubGVuZ3RoID49IG1pbiAmJiB2YWx1ZS5sZW5ndGggPD0gbWF4ICk7XG4gIH0sXG5cbiAgaW50ZWdlcjogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIG1pbiwgbWF4ICl7XG4gICAgICBpZiggIW1pbiAmJiBtaW4gIT09IDAgKVxuICAgICAgICAgIG1pbiA9IC1JbmZpbml0eTtcbiAgICAgIGlmKCAhbWF4IClcbiAgICAgICAgICBtYXggPSBJbmZpbml0eTtcblxuICAgICAgLy8gRW1wdHkgc3RyaW5nIHBhc3NlcyB0aGUgY2hlY2tcbiAgICAgIGlmKCF2YWx1ZSAmJiB2YWx1ZSAhPSAwKVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuXG4gICAgICB2YXIgaW50VmFsID0gcGFyc2VJbnQoIHZhbHVlICk7XG5cbiAgICAgIGlmKCB2YWx1ZSAhPSBpbnRWYWwgKVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgcmV0dXJuICggaW50VmFsIDw9IG1heCAmJiBpbnRWYWwgPj0gbWluICk7XG4gIH0sXG5cbiAgY2hlY2tlZDogZnVuY3Rpb24oIHZhbHVlICl7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH0sXG5cbiAgbWF0Y2hlczogZnVuY3Rpb24oIHZhbHVlLCBqc29uVmFsdWUsIHBhdGggKXtcbiAgICAgIHJldHVybiB2YWx1ZSA9PSBmaW5kSW5UcmVlKCBwYXRoLnNwbGl0KCcuJyksIGpzb25WYWx1ZSApO1xuICB9XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXHRnZXRWYWxpZGF0aW9uRXJyb3I6IGZ1bmN0aW9uKCB2YWx1ZSwganNvblZhbHVlLCB2YWxpZGF0ZXMgKXtcblx0XHR2YXIgbWV0aG9kcyA9IFtdLFxuXHRcdFx0ZXJyb3IgPSBmYWxzZSxcblx0XHRcdGkgPSAwXG5cdFx0O1xuXG5cdFx0Ly8gU3RvcmUgdGhlIHZhbGlkYXRpb24gbWV0aG9kcyBpbiBhbiBhcnJheVxuXHRcdGlmKCB0eXBlb2YgdmFsaWRhdGVzID09ICdzdHJpbmcnICl7XG5cdFx0XHRtZXRob2RzID0gcGFyc2VNZXRob2RTdHJpbmcoIHZhbGlkYXRlcyApO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB0eXBlb2YgdmFsaWRhdGVzID09ICdmdW5jdGlvbicgKXtcblx0XHRcdG1ldGhvZHMgPSBbIHZhbGlkYXRlcyBdO1xuXHRcdH1cblx0XHRlbHNlIGlmKCB2YWxpZGF0ZXMgJiYgdmFsaWRhdGVzLmNvbnN0cnVjdG9yID09PSBBcnJheSApe1xuXHRcdFx0bWV0aG9kcyA9IHZhbGlkYXRlcztcblx0XHR9XG5cblxuXHRcdHZhciBkZWZpbml0aW9uLCBmLCBtZXRob2Q7XG5cdFx0d2hpbGUoICFlcnJvciAmJiBpIDwgbWV0aG9kcy5sZW5ndGggKXtcblx0XHRcdG1ldGhvZCA9IG1ldGhvZHNbaSsrXTtcblx0XHRcdGlmKCB0eXBlb2YgbWV0aG9kID09ICdzdHJpbmcnICl7XG5cblx0XHRcdFx0Ly8gZGVmaW5pdGlvbiB7bmFtZSwgYXJnc31cblx0XHRcdFx0ZGVmaW5pdGlvbiA9IHBhcnNlTWV0aG9kTmFtZSggbWV0aG9kICk7XG5cdFx0XHRcdGYgPSBWYWxpZGF0aW9uTWV0aG9kc1sgZGVmaW5pdGlvbi5uYW1lIF07XG5cdFx0XHRcdGlmKCAhZiApXG5cdFx0XHRcdFx0Y29uc29sZS5sb2coICdVbmtvd24gdmFsaWRhdGlvbiBtZXRob2QgJyArIGRlZmluaXRpb24ubmFtZSApO1xuXHRcdFx0XHRlbHNlIGlmKCAhZi5hcHBseSggbnVsbCwgWyB2YWx1ZSwganNvblZhbHVlIF0uY29uY2F0KCBkZWZpbml0aW9uLmFyZ3MgKSApKXtcblx0XHRcdFx0XHRlcnJvciA9IHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdG1ldGhvZDogbWV0aG9kXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0ZWxzZSBpZiggdHlwZW9mIG1ldGhvZCA9PSAnZnVuY3Rpb24nICl7XG5cdFx0XHRcdGlmKCAhbWV0aG9kKCB2YWx1ZSwganNvblZhbHVlICkgKVxuXHRcdFx0XHRcdGVycm9yID0ge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0bWV0aG9kOiAnY3VzdG9tJ1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVycm9yO1xuXHR9XG59O1xuXG4vKlxuIEhFTFBFUiBNRVRIT0RTXG4gKi9cblxudmFyIHBhcnNlTWV0aG9kU3RyaW5nID0gZnVuY3Rpb24oIHN0cmluZyApe1xuXHRyZXR1cm4gc3RyaW5nLm1hdGNoKC9bXlxcc1xcW10rKFxcW1teXFxdXSs/XFxdKT8vaWcpO1xufTtcblxuLyoqXG4gKiBQYXJzZSBhIG1ldGhvZCBjYWxsIGluIHRoZSBkYXRhLXZhbGlkYXRpb24gYXR0cmlidXRlLlxuICogQHBhcmFtICB7U3RyaW5nfSBtZXRob2RTdHIgQSBtZXRob2QgY2FsbCBsaWtlIG1ldGhvZFthcmcxLCBhcmcyLCAuLi5dXG4gKiBAcmV0dXJuIHtPYmplY3R9ICAgICAgICAgICBBbiBvYmplY3QgbGlrZSB7bmFtZTogJ21ldGhvZCcsIGFyZ3M6IFthcmcxLCBhcmcyLCAuLi5dfVxuICovXG52YXIgcGFyc2VNZXRob2ROYW1lID0gZnVuY3Rpb24oIG1ldGhvZFN0ciApe1xuICAgIHZhciBwYXJ0cyA9IG1ldGhvZFN0ci5zcGxpdCgnWycpLFxuICAgICAgICBkZWZpbml0aW9uID0ge1xuICAgICAgICAgICAgbmFtZTogcGFydHNbMF0sXG4gICAgICAgICAgICBhcmdzOiBbXVxuICAgICAgICB9LFxuICAgICAgICBhcmdzXG4gICAgO1xuXG4gICAgaWYoIHBhcnRzLmxlbmd0aCA+IDEgKXtcbiAgICAgICAgYXJncyA9IHBhcnRzWzFdO1xuXG4gICAgICAgIGlmKCBhcmdzWyBhcmdzLmxlbmd0aCAtIDEgXSA9PSAnXScgKVxuICAgICAgICAgICAgYXJncyA9IGFyZ3Muc2xpY2UoMCwgYXJncy5sZW5ndGggLSAxKTtcblxuICAgICAgICBkZWZpbml0aW9uLmFyZ3MgPSBhcmdzLnNwbGl0KC9cXHMqLFxccyovKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZSBvZiBhIGZpZWxkIG5vZGUsIGhpZGluZyB0aGUgZGlmZmVyZW5jZXMgYW1vbmdcbiAqIGRpZmZlcmVudCB0eXBlIG9mIGlucHV0cy5cbiAqXG4gKiBAcGFyYW0gIHtET01FbGVtZW50fSBmaWVsZCBUaGUgZmllbGQuXG4gKiBAcmV0dXJuIHtTdHJpbmd9ICAgICAgIFRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZC5cbiAqL1xudmFyIGdldEZpZWxkVmFsdWUgPSBmdW5jdGlvbiggZmllbGQgKXtcbiAgICB2YXIgdGFnTmFtZSA9IGZpZWxkLnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgIGlmKCB0YWdOYW1lID09ICdpbnB1dCcgJiYgZmllbGQudHlwZSA9PSAnY2hlY2tib3gnICl7XG4gICAgICAgIHJldHVybiBmaWVsZC5jaGVja2VkO1xuICAgIH1cblxuICAgIGlmKCB0YWdOYW1lID09ICdzZWxlY3QnICl7XG4gICAgICAgIHJldHVybiBmaWVsZC5vcHRpb25zW2ZpZWxkLnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBmaWVsZC52YWx1ZTtcbn07XG5cbmZ1bmN0aW9uIGZpbmRJblRyZWUoIHBhdGgsIGpzb25WYWx1ZSApe1xuXHRpZiggIXBhdGgubGVuZ3RoIClcblx0XHRyZXR1cm4ganNvblZhbHVlO1xuXG5cdHJldHVybiBmaW5kSW5UcmVlKHBhdGguc2xpY2UoMSksIGpzb25WYWx1ZVsgcGF0aFswXSBdKTtcbn1cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3NyYy92YWxpZGF0aW9uLmpzXG4gKiogbW9kdWxlIGlkID0gMThcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vc3JjL3ZhbGlkYXRpb24uanM/Iik7DQoNCi8qKiovIH0sDQovKiAxOSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCJ2YXIgUmVhY3QgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDEpLFxuXHRUeXBlRmllbGQgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKDIpXG47XG5cbi8qKlxuICogQ29tcG9uZW50IHRvIGFkZCBmaWVsZHMgdG8gYW4gT2JqZWN0IG9yIEFycmF5LlxuICogQHBhcmFtICB7RnJlZXplck5vZGV9IHJvb3QgVGhlIHBhcmVudCB0byBhZGQgdGhlIGF0dHJpYnV0ZS5cbiAqIEBwYXJhbSAge3N0cmluZ30gbmFtZSBPcHRpb25hbC4gSWYgcHJvdmlkZWQsIHRoZSBhdHRyaWJ1dGUgYWRkZWQgd2lsbCBoYXZlIHRoYXQga2V5IChhcnJheXMpLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgYW4gaW5wdXQgd2lsbCBiZSBzaG93biB0byBsZXQgdGhlIHVzZXIgZGVmaW5lIHRoZSBrZXkuXG4gKi9cbnZhciBGaWVsZEFkZGVyID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRnZXRJbml0aWFsU3RhdGU6IGZ1bmN0aW9uKCl7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNyZWF0aW5nOiB0aGlzLnByb3BzLmNyZWF0aW5nIHx8IGZhbHNlLFxuXHRcdFx0bmFtZTogdGhpcy5wcm9wcy5uYW1lLFxuXHRcdFx0dHlwZTogJ3N0cmluZydcblx0XHR9O1xuXHR9LFxuXG5cdHJlbmRlcjogZnVuY3Rpb24oKXtcblx0XHRpZiggIXRoaXMuc3RhdGUuY3JlYXRpbmcgKVxuXHRcdFx0cmV0dXJuIFJlYWN0LkRPTS5hKHsgY2xhc3NOYW1lOiAnanNvbkFkZCcsIGhyZWY6ICcjJywgb25DbGljazogdGhpcy5oYW5kbGVDcmVhdGUgfSwgdGhpcy5wcm9wcy50ZXh0ICk7XG5cblx0XHR2YXIgb3B0aW9ucyA9IHRoaXMuZ2V0VHlwZXMoKS5tYXAoIGZ1bmN0aW9uKCB0eXBlICl7XG5cdFx0XHRcdHJldHVybiBSZWFjdC5ET00ub3B0aW9uKHt2YWx1ZTogdHlwZSwga2V5OiB0eXBlfSwgdHlwZVswXS50b1VwcGVyQ2FzZSgpICsgdHlwZS5zbGljZSgxKSk7XG5cdFx0XHR9KSxcblx0XHRcdGZpZWxkTmFtZVxuXHRcdDtcblxuXHRcdGlmKCB0eXBlb2YgdGhpcy5wcm9wcy5uYW1lICE9ICd1bmRlZmluZWQnIClcblx0XHRcdGZpZWxkTmFtZSA9ICBbXG5cdFx0XHRcdFJlYWN0LkRPTS5zcGFuKHtjbGFzc05hbWU6ICdqc29uTmFtZSd9LCB0aGlzLnByb3BzLm5hbWUpLFxuXHRcdFx0XHRSZWFjdC5ET00uc3BhbihudWxsLCAnOicpXG5cdFx0XHRdO1xuXHRcdGVsc2Uge1xuXHRcdFx0ZmllbGROYW1lID0gW1xuXHRcdFx0XHRSZWFjdC5ET00uaW5wdXQoe3JlZjogJ2tleUlucHV0JywgdHlwZTogJ3RleHQnLCB2YWx1ZTogdGhpcy5zdGF0ZS52YWx1ZSwgb25DaGFuZ2U6IHRoaXMuY2hhbmdlS2V5fSksXG5cdFx0XHRcdFJlYWN0LkRPTS5zcGFuKG51bGwsICc6Jylcblx0XHRcdF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFJlYWN0LkRPTS5kaXYoIHtjbGFzc05hbWU6ICdqc29uRmllbGQganNvbkZpZWxkQWRkZXInfSwgW1xuXHRcdFx0ZmllbGROYW1lLFxuXHRcdFx0UmVhY3QuRE9NLnNlbGVjdCh7IGtleTogJ3MnLCB2YWx1ZTogdGhpcy5zdGF0ZS50eXBlLCBvbkNoYW5nZTogdGhpcy5jaGFuZ2VUeXBlLCByZWY6ICd0eXBlU2VsZWN0b3InfSwgb3B0aW9ucyksXG5cdFx0XHRSZWFjdC5ET00uYnV0dG9uKHsga2V5OiAnYicsIG9uQ2xpY2s6IHRoaXMuY3JlYXRlRmllbGQgfSwgJ09LJyApLFxuXHRcdFx0UmVhY3QuRE9NLmEoeyBrZXk6ICdhJywgaHJlZjogJyMnLCBjbGFzc05hbWU6ICdjYW5jZWxGaWVsZCcsIG9uQ2xpY2s6IHRoaXMuaGFuZGxlQ2FuY2VsfSwgJ0NhbmNlbCcpXG5cdFx0XSk7XG5cdH0sXG5cblx0Y29tcG9uZW50RGlkVXBkYXRlOiBmdW5jdGlvbiggcHJldlByb3BzLCBwcmV2U3RhdGUgKXtcblx0XHRpZiggIXByZXZTdGF0ZS5jcmVhdGluZyAmJiB0aGlzLnN0YXRlLmNyZWF0aW5nICl7XG5cdFx0XHRpZiggdGhpcy5yZWZzLmtleUlucHV0IClcblx0XHRcdFx0dGhpcy5yZWZzLmtleUlucHV0LmdldERPTU5vZGUoKS5mb2N1cygpO1xuXHRcdFx0ZWxzZVxuXHRcdFx0XHR0aGlzLnJlZnMudHlwZVNlbGVjdG9yLmdldERPTU5vZGUoKS5mb2N1cygpO1xuXHRcdH1cblx0fSxcblxuXHRjb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzOiBmdW5jdGlvbiggbmV3UHJvcHMgKXtcblx0XHR0aGlzLnNldFN0YXRlKHtuYW1lOiBuZXdQcm9wcy5uYW1lfSk7XG5cdH0sXG5cblx0aGFuZGxlQ3JlYXRlOiBmdW5jdGlvbiggZSApe1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR0aGlzLnNldFN0YXRlKHtjcmVhdGluZzogdHJ1ZX0pO1xuXHR9LFxuXG5cdGhhbmRsZUNhbmNlbDogZnVuY3Rpb24oIGUgKXtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0dGhpcy5zZXRTdGF0ZSh7Y3JlYXRpbmc6IGZhbHNlfSk7XG5cdH0sXG5cblx0Y2hhbmdlVHlwZTogZnVuY3Rpb24oIGUgKXtcblx0XHR0aGlzLnNldFN0YXRlKHt0eXBlOiBlLnRhcmdldC52YWx1ZX0pO1xuXHR9LFxuXG5cdGNoYW5nZUtleTogZnVuY3Rpb24oIGUgKXtcblx0XHR0aGlzLnNldFN0YXRlKHtuYW1lOiBlLnRhcmdldC52YWx1ZX0pO1xuXHR9LFxuXG5cdGNyZWF0ZUZpZWxkOiBmdW5jdGlvbigpe1xuXHRcdHRoaXMuc2V0U3RhdGUoe2NyZWF0aW5nOiBmYWxzZX0pO1xuXG5cdFx0dmFyIHZhbHVlID0gVHlwZUZpZWxkLnByb3RvdHlwZS5jb21wb25lbnRzWyB0aGlzLnN0YXRlLnR5cGUgXS5wcm90b3R5cGUuZGVmYXVsdFZhbHVlO1xuXG5cdFx0dGhpcy5wcm9wcy5vbkNyZWF0ZSggdGhpcy5zdGF0ZS5uYW1lLCB2YWx1ZSwge3R5cGU6IHRoaXMuc3RhdGUudHlwZSB9KTtcblx0fSxcblxuXHRnZXRUeXBlczogZnVuY3Rpb24oKXtcblx0XHRyZXR1cm4gT2JqZWN0LmtleXMoIFR5cGVGaWVsZC5wcm90b3R5cGUuY29tcG9uZW50cyApO1xuXHR9XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBGaWVsZEFkZGVyO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9zcmMvRmllbGRBZGRlci5qc1xuICoqIG1vZHVsZSBpZCA9IDE5XG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL3NyYy9GaWVsZEFkZGVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjAgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xuXG4vLyNidWlsZFxudmFyIGdsb2JhbCA9IChuZXcgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpKTtcblxudmFyIFV0aWxzID0ge1xuXHRleHRlbmQ6IGZ1bmN0aW9uKCBvYiwgcHJvcHMgKXtcblx0XHRmb3IoIHZhciBwIGluIHByb3BzICl7XG5cdFx0XHRvYltwXSA9IHByb3BzW3BdO1xuXHRcdH1cblx0XHRyZXR1cm4gb2I7XG5cdH0sXG5cblx0Y3JlYXRlTm9uRW51bWVyYWJsZTogZnVuY3Rpb24oIG9iaiwgcHJvdG8gKXtcblx0XHR2YXIgbmUgPSB7fTtcblx0XHRmb3IoIHZhciBrZXkgaW4gb2JqIClcblx0XHRcdG5lW2tleV0gPSB7dmFsdWU6IG9ialtrZXldIH07XG5cdFx0cmV0dXJuIE9iamVjdC5jcmVhdGUoIHByb3RvIHx8IHt9LCBuZSApO1xuXHR9LFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbWVzc2FnZSApe1xuXHRcdHZhciBlcnIgPSBuZXcgRXJyb3IoIG1lc3NhZ2UgKTtcblx0XHRpZiggY29uc29sZSApXG5cdFx0XHRyZXR1cm4gY29uc29sZS5lcnJvciggZXJyICk7XG5cdFx0ZWxzZVxuXHRcdFx0dGhyb3cgZXJyO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvLCBjbGJrICl7XG5cdFx0dmFyIGksbCxrZXlzO1xuXHRcdGlmKCBvICYmIG8uY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcblx0XHRcdGZvciAoaSA9IDAsIGwgPSBvLmxlbmd0aDsgaSA8IGw7IGkrKylcblx0XHRcdFx0Y2xiayggb1tpXSwgaSApO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdGtleXMgPSBPYmplY3Qua2V5cyggbyApO1xuXHRcdFx0Zm9yKCBpID0gMCwgbCA9IGtleXMubGVuZ3RoOyBpIDwgbDsgaSsrIClcblx0XHRcdFx0Y2xiayggb1sga2V5c1tpXSBdLCBrZXlzW2ldICk7XG5cdFx0fVxuXHR9LFxuXG5cdGFkZE5FOiBmdW5jdGlvbiggbm9kZSwgYXR0cnMgKXtcblx0XHRmb3IoIHZhciBrZXkgaW4gYXR0cnMgKXtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggbm9kZSwga2V5LCB7XG5cdFx0XHRcdGVudW1lcmFibGU6IGZhbHNlLFxuXHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogYXR0cnNbIGtleSBdXG5cdFx0XHR9KTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gbmV4dFRpY2sgLSBieSBzdGFnYXMgLyBwdWJsaWMgZG9tYWluXG4gIFx0bmV4dFRpY2s6IChmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcXVldWUgPSBbXSxcblx0XHRcdGRpcnR5ID0gZmFsc2UsXG5cdFx0XHRmbixcblx0XHRcdGhhc1Bvc3RNZXNzYWdlID0gISFnbG9iYWwucG9zdE1lc3NhZ2UsXG5cdFx0XHRtZXNzYWdlTmFtZSA9ICduZXh0dGljaycsXG5cdFx0XHR0cmlnZ2VyID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGhhc1Bvc3RNZXNzYWdlXG5cdFx0XHRcdFx0PyBmdW5jdGlvbiB0cmlnZ2VyICgpIHtcblx0XHRcdFx0XHRnbG9iYWwucG9zdE1lc3NhZ2UobWVzc2FnZU5hbWUsICcqJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0OiBmdW5jdGlvbiB0cmlnZ2VyICgpIHtcblx0XHRcdFx0XHRzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcHJvY2Vzc1F1ZXVlKCkgfSwgMCk7XG5cdFx0XHRcdH07XG5cdFx0XHR9KCkpLFxuXHRcdFx0cHJvY2Vzc1F1ZXVlID0gKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0cmV0dXJuIGhhc1Bvc3RNZXNzYWdlXG5cdFx0XHRcdFx0PyBmdW5jdGlvbiBwcm9jZXNzUXVldWUgKGV2ZW50KSB7XG5cdFx0XHRcdFx0XHRpZiAoZXZlbnQuc291cmNlID09PSBnbG9iYWwgJiYgZXZlbnQuZGF0YSA9PT0gbWVzc2FnZU5hbWUpIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHRcdGZsdXNoUXVldWUoKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0OiBmbHVzaFF1ZXVlO1xuICAgICAgXHR9KSgpXG4gICAgICA7XG5cbiAgICAgIGZ1bmN0aW9uIGZsdXNoUXVldWUgKCkge1xuICAgICAgICAgIHdoaWxlIChmbiA9IHF1ZXVlLnNoaWZ0KCkpIHtcbiAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGlydHkgPSBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgZnVuY3Rpb24gbmV4dFRpY2sgKGZuKSB7XG4gICAgICAgICAgcXVldWUucHVzaChmbik7XG4gICAgICAgICAgaWYgKGRpcnR5KSByZXR1cm47XG4gICAgICAgICAgZGlydHkgPSB0cnVlO1xuICAgICAgICAgIHRyaWdnZXIoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhhc1Bvc3RNZXNzYWdlKSBnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIHByb2Nlc3NRdWV1ZSwgdHJ1ZSk7XG5cbiAgICAgIG5leHRUaWNrLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIGdsb2JhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgcHJvY2Vzc1F1ZXVlLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG5leHRUaWNrO1xuICB9KSgpXG59O1xuLy8jYnVpbGRcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFV0aWxzO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mcmVlemVyLWpzL3NyYy91dGlscy5qc1xuICoqIG1vZHVsZSBpZCA9IDIwXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9zcmMvdXRpbHMuanM/Iik7DQoNCi8qKiovIH0sDQovKiAyMSAqLw0KLyoqKi8gZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7DQoNCglldmFsKCIndXNlIHN0cmljdCc7XG5cbnZhciBVdGlscyA9IF9fd2VicGFja19yZXF1aXJlX18oIDIwICk7XG5cbi8vI2J1aWxkXG5cbi8vIFRoZSBwcm90b3R5cGUgbWV0aG9kcyBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IG9iamVjdFxuLy8gYW5kIGFwcGxpZWQgYXMgbm9uIGVudW1lcmFibGUgcHJvcGVydGllcyBsYXRlclxudmFyIGVtaXR0ZXJQcm90byA9IHtcblx0b246IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyLCBvbmNlICl7XG5cdFx0dmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG5cblx0XHRsaXN0ZW5lcnMucHVzaCh7IGNhbGxiYWNrOiBsaXN0ZW5lciwgb25jZTogb25jZX0pO1xuXHRcdHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF0gPSAgbGlzdGVuZXJzO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0b25jZTogZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKXtcblx0XHR0aGlzLm9uKCBldmVudE5hbWUsIGxpc3RlbmVyLCB0cnVlICk7XG5cdH0sXG5cblx0b2ZmOiBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApe1xuXHRcdGlmKCB0eXBlb2YgZXZlbnROYW1lID09ICd1bmRlZmluZWQnICl7XG5cdFx0XHR0aGlzLl9ldmVudHMgPSB7fTtcblx0XHR9XG5cdFx0ZWxzZSBpZiggdHlwZW9mIGxpc3RlbmVyID09ICd1bmRlZmluZWQnICkge1xuXHRcdFx0dGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXSA9IFtdO1xuXHRcdH1cblx0XHRlbHNlIHtcblx0XHRcdHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdIHx8IFtdLFxuXHRcdFx0XHRpXG5cdFx0XHQ7XG5cblx0XHRcdGZvciAoaSA9IGxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuXHRcdFx0XHRpZiggbGlzdGVuZXJzW2ldID09PSBsaXN0ZW5lciApXG5cdFx0XHRcdFx0bGlzdGVuZXJzLnNwbGljZSggaSwgMSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudE5hbWUgKXtcblx0XHR2YXIgYXJncyA9IFtdLnNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMSApLFxuXHRcdFx0bGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXSB8fCBbXSxcblx0XHRcdG9uY2VMaXN0ZW5lcnMgPSBbXSxcblx0XHRcdGksIGxpc3RlbmVyXG5cdFx0O1xuXG5cdFx0Ly8gQ2FsbCBsaXN0ZW5lcnNcblx0XHRmb3IgKGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXTtcblxuXHRcdFx0aWYoIGxpc3RlbmVyLmNhbGxiYWNrIClcblx0XHRcdFx0bGlzdGVuZXIuY2FsbGJhY2suYXBwbHkoIG51bGwsIGFyZ3MgKTtcblx0XHRcdGVsc2Uge1xuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBub3QgYSBjYWxsYmFjaywgcmVtb3ZlIVxuXHRcdFx0XHRsaXN0ZW5lci5vbmNlID0gdHJ1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYoIGxpc3RlbmVyLm9uY2UgKVxuXHRcdFx0XHRvbmNlTGlzdGVuZXJzLnB1c2goIGkgKTtcblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgbGlzdGVuZXJzIG1hcmtlZCBhcyBvbmNlXG5cdFx0Zm9yKCBpID0gb25jZUxpc3RlbmVycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApe1xuXHRcdFx0bGlzdGVuZXJzLnNwbGljZSggb25jZUxpc3RlbmVyc1tpXSwgMSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG4vLyBNZXRob2RzIGFyZSBub3QgZW51bWVyYWJsZSBzbywgd2hlbiB0aGUgc3RvcmVzIGFyZVxuLy8gZXh0ZW5kZWQgd2l0aCB0aGUgZW1pdHRlciwgdGhleSBjYW4gYmUgaXRlcmF0ZWQgYXNcbi8vIGhhc2htYXBzXG52YXIgRW1pdHRlciA9IFV0aWxzLmNyZWF0ZU5vbkVudW1lcmFibGUoIGVtaXR0ZXJQcm90byApO1xuLy8jYnVpbGRcblxubW9kdWxlLmV4cG9ydHMgPSBFbWl0dGVyO1xuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIC4vfi9mcmVlemVyLWpzL3NyYy9lbWl0dGVyLmpzXG4gKiogbW9kdWxlIGlkID0gMjFcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vfi9mcmVlemVyLWpzL3NyYy9lbWl0dGVyLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjIgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjAgKTtcclxuXHJcbi8vI2J1aWxkXHJcblxyXG4vKipcclxuICogQ3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSBkZXNjcmlwdG9ycywgdG8gYmUgdXNlZCBieSBPYmplY3QuY3JlYXRlLlxyXG4gKiBAcGFyYW0gIHtPYmplY3R9IGF0dHJzIFByb3BlcnRpZXMgdG8gY3JlYXRlIGRlc2NyaXB0b3JzXHJcbiAqIEByZXR1cm4ge09iamVjdH0gICAgICAgQSBoYXNoIHdpdGggdGhlIGRlc2NyaXB0b3JzLlxyXG4gKi9cclxudmFyIGNyZWF0ZU5FID0gZnVuY3Rpb24oIGF0dHJzICl7XHJcblx0dmFyIG5lID0ge307XHJcblxyXG5cdGZvciggdmFyIGtleSBpbiBhdHRycyApe1xyXG5cdFx0bmVbIGtleSBdID0ge1xyXG5cdFx0XHR3cml0YWJsZTogdHJ1ZSxcclxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxyXG5cdFx0XHRlbnVtZXJhYmxlOiBmYWxzZSxcclxuXHRcdFx0dmFsdWU6IGF0dHJzWyBrZXldXHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRyZXR1cm4gbmU7XHJcbn1cclxuXHJcbnZhciBjb21tb25NZXRob2RzID0ge1xyXG5cdHNldDogZnVuY3Rpb24oIGF0dHIsIHZhbHVlICl7XHJcblx0XHR2YXIgYXR0cnMgPSBhdHRyLFxyXG5cdFx0XHR1cGRhdGUgPSB0aGlzLl9fLnRyYW5zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHR5cGVvZiB2YWx1ZSAhPSAndW5kZWZpbmVkJyApe1xyXG5cdFx0XHRhdHRycyA9IHt9O1xyXG5cdFx0XHRhdHRyc1sgYXR0ciBdID0gdmFsdWU7XHJcblx0XHR9XHJcblxyXG5cdFx0aWYoICF1cGRhdGUgKXtcclxuXHRcdFx0Zm9yKCB2YXIga2V5IGluIGF0dHJzICl7XHJcblx0XHRcdFx0dXBkYXRlID0gdXBkYXRlIHx8IHRoaXNbIGtleSBdICE9IGF0dHJzWyBrZXkgXTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0Ly8gTm8gY2hhbmdlcywganVzdCByZXR1cm4gdGhlIG5vZGVcclxuXHRcdFx0aWYoICF1cGRhdGUgKVxyXG5cdFx0XHRcdHJldHVybiB0aGlzO1xyXG5cdFx0fVxyXG5cclxuXHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ21lcmdlJywgdGhpcywgYXR0cnMgKTtcclxuXHR9LFxyXG5cclxuXHRyZXNldDogZnVuY3Rpb24oIGF0dHJzICkge1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAncmVwbGFjZScsIHRoaXMsIGF0dHJzICk7XHJcblx0fSxcclxuXHJcblx0Z2V0TGlzdGVuZXI6IGZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdsaXN0ZW5lcicsIHRoaXMgKTtcclxuXHR9LFxyXG5cclxuXHR0b0pTOiBmdW5jdGlvbigpe1xyXG5cdFx0dmFyIGpzO1xyXG5cdFx0aWYoIHRoaXMuY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcclxuXHRcdFx0anMgPSBuZXcgQXJyYXkoIHRoaXMubGVuZ3RoICk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0anMgPSB7fTtcclxuXHRcdH1cclxuXHJcblx0XHRVdGlscy5lYWNoKCB0aGlzLCBmdW5jdGlvbiggY2hpbGQsIGkgKXtcclxuXHRcdFx0aWYoIGNoaWxkICYmIGNoaWxkLl9fIClcclxuXHRcdFx0XHRqc1sgaSBdID0gY2hpbGQudG9KUygpO1xyXG5cdFx0XHRlbHNlXHJcblx0XHRcdFx0anNbIGkgXSA9IGNoaWxkO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0cmV0dXJuIGpzO1xyXG5cdH0sXHJcblxyXG5cdHRyYW5zYWN0OiBmdW5jdGlvbigpe1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAndHJhbnNhY3QnLCB0aGlzICk7XHJcblx0fSxcclxuXHRydW46IGZ1bmN0aW9uKCl7XHJcblx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdydW4nLCB0aGlzICk7XHJcblx0fVxyXG59O1xyXG5cclxudmFyIGFycmF5TWV0aG9kcyA9IFV0aWxzLmV4dGVuZCh7XHJcblx0cHVzaDogZnVuY3Rpb24oIGVsICl7XHJcblx0XHRyZXR1cm4gdGhpcy5hcHBlbmQoIFtlbF0gKTtcclxuXHR9LFxyXG5cclxuXHRhcHBlbmQ6IGZ1bmN0aW9uKCBlbHMgKXtcclxuXHRcdGlmKCBlbHMgJiYgZWxzLmxlbmd0aCApXHJcblx0XHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ3NwbGljZScsIHRoaXMsIFt0aGlzLmxlbmd0aCwgMF0uY29uY2F0KCBlbHMgKSApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0cG9wOiBmdW5jdGlvbigpe1xyXG5cdFx0aWYoICF0aGlzLmxlbmd0aCApXHJcblx0XHRcdHJldHVybiB0aGlzO1xyXG5cclxuXHRcdHJldHVybiB0aGlzLl9fLm5vdGlmeSggJ3NwbGljZScsIHRoaXMsIFt0aGlzLmxlbmd0aCAtMSwgMV0gKTtcclxuXHR9LFxyXG5cclxuXHR1bnNoaWZ0OiBmdW5jdGlvbiggZWwgKXtcclxuXHRcdHJldHVybiB0aGlzLnByZXBlbmQoIFtlbF0gKTtcclxuXHR9LFxyXG5cclxuXHRwcmVwZW5kOiBmdW5jdGlvbiggZWxzICl7XHJcblx0XHRpZiggZWxzICYmIGVscy5sZW5ndGggKVxyXG5cdFx0XHRyZXR1cm4gdGhpcy5fXy5ub3RpZnkoICdzcGxpY2UnLCB0aGlzLCBbMCwgMF0uY29uY2F0KCBlbHMgKSApO1xyXG5cdFx0cmV0dXJuIHRoaXM7XHJcblx0fSxcclxuXHJcblx0c2hpZnQ6IGZ1bmN0aW9uKCl7XHJcblx0XHRpZiggIXRoaXMubGVuZ3RoIClcclxuXHRcdFx0cmV0dXJuIHRoaXM7XHJcblxyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAnc3BsaWNlJywgdGhpcywgWzAsIDFdICk7XHJcblx0fSxcclxuXHJcblx0c3BsaWNlOiBmdW5jdGlvbiggaW5kZXgsIHRvUmVtb3ZlLCB0b0FkZCApe1xyXG5cdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAnc3BsaWNlJywgdGhpcywgYXJndW1lbnRzICk7XHJcblx0fVxyXG59LCBjb21tb25NZXRob2RzICk7XHJcblxyXG52YXIgRnJvemVuQXJyYXkgPSBPYmplY3QuY3JlYXRlKCBBcnJheS5wcm90b3R5cGUsIGNyZWF0ZU5FKCBhcnJheU1ldGhvZHMgKSApO1xyXG5cclxudmFyIE1peGlucyA9IHtcclxuXHJcbkhhc2g6IE9iamVjdC5jcmVhdGUoIE9iamVjdC5wcm90b3R5cGUsIGNyZWF0ZU5FKCBVdGlscy5leHRlbmQoe1xyXG5cdHJlbW92ZTogZnVuY3Rpb24oIGtleXMgKXtcclxuXHRcdHZhciBmaWx0ZXJlZCA9IFtdLFxyXG5cdFx0XHRrID0ga2V5c1xyXG5cdFx0O1xyXG5cclxuXHRcdGlmKCBrZXlzLmNvbnN0cnVjdG9yICE9IEFycmF5IClcclxuXHRcdFx0ayA9IFsga2V5cyBdO1xyXG5cclxuXHRcdGZvciggdmFyIGkgPSAwLCBsID0gay5sZW5ndGg7IGk8bDsgaSsrICl7XHJcblx0XHRcdGlmKCB0aGlzLmhhc093blByb3BlcnR5KCBrW2ldICkgKVxyXG5cdFx0XHRcdGZpbHRlcmVkLnB1c2goIGtbaV0gKTtcclxuXHRcdH1cclxuXHJcblx0XHRpZiggZmlsdGVyZWQubGVuZ3RoIClcclxuXHRcdFx0cmV0dXJuIHRoaXMuX18ubm90aWZ5KCAncmVtb3ZlJywgdGhpcywgZmlsdGVyZWQgKTtcclxuXHRcdHJldHVybiB0aGlzO1xyXG5cdH1cclxufSwgY29tbW9uTWV0aG9kcykpKSxcclxuXHJcbkxpc3Q6IEZyb3plbkFycmF5LFxyXG5hcnJheU1ldGhvZHM6IGFycmF5TWV0aG9kc1xyXG59O1xyXG4vLyNidWlsZFxyXG5cclxubW9kdWxlLmV4cG9ydHMgPSBNaXhpbnM7XG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2ZyZWV6ZXItanMvc3JjL21peGlucy5qc1xuICoqIG1vZHVsZSBpZCA9IDIyXG4gKiogbW9kdWxlIGNodW5rcyA9IDBcbiAqKi9cbi8vIyBzb3VyY2VVUkw9d2VicGFjazovLy8uL34vZnJlZXplci1qcy9zcmMvbWl4aW5zLmpzPyIpOw0KDQovKioqLyB9LA0KLyogMjMgKi8NCi8qKiovIGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykgew0KDQoJZXZhbCgiJ3VzZSBzdHJpY3QnO1xyXG5cclxudmFyIFV0aWxzID0gX193ZWJwYWNrX3JlcXVpcmVfXyggMjAgKSxcclxuXHRNaXhpbnMgPSBfX3dlYnBhY2tfcmVxdWlyZV9fKCAyMiksXHJcblx0RW1pdHRlciA9IF9fd2VicGFja19yZXF1aXJlX18oMjEpXHJcbjtcclxuXHJcbi8vI2J1aWxkXHJcbnZhciBGcm96ZW4gPSB7XHJcblx0ZnJlZXplOiBmdW5jdGlvbiggbm9kZSwgbm90aWZ5LCBmcmVlemVGbiApe1xyXG5cdFx0aWYoIG5vZGUgJiYgbm9kZS5fXyApe1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4sIG1peGluLCBjb25zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIG5vZGUuY29uc3RydWN0b3IgPT0gQXJyYXkgKXtcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5jcmVhdGVBcnJheSggbm9kZS5sZW5ndGggKTtcclxuXHRcdH1cclxuXHRcdGVsc2Uge1xyXG5cdFx0XHRmcm96ZW4gPSBPYmplY3QuY3JlYXRlKCBNaXhpbnMuSGFzaCApO1xyXG5cdFx0fVxyXG5cclxuXHRcdFV0aWxzLmFkZE5FKCBmcm96ZW4sIHsgX186IHtcclxuXHRcdFx0bGlzdGVuZXI6IGZhbHNlLFxyXG5cdFx0XHRwYXJlbnRzOiBbXSxcclxuXHRcdFx0bm90aWZ5OiBub3RpZnksXHJcblx0XHRcdGRpcnR5OiBmYWxzZSxcclxuXHRcdFx0ZnJlZXplRm46IGZyZWV6ZUZuXHJcblx0XHR9fSk7XHJcblxyXG5cdFx0Ly8gRnJlZXplIGNoaWxkcmVuXHJcblx0XHRVdGlscy5lYWNoKCBub2RlLCBmdW5jdGlvbiggY2hpbGQsIGtleSApe1xyXG5cdFx0XHRjb25zID0gY2hpbGQgJiYgY2hpbGQuY29uc3RydWN0b3I7XHJcblx0XHRcdGlmKCBjb25zID09IEFycmF5IHx8IGNvbnMgPT0gT2JqZWN0ICl7XHJcblx0XHRcdFx0Y2hpbGQgPSBtZS5mcmVlemUoIGNoaWxkLCBub3RpZnksIGZyZWV6ZUZuICk7XHJcblx0XHRcdH1cclxuXHJcblx0XHRcdGlmKCBjaGlsZCAmJiBjaGlsZC5fXyApe1xyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5bIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRmcmVlemVGbiggZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHR1cGRhdGU6IGZ1bmN0aW9uKCB0eXBlLCBub2RlLCBvcHRpb25zICl7XHJcblx0XHRpZiggIXRoaXNbIHR5cGUgXSlcclxuXHRcdFx0cmV0dXJuIFV0aWxzLmVycm9yKCAnVW5rbm93biB1cGRhdGUgdHlwZTogJyArIHR5cGUgKTtcclxuXHJcblx0XHRyZXR1cm4gdGhpc1sgdHlwZSBdKCBub2RlLCBvcHRpb25zICk7XHJcblx0fSxcclxuXHJcblx0cmVzZXQ6IGZ1bmN0aW9uKCBub2RlLCB2YWx1ZSApe1xyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0ZnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHZhbHVlICYmIHZhbHVlLl9fICl7XHJcblx0XHRcdGZyb3plbiA9IHZhbHVlO1xyXG5cdFx0XHRmcm96ZW4uX18ubGlzdGVuZXIgPSB2YWx1ZS5fXy5saXN0ZW5lcjtcclxuXHRcdFx0ZnJvemVuLl9fLnBhcmVudHMgPSBbXTtcclxuXHJcblx0XHRcdC8vIFNldCBiYWNrIHRoZSBwYXJlbnQgb24gdGhlIGNoaWxkcmVuXHJcblx0XHRcdC8vIHRoYXQgaGF2ZSBiZWVuIHVwZGF0ZWRcclxuXHRcdFx0dGhpcy5maXhDaGlsZHJlbiggZnJvemVuLCBub2RlICk7XHJcblx0XHRcdFV0aWxzLmVhY2goIGZyb3plbiwgZnVuY3Rpb24oIGNoaWxkICl7XHJcblx0XHRcdFx0aWYoIGNoaWxkICYmIGNoaWxkLl9fICl7XHJcblx0XHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIG5vZGUgKTtcclxuXHRcdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0XHRlbHNlIHtcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5mcmVlemUoIG5vZGUsIG5vZGUuX18ubm90aWZ5LCBub2RlLl9fLmZyZWV6ZUZuICk7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRtZXJnZTogZnVuY3Rpb24oIG5vZGUsIGF0dHJzICl7XHJcblx0XHR2YXIgdHJhbnMgPSBub2RlLl9fLnRyYW5zLFxyXG5cclxuXHRcdFx0Ly8gQ2xvbmUgdGhlIGF0dHJzIHRvIG5vdCBtb2RpZnkgdGhlIGFyZ3VtZW50XHJcblx0XHRcdGF0dHJzID0gVXRpbHMuZXh0ZW5kKCB7fSwgYXR0cnMpXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zICl7XHJcblxyXG5cdFx0XHRmb3IoIHZhciBhdHRyIGluIGF0dHJzIClcclxuXHRcdFx0XHR0cmFuc1sgYXR0ciBdID0gYXR0cnNbIGF0dHIgXTtcclxuXHRcdFx0cmV0dXJuIG5vZGU7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0ZnJvemVuID0gdGhpcy5jb3B5TWV0YSggbm9kZSApLFxyXG5cdFx0XHRub3RpZnkgPSBub2RlLl9fLm5vdGlmeSxcclxuXHRcdFx0dmFsLCBjb25zLCBrZXksIGlzRnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0aXNGcm96ZW4gPSBjaGlsZCAmJiBjaGlsZC5fXztcclxuXHJcblx0XHRcdGlmKCBpc0Zyb3plbiApe1xyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG5vZGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0dmFsID0gYXR0cnNbIGtleSBdO1xyXG5cdFx0XHRpZiggIXZhbCApe1xyXG5cdFx0XHRcdGlmKCBpc0Zyb3plbiApXHJcblx0XHRcdFx0XHRtZS5hZGRQYXJlbnQoIGNoaWxkLCBmcm96ZW4gKTtcclxuXHRcdFx0XHRyZXR1cm4gZnJvemVuWyBrZXkgXSA9IGNoaWxkO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRjb25zID0gdmFsICYmIHZhbC5jb25zdHJ1Y3RvcjtcclxuXHJcblx0XHRcdGlmKCBjb25zID09IEFycmF5IHx8IGNvbnMgPT0gT2JqZWN0IClcclxuXHRcdFx0XHR2YWwgPSBtZS5mcmVlemUoIHZhbCwgbm90aWZ5LCBub2RlLl9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRpZiggdmFsICYmIHZhbC5fXyApXHJcblx0XHRcdFx0bWUuYWRkUGFyZW50KCB2YWwsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0ZGVsZXRlIGF0dHJzWyBrZXkgXTtcclxuXHJcblx0XHRcdGZyb3plblsga2V5IF0gPSB2YWw7XHJcblx0XHR9KTtcclxuXHJcblxyXG5cdFx0Zm9yKCBrZXkgaW4gYXR0cnMgKSB7XHJcblx0XHRcdHZhbCA9IGF0dHJzWyBrZXkgXTtcclxuXHRcdFx0Y29ucyA9IHZhbCAmJiB2YWwuY29uc3RydWN0b3I7XHJcblxyXG5cdFx0XHRpZiggY29ucyA9PSBBcnJheSB8fCBjb25zID09IE9iamVjdCApXHJcblx0XHRcdFx0dmFsID0gbWUuZnJlZXplKCB2YWwsIG5vdGlmeSwgbm9kZS5fXy5mcmVlemVGbiApO1xyXG5cclxuXHRcdFx0aWYoIHZhbCAmJiB2YWwuX18gKVxyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggdmFsLCBmcm96ZW4gKTtcclxuXHJcblx0XHRcdGZyb3plblsga2V5IF0gPSB2YWw7XHJcblx0XHR9XHJcblxyXG5cdFx0bm9kZS5fXy5mcmVlemVGbiggZnJvemVuICk7XHJcblxyXG5cdFx0dGhpcy5yZWZyZXNoUGFyZW50cyggbm9kZSwgZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRyZXBsYWNlOiBmdW5jdGlvbiggbm9kZSwgcmVwbGFjZW1lbnQgKSB7XHJcblxyXG5cdFx0dmFyIG1lID0gdGhpcyxcclxuXHRcdFx0Y29ucyA9IHJlcGxhY2VtZW50ICYmIHJlcGxhY2VtZW50LmNvbnN0cnVjdG9yLFxyXG5cdFx0XHRfXyA9IG5vZGUuX18sXHJcblx0XHRcdGZyb3plbiA9IHJlcGxhY2VtZW50XHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGNvbnMgPT0gQXJyYXkgfHwgY29ucyA9PSBPYmplY3QgKSB7XHJcblxyXG5cdFx0XHRmcm96ZW4gPSBtZS5mcmVlemUoIHJlcGxhY2VtZW50LCBfXy5ub3RpZnksIF9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRmcm96ZW4uX18ucGFyZW50cyA9IF9fLnBhcmVudHM7XHJcblxyXG5cdFx0XHQvLyBBZGQgdGhlIGN1cnJlbnQgbGlzdGVuZXIgaWYgZXhpc3RzLCByZXBsYWNpbmcgYVxyXG5cdFx0XHQvLyBwcmV2aW91cyBsaXN0ZW5lciBpbiB0aGUgZnJvemVuIGlmIGV4aXN0ZWRcclxuXHRcdFx0aWYoIF9fLmxpc3RlbmVyIClcclxuXHRcdFx0XHRmcm96ZW4uX18ubGlzdGVuZXIgPSBub2RlLl9fLmxpc3RlbmVyO1xyXG5cclxuXHRcdFx0Ly8gU2luY2UgdGhlIHBhcmVudHMgd2lsbCBiZSByZWZyZXNoZWQgZGlyZWN0bHksXHJcblx0XHRcdC8vIFRyaWdnZXIgdGhlIGxpc3RlbmVyIGhlcmVcclxuXHRcdFx0aWYoIGZyb3plbi5fXy5saXN0ZW5lciApXHJcblx0XHRcdFx0dGhpcy50cmlnZ2VyKCBmcm96ZW4sICd1cGRhdGUnLCBmcm96ZW4gKTtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZWZyZXNoIHRoZSBwYXJlbnQgbm9kZXMgZGlyZWN0bHlcclxuXHRcdGlmKCAhX18ucGFyZW50cy5sZW5ndGggJiYgX18ubGlzdGVuZXIgKXtcclxuXHRcdFx0X18ubGlzdGVuZXIudHJpZ2dlciggJ2ltbWVkaWF0ZScsIG5vZGUsIGZyb3plbiApO1xyXG5cdFx0fVxyXG5cdFx0Zm9yICh2YXIgaSA9IF9fLnBhcmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0aWYoIGkgPT0gMCApe1xyXG5cdFx0XHRcdHRoaXMucmVmcmVzaCggX18ucGFyZW50c1tpXSwgbm9kZSwgZnJvemVuLCBmYWxzZSApO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2V7XHJcblxyXG5cdFx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBbbm9kZSwgZnJvemVuXSApO1xyXG5cdFx0XHR9XHJcblx0XHR9XHJcblx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdH0sXHJcblxyXG5cdHJlbW92ZTogZnVuY3Rpb24oIG5vZGUsIGF0dHJzICl7XHJcblx0XHR2YXIgdHJhbnMgPSBub2RlLl9fLnRyYW5zO1xyXG5cdFx0aWYoIHRyYW5zICl7XHJcblx0XHRcdGZvciggdmFyIGwgPSBhdHRycy5sZW5ndGggLSAxOyBsID49IDA7IGwtLSApXHJcblx0XHRcdFx0ZGVsZXRlIHRyYW5zWyBhdHRyc1tsXSBdO1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGlzRnJvemVuXHJcblx0XHQ7XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0aXNGcm96ZW4gPSBjaGlsZCAmJiBjaGlsZC5fXztcclxuXHJcblx0XHRcdGlmKCBpc0Zyb3plbiApe1xyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG5vZGUgKTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIGF0dHJzLmluZGV4T2YoIGtleSApICE9IC0xICl7XHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiggaXNGcm96ZW4gKVxyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0ZnJvemVuWyBrZXkgXSA9IGNoaWxkO1xyXG5cdFx0fSk7XHJcblxyXG5cdFx0bm9kZS5fXy5mcmVlemVGbiggZnJvemVuICk7XHJcblx0XHR0aGlzLnJlZnJlc2hQYXJlbnRzKCBub2RlLCBmcm96ZW4gKTtcclxuXHJcblx0XHRyZXR1cm4gZnJvemVuO1xyXG5cdH0sXHJcblxyXG5cdHNwbGljZTogZnVuY3Rpb24oIG5vZGUsIGFyZ3MgKXtcclxuXHRcdHZhciB0cmFucyA9IG5vZGUuX18udHJhbnM7XHJcblx0XHRpZiggdHJhbnMgKXtcclxuXHRcdFx0dHJhbnMuc3BsaWNlLmFwcGx5KCB0cmFucywgYXJncyApO1xyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHRcdH1cclxuXHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGluZGV4ID0gYXJnc1swXSxcclxuXHRcdFx0ZGVsZXRlSW5kZXggPSBpbmRleCArIGFyZ3NbMV0sXHJcblx0XHRcdF9fID0gbm9kZS5fXyxcclxuXHRcdFx0Y29uLCBjaGlsZFxyXG5cdFx0O1xyXG5cclxuXHRcdC8vIENsb25lIHRoZSBhcnJheVxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBpICl7XHJcblxyXG5cdFx0XHRpZiggY2hpbGQgJiYgY2hpbGQuX18gKXtcclxuXHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIGNoaWxkLCBub2RlICk7XHJcblxyXG5cdFx0XHRcdC8vIFNraXAgdGhlIG5vZGVzIHRvIGRlbGV0ZVxyXG5cdFx0XHRcdGlmKCBpIDwgaW5kZXggfHwgaT49IGRlbGV0ZUluZGV4IClcclxuXHRcdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5baV0gPSBjaGlsZDtcclxuXHRcdH0pO1xyXG5cclxuXHRcdC8vIFByZXBhcmUgdGhlIG5ldyBub2Rlc1xyXG5cdFx0aWYoIGFyZ3MubGVuZ3RoID4gMSApe1xyXG5cdFx0XHRmb3IgKHZhciBpID0gYXJncy5sZW5ndGggLSAxOyBpID49IDI7IGktLSkge1xyXG5cdFx0XHRcdGNoaWxkID0gYXJnc1tpXTtcclxuXHRcdFx0XHRjb24gPSBjaGlsZCAmJiBjaGlsZC5jb25zdHJ1Y3RvcjtcclxuXHJcblx0XHRcdFx0aWYoIGNvbiA9PSBBcnJheSB8fCBjb24gPT0gT2JqZWN0IClcclxuXHRcdFx0XHRcdGNoaWxkID0gdGhpcy5mcmVlemUoIGNoaWxkLCBfXy5ub3RpZnksIF9fLmZyZWV6ZUZuICk7XHJcblxyXG5cdFx0XHRcdGlmKCBjaGlsZCAmJiBjaGlsZC5fXyApXHJcblx0XHRcdFx0XHR0aGlzLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cclxuXHRcdFx0XHRhcmdzW2ldID0gY2hpbGQ7XHJcblx0XHRcdH1cclxuXHRcdH1cclxuXHJcblx0XHQvLyBzcGxpY2VcclxuXHRcdEFycmF5LnByb3RvdHlwZS5zcGxpY2UuYXBwbHkoIGZyb3plbiwgYXJncyApO1xyXG5cclxuXHRcdG5vZGUuX18uZnJlZXplRm4oIGZyb3plbiApO1xyXG5cdFx0dGhpcy5yZWZyZXNoUGFyZW50cyggbm9kZSwgZnJvemVuICk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHR0cmFuc2FjdDogZnVuY3Rpb24oIG5vZGUgKSB7XHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHR0cmFuc2FjdGluZyA9IG5vZGUuX18udHJhbnMsXHJcblx0XHRcdHRyYW5zXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zYWN0aW5nIClcclxuXHRcdFx0cmV0dXJuIHRyYW5zYWN0aW5nO1xyXG5cclxuXHRcdHRyYW5zID0gbm9kZS5jb25zdHJ1Y3RvciA9PSBBcnJheSA/IFtdIDoge307XHJcblxyXG5cdFx0VXRpbHMuZWFjaCggbm9kZSwgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0dHJhbnNbIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRub2RlLl9fLnRyYW5zID0gdHJhbnM7XHJcblxyXG5cdFx0Ly8gQ2FsbCBydW4gYXV0b21hdGljYWxseSBpbiBjYXNlXHJcblx0XHQvLyB0aGUgdXNlciBmb3Jnb3QgYWJvdXQgaXRcclxuXHRcdFV0aWxzLm5leHRUaWNrKCBmdW5jdGlvbigpe1xyXG5cdFx0XHRpZiggbm9kZS5fXy50cmFucyApXHJcblx0XHRcdFx0bWUucnVuKCBub2RlICk7XHJcblx0XHR9KTtcclxuXHJcblx0XHRyZXR1cm4gdHJhbnM7XHJcblx0fSxcclxuXHJcblx0cnVuOiBmdW5jdGlvbiggbm9kZSApIHtcclxuXHRcdHZhciBtZSA9IHRoaXMsXHJcblx0XHRcdHRyYW5zID0gbm9kZS5fXy50cmFuc1xyXG5cdFx0O1xyXG5cclxuXHRcdGlmKCAhdHJhbnMgKVxyXG5cdFx0XHRyZXR1cm4gbm9kZTtcclxuXHJcblx0XHQvLyBSZW1vdmUgdGhlIG5vZGUgYXMgYSBwYXJlbnRcclxuXHRcdFV0aWxzLmVhY2goIHRyYW5zLCBmdW5jdGlvbiggY2hpbGQsIGtleSApe1xyXG5cdFx0XHRpZiggY2hpbGQgJiYgY2hpbGQuX18gKXtcclxuXHRcdFx0XHRtZS5yZW1vdmVQYXJlbnQoIGNoaWxkLCBub2RlICk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cclxuXHRcdGRlbGV0ZSBub2RlLl9fLnRyYW5zO1xyXG5cclxuXHRcdHZhciByZXN1bHQgPSB0aGlzLnJlcGxhY2UoIG5vZGUsIHRyYW5zICk7XHJcblx0XHRyZXR1cm4gcmVzdWx0O1xyXG5cdH0sXHJcblxyXG5cdHJlZnJlc2g6IGZ1bmN0aW9uKCBub2RlLCBvbGRDaGlsZCwgbmV3Q2hpbGQsIHJldHVyblVwZGF0ZWQgKXtcclxuXHRcdHZhciBtZSA9IHRoaXMsXHJcblx0XHRcdHRyYW5zID0gbm9kZS5fXy50cmFucyxcclxuXHRcdFx0Zm91bmQgPSAwXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIHRyYW5zICl7XHJcblxyXG5cdFx0XHRVdGlscy5lYWNoKCB0cmFucywgZnVuY3Rpb24oIGNoaWxkLCBrZXkgKXtcclxuXHRcdFx0XHRpZiggZm91bmQgKSByZXR1cm47XHJcblxyXG5cdFx0XHRcdGlmKCBjaGlsZCA9PT0gb2xkQ2hpbGQgKXtcclxuXHJcblx0XHRcdFx0XHR0cmFuc1sga2V5IF0gPSBuZXdDaGlsZDtcclxuXHRcdFx0XHRcdGZvdW5kID0gMTtcclxuXHJcblx0XHRcdFx0XHRpZiggbmV3Q2hpbGQgJiYgbmV3Q2hpbGQuX18gKVxyXG5cdFx0XHRcdFx0XHRtZS5hZGRQYXJlbnQoIG5ld0NoaWxkLCBub2RlICk7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdHJldHVybiBub2RlO1xyXG5cdFx0fVxyXG5cclxuXHRcdHZhciBmcm96ZW4gPSB0aGlzLmNvcHlNZXRhKCBub2RlICksXHJcblx0XHRcdGRpcnR5ID0gbm9kZS5fXy5kaXJ0eSxcclxuXHRcdFx0ZGlydCwgcmVwbGFjZW1lbnQsIF9fXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGRpcnR5ICl7XHJcblx0XHRcdGRpcnQgPSBkaXJ0eVswXSxcclxuXHRcdFx0cmVwbGFjZW1lbnQgPSBkaXJ0eVsxXVxyXG5cdFx0fVxyXG5cclxuXHRcdFV0aWxzLmVhY2goIG5vZGUsIGZ1bmN0aW9uKCBjaGlsZCwga2V5ICl7XHJcblx0XHRcdGlmKCBjaGlsZCA9PT0gb2xkQ2hpbGQgKXtcclxuXHRcdFx0XHRjaGlsZCA9IG5ld0NoaWxkO1xyXG5cdFx0XHR9XHJcblx0XHRcdGVsc2UgaWYoIGNoaWxkID09PSBkaXJ0ICl7XHJcblx0XHRcdFx0Y2hpbGQgPSByZXBsYWNlbWVudDtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYoIGNoaWxkICYmIChfXyA9IGNoaWxkLl9fKSApe1xyXG5cclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhIHRyYW5zIGhhcHBlbmluZyB3ZVxyXG5cdFx0XHRcdC8vIGRvbid0IHVwZGF0ZSBhIGRpcnR5IG5vZGUgbm93LiBUaGUgdXBkYXRlXHJcblx0XHRcdFx0Ly8gd2lsbCBvY2N1ciBvbiBydW4uXHJcblx0XHRcdFx0aWYoICFfXy50cmFucyAmJiBfXy5kaXJ0eSApe1xyXG5cdFx0XHRcdFx0Y2hpbGQgPSBtZS5yZWZyZXNoKCBjaGlsZCwgX18uZGlydHlbMF0sIF9fLmRpcnR5WzFdLCB0cnVlICk7XHJcblx0XHRcdFx0fVxyXG5cclxuXHJcblx0XHRcdFx0bWUucmVtb3ZlUGFyZW50KCBjaGlsZCwgbm9kZSApO1xyXG5cdFx0XHRcdG1lLmFkZFBhcmVudCggY2hpbGQsIGZyb3plbiApO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRmcm96ZW5bIGtleSBdID0gY2hpbGQ7XHJcblx0XHR9KTtcclxuXHJcblx0XHRub2RlLl9fLmZyZWV6ZUZuKCBmcm96ZW4gKTtcclxuXHJcblx0XHQvLyBJZiB0aGUgbm9kZSB3YXMgZGlydHksIGNsZWFuIGl0XHJcblx0XHRub2RlLl9fLmRpcnR5ID0gZmFsc2U7XHJcblxyXG5cdFx0aWYoIHJldHVyblVwZGF0ZWQgKVxyXG5cdFx0XHRyZXR1cm4gZnJvemVuO1xyXG5cclxuXHRcdHRoaXMucmVmcmVzaFBhcmVudHMoIG5vZGUsIGZyb3plbiApO1xyXG5cdH0sXHJcblxyXG5cdGZpeENoaWxkcmVuOiBmdW5jdGlvbiggbm9kZSwgb2xkTm9kZSApe1xyXG5cdFx0dmFyIG1lID0gdGhpcztcclxuXHRcdFV0aWxzLmVhY2goIG5vZGUsIGZ1bmN0aW9uKCBjaGlsZCApe1xyXG5cdFx0XHRpZiggIWNoaWxkIHx8ICFjaGlsZC5fXyApXHJcblx0XHRcdFx0cmV0dXJuO1xyXG5cclxuXHRcdFx0Ly8gSWYgdGhlIGNoaWxkIGlzIGxpbmtlZCB0byB0aGUgbm9kZSxcclxuXHRcdFx0Ly8gbWF5YmUgaXRzIGNoaWxkcmVuIGFyZSBub3QgbGlua2VkXHJcblx0XHRcdGlmKCBjaGlsZC5fXy5wYXJlbnRzLmluZGV4T2YoIG5vZGUgKSAhPSAtMSApXHJcblx0XHRcdFx0cmV0dXJuIG1lLmZpeENoaWxkcmVuKCBjaGlsZCApO1xyXG5cclxuXHRcdFx0Ly8gSWYgdGhlIGNoaWxkIHdhc24ndCBsaW5rZWQgaXQgaXMgc3VyZVxyXG5cdFx0XHQvLyB0aGF0IGl0IHdhc24ndCBtb2RpZmllZC4gSnVzdCBsaW5rIGl0XHJcblx0XHRcdC8vIHRvIHRoZSBuZXcgcGFyZW50XHJcblx0XHRcdGlmKCBjaGlsZC5fXy5wYXJlbnRzLmxlbmd0aCA9PSAxIClcclxuXHRcdFx0XHRyZXR1cm4gY2hpbGQuX18ucGFyZW50cyA9IFsgbm9kZSBdO1xyXG5cclxuXHRcdFx0aWYoIG9sZE5vZGUgKVxyXG5cdFx0XHRcdG1lLnJlbW92ZVBhcmVudCggY2hpbGQsIG9sZE5vZGUgKTtcclxuXHJcblx0XHRcdG1lLmFkZFBhcmVudCggbm9kZSApO1xyXG5cdFx0fSk7XHJcblx0fSxcclxuXHJcblx0Y29weU1ldGE6IGZ1bmN0aW9uKCBub2RlICl7XHJcblx0XHR2YXIgbWUgPSB0aGlzLFxyXG5cdFx0XHRmcm96ZW5cclxuXHRcdDtcclxuXHJcblx0XHRpZiggbm9kZS5jb25zdHJ1Y3RvciA9PSBBcnJheSApe1xyXG5cdFx0XHRmcm96ZW4gPSB0aGlzLmNyZWF0ZUFycmF5KCBub2RlLmxlbmd0aCApO1xyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGZyb3plbiA9IE9iamVjdC5jcmVhdGUoIE1peGlucy5IYXNoICk7XHJcblx0XHR9XHJcblxyXG5cdFx0dmFyIF9fID0gbm9kZS5fXztcclxuXHJcblx0XHRVdGlscy5hZGRORSggZnJvemVuLCB7X186IHtcclxuXHRcdFx0bm90aWZ5OiBfXy5ub3RpZnksXHJcblx0XHRcdGxpc3RlbmVyOiBfXy5saXN0ZW5lcixcclxuXHRcdFx0cGFyZW50czogX18ucGFyZW50cy5zbGljZSggMCApLFxyXG5cdFx0XHR0cmFuczogX18udHJhbnMsXHJcblx0XHRcdGRpcnR5OiBmYWxzZSxcclxuXHRcdFx0ZnJlZXplRm46IF9fLmZyZWV6ZUZuXHJcblx0XHR9fSk7XHJcblxyXG5cdFx0cmV0dXJuIGZyb3plbjtcclxuXHR9LFxyXG5cclxuXHRyZWZyZXNoUGFyZW50czogZnVuY3Rpb24oIG9sZENoaWxkLCBuZXdDaGlsZCApe1xyXG5cdFx0dmFyIF9fID0gb2xkQ2hpbGQuX18sXHJcblx0XHRcdGlcclxuXHRcdDtcclxuXHJcblx0XHRpZiggX18ubGlzdGVuZXIgKVxyXG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5ld0NoaWxkLCAndXBkYXRlJywgbmV3Q2hpbGQgKTtcclxuXHJcblx0XHRpZiggIV9fLnBhcmVudHMubGVuZ3RoICl7XHJcblx0XHRcdGlmKCBfXy5saXN0ZW5lciApe1xyXG5cdFx0XHRcdF9fLmxpc3RlbmVyLnRyaWdnZXIoICdpbW1lZGlhdGUnLCBvbGRDaGlsZCwgbmV3Q2hpbGQgKTtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdFx0ZWxzZSB7XHJcblx0XHRcdGZvciAoaSA9IF9fLnBhcmVudHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIHBhcmVudCwgbWFyayBldmVyeW9uZSBhcyBkaXJ0eVxyXG5cdFx0XHRcdC8vIGJ1dCB0aGUgbGFzdCBpbiB0aGUgaXRlcmF0aW9uLCBhbmQgd2hlbiB0aGUgbGFzdCBpcyByZWZyZXNoZWRcclxuXHRcdFx0XHQvLyBpdCB3aWxsIHVwZGF0ZSB0aGUgZGlydHkgbm9kZXMuXHJcblx0XHRcdFx0aWYoIGkgPT0gMCApXHJcblx0XHRcdFx0XHR0aGlzLnJlZnJlc2goIF9fLnBhcmVudHNbaV0sIG9sZENoaWxkLCBuZXdDaGlsZCwgZmFsc2UgKTtcclxuXHRcdFx0XHRlbHNle1xyXG5cclxuXHRcdFx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBbb2xkQ2hpbGQsIG5ld0NoaWxkXSApO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cdH0sXHJcblxyXG5cdG1hcmtEaXJ0eTogZnVuY3Rpb24oIG5vZGUsIGRpcnQgKXtcclxuXHRcdHZhciBfXyA9IG5vZGUuX18sXHJcblx0XHRcdGlcclxuXHRcdDtcclxuXHRcdF9fLmRpcnR5ID0gZGlydDtcclxuXHJcblx0XHQvLyBJZiB0aGVyZSBpcyBhIHRyYW5zYWN0aW9uIGhhcHBlbmluZyBpbiB0aGUgbm9kZVxyXG5cdFx0Ly8gdXBkYXRlIHRoZSB0cmFuc2FjdGlvbiBkYXRhIGltbWVkaWF0ZWx5XHJcblx0XHRpZiggX18udHJhbnMgKVxyXG5cdFx0XHR0aGlzLnJlZnJlc2goIG5vZGUsIGRpcnRbMF0sIGRpcnRbMV0gKTtcclxuXHJcblx0XHRmb3IgKCBpID0gX18ucGFyZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSApIHtcclxuXHJcblx0XHRcdHRoaXMubWFya0RpcnR5KCBfXy5wYXJlbnRzW2ldLCBkaXJ0ICk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0cmVtb3ZlUGFyZW50OiBmdW5jdGlvbiggbm9kZSwgcGFyZW50ICl7XHJcblx0XHR2YXIgcGFyZW50cyA9IG5vZGUuX18ucGFyZW50cyxcclxuXHRcdFx0aW5kZXggPSBwYXJlbnRzLmluZGV4T2YoIHBhcmVudCApXHJcblx0XHQ7XHJcblxyXG5cdFx0aWYoIGluZGV4ICE9IC0xICl7XHJcblxyXG5cdFx0XHRwYXJlbnRzLnNwbGljZSggaW5kZXgsIDEgKTtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHRhZGRQYXJlbnQ6IGZ1bmN0aW9uKCBub2RlLCBwYXJlbnQgKXtcclxuXHRcdHZhciBwYXJlbnRzID0gbm9kZS5fXy5wYXJlbnRzLFxyXG5cdFx0XHRpbmRleCA9IHBhcmVudHMuaW5kZXhPZiggcGFyZW50IClcclxuXHRcdDtcclxuXHJcblx0XHRpZiggaW5kZXggPT0gLTEgKXtcclxuXHRcdFx0cGFyZW50c1sgcGFyZW50cy5sZW5ndGggXSA9IHBhcmVudDtcclxuXHRcdH1cclxuXHR9LFxyXG5cclxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggbm9kZSwgZXZlbnROYW1lLCBwYXJhbSApe1xyXG5cdFx0dmFyIGxpc3RlbmVyID0gbm9kZS5fXy5saXN0ZW5lcixcclxuXHRcdFx0dGlja2luZyA9IGxpc3RlbmVyLnRpY2tpbmdcclxuXHRcdDtcclxuXHJcblx0XHRsaXN0ZW5lci50aWNraW5nID0gcGFyYW07XHJcblx0XHRpZiggIXRpY2tpbmcgKXtcclxuXHRcdFx0VXRpbHMubmV4dFRpY2soIGZ1bmN0aW9uKCl7XHJcblx0XHRcdFx0dmFyIHVwZGF0ZWQgPSBsaXN0ZW5lci50aWNraW5nO1xyXG5cdFx0XHRcdGxpc3RlbmVyLnRpY2tpbmcgPSBmYWxzZTtcclxuXHRcdFx0XHRsaXN0ZW5lci50cmlnZ2VyKCBldmVudE5hbWUsIHVwZGF0ZWQgKTtcclxuXHRcdFx0fSk7XHJcblx0XHR9XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlTGlzdGVuZXI6IGZ1bmN0aW9uKCBmcm96ZW4gKXtcclxuXHRcdHZhciBsID0gZnJvemVuLl9fLmxpc3RlbmVyO1xyXG5cclxuXHRcdGlmKCAhbCApIHtcclxuXHRcdFx0bCA9IE9iamVjdC5jcmVhdGUoRW1pdHRlciwge1xyXG5cdFx0XHRcdF9ldmVudHM6IHtcclxuXHRcdFx0XHRcdHZhbHVlOiB7fSxcclxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlXHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9KTtcclxuXHJcblx0XHRcdGZyb3plbi5fXy5saXN0ZW5lciA9IGw7XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIGw7XHJcblx0fSxcclxuXHJcblx0Y3JlYXRlQXJyYXk6IChmdW5jdGlvbigpe1xyXG5cdFx0Ly8gU2V0IGNyZWF0ZUFycmF5IG1ldGhvZFxyXG5cdFx0aWYoIFtdLl9fcHJvdG9fXyApXHJcblx0XHRcdHJldHVybiBmdW5jdGlvbiggbGVuZ3RoICl7XHJcblx0XHRcdFx0dmFyIGFyciA9IG5ldyBBcnJheSggbGVuZ3RoICk7XHJcblx0XHRcdFx0YXJyLl9fcHJvdG9fXyA9IE1peGlucy5MaXN0O1xyXG5cdFx0XHRcdHJldHVybiBhcnI7XHJcblx0XHRcdH1cclxuXHRcdHJldHVybiBmdW5jdGlvbiggbGVuZ3RoICl7XHJcblx0XHRcdHZhciBhcnIgPSBuZXcgQXJyYXkoIGxlbmd0aCApLFxyXG5cdFx0XHRcdG1ldGhvZHMgPSBNaXhpbnMuYXJyYXlNZXRob2RzXHJcblx0XHRcdDtcclxuXHRcdFx0Zm9yKCB2YXIgbSBpbiBtZXRob2RzICl7XHJcblx0XHRcdFx0YXJyWyBtIF0gPSBtZXRob2RzWyBtIF07XHJcblx0XHRcdH1cclxuXHRcdFx0cmV0dXJuIGFycjtcclxuXHRcdH1cclxuXHR9KSgpXHJcbn07XHJcbi8vI2J1aWxkXHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IEZyb3plbjtcblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL34vZnJlZXplci1qcy9zcmMvZnJvemVuLmpzXG4gKiogbW9kdWxlIGlkID0gMjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqL1xuLy8jIHNvdXJjZVVSTD13ZWJwYWNrOi8vLy4vfi9mcmVlemVyLWpzL3NyYy9mcm96ZW4uanM/Iik7DQoNCi8qKiovIH0NCi8qKioqKiovIF0pDQp9KTsNCjsNCg=="></script>
</head>
<body style="background-color:white;">
<div id="htmlwidget_container" style="overflow:scroll;">
<div id="htmlwidget-7644" class="reactjson html-widget" style="width:960px;height:500px;">
</div>
</div>
<script type="application/json" data-for="htmlwidget-7644">{"x":{"json":[{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4"},{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.875,"qsec":17.02,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4 Wag"},{"mpg":22.8,"cyl":4,"disp":108,"hp":93,"drat":3.85,"wt":2.32,"qsec":18.61,"vs":1,"am":1,"gear":4,"carb":1,"_row":"Datsun 710"},{"mpg":21.4,"cyl":6,"disp":258,"hp":110,"drat":3.08,"wt":3.215,"qsec":19.44,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Hornet 4 Drive"},{"mpg":18.7,"cyl":8,"disp":360,"hp":175,"drat":3.15,"wt":3.44,"qsec":17.02,"vs":0,"am":0,"gear":3,"carb":2,"_row":"Hornet Sportabout"}]},"evals":[],"jsHooks":[]}</script>
<script type="application/htmlwidget-sizing" data-for="htmlwidget-7644">{"viewer":{"width":450,"height":350,"padding":15,"fill":true},"browser":{"width":960,"height":500,"padding":40,"fill":false}}</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment