LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDF9LCB0cnVlKQoKCmRvICAgLS0gdGVzdGluZyBsaW5lIGluZm8vdHJhY2Ugd2l0aCBsYXJnZSBnYXBzIGluIHNvdXJjZQoKICBsb2NhbCBhID0gezEsIDIsIDMsIDEwLCAxMjQsIDEyNSwgMTI2LCAxMjcsIDEyOCwgMTI5LCAxMzAsCiAgICAgICAgICAgICAyNTUsIDI1NiwgMjU3LCA1MDAsIDEwMDB9CiAgbG9jYWwgcyA9IFtbCiAgICAgbG9jYWwgYiA9IHsxMH0KICAgICBhID0gYlsxXSBYICsgWSBiWzFdCiAgICAgYiA9IDQKICBdXQogIGZvciBfLCBpIGluIGlwYWlycyhhKSBkbwogICAgbG9jYWwgc3VicyA9IHtYID0gc3RyaW5nLnJlcCgiXG4iLCBpKX0KICAgIGZvciBfLCBqIGluIGlwYWlycyhhKSBkbwogICAgICBzdWJzLlkgPSBzdHJpbmcucmVwKCJcbiIsIGopCiAgICAgIGxvY2FsIHMgPSBzdHJpbmcuZ3N1YihzLCAiW1hZXSIsIHN1YnMpCiAgICAgIHRlc3QocywgezEsIDIgKyBpLCAyICsgaSArIGosIDIgKyBpLCAyICsgaSArIGosIDMgKyBpICsgan0pCiAgICBlbmQKICBlbmQKZW5kCgpwcmludCcrJwoKLS0gaW52YWxpZCBsZXZlbHMgaW4gW2dzXWV0bG9jYWwKYXNzZXJ0KG5vdCBwY2FsbChkZWJ1Zy5nZXRsb2NhbCwgMjAsIDEpKQphc3NlcnQobm90IHBjYWxsKGRlYnVnLnNldGxvY2FsLCAtMSwgMSwgMTApKQoKCi0tIHBhcmFtZXRlciBuYW1lcwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsYiwuLi4pIGxvY2FsIGQsIGUgZW5kCmxvY2FsIGNvID0gY29yb3V0aW5lLmNyZWF0ZShmb28pCgphc3NlcnQoZGVidWcuZ2V0bG9jYWwoZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDIpID09ICdiJykKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChmb28sIDMpKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMSkgPT0gJ2EnKQphc3NlcnQoZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCBmb28sIDMpKQoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbChwcmludCwgMSkpCgoKbG9jYWwgZnVuY3Rpb24gZm9vICgpIHJldHVybiAoZGVidWcuZ2V0bG9jYWwoMSwgLTEpKSBlbmQKYXNzZXJ0KG5vdCBmb28oMTApKQoKCi0tIHZhcmFyZ3MKbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pCiAgbG9jYWwgdCA9IHRhYmxlLnBhY2soLi4uKQogIGZvciBpID0gMSwgdC5uIGRvCiAgICBsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgLWkpCiAgICBhc3NlcnQobiA9PSAiKHZhcmFyZykiIGFuZCB2ID09IHRbaV0pCiAgZW5kCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgxLCAtKHQubiArIDEpKSkKICBhc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKDEsIC0odC5uICsgMSksIDMwKSkKICBpZiB0Lm4gPiAwIHRoZW4KICAgIChmdW5jdGlvbiAoeCkKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC0xLCB4KSA9PSAiKHZhcmFyZykiKQogICAgICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgLXQubiwgeCkgPT0gIih2YXJhcmcpIikKICAgICBlbmQpKDQzMCkKICAgICBhc3NlcnQoLi4uID09IDQzMCkKICBlbmQKZW5kCgpmb28oKQpmb28ocHJpbnQpCmZvbygyMDAsIDMsIDQpCmxvY2FsIGEgPSB7fQpmb3IgaSA9IDEsIChfc29mdCBhbmQgMTAwIG9yIDEwMDApIGRvIGFbaV0gPSBpIGVuZApmb28odGFibGUudW5wYWNrKGEpKQphID0gbmlsCgoKCmRvICAgLS0gdGVzdCBob29rIHByZXNlbmNlIGluIGRlYnVnIGluZm8KICBhc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKICBsb2NhbCBjb3VudCA9IDAKICBsb2NhbCBmdW5jdGlvbiBmICgpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1ld2hhdCA9PSAiaG9vayIpCiAgICBsb2NhbCBzbmRsaW5lID0gc3RyaW5nLm1hdGNoKGRlYnVnLnRyYWNlYmFjaygpLCAiXG4oLi0pXG4iKQogICAgYXNzZXJ0KHN0cmluZy5maW5kKHNuZGxpbmUsICJob29rIikpCiAgICBjb3VudCA9IGNvdW50ICsgMQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwgImwiKQogIGxvY2FsIGEgPSAwCiAgX0VOVi5hID0gYQogIGEgPSAxCiAgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KGNvdW50ID09IDQpCmVuZAoKCmEgPSB7fTsgTCA9IG5pbApsb2NhbCBnbG9iID0gMQpsb2NhbCBvbGRnbG9iID0gZ2xvYgpkZWJ1Zy5zZXRob29rKGZ1bmN0aW9uIChlLGwpCiAgY29sbGVjdGdhcmJhZ2UoKSAgIC0tIGZvcmNlIEdDIGR1cmluZyBhIGhvb2sKICBsb2NhbCBmLCBtLCBjID0gZGVidWcuZ2V0aG9vaygpCiAgYXNzZXJ0KG0gPT0gJ2NybCcgYW5kIGMgPT0gMCkKICBpZiBlID09ICJsaW5lIiB0aGVuCiAgICBpZiBnbG9iIH49IG9sZGdsb2IgdGhlbgogICAgICBMID0gbC0xICAgLS0gZ2V0IHRoZSBmaXJzdCBsaW5lIHdoZXJlICJnbG9iIiBoYXMgY2hhbmdlZAogICAgICBvbGRnbG9iID0gZ2xvYgogICAgZW5kCiAgZWxzZWlmIGUgPT0gImNhbGwiIHRoZW4KICAgICAgbG9jYWwgZiA9IGRlYnVnLmdldGluZm8oMiwgImYiKS5mdW5jCiAgICAgIGFbZl0gPSAxCiAgZWxzZSBhc3NlcnQoZSA9PSAicmV0dXJuIikKICBlbmQKZW5kLCAiY3JsIikKCgpmdW5jdGlvbiBmKGEsYikKICBjb2xsZWN0Z2FyYmFnZSgpCiAgbG9jYWwgXywgeCA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCiAgbG9jYWwgXywgeSA9IGRlYnVnLmdldGxvY2FsKDEsIDIpCiAgYXNzZXJ0KHggPT0gYSBhbmQgeSA9PSBiKQogIGFzc2VydChkZWJ1Zy5zZXRsb2NhbCgyLCAzLCAicGVyYSIpID09ICJBQSIuLiJBQSIpCiAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIDQsICJtYefjIikgPT0gIkIiKQogIHggPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgYXNzZXJ0KHguZnVuYyA9PSBnIGFuZCB4LndoYXQgPT0gIkx1YSIgYW5kIHgubmFtZSA9PSAnZycgYW5kCiAgICAgICAgIHgubnVwcyA9PSAyIGFuZCBzdHJpbmcuZmluZCh4LnNvdXJjZSwgIl5ALipkYiUubHVhJCIpKQogIGdsb2IgPSBnbG9iKzEKICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMSkKICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMikKZW5kCgpmdW5jdGlvbiBmb28oKQogIGdsb2IgPSBnbG9iKzEKICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lID09IEwrMSkKZW5kOyBmb28oKSAgLS0gc2V0IEwKLS0gY2hlY2sgbGluZSBjb3VudGluZyBpbnNpZGUgc3RyaW5ncyBhbmQgZW1wdHkgbGluZXMKCl8gPSAnYWxvXAphbG8nIC4uIFtbCgpdXQotLVtbCl1dCmFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxMSkgIC0tIGNoZWNrIGNvdW50IG9mIGxpbmVzCgoKZnVuY3Rpb24gZyAoLi4uKQogIGxvY2FsIGFyZyA9IHsuLi59CiAgZG8gbG9jYWwgYSxiLGM7IGE9bWF0aC5zaW4oNDApOyBlbmQKICBsb2NhbCBmZWlqYW8KICBsb2NhbCBBQUFBLEIgPSAieHV4dSIsICJtYW3jbyIKICBmKEFBQUEsQikKICBhc3NlcnQoQUFBQSA9PSAicGVyYSIgYW5kIEIgPT0gIm1h5+MiKQogIGRvCiAgICAgbG9jYWwgQiA9IDEzCiAgICAgbG9jYWwgeCx5ID0gZGVidWcuZ2V0bG9jYWwoMSw1KQogICAgIGFzc2VydCh4ID09ICdCJyBhbmQgeSA9PSAxMykKICBlbmQKZW5kCgpnKCkKCgphc3NlcnQoYVtmXSBhbmQgYVtnXSBhbmQgYVthc3NlcnRdIGFuZCBhW2RlYnVnLmdldGxvY2FsXSBhbmQgbm90IGFbcHJpbnRdKQoKCi0tIHRlc3RzIGZvciBtYW5pcHVsYXRpbmcgbm9uLXJlZ2lzdGVyZWQgbG9jYWxzIChDIGFuZCBMdWEgdGVtcG9yYXJpZXMpCgpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMSkKYXNzZXJ0KHYgPT0gMCBhbmQgbiA9PSAiKEMgdGVtcG9yYXJ5KSIpCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAyKQphc3NlcnQodiA9PSAyIGFuZCBuID09ICIoQyB0ZW1wb3JhcnkpIikKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAzKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAwKSkKCmZ1bmN0aW9uIGYoKQogIGFzc2VydChzZWxlY3QoMiwgZGVidWcuZ2V0bG9jYWwoMiwzKSkgPT0gMSkKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDIsNCkpCiAgZGVidWcuc2V0bG9jYWwoMiwgMywgMTApCiAgcmV0dXJuIDIwCmVuZAoKZnVuY3Rpb24gZyhhLGIpIHJldHVybiAoYSsxKSArIGYoKSBlbmQKCmFzc2VydChnKDAsMCkgPT0gMzApCiAKCmRlYnVnLnNldGhvb2sobmlsKTsKYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCgoKLS0gbWluaW1hbCB0ZXN0cyBmb3Igc2V0dXNlcnZhbHVlL2dldHVzZXJ2YWx1ZQpkbwogIGFzc2VydChkZWJ1Zy5zZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKSA9PSBuaWwpCiAgbG9jYWwgYSwgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApCiAgYXNzZXJ0KGEgPT0gbmlsIGFuZCBub3QgYikKZW5kCgotLSB0ZXN0aW5nIGl0ZXJhY3Rpb24gYmV0d2VlbiBtdWx0aXBsZSB2YWx1ZXMgeCBob29rcwpkbwogIGxvY2FsIGZ1bmN0aW9uIGYoLi4uKSByZXR1cm4gMywgLi4uIGVuZAogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGEgPSB7fQogIGZvciBpID0gMSwgMTAwIGRvIGFbaV0gPSBpIGVuZAogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgY291bnQgPSBjb3VudCArIDEgZW5kLCAiIiwgMSkKICBsb2NhbCB0ID0ge3RhYmxlLnVucGFjayhhKX0KICBhc3NlcnQoI3QgPT0gMTAwKQogIHQgPSB7dGFibGUudW5wYWNrKGEsIDEsIDMpfQogIGFzc2VydCgjdCA9PSAzKQogIHQgPSB7Zih0YWJsZS51bnBhY2soYSwgMSwgMzApKX0KICBhc3NlcnQoI3QgPT0gMzEpCmVuZAoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cwoKbG9jYWwgZnVuY3Rpb24gY29sbGVjdGxvY2FscyAobGV2ZWwpCiAgbG9jYWwgdGFiID0ge30KICBmb3IgaSA9IDEsIG1hdGguaHVnZSBkbwogICAgbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKGxldmVsICsgMSwgaSkKICAgIGlmIG5vdCAobiBhbmQgc3RyaW5nLmZpbmQobiwgIl5bYS16QS1aMC05X10rJCIpKSB0aGVuCiAgICAgICBicmVhayAgIC0tIGNvbnNpZGVyIG9ubHkgcmVhbCB2YXJpYWJsZXMKICAgIGVuZAogICAgdGFiW25dID0gdgogIGVuZAogIHJldHVybiB0YWIKZW5kCgoKWCA9IG5pbAphID0ge30KZnVuY3Rpb24gYTpmIChhLCBiLCAuLi4pIGxvY2FsIGFyZyA9IHsuLi59OyBsb2NhbCBjID0gMTMgZW5kCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgYXNzZXJ0KGUgPT0gImNhbGwiKQogIGRvc3RyaW5nKCJYWCA9IDEyIikgIC0tIHRlc3QgZG9zdHJpbmcgaW5zaWRlIGhvb2tzCiAgLS0gdGVzdGluZyBlcnJvcnMgaW5zaWRlIGhvb2tzCiAgYXNzZXJ0KG5vdCBwY2FsbChsb2FkKCJhPSdqb2FvJysxIikpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpIAogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgImwiKS5jdXJyZW50bGluZSA9PSBsKQogICAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICAgIGFzc2VydChlID09ICJsaW5lIikKICAgIGFzc2VydChtID09ICdsJyBhbmQgYyA9PSAwKQogICAgZGVidWcuc2V0aG9vayhuaWwpICAtLSBob29rIGlzIGNhbGxlZCBvbmx5IG9uY2UKICAgIGFzc2VydChub3QgWCkgICAgICAgLS0gY2hlY2sgdGhhdAogICAgWCA9IGNvbGxlY3Rsb2NhbHMoMikKICBlbmQsICJsIikKZW5kLCAiYyIpCgphOmYoMSwyLDMsNCw1KQphc3NlcnQoWC5zZWxmID09IGEgYW5kIFguYSA9PSAxICAgYW5kIFguYiA9PSAyIGFuZCBYLmMgPT0gbmlsKQphc3NlcnQoWFggPT0gMTIpCmFzc2VydChkZWJ1Zy5nZXRob29rKCkgPT0gbmlsKQoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcyBpbiByZXR1cm4gaG9vayAoYnVnIGluIDUuMikKZG8KICBsb2NhbCBYID0gZmFsc2UKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCBiLCAuLi4pCiAgICBkbyBsb2NhbCB4LHkseiBlbmQKICAgIGxvY2FsIGMsIGQgPSAxMCwgMjAKICAgIHJldHVybgogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBhdXggKCkKICAgIGlmIGRlYnVnLmdldGluZm8oMikubmFtZSA9PSAiZm9vIiB0aGVuCiAgICAgIFggPSB0cnVlICAgLS0gdG8gc2lnbmFsIHRoYXQgaXQgZm91bmQgJ2ZvbycKICAgICAgbG9jYWwgdGFiID0ge2EgPSAxMDAsIGIgPSAyMDAsIGMgPSAxMCwgZCA9IDIwfQogICAgICBmb3IgbiwgdiBpbiBwYWlycyhjb2xsZWN0bG9jYWxzKDIpKSBkbwogICAgICAgIGFzc2VydCh0YWJbbl0gPT0gdikKICAgICAgICB0YWJbbl0gPSB1bmRlZgogICAgICBlbmQKICAgICAgYXNzZXJ0KG5leHQodGFiKSA9PSBuaWwpICAgIC0tICd0YWInIG11c3QgYmUgZW1wdHkKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGF1eCwgInIiKTsgZm9vKDEwMCwgMjAwKTsgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KFgpCgplbmQKCgpsb2NhbCBmdW5jdGlvbiBlcXNlcSAodDEsIHQyKQogIGFzc2VydCgjdDEgPT0gI3QyKQogIGZvciBpID0gMSwgI3QxIGRvCiAgICBhc3NlcnQodDFbaV0gPT0gdDJbaV0pCiAgZW5kCmVuZAoKCmRvICBwcmludCgidGVzdGluZyBpbnNwZWN0aW9uIG9mIHBhcmFtZXRlcnMvcmV0dXJuZWQgdmFsdWVzIikKICBsb2NhbCBvbiA9IGZhbHNlCiAgbG9jYWwgaW5wLCBvdXQKCiAgbG9jYWwgZnVuY3Rpb24gaG9vayAoZXZlbnQpCiAgICBpZiBub3Qgb24gdGhlbiByZXR1cm4gZW5kCiAgICBsb2NhbCBhciA9IGRlYnVnLmdldGluZm8oMiwgInJ1UyIpCiAgICBsb2NhbCB0ID0ge30KICAgIGZvciBpID0gYXIuZnRyYW5zZmVyLCBhci5mdHJhbnNmZXIgKyBhci5udHJhbnNmZXIgLSAxIGRvCiAgICAgIGxvY2FsIF8sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgyLCBpKQogICAgICB0WyN0ICsgMV0gPSB2IAogICAgZW5kCiAgICBpZiBldmVudCA9PSAicmV0dXJuIiB0aGVuCiAgICAgIG91dCA9IHQKICAgIGVsc2UKICAgICAgaW5wID0gdAogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soaG9vaywgImNyIikKCiAgb24gPSB0cnVlOyBtYXRoLnNpbigzKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezN9KTsgZXFzZXEob3V0LCB7bWF0aC5zaW4oMyl9KQoKICBvbiA9IHRydWU7IHNlbGVjdCgyLCAxMCwgMjAsIDMwLCA0MCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyLCAxMCwgMjAsIDMwLCA0MH0pOyBlcXNlcShvdXQsIHsyMCwgMzAsIDQwfSkKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pIHJldHVybiAuLi4gZW5kCiAgbG9jYWwgZnVuY3Rpb24gZm9vMSAoKSBvbiA9IG5vdCBvbjsgcmV0dXJuIGZvbygyMCwgMTAsIDApIGVuZAogIGZvbzEoKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIwfSk7IGVxc2VxKG91dCwgezEwLCAwfSkKCiAgZGVidWcuc2V0aG9vaygpCmVuZAoKCgotLSB0ZXN0aW5nIHVwdmFsdWUgYWNjZXNzCmxvY2FsIGZ1bmN0aW9uIGdldHVwdmFsdWVzIChmKQogIGxvY2FsIHQgPSB7fQogIGxvY2FsIGkgPSAxCiAgd2hpbGUgdHJ1ZSBkbwogICAgbG9jYWwgbmFtZSwgdmFsdWUgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIGkpCiAgICBpZiBub3QgbmFtZSB0aGVuIGJyZWFrIGVuZAogICAgYXNzZXJ0KG5vdCB0W25hbWVdKQogICAgdFtuYW1lXSA9IHZhbHVlCiAgICBpID0gaSArIDEKICBlbmQKICByZXR1cm4gdAplbmQKCmxvY2FsIGEsYixjID0gMSwyLDMKbG9jYWwgZnVuY3Rpb24gZm9vMSAoYSkgYiA9IGE7IHJldHVybiBjIGVuZApsb2NhbCBmdW5jdGlvbiBmb28yICh4KSBhID0geDsgcmV0dXJuIGMrYiBlbmQKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMCkpCmFzc2VydChub3QgZGVidWcuc2V0dXB2YWx1ZShmb28xLCAzLCAieHV4dSIpKQpsb2NhbCB0ID0gZ2V0dXB2YWx1ZXMoZm9vMSkKYXNzZXJ0KHQuYSA9PSBuaWwgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKdCA9IGdldHVwdmFsdWVzKGZvbzIpCmFzc2VydCh0LmEgPT0gMSBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmb28xLCAxLCAieHV4dSIpID09ICJiIikKYXNzZXJ0KCh7ZGVidWcuZ2V0dXB2YWx1ZShmb28yLCAzKX0pWzJdID09ICJ4dXh1IikKLS0gdXB2YWx1ZXMgb2YgQyBmdW5jdGlvbnMgYXJlIGFsbHdheXMgImNhbGxlZCIgIiIgKHRoZSBlbXB0eSBzdHJpbmcpCmFzc2VydChkZWJ1Zy5nZXR1cHZhbHVlKHN0cmluZy5nbWF0Y2goIngiLCAieCIpLCAxKSA9PSAiIikgIAoKCi0tIHRlc3RpbmcgY291bnQgaG9va3MKbG9jYWwgYT0wCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDEpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDEwMDAgPCBhIGFuZCBhIDwgMTAxMikKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMjUwIDwgYSBhbmQgYSA8IDI1NSkKbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKYXNzZXJ0KG0gPT0gIiIgYW5kIGMgPT0gNCkKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNDAwMCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoYSA9PSAwKQoKZG8KICBkZWJ1Zy5zZXRob29rKHByaW50LCAiIiwgMl4yNCAtIDEpICAgLS0gY291bnQgdXBwZXJib3VuZAogIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgYXNzZXJ0KCh7ZGVidWcuZ2V0aG9vaygpfSlbM10gPT0gMl4yNCAtIDEpCmVuZAoKZGVidWcuc2V0aG9vaygpCgoKLS0gdGVzdHMgZm9yIHRhaWwgY2FsbHMKbG9jYWwgZnVuY3Rpb24gZiAoeCkKICBpZiB4IHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJTIikud2hhdCA9PSAiTHVhIikKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgbG9jYWwgdGFpbCA9IGRlYnVnLmdldGluZm8oMikKICAgIGFzc2VydCh0YWlsLmZ1bmMgPT0gZzEgYW5kIHRhaWwuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMywgIlMiKS53aGF0ID09ICJtYWluIikKICAgIHByaW50IisiCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBnKHgpIHJldHVybiBmKHgpIGVuZAoKZnVuY3Rpb24gZzEoeCkgZyh4KSBlbmQKCmxvY2FsIGZ1bmN0aW9uIGggKHgpIGxvY2FsIGY9ZzE7IHJldHVybiBmKHgpIGVuZAoKaCh0cnVlKQoKbG9jYWwgYiA9IHt9CmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIHRhYmxlLmluc2VydChiLCBlKSBlbmQsICJjciIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQpsb2NhbCByZXMgPSB7InJldHVybiIsICAgLS0gZmlyc3QgcmV0dXJuIChmcm9tIHNldGhvb2spCiAgImNhbGwiLCAidGFpbCBjYWxsIiwgImNhbGwiLCAidGFpbCBjYWxsIiwKICAicmV0dXJuIiwgInJldHVybiIsCiAgImNhbGwiLCAgICAtLSBsYXN0IGNhbGwgKHRvIHNldGhvb2spCn0KZm9yIGkgPSAxLCAjcmVzIGRvIGFzc2VydChyZXNbaV0gPT0gdGFibGUucmVtb3ZlKGIsIDEpKSBlbmQKCmIgPSAwCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgICAgICAgICAgICAgICBpZiBlID09ICJ0YWlsIGNhbGwiIHRoZW4KICAgICAgICAgICAgICAgICAgYiA9IGIgKyAxCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICBlbmQsICJjIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmFzc2VydChiID09IDIpICAgLS0gdHdvIHRhaWwgY2FsbHMKCmxpbSA9IF9zb2Z0IGFuZCAzMDAwIG9yIDMwMDAwCmxvY2FsIGZ1bmN0aW9uIGZvbyAoeCkKICBpZiB4PT0wIHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIpLndoYXQgPT0gIm1haW4iKQogICAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChpbmZvLmlzdGFpbGNhbGwgPT0gdHJ1ZSBhbmQgaW5mby5mdW5jID09IGZvbykKICBlbHNlIHJldHVybiBmb28oeC0xKQogIGVuZAplbmQKCmZvbyhsaW0pCgoKcHJpbnQiKyIKCgotLSB0ZXN0aW5nIGxvY2FsIGZ1bmN0aW9uIGluZm9ybWF0aW9uCmNvID0gbG9hZFtbCiAgbG9jYWwgQSA9IGZ1bmN0aW9uICgpCiAgICByZXR1cm4geAogIGVuZAogIHJldHVybgpdXQoKbG9jYWwgYSA9IDAKLS0gJ0EnIHNob3VsZCBiZSB2aXNpYmxlIHRvIGRlYnVnZ2VyIG9ubHkgYWZ0ZXIgaXRzIGNvbXBsZXRlIGRlZmluaXRpb24KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkKICBpZiBsID09IDMgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiKHRlbXBvcmFyeSkiKQogIGVsc2VpZiBsID09IDQgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiQSIpCiAgZW5kCmVuZCwgImwiKQpjbygpICAtLSBydW4gbG9jYWwgZnVuY3Rpb24gZGVmaW5pdGlvbgpkZWJ1Zy5zZXRob29rKCkgIC0tIHR1cm4gb2ZmIGhvb2sKYXNzZXJ0KGEgPT0gMikgICAtLSBlbnN1cmUgYWxsIHR3byBsaW5lcyB3aGVyZSBob29rZWQKCi0tIHRlc3RpbmcgdHJhY2ViYWNrCgphc3NlcnQoZGVidWcudHJhY2ViYWNrKHByaW50KSA9PSBwcmludCkKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCwgNCkgPT0gcHJpbnQpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiwgNCksICJeaGlcbiIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiXmhpXG4iKSkKYXNzZXJ0KG5vdCBzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soImhpIiksICInZGVidWcudHJhY2ViYWNrJyIpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDApLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygpLCAiXnN0YWNrIHRyYWNlYmFjazpcbiIpKQoKZG8gIC0tIEMtZnVuY3Rpb24gbmFtZXMgaW4gdHJhY2ViYWNrCiAgbG9jYWwgc3QsIG1zZyA9IChmdW5jdGlvbiAoKSByZXR1cm4gcGNhbGwgZW5kKSgpKGRlYnVnLnRyYWNlYmFjaykKICBhc3NlcnQoc3QgPT0gdHJ1ZSBhbmQgc3RyaW5nLmZpbmQobXNnLCAicGNhbGwiKSkKZW5kCgoKLS0gdGVzdGluZyBucGFyYW1zLCBudXBzIGUgaXN2YXJhcmcKbG9jYWwgdCA9IGRlYnVnLmdldGluZm8ocHJpbnQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDAgYW5kIHQubnVwcyA9PSAwKQoKdCA9IGRlYnVnLmdldGluZm8oZnVuY3Rpb24gKGEsYixjKSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gZmFsc2UgYW5kIHQubnBhcmFtcyA9PSAzIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsLi4uKSByZXR1cm4gdFthXSBlbmQsICJ1IikKYXNzZXJ0KHQuaXN2YXJhcmcgPT0gdHJ1ZSBhbmQgdC5ucGFyYW1zID09IDIgYW5kIHQubnVwcyA9PSAxKQoKdCA9IGRlYnVnLmdldGluZm8oMSkgICAtLSBtYWluCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMSBhbmQKICAgICAgIGRlYnVnLmdldHVwdmFsdWUodC5mdW5jLCAxKSA9PSAiX0VOViIpCgoKCgotLSB0ZXN0aW5nIGRlYnVnZ2luZyBvZiBjb3JvdXRpbmVzCgpsb2NhbCBmdW5jdGlvbiBjaGVja3RyYWNlYmFjayAoY28sIHAsIGxldmVsKQogIGxvY2FsIHRiID0gZGVidWcudHJhY2ViYWNrKGNvLCBuaWwsIGxldmVsKQogIGxvY2FsIGkgPSAwCiAgZm9yIGwgaW4gc3RyaW5nLmdtYXRjaCh0YiwgIlteXG5dK1xuPyIpIGRvCiAgICBhc3NlcnQoaSA9PSAwIG9yIHN0cmluZy5maW5kKGwsIHBbaV0pKQogICAgaSA9IGkrMQogIGVuZAogIGFzc2VydChwW2ldID09IHVuZGVmKQplbmQKCgpsb2NhbCBmdW5jdGlvbiBmIChuKQogIGlmIG4gPiAwIHRoZW4gZihuLTEpCiAgZWxzZSBjb3JvdXRpbmUueWllbGQoKSBlbmQKZW5kCgpsb2NhbCBjbyA9IGNvcm91dGluZS5jcmVhdGUoZikKY29yb3V0aW5lLnJlc3VtZShjbywgMykKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIn0pCmNoZWNrdHJhY2ViYWNrKGNvLCB7ImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAxKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9LCAyKQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEifSwgNCkKY2hlY2t0cmFjZWJhY2soY28sIHt9LCA0MCkKCgpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpCiAgICAgICBsb2NhbCBhID0gMQogICAgICAgY29yb3V0aW5lLnlpZWxkKGRlYnVnLmdldGluZm8oMSwgImwiKSkKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUpCiAgICAgICByZXR1cm4gYQogICAgIGVuZCkKCmxvY2FsIHRyID0ge30KbG9jYWwgZm9vID0gZnVuY3Rpb24gKGUsIGwpIGlmIGwgdGhlbiB0YWJsZS5pbnNlcnQodHIsIGwpIGVuZCBlbmQKZGVidWcuc2V0aG9vayhjbywgZm9vLCAibGNyIikKCmxvY2FsIF8sIGwgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKbG9jYWwgeCA9IGRlYnVnLmdldGluZm8oY28sIDEsICJsZkxTIikKYXNzZXJ0KHguY3VycmVudGxpbmUgPT0gbC5jdXJyZW50bGluZSBhbmQgeC5hY3RpdmVsaW5lc1t4LmN1cnJlbnRsaW5lXSkKYXNzZXJ0KHR5cGUoeC5mdW5jKSA9PSAiZnVuY3Rpb24iKQpmb3IgaT14LmxpbmVkZWZpbmVkICsgMSwgeC5sYXN0bGluZWRlZmluZWQgZG8KICBhc3NlcnQoeC5hY3RpdmVsaW5lc1tpXSkKICB4LmFjdGl2ZWxpbmVzW2ldID0gdW5kZWYKZW5kCmFzc2VydChuZXh0KHguYWN0aXZlbGluZXMpID09IG5pbCkgICAtLSBubyAnZXh0cmEnIGVsZW1lbnRzCmFzc2VydChub3QgZGVidWcuZ2V0aW5mbyhjbywgMikpCmxvY2FsIGEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmEsYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAyKQphc3NlcnQoYSA9PSAiYSIgYW5kIGIgPT0gMSkKZGVidWcuc2V0bG9jYWwoY28sIDEsIDIsICJoaSIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydCgjdHIgPT0gMiBhbmQKICAgICAgIHRyWzFdID09IGwuY3VycmVudGxpbmUtMSBhbmQgdHJbMl0gPT0gbC5jdXJyZW50bGluZSkKCmEsYixjID0gcGNhbGwoY29yb3V0aW5lLnJlc3VtZSwgY28pCmFzc2VydChhIGFuZCBiIGFuZCBjID09IGwuY3VycmVudGxpbmUrMSkKY2hlY2t0cmFjZWJhY2soY28sIHsieWllbGQiLCAiaW4gZnVuY3Rpb24gPCJ9KQoKYSxiID0gY29yb3V0aW5lLnJlc3VtZShjbykKYXNzZXJ0KGEgYW5kIGIgPT0gImhpIikKYXNzZXJ0KCN0ciA9PSA0IGFuZCB0cls0XSA9PSBsLmN1cnJlbnRsaW5lKzIpCmFzc2VydChkZWJ1Zy5nZXRob29rKGNvKSA9PSBmb28pCmFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQpjaGVja3RyYWNlYmFjayhjbywge30pCgoKLS0gY2hlY2sgZ2V0L3NldGxvY2FsIGluIGNvcm91dGluZXMKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogIGxvY2FsIGEsIGIgPSBjb3JvdXRpbmUueWllbGQoeCkKICBhc3NlcnQoYSA9PSAxMDAgYW5kIGIgPT0gbmlsKQogIHJldHVybiB4CmVuZCkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwKQphc3NlcnQoYSBhbmQgYiA9PSAxMCkKYSwgYiA9IGRlYnVnLmdldGxvY2FsKGNvLCAxLCAxKQphc3NlcnQoYSA9PSAieCIgYW5kIGIgPT0gMTApCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIDEsIDUpKQphc3NlcnQoZGVidWcuc2V0bG9jYWwoY28sIDEsIDEsIDMwKSA9PSAieCIpCmFzc2VydChub3QgZGVidWcuc2V0bG9jYWwoY28sIDEsIDUsIDQwKSkKYSwgYiA9IGNvcm91dGluZS5yZXN1bWUoY28sIDEwMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMzApCgoKLS0gY2hlY2sgdHJhY2ViYWNrIG9mIHN1c3BlbmRlZCBjb3JvdXRpbmVzCgpmdW5jdGlvbiBmKGkpIGNvcm91dGluZS55aWVsZChpID09IDApOyBmKGkgLSAxKSBlbmQKCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkgZih4KSBlbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAzKQp0ID0geyInY29yb3V0aW5lLnlpZWxkJyIsICInZiciLCAiaW4gZnVuY3Rpb24gPCJ9CnJlcGVhdAogIGNoZWNrdHJhY2ViYWNrKGNvLCB0KQogIGEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvKQogIHRhYmxlLmluc2VydCh0LCAyLCAiJ2YnIikgICAtLSBvbmUgbW9yZSByZWN1cnNpdmUgY2FsbCB0byAnZicKdW50aWwgYgpjaGVja3RyYWNlYmFjayhjbywgdCkKCgotLSB0ZXN0IGFjZXNzaW5nIGxpbmUgbnVtYmVycyBvZiBhIGNvcm91dGluZSBmcm9tIGEgcmVzdW1lIGluc2lkZQotLSBhIEMgZnVuY3Rpb24gKHRoaXMgaXMgYSBrbm93biBidWcgaW4gTHVhIDUuMCkKCmxvY2FsIGZ1bmN0aW9uIGcoeCkKICAgIGNvcm91dGluZS55aWVsZCh4KQplbmQKCmxvY2FsIGZ1bmN0aW9uIGYgKGkpCiAgZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoKSBlbmQsICJsIikKICBmb3Igaj0xLDEwMDAgZG8KICAgIGcoaStqKQogIGVuZAplbmQKCmxvY2FsIGNvID0gY29yb3V0aW5lLndyYXAoZikKY28oMTApCnBjYWxsKGNvKQpwY2FsbChjbykKCgphc3NlcnQodHlwZShkZWJ1Zy5nZXRyZWdpc3RyeSgpKSA9PSAidGFibGUiKQoKCi0tIHRlc3QgdGFnbWV0aG9kIGluZm9ybWF0aW9uCmxvY2FsIGEgPSB7fQpsb2NhbCBmdW5jdGlvbiBmICh0KQogIGxvY2FsIGluZm8gPSBkZWJ1Zy5nZXRpbmZvKDEpOwogIGFzc2VydChpbmZvLm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICBhLm9wID0gaW5mby5uYW1lCiAgcmV0dXJuIGluZm8ubmFtZQplbmQKc2V0bWV0YXRhYmxlKGEsIHsKICBfX2luZGV4ID0gZjsgX19hZGQgPSBmOyBfX2RpdiA9IGY7IF9fbW9kID0gZjsgX19jb25jYXQgPSBmOyBfX3BvdyA9IGY7CiAgX19tdWwgPSBmOyBfX2lkaXYgPSBmOyBfX3VubSA9IGY7IF9fbGVuID0gZjsgX19zdWIgPSBmOwogIF9fc2hsID0gZjsgX19zaHIgPSBmOyBfX2JvciA9IGY7IF9fYnhvciA9IGY7CiAgX19lcSA9IGY7IF9fbGUgPSBmOyBfX2x0ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fYmFuZCA9IGY7CiAgX19ibm90ID0gZjsKfSkKCmxvY2FsIGIgPSBzZXRtZXRhdGFibGUoe30sIGdldG1ldGF0YWJsZShhKSkKCmFzc2VydChhWzNdID09ICJpbmRleCIgYW5kIGFeMyA9PSAicG93IiBhbmQgYS4uYSA9PSAiY29uY2F0IikKYXNzZXJ0KGEvMyA9PSAiZGl2IiBhbmQgMyVhID09ICJtb2QiKQphc3NlcnQoYSszID09ICJhZGQiIGFuZCAzLWEgPT0gInN1YiIgYW5kIGEqMyA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSYzID09ICJiYW5kIikKYXNzZXJ0KGEgKyAzMDAwMCA9PSAiYWRkIiBhbmQgYSAtIDMuMCA9PSAic3ViIiBhbmQgYSAqIDMuMCA9PSAibXVsIiBhbmQKICAgICAgIC1hID09ICJ1bm0iIGFuZCAjYSA9PSAibGVuIiBhbmQgYSAmIDMgPT0gImJhbmQiKQphc3NlcnQoYXwzID09ICJib3IiIGFuZCAzfmEgPT0gImJ4b3IiIGFuZCBhPDwzID09ICJzaGlmdCIgYW5kCiAgICAgICBhPj4xID09ICJzaGlmdCIpCmFzc2VydCAoYT09YiBhbmQgYS5vcCA9PSAiZXEiKQphc3NlcnQgKGE+PWIgYW5kIGEub3AgPT0gIm9yZGVyIikKYXNzZXJ0IChhPmIgYW5kIGEub3AgPT0gIm9yZGVyIikKYXNzZXJ0KH5hID09ICJibm90IikKCmRvICAgLS0gdGVzdGluZyBmb3ItaXRlcmF0b3IgbmFtZQogIGxvY2FsIGZ1bmN0aW9uIGYoKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMSkubmFtZSA9PSAiZm9yIGl0ZXJhdG9yIikKICBlbmQKCiAgZm9yIGkgaW4gZiBkbyBlbmQKZW5kCgoKZG8gICAtLSB0ZXN0aW5nIGRlYnVnIGluZm8gZm9yIGZpbmFsaXplcnMKICBsb2NhbCBuYW1lID0gbmlsCgogIC0tIGNyZWF0ZSBhIHBpZWNlIG9mIGdhcmJhZ2Ugd2l0aCBhIGZpbmFsaXplcgogIHNldG1ldGF0YWJsZSh7fSwge19fZ2MgPSBmdW5jdGlvbiAoKQogICAgbG9jYWwgdCA9IGRlYnVnLmdldGluZm8oMikgICAtLSBnZXQgY2FsbGVlIGluZm9ybWF0aW9uCiAgICBhc3NlcnQodC5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCiAgICBuYW1lID0gdC5uYW1lCiAgZW5kfSkKCiAgLS0gcmVwZWF0IHVudGlsIHByZXZpb3VzIGZpbmFsaXplciBydW5zIChzZXR0aW5nICduYW1lJykKICByZXBlYXQgbG9jYWwgYSA9IHt9IHVudGlsIG5hbWUKICBhc3NlcnQobmFtZSA9PSAiX19nYyIpCmVuZAoKCmRvCiAgcHJpbnQoInRlc3RpbmcgdHJhY2ViYWNrIHNpemVzIikKCiAgbG9jYWwgZnVuY3Rpb24gY291bnRsaW5lcyAocykKICAgIHJldHVybiBzZWxlY3QoMiwgc3RyaW5nLmdzdWIocywgIlxuIiwgIiIpKQogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBkZWVwIChsdmwsIG4pCiAgICBpZiBsdmwgPT0gMCB0aGVuCiAgICAgIHJldHVybiAoZGVidWcudHJhY2ViYWNrKCJtZXNzYWdlIiwgbikpCiAgICBlbHNlCiAgICAgIHJldHVybiAoZGVlcChsdmwtMSwgbikpCiAgICBlbmQKICBlbmQKCiAgbG9jYWwgZnVuY3Rpb24gY2hlY2tkZWVwICh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCBzID0gZGVlcCh0b3RhbCwgc3RhcnQpCiAgICBsb2NhbCByZXN0ID0gc3RyaW5nLm1hdGNoKHMsICJebWVzc2FnZVxuc3RhY2sgdHJhY2ViYWNrOlxuKC4qKSQiKQogICAgbG9jYWwgY2wgPSBjb3VudGxpbmVzKHJlc3QpCiAgICAtLSBhdCBtb3N0IDEwIGxpbmVzIGluIGZpcnN0IHBhcnQsIDExIGluIHNlY29uZCwgcGx1cyAnLi4uJwogICAgYXNzZXJ0KGNsIDw9IDEwICsgMTEgKyAxKQogICAgbG9jYWwgYnJrID0gc3RyaW5nLmZpbmQocmVzdCwgIiUuJS4lLiIpCiAgICBpZiBicmsgdGhlbiAgIC0tIGRvZXMgbWVzc2FnZSBoYXZlICcuLi4nPwogICAgICBsb2NhbCByZXN0MSA9IHN0cmluZy5zdWIocmVzdCwgMSwgYnJrKQogICAgICBsb2NhbCByZXN0MiA9IHN0cmluZy5zdWIocmVzdCwgYnJrLCAjcmVzdCkKICAgICAgYXNzZXJ0KGNvdW50bGluZXMocmVzdDEpID09IDEwIGFuZCBjb3VudGxpbmVzKHJlc3QyKSA9PSAxMSkKICAgIGVsc2UKICAgICAgYXNzZXJ0KGNsID09IHRvdGFsIC0gc3RhcnQgKyAyKQogICAgZW5kCiAgZW5kCgogIGZvciBkID0gMSwgNTEsIDEwIGRvCiAgICBmb3IgbCA9IDEsIGQgZG8KICAgICAgLS0gdXNlIGNvcm91dGluZXMgdG8gZW5zdXJlIGNvbXBsZXRlIGNvbnRyb2wgb2YgdGhlIHN0YWNrCiAgICAgIGNvcm91dGluZS53cmFwKGNoZWNrZGVlcCkoZCwgbCkKICAgIGVuZAogIGVuZAoKZW5kCgoKcHJpbnQoInRlc3RpbmcgZGVidWcgZnVuY3Rpb25zIG9uIGNodW5rIHdpdGhvdXQgZGVidWcgaW5mbyIpCnByb2cgPSBbWy0tIHByb2dyYW0gdG8gYmUgbG9hZGVkIHdpdGhvdXQgZGVidWcgaW5mb3JtYXRpb24KbG9jYWwgZGVidWcgPSByZXF1aXJlJ2RlYnVnJwpsb2NhbCBhID0gMTIgIC0tIGEgbG9jYWwgdmFyaWFibGUKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAxKQphc3NlcnQobiA9PSAiKHRlbXBvcmFyeSkiIGFuZCB2ID09IGRlYnVnKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQpuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKYXNzZXJ0KG4gPT0gIih0ZW1wb3JhcnkpIiBhbmQgdiA9PSAxMikgICAtLSB1bmtvd24gbmFtZSBidXQga25vd24gdmFsdWUKCi0tIGEgZnVuY3Rpb24gd2l0aCBhbiB1cHZhbHVlCmxvY2FsIGYgPSBmdW5jdGlvbiAoKSBsb2NhbCB4OyByZXR1cm4gYSBlbmQKbiwgdiA9IGRlYnVnLmdldHVwdmFsdWUoZiwgMSkKYXNzZXJ0KG4gPT0gIihubyBuYW1lKSIgYW5kIHYgPT0gMTIpCmFzc2VydChkZWJ1Zy5zZXR1cHZhbHVlKGYsIDEsIDEzKSA9PSAiKG5vIG5hbWUpIikKYXNzZXJ0KGEgPT0gMTMpCgpsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYsICJMIikuYWN0aXZlbGluZXMKYXNzZXJ0KG5leHQodCkgPT0gbmlsKSAgICAtLSBhY3RpdmUgbGluZXMgYXJlIGVtcHR5CgotLSBkdW1wL2xvYWQgYSBmdW5jdGlvbiB3aXRob3V0IGRlYnVnIGluZm8KZiA9IGxvYWQoc3RyaW5nLmR1bXAoZikpCgp0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnJldHVybiBhCl1dCgoKLS0gbG9hZCAncHJvZycgd2l0aG91dCBkZWJ1ZyBpbmZvCmxvY2FsIGYgPSBhc3NlcnQobG9hZChzdHJpbmcuZHVtcChsb2FkKHByb2cpLCB0cnVlKSkpCgphc3NlcnQoZigpID09IDEzKQoKZG8gICAtLSB0ZXN0cyBmb3IgJ3NvdXJjZScgaW4gYmluYXJ5IGR1bXBzCiAgbG9jYWwgcHJvZyA9IFtbCiAgICByZXR1cm4gZnVuY3Rpb24gKHgpCiAgICAgIHJldHVybiBmdW5jdGlvbiAoeSkgCiAgICAgICAgcmV0dXJuIHggKyB5CiAgICAgIGVuZAogICAgZW5kCiAgXV0KICBsb2NhbCBuYW1lID0gc3RyaW5nLnJlcCgieCIsIDEwMDApCiAgbG9jYWwgcCA9IGFzc2VydChsb2FkKHByb2csIG5hbWUpKQogIC0tIGxvYWQgJ3AnIGFzIGEgYmluYXJ5IGNodW5rIHdpdGggZGVidWcgaW5mb3JtYXRpb24KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCkKICBhc3NlcnQoI2MgPiAxMDAwIGFuZCAjYyA8IDIwMDApICAgLS0gbm8gcmVwZXRpdGlvbiBvZiAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzKQogIGFzc2VydChoKDUpID09IDgpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09IG5hbWUgYW5kICAgLS0gYWxsIGZ1bmN0aW9ucyBoYXZlICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09IG5hbWUgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSBuYW1lKQogIC0tIGFnYWluLCB3aXRob3V0IGRlYnVnIGluZm8KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCwgdHJ1ZSkKICBhc3NlcnQoI2MgPCA1MDApICAgLS0gbm8gJ3NvdXJjZScgaW4gZHVtcAogIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKICBsb2NhbCBnID0gZigpCiAgbG9jYWwgaCA9IGcoMzApCiAgYXNzZXJ0KGgoNTApID09IDgwKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSAnPT8nIGFuZCAgIC0tIG5vIGZ1bmN0aW9uIGhhcyAnc291cmNlJwogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGcpLnNvdXJjZSA9PSAnPT8nIGFuZCAKICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gJz0/JykKZW5kCgpwcmludCJPSyIKCg==