LS0gJElkOiB0ZXN0ZXMvZGIubHVhICQKLS0gU2VlIENvcHlyaWdodCBOb3RpY2UgaW4gZmlsZSBhbGwubHVhCgotLSB0ZXN0aW5nIGRlYnVnIGxpYnJhcnkKCmxvY2FsIGRlYnVnID0gcmVxdWlyZSAiZGVidWciCgpsb2NhbCBmdW5jdGlvbiBkb3N0cmluZyhzKSByZXR1cm4gYXNzZXJ0KGxvYWQocykpKCkgZW5kCgpwcmludCJ0ZXN0aW5nIGRlYnVnIGxpYnJhcnkgYW5kIGRlYnVnIGluZm9ybWF0aW9uIgoKZG8KbG9jYWwgYT0xCmVuZAoKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRob29rKCkpCgpsb2NhbCB0ZXN0bGluZSA9IDE5ICAgICAgICAgLS0gbGluZSB3aGVyZSAndGVzdCcgaXMgZGVmaW5lZApmdW5jdGlvbiB0ZXN0IChzLCBsLCBwKSAgICAgLS0gdGhpcyBtdXN0IGJlIGxpbmUgMTkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gYXZvaWQgZ2MgZHVyaW5nIHRyYWNlCiAgbG9jYWwgZnVuY3Rpb24gZiAoZXZlbnQsIGxpbmUpCiAgICBhc3NlcnQoZXZlbnQgPT0gJ2xpbmUnKQogICAgbG9jYWwgbCA9IHRhYmxlLnJlbW92ZShsLCAxKQogICAgaWYgcCB0aGVuIHByaW50KGwsIGxpbmUpIGVuZAogICAgYXNzZXJ0KGwgPT0gbGluZSwgIndyb25nIHRyYWNlISEiKQogIGVuZAogIGRlYnVnLnNldGhvb2soZiwibCIpOyBsb2FkKHMpKCk7IGRlYnVnLnNldGhvb2soKQogIGFzc2VydCgjbCA9PSAwKQplbmQKCgpkbwogIGFzc2VydChub3QgcGNhbGwoZGVidWcuZ2V0aW5mbywgcHJpbnQsICJYIikpICAgLS0gaW52YWxpZCBvcHRpb24KICBhc3NlcnQobm90IGRlYnVnLmdldGluZm8oMTAwMCkpICAgLS0gb3V0IG9mIHJhbmdlIGxldmVsCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRpbmZvKC0xKSkgICAgIC0tIG91dCBvZiByYW5nZSBsZXZlbAogIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKHByaW50KQogIGFzc2VydChhLndoYXQgPT0gIkMiIGFuZCBhLnNob3J0X3NyYyA9PSAiW0NdIikKICBhID0gZGVidWcuZ2V0aW5mbyhwcmludCwgIkwiKQogIGFzc2VydChhLmFjdGl2ZWxpbmVzID09IG5pbCkKICBsb2NhbCBiID0gZGVidWcuZ2V0aW5mbyh0ZXN0LCAiU2ZMIikKICBhc3NlcnQoYi5uYW1lID09IG5pbCBhbmQgYi53aGF0ID09ICJMdWEiIGFuZCBiLmxpbmVkZWZpbmVkID09IHRlc3RsaW5lIGFuZAogICAgICAgICBiLmxhc3RsaW5lZGVmaW5lZCA9PSBiLmxpbmVkZWZpbmVkICsgMTAgYW5kCiAgICAgICAgIGIuZnVuYyA9PSB0ZXN0IGFuZCBub3Qgc3RyaW5nLmZpbmQoYi5zaG9ydF9zcmMsICIlWyIpKQogIGFzc2VydChiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWQgKyAxXSBhbmQKICAgICAgICAgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZF0pCiAgYXNzZXJ0KG5vdCBiLmFjdGl2ZWxpbmVzW2IubGluZWRlZmluZWRdIGFuZAogICAgICAgICBub3QgYi5hY3RpdmVsaW5lc1tiLmxhc3RsaW5lZGVmaW5lZCArIDFdKQplbmQKCgotLSB0ZXN0IGZpbGUgYW5kIHN0cmluZyBuYW1lcyB0cnVuY2F0aW9uCmEgPSAiZnVuY3Rpb24gZiAoKSBlbmQiCmxvY2FsIGZ1bmN0aW9uIGRvc3RyaW5nIChzLCB4KSByZXR1cm4gbG9hZChzLCB4KSgpIGVuZApkb3N0cmluZyhhKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gc3RyaW5nLmZvcm1hdCgnW3N0cmluZyAiJXMiXScsIGEpKQpkb3N0cmluZyhhLi5zdHJpbmcuZm9ybWF0KCI7ICVzXG49MSIsIHN0cmluZy5yZXAoJ3AnLCA0MDApKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLmdldGluZm8oZikuc2hvcnRfc3JjLCAnXiVbc3RyaW5nIFteXG5dKiUuJS4lLiIlXSQnKSkKZG9zdHJpbmcoYS4uc3RyaW5nLmZvcm1hdCgiOyAlcz0xIiwgc3RyaW5nLnJlcCgncCcsIDQwMCkpKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICdeJVtzdHJpbmcgW15cbl0qJS4lLiUuIiVdJCcpKQpkb3N0cmluZygiXG4iLi5hKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gJ1tzdHJpbmcgIi4uLiJdJykKZG9zdHJpbmcoYSwgIiIpCmFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYyA9PSAnW3N0cmluZyAiIl0nKQpkb3N0cmluZyhhLCAiQHh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCAiQCIuLnN0cmluZy5yZXAoJ3AnLCAxMDAwKS4uJ3QnKQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMsICJeJS4lLiUucCp0JCIpKQpkb3N0cmluZyhhLCAiPXh1eHUiKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gInh1eHUiKQpkb3N0cmluZyhhLCBzdHJpbmcuZm9ybWF0KCI9JXMiLCBzdHJpbmcucmVwKCd4JywgNTAwKSkpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy5nZXRpbmZvKGYpLnNob3J0X3NyYywgIl54KiQiKSkKZG9zdHJpbmcoYSwgIj0iKQphc3NlcnQoZGVidWcuZ2V0aW5mbyhmKS5zaG9ydF9zcmMgPT0gIiIpCmEgPSBuaWw7IGYgPSBuaWw7CgoKcmVwZWF0CiAgbG9jYWwgZyA9IHt4ID0gZnVuY3Rpb24gKCkKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDIpCiAgICBhc3NlcnQoYS5uYW1lID09ICdmJyBhbmQgYS5uYW1ld2hhdCA9PSAnbG9jYWwnKQogICAgYSA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChhLm5hbWUgPT0gJ3gnIGFuZCBhLm5hbWV3aGF0ID09ICdmaWVsZCcpCiAgICByZXR1cm4gJ3hpeGknCiAgZW5kfQogIGxvY2FsIGYgPSBmdW5jdGlvbiAoKSByZXR1cm4gMSsxIGFuZCAobm90IDEgb3IgZy54KCkpIGVuZAogIGFzc2VydChmKCkgPT0gJ3hpeGknKQogIGcgPSBkZWJ1Zy5nZXRpbmZvKGYpCiAgYXNzZXJ0KGcud2hhdCA9PSAiTHVhIiBhbmQgZy5mdW5jID09IGYgYW5kIGcubmFtZXdoYXQgPT0gIiIgYW5kIG5vdCBnLm5hbWUpCgogIGZ1bmN0aW9uIGYgKHgsIG5hbWUpICAgLS0gbG9jYWwhCiAgICBuYW1lID0gbmFtZSBvciAnZicKICAgIGxvY2FsIGEgPSBkZWJ1Zy5nZXRpbmZvKDEpCiAgICBhc3NlcnQoYS5uYW1lID09IG5hbWUgYW5kIGEubmFtZXdoYXQgPT0gJ2xvY2FsJykKICAgIHJldHVybiB4CiAgZW5kCgogIC0tIGJyZWFrcyBpbiBkaWZmZXJlbnQgY29uZGl0aW9ucwogIGlmIDM+NCB0aGVuIGJyZWFrIGVuZDsgZigpCiAgaWYgMzw0IHRoZW4gYT0xIGVsc2UgYnJlYWsgZW5kOyBmKCkKICB3aGlsZSAxIGRvIGxvY2FsIHg9MTA7IGJyZWFrIGVuZDsgZigpCiAgbG9jYWwgYiA9IDEKICBpZiAzPjQgdGhlbiByZXR1cm4gbWF0aC5zaW4oMSkgZW5kOyBmKCkKICBhID0gMzw0OyBmKCkKICBhID0gMzw0IG9yIDE7IGYoKQogIHJlcGVhdCBsb2NhbCB4PTIwOyBpZiA0PjMgdGhlbiBmKCkgZWxzZSBicmVhayBlbmQ7IGYoKSB1bnRpbCAxCiAgZyA9IHt9CiAgZihnKS54ID0gZigyKSBhbmQgZigxMCkrZig5KQogIGFzc2VydChnLnggPT0gZigxOSkpCiAgZnVuY3Rpb24gZyh4KSBpZiBub3QgeCB0aGVuIHJldHVybiAzIGVuZCByZXR1cm4gKHgoJ2EnLCAneCcpKSBlbmQKICBhc3NlcnQoZyhmKSA9PSAnYScpCnVudGlsIDEKCnRlc3QoW1tpZgptYXRoLnNpbigxKQp0aGVuCiAgYT0xCmVsc2UKICBhPTIKZW5kCl1dLCB7MiwzLDQsN30pCgp0ZXN0KFtbLS0KaWYgbmlsIHRoZW4KICBhPTEKZWxzZQogIGE9MgplbmQKXV0sIHsyLDUsNn0pCgp0ZXN0KFtbYT0xCnJlcGVhdAogIGE9YSsxCnVudGlsIGE9PTMKXV0sIHsxLDMsNCwzLDR9KQoKdGVzdChbWyBkbwogIHJldHVybgplbmQKXV0sIHsyfSkKCnRlc3QoW1tsb2NhbCBhCmE9MQp3aGlsZSBhPD0zIGRvCiAgYT1hKzEKZW5kCl1dLCB7MSwyLDMsNCwzLDQsMyw0LDMsNX0pCgp0ZXN0KFtbd2hpbGUgbWF0aC5zaW4oMSkgZG8KICBpZiBtYXRoLnNpbigxKQogIHRoZW4gYnJlYWsKICBlbmQKZW5kCmE9MV1dLCB7MSwyLDMsNn0pCgp0ZXN0KFtbZm9yIGk9MSwzIGRvCiAgYT1pCmVuZApdXSwgezEsMiwxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGksdiBpbiBwYWlyc3snYScsJ2InfSBkbwogIGE9dG9zdHJpbmcoaSkgLi4gdgplbmQKXV0sIHsxLDIsMSwyLDEsM30pCgp0ZXN0KFtbZm9yIGk9MSw0IGRvIGE9MSBlbmRdXSwgezEsMSwxLDEsMX0pCgoKZG8gICAtLSB0ZXN0aW5nIGxpbmUgaW5mby90cmFjZSB3aXRoIGxhcmdlIGdhcHMgaW4gc291cmNlCgogIGxvY2FsIGEgPSB7MSwgMiwgMywgMTAsIDEyNCwgMTI1LCAxMjYsIDEyNywgMTI4LCAxMjksIDEzMCwKICAgICAgICAgICAgIDI1NSwgMjU2LCAyNTcsIDUwMCwgMTAwMH0KICBsb2NhbCBzID0gW1sKICAgICBsb2NhbCBiID0gezEwfQogICAgIGEgPSBiWzFdIFggKyBZIGJbMV0KICAgICBiID0gNAogIF1dCiAgZm9yIF8sIGkgaW4gaXBhaXJzKGEpIGRvCiAgICBsb2NhbCBzdWJzID0ge1ggPSBzdHJpbmcucmVwKCJcbiIsIGkpfQogICAgZm9yIF8sIGogaW4gaXBhaXJzKGEpIGRvCiAgICAgIHN1YnMuWSA9IHN0cmluZy5yZXAoIlxuIiwgaikKICAgICAgbG9jYWwgcyA9IHN0cmluZy5nc3ViKHMsICJbWFldIiwgc3VicykKICAgICAgdGVzdChzLCB7MSwgMiArIGksIDIgKyBpICsgaiwgMiArIGksIDIgKyBpICsgaiwgMyArIGkgKyBqfSkKICAgIGVuZAogIGVuZAplbmQKCnByaW50JysnCgotLSBpbnZhbGlkIGxldmVscyBpbiBbZ3NdZXRsb2NhbAphc3NlcnQobm90IHBjYWxsKGRlYnVnLmdldGxvY2FsLCAyMCwgMSkpCmFzc2VydChub3QgcGNhbGwoZGVidWcuc2V0bG9jYWwsIC0xLCAxLCAxMCkpCgoKLS0gcGFyYW1ldGVyIG5hbWVzCmxvY2FsIGZ1bmN0aW9uIGZvbyAoYSxiLC4uLikgbG9jYWwgZCwgZSBlbmQKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZvbykKCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChmb28sIDEpID09ICdhJykKYXNzZXJ0KGRlYnVnLmdldGxvY2FsKGZvbywgMikgPT0gJ2InKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGZvbywgMykpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAxKSA9PSAnYScpCmFzc2VydChkZWJ1Zy5nZXRsb2NhbChjbywgZm9vLCAyKSA9PSAnYicpCmFzc2VydChub3QgZGVidWcuZ2V0bG9jYWwoY28sIGZvbywgMykpCgphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKHByaW50LCAxKSkKCgpsb2NhbCBmdW5jdGlvbiBmb28gKCkgcmV0dXJuIChkZWJ1Zy5nZXRsb2NhbCgxLCAtMSkpIGVuZAphc3NlcnQobm90IGZvbygxMCkpCgoKLS0gdmFyYXJncwpsb2NhbCBmdW5jdGlvbiBmb28gKGEsIC4uLikKICBsb2NhbCB0ID0gdGFibGUucGFjayguLi4pCiAgZm9yIGkgPSAxLCB0Lm4gZG8KICAgIGxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgxLCAtaSkKICAgIGFzc2VydChuID09ICIoKnZhcmFyZykiIGFuZCB2ID09IHRbaV0pCiAgZW5kCiAgYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgxLCAtKHQubiArIDEpKSkKICBhc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKDEsIC0odC5uICsgMSksIDMwKSkKICBpZiB0Lm4gPiAwIHRoZW4KICAgIChmdW5jdGlvbiAoeCkKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC0xLCB4KSA9PSAiKCp2YXJhcmcpIikKICAgICAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIC10Lm4sIHgpID09ICIoKnZhcmFyZykiKQogICAgIGVuZCkoNDMwKQogICAgIGFzc2VydCguLi4gPT0gNDMwKQogIGVuZAplbmQKCmZvbygpCmZvbyhwcmludCkKZm9vKDIwMCwgMywgNCkKbG9jYWwgYSA9IHt9CmZvciBpID0gMSwgKF9zb2Z0IGFuZCAxMDAgb3IgMTAwMCkgZG8gYVtpXSA9IGkgZW5kCmZvbyh0YWJsZS51bnBhY2soYSkpCmEgPSBuaWwKCgoKZG8gICAtLSB0ZXN0IGhvb2sgcHJlc2VuY2UgaW4gZGVidWcgaW5mbwogIGFzc2VydChub3QgZGVidWcuZ2V0aG9vaygpKQogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGZ1bmN0aW9uIGYgKCkKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEpLm5hbWV3aGF0ID09ICJob29rIikKICAgIGxvY2FsIHNuZGxpbmUgPSBzdHJpbmcubWF0Y2goZGVidWcudHJhY2ViYWNrKCksICJcbiguLSlcbiIpCiAgICBhc3NlcnQoc3RyaW5nLmZpbmQoc25kbGluZSwgImhvb2siKSkKICAgIGNvdW50ID0gY291bnQgKyAxCiAgZW5kCiAgZGVidWcuc2V0aG9vayhmLCAibCIpCiAgbG9jYWwgYSA9IDAKICBfRU5WLmEgPSBhCiAgYSA9IDEKICBkZWJ1Zy5zZXRob29rKCkKICBhc3NlcnQoY291bnQgPT0gNCkKZW5kCgoKYSA9IHt9OyBMID0gbmlsCmxvY2FsIGdsb2IgPSAxCmxvY2FsIG9sZGdsb2IgPSBnbG9iCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsbCkKICBjb2xsZWN0Z2FyYmFnZSgpICAgLS0gZm9yY2UgR0MgZHVyaW5nIGEgaG9vawogIGxvY2FsIGYsIG0sIGMgPSBkZWJ1Zy5nZXRob29rKCkKICBhc3NlcnQobSA9PSAnY3JsJyBhbmQgYyA9PSAwKQogIGlmIGUgPT0gImxpbmUiIHRoZW4KICAgIGlmIGdsb2Igfj0gb2xkZ2xvYiB0aGVuCiAgICAgIEwgPSBsLTEgICAtLSBnZXQgdGhlIGZpcnN0IGxpbmUgd2hlcmUgImdsb2IiIGhhcyBjaGFuZ2VkCiAgICAgIG9sZGdsb2IgPSBnbG9iCiAgICBlbmQKICBlbHNlaWYgZSA9PSAiY2FsbCIgdGhlbgogICAgICBsb2NhbCBmID0gZGVidWcuZ2V0aW5mbygyLCAiZiIpLmZ1bmMKICAgICAgYVtmXSA9IDEKICBlbHNlIGFzc2VydChlID09ICJyZXR1cm4iKQogIGVuZAplbmQsICJjcmwiKQoKCmZ1bmN0aW9uIGYoYSxiKQogIGNvbGxlY3RnYXJiYWdlKCkKICBsb2NhbCBfLCB4ID0gZGVidWcuZ2V0bG9jYWwoMSwgMSkKICBsb2NhbCBfLCB5ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKICBhc3NlcnQoeCA9PSBhIGFuZCB5ID09IGIpCiAgYXNzZXJ0KGRlYnVnLnNldGxvY2FsKDIsIDMsICJwZXJhIikgPT0gIkFBIi4uIkFBIikKICBhc3NlcnQoZGVidWcuc2V0bG9jYWwoMiwgNCwgIm1h5+MiKSA9PSAiQiIpCiAgeCA9IGRlYnVnLmdldGluZm8oMikKICBhc3NlcnQoeC5mdW5jID09IGcgYW5kIHgud2hhdCA9PSAiTHVhIiBhbmQgeC5uYW1lID09ICdnJyBhbmQKICAgICAgICAgeC5udXBzID09IDIgYW5kIHN0cmluZy5maW5kKHguc291cmNlLCAiXkAuKmRiJS5sdWEkIikpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsyKQplbmQKCmZ1bmN0aW9uIGZvbygpCiAgZ2xvYiA9IGdsb2IrMQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJsIikuY3VycmVudGxpbmUgPT0gTCsxKQplbmQ7IGZvbygpICAtLSBzZXQgTAotLSBjaGVjayBsaW5lIGNvdW50aW5nIGluc2lkZSBzdHJpbmdzIGFuZCBlbXB0eSBsaW5lcwoKXyA9ICdhbG9cCmFsbycgLi4gW1sKCl1dCi0tW1sKXV0KYXNzZXJ0KGRlYnVnLmdldGluZm8oMSwgImwiKS5jdXJyZW50bGluZSA9PSBMKzExKSAgLS0gY2hlY2sgY291bnQgb2YgbGluZXMKCgpmdW5jdGlvbiBnICguLi4pCiAgbG9jYWwgYXJnID0gey4uLn0KICBkbyBsb2NhbCBhLGIsYzsgYT1tYXRoLnNpbig0MCk7IGVuZAogIGxvY2FsIGZlaWphbwogIGxvY2FsIEFBQUEsQiA9ICJ4dXh1IiwgIm1hbeNvIgogIGYoQUFBQSxCKQogIGFzc2VydChBQUFBID09ICJwZXJhIiBhbmQgQiA9PSAibWHn4yIpCiAgZG8KICAgICBsb2NhbCBCID0gMTMKICAgICBsb2NhbCB4LHkgPSBkZWJ1Zy5nZXRsb2NhbCgxLDUpCiAgICAgYXNzZXJ0KHggPT0gJ0InIGFuZCB5ID09IDEzKQogIGVuZAplbmQKCmcoKQoKCmFzc2VydChhW2ZdIGFuZCBhW2ddIGFuZCBhW2Fzc2VydF0gYW5kIGFbZGVidWcuZ2V0bG9jYWxdIGFuZCBub3QgYVtwcmludF0pCgoKLS0gdGVzdHMgZm9yIG1hbmlwdWxhdGluZyBub24tcmVnaXN0ZXJlZCBsb2NhbHMgKEMgYW5kIEx1YSB0ZW1wb3JhcmllcykKCmxvY2FsIG4sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgwLCAxKQphc3NlcnQodiA9PSAwIGFuZCBuID09ICIoKnRlbXBvcmFyeSkiKQpsb2NhbCBuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMCwgMikKYXNzZXJ0KHYgPT0gMiBhbmQgbiA9PSAiKCp0ZW1wb3JhcnkpIikKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAzKSkKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXRsb2NhbCgwLCAwKSkKCmZ1bmN0aW9uIGYoKQogIGFzc2VydChzZWxlY3QoMiwgZGVidWcuZ2V0bG9jYWwoMiwzKSkgPT0gMSkKICBhc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKDIsNCkpCiAgZGVidWcuc2V0bG9jYWwoMiwgMywgMTApCiAgcmV0dXJuIDIwCmVuZAoKZnVuY3Rpb24gZyhhLGIpIHJldHVybiAoYSsxKSArIGYoKSBlbmQKCmFzc2VydChnKDAsMCkgPT0gMzApCiAKCmRlYnVnLnNldGhvb2sobmlsKTsKYXNzZXJ0KGRlYnVnLmdldGhvb2soKSA9PSBuaWwpCgoKLS0gbWluaW1hbCB0ZXN0cyBmb3Igc2V0dXNlcnZhbHVlL2dldHVzZXJ2YWx1ZQpkbwogIGFzc2VydChkZWJ1Zy5zZXR1c2VydmFsdWUoaW8uc3RkaW4sIDEwKSA9PSBuaWwpCiAgbG9jYWwgYSwgYiA9IGRlYnVnLmdldHVzZXJ2YWx1ZShpby5zdGRpbiwgMTApCiAgYXNzZXJ0KGEgPT0gbmlsIGFuZCBub3QgYikKZW5kCgotLSB0ZXN0aW5nIGl0ZXJhY3Rpb24gYmV0d2VlbiBtdWx0aXBsZSB2YWx1ZXMgeCBob29rcwpkbwogIGxvY2FsIGZ1bmN0aW9uIGYoLi4uKSByZXR1cm4gMywgLi4uIGVuZAogIGxvY2FsIGNvdW50ID0gMAogIGxvY2FsIGEgPSB7fQogIGZvciBpID0gMSwgMTAwIGRvIGFbaV0gPSBpIGVuZAogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgY291bnQgPSBjb3VudCArIDEgZW5kLCAiIiwgMSkKICBsb2NhbCB0ID0ge3RhYmxlLnVucGFjayhhKX0KICBhc3NlcnQoI3QgPT0gMTAwKQogIHQgPSB7dGFibGUudW5wYWNrKGEsIDEsIDMpfQogIGFzc2VydCgjdCA9PSAzKQogIHQgPSB7Zih0YWJsZS51bnBhY2soYSwgMSwgMzApKX0KICBhc3NlcnQoI3QgPT0gMzEpCmVuZAoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGZ1bmN0aW9uIGFyZ3VtZW50cwoKbG9jYWwgZnVuY3Rpb24gY29sbGVjdGxvY2FscyAobGV2ZWwpCiAgbG9jYWwgdGFiID0ge30KICBmb3IgaSA9IDEsIG1hdGguaHVnZSBkbwogICAgbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKGxldmVsICsgMSwgaSkKICAgIGlmIG5vdCAobiBhbmQgc3RyaW5nLmZpbmQobiwgIl5bYS16QS1aMC05X10rJCIpKSB0aGVuCiAgICAgICBicmVhayAgIC0tIGNvbnNpZGVyIG9ubHkgcmVhbCB2YXJpYWJsZXMKICAgIGVuZAogICAgdGFiW25dID0gdgogIGVuZAogIHJldHVybiB0YWIKZW5kCgoKWCA9IG5pbAphID0ge30KZnVuY3Rpb24gYTpmIChhLCBiLCAuLi4pIGxvY2FsIGFyZyA9IHsuLi59OyBsb2NhbCBjID0gMTMgZW5kCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgYXNzZXJ0KGUgPT0gImNhbGwiKQogIGRvc3RyaW5nKCJYWCA9IDEyIikgIC0tIHRlc3QgZG9zdHJpbmcgaW5zaWRlIGhvb2tzCiAgLS0gdGVzdGluZyBlcnJvcnMgaW5zaWRlIGhvb2tzCiAgYXNzZXJ0KG5vdCBwY2FsbChsb2FkKCJhPSdqb2FvJysxIikpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUsIGwpIAogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMiwgImwiKS5jdXJyZW50bGluZSA9PSBsKQogICAgbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKICAgIGFzc2VydChlID09ICJsaW5lIikKICAgIGFzc2VydChtID09ICdsJyBhbmQgYyA9PSAwKQogICAgZGVidWcuc2V0aG9vayhuaWwpICAtLSBob29rIGlzIGNhbGxlZCBvbmx5IG9uY2UKICAgIGFzc2VydChub3QgWCkgICAgICAgLS0gY2hlY2sgdGhhdAogICAgWCA9IGNvbGxlY3Rsb2NhbHMoMikKICBlbmQsICJsIikKZW5kLCAiYyIpCgphOmYoMSwyLDMsNCw1KQphc3NlcnQoWC5zZWxmID09IGEgYW5kIFguYSA9PSAxICAgYW5kIFguYiA9PSAyIGFuZCBYLmMgPT0gbmlsKQphc3NlcnQoWFggPT0gMTIpCmFzc2VydChkZWJ1Zy5nZXRob29rKCkgPT0gbmlsKQoKCi0tIHRlc3RpbmcgYWNjZXNzIHRvIGxvY2FsIHZhcmlhYmxlcyBpbiByZXR1cm4gaG9vayAoYnVnIGluIDUuMikKZG8KICBsb2NhbCBYID0gZmFsc2UKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCBiLCAuLi4pCiAgICBkbyBsb2NhbCB4LHkseiBlbmQKICAgIGxvY2FsIGMsIGQgPSAxMCwgMjAKICAgIHJldHVybgogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBhdXggKCkKICAgIGlmIGRlYnVnLmdldGluZm8oMikubmFtZSA9PSAiZm9vIiB0aGVuCiAgICAgIFggPSB0cnVlICAgLS0gdG8gc2lnbmFsIHRoYXQgaXQgZm91bmQgJ2ZvbycKICAgICAgbG9jYWwgdGFiID0ge2EgPSAxMDAsIGIgPSAyMDAsIGMgPSAxMCwgZCA9IDIwfQogICAgICBmb3IgbiwgdiBpbiBwYWlycyhjb2xsZWN0bG9jYWxzKDIpKSBkbwogICAgICAgIGFzc2VydCh0YWJbbl0gPT0gdikKICAgICAgICB0YWJbbl0gPSB1bmRlZgogICAgICBlbmQKICAgICAgYXNzZXJ0KG5leHQodGFiKSA9PSBuaWwpICAgIC0tICd0YWInIG11c3QgYmUgZW1wdHkKICAgIGVuZAogIGVuZAoKICBkZWJ1Zy5zZXRob29rKGF1eCwgInIiKTsgZm9vKDEwMCwgMjAwKTsgZGVidWcuc2V0aG9vaygpCiAgYXNzZXJ0KFgpCgplbmQKCgpsb2NhbCBmdW5jdGlvbiBlcXNlcSAodDEsIHQyKQogIGFzc2VydCgjdDEgPT0gI3QyKQogIGZvciBpID0gMSwgI3QxIGRvCiAgICBhc3NlcnQodDFbaV0gPT0gdDJbaV0pCiAgZW5kCmVuZAoKCmRvICBwcmludCgidGVzdGluZyBpbnNwZWN0aW9uIG9mIHBhcmFtZXRlcnMvcmV0dXJuZWQgdmFsdWVzIikKICBsb2NhbCBvbiA9IGZhbHNlCiAgbG9jYWwgaW5wLCBvdXQKCiAgbG9jYWwgZnVuY3Rpb24gaG9vayAoZXZlbnQpCiAgICBpZiBub3Qgb24gdGhlbiByZXR1cm4gZW5kCiAgICBsb2NhbCBhciA9IGRlYnVnLmdldGluZm8oMiwgInJ1UyIpCiAgICBsb2NhbCB0ID0ge30KICAgIGZvciBpID0gYXIuZnRyYW5zZmVyLCBhci5mdHJhbnNmZXIgKyBhci5udHJhbnNmZXIgLSAxIGRvCiAgICAgIGxvY2FsIF8sIHYgPSBkZWJ1Zy5nZXRsb2NhbCgyLCBpKQogICAgICB0WyN0ICsgMV0gPSB2IAogICAgZW5kCiAgICBpZiBldmVudCA9PSAicmV0dXJuIiB0aGVuCiAgICAgIG91dCA9IHQKICAgIGVsc2UKICAgICAgaW5wID0gdAogICAgZW5kCiAgZW5kCgogIGRlYnVnLnNldGhvb2soaG9vaywgImNyIikKCiAgb24gPSB0cnVlOyBtYXRoLnNpbigzKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezN9KTsgZXFzZXEob3V0LCB7bWF0aC5zaW4oMyl9KQoKICBvbiA9IHRydWU7IHNlbGVjdCgyLCAxMCwgMjAsIDMwLCA0MCk7IG9uID0gZmFsc2UKICBlcXNlcShpbnAsIHsyLCAxMCwgMjAsIDMwLCA0MH0pOyBlcXNlcShvdXQsIHsyMCwgMzAsIDQwfSkKCiAgbG9jYWwgZnVuY3Rpb24gZm9vIChhLCAuLi4pIHJldHVybiAuLi4gZW5kCiAgbG9jYWwgZnVuY3Rpb24gZm9vMSAoKSBvbiA9IG5vdCBvbjsgcmV0dXJuIGZvbygyMCwgMTAsIDApIGVuZAogIGZvbzEoKTsgb24gPSBmYWxzZQogIGVxc2VxKGlucCwgezIwfSk7IGVxc2VxKG91dCwgezEwLCAwfSkKCiAgZGVidWcuc2V0aG9vaygpCmVuZAoKCgotLSB0ZXN0aW5nIHVwdmFsdWUgYWNjZXNzCmxvY2FsIGZ1bmN0aW9uIGdldHVwdmFsdWVzIChmKQogIGxvY2FsIHQgPSB7fQogIGxvY2FsIGkgPSAxCiAgd2hpbGUgdHJ1ZSBkbwogICAgbG9jYWwgbmFtZSwgdmFsdWUgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIGkpCiAgICBpZiBub3QgbmFtZSB0aGVuIGJyZWFrIGVuZAogICAgYXNzZXJ0KG5vdCB0W25hbWVdKQogICAgdFtuYW1lXSA9IHZhbHVlCiAgICBpID0gaSArIDEKICBlbmQKICByZXR1cm4gdAplbmQKCmxvY2FsIGEsYixjID0gMSwyLDMKbG9jYWwgZnVuY3Rpb24gZm9vMSAoYSkgYiA9IGE7IHJldHVybiBjIGVuZApsb2NhbCBmdW5jdGlvbiBmb28yICh4KSBhID0geDsgcmV0dXJuIGMrYiBlbmQKYXNzZXJ0KG5vdCBkZWJ1Zy5nZXR1cHZhbHVlKGZvbzEsIDMpKQphc3NlcnQobm90IGRlYnVnLmdldHVwdmFsdWUoZm9vMSwgMCkpCmFzc2VydChub3QgZGVidWcuc2V0dXB2YWx1ZShmb28xLCAzLCAieHV4dSIpKQpsb2NhbCB0ID0gZ2V0dXB2YWx1ZXMoZm9vMSkKYXNzZXJ0KHQuYSA9PSBuaWwgYW5kIHQuYiA9PSAyIGFuZCB0LmMgPT0gMykKdCA9IGdldHVwdmFsdWVzKGZvbzIpCmFzc2VydCh0LmEgPT0gMSBhbmQgdC5iID09IDIgYW5kIHQuYyA9PSAzKQphc3NlcnQoZGVidWcuc2V0dXB2YWx1ZShmb28xLCAxLCAieHV4dSIpID09ICJiIikKYXNzZXJ0KCh7ZGVidWcuZ2V0dXB2YWx1ZShmb28yLCAzKX0pWzJdID09ICJ4dXh1IikKLS0gdXB2YWx1ZXMgb2YgQyBmdW5jdGlvbnMgYXJlIGFsbHdheXMgImNhbGxlZCIgIiIgKHRoZSBlbXB0eSBzdHJpbmcpCmFzc2VydChkZWJ1Zy5nZXR1cHZhbHVlKHN0cmluZy5nbWF0Y2goIngiLCAieCIpLCAxKSA9PSAiIikgIAoKCi0tIHRlc3RpbmcgY291bnQgaG9va3MKbG9jYWwgYT0wCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIGE9YSsxIGVuZCwgIiIsIDEpCmE9MDsgZm9yIGk9MSwxMDAwIGRvIGVuZDsgYXNzZXJ0KDEwMDAgPCBhIGFuZCBhIDwgMTAxMikKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoMjUwIDwgYSBhbmQgYSA8IDI1NSkKbG9jYWwgZixtLGMgPSBkZWJ1Zy5nZXRob29rKCkKYXNzZXJ0KG0gPT0gIiIgYW5kIGMgPT0gNCkKZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSkgYT1hKzEgZW5kLCAiIiwgNDAwMCkKYT0wOyBmb3IgaT0xLDEwMDAgZG8gZW5kOyBhc3NlcnQoYSA9PSAwKQoKZG8KICBkZWJ1Zy5zZXRob29rKHByaW50LCAiIiwgMl4yNCAtIDEpICAgLS0gY291bnQgdXBwZXJib3VuZAogIGxvY2FsIGYsbSxjID0gZGVidWcuZ2V0aG9vaygpCiAgYXNzZXJ0KCh7ZGVidWcuZ2V0aG9vaygpfSlbM10gPT0gMl4yNCAtIDEpCmVuZAoKZGVidWcuc2V0aG9vaygpCgoKLS0gdGVzdHMgZm9yIHRhaWwgY2FsbHMKbG9jYWwgZnVuY3Rpb24gZiAoeCkKICBpZiB4IHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJTIikud2hhdCA9PSAiTHVhIikKICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDEsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgbG9jYWwgdGFpbCA9IGRlYnVnLmdldGluZm8oMikKICAgIGFzc2VydCh0YWlsLmZ1bmMgPT0gZzEgYW5kIHRhaWwuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgYXNzZXJ0KGRlYnVnLmdldGluZm8oMywgIlMiKS53aGF0ID09ICJtYWluIikKICAgIHByaW50IisiCiAgICBlbmQKZW5kCgpmdW5jdGlvbiBnKHgpIHJldHVybiBmKHgpIGVuZAoKZnVuY3Rpb24gZzEoeCkgZyh4KSBlbmQKCmxvY2FsIGZ1bmN0aW9uIGggKHgpIGxvY2FsIGY9ZzE7IHJldHVybiBmKHgpIGVuZAoKaCh0cnVlKQoKbG9jYWwgYiA9IHt9CmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpIHRhYmxlLmluc2VydChiLCBlKSBlbmQsICJjciIpCmgoZmFsc2UpCmRlYnVnLnNldGhvb2soKQpsb2NhbCByZXMgPSB7InJldHVybiIsICAgLS0gZmlyc3QgcmV0dXJuIChmcm9tIHNldGhvb2spCiAgImNhbGwiLCAidGFpbCBjYWxsIiwgImNhbGwiLCAidGFpbCBjYWxsIiwKICAicmV0dXJuIiwgInJldHVybiIsCiAgImNhbGwiLCAgICAtLSBsYXN0IGNhbGwgKHRvIHNldGhvb2spCn0KZm9yIGkgPSAxLCAjcmVzIGRvIGFzc2VydChyZXNbaV0gPT0gdGFibGUucmVtb3ZlKGIsIDEpKSBlbmQKCmIgPSAwCmRlYnVnLnNldGhvb2soZnVuY3Rpb24gKGUpCiAgICAgICAgICAgICAgICBpZiBlID09ICJ0YWlsIGNhbGwiIHRoZW4KICAgICAgICAgICAgICAgICAgYiA9IGIgKyAxCiAgICAgICAgICAgICAgICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIsICJ0IikuaXN0YWlsY2FsbCA9PSB0cnVlKQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygyLCAidCIpLmlzdGFpbGNhbGwgPT0gZmFsc2UpCiAgICAgICAgICAgICAgICBlbmQKICAgICAgICAgICAgICBlbmQsICJjIikKaChmYWxzZSkKZGVidWcuc2V0aG9vaygpCmFzc2VydChiID09IDIpICAgLS0gdHdvIHRhaWwgY2FsbHMKCmxpbSA9IF9zb2Z0IGFuZCAzMDAwIG9yIDMwMDAwCmxvY2FsIGZ1bmN0aW9uIGZvbyAoeCkKICBpZiB4PT0wIHRoZW4KICAgIGFzc2VydChkZWJ1Zy5nZXRpbmZvKDIpLndoYXQgPT0gIm1haW4iKQogICAgbG9jYWwgaW5mbyA9IGRlYnVnLmdldGluZm8oMSkKICAgIGFzc2VydChpbmZvLmlzdGFpbGNhbGwgPT0gdHJ1ZSBhbmQgaW5mby5mdW5jID09IGZvbykKICBlbHNlIHJldHVybiBmb28oeC0xKQogIGVuZAplbmQKCmZvbyhsaW0pCgoKcHJpbnQiKyIKCgotLSB0ZXN0aW5nIGxvY2FsIGZ1bmN0aW9uIGluZm9ybWF0aW9uCmNvID0gbG9hZFtbCiAgbG9jYWwgQSA9IGZ1bmN0aW9uICgpCiAgICByZXR1cm4geAogIGVuZAogIHJldHVybgpdXQoKbG9jYWwgYSA9IDAKLS0gJ0EnIHNob3VsZCBiZSB2aXNpYmxlIHRvIGRlYnVnZ2VyIG9ubHkgYWZ0ZXIgaXRzIGNvbXBsZXRlIGRlZmluaXRpb24KZGVidWcuc2V0aG9vayhmdW5jdGlvbiAoZSwgbCkKICBpZiBsID09IDMgdGhlbiBhID0gYSArIDE7IGFzc2VydChkZWJ1Zy5nZXRsb2NhbCgyLCAxKSA9PSAiKCp0ZW1wb3JhcnkpIikKICBlbHNlaWYgbCA9PSA0IHRoZW4gYSA9IGEgKyAxOyBhc3NlcnQoZGVidWcuZ2V0bG9jYWwoMiwgMSkgPT0gIkEiKQogIGVuZAplbmQsICJsIikKY28oKSAgLS0gcnVuIGxvY2FsIGZ1bmN0aW9uIGRlZmluaXRpb24KZGVidWcuc2V0aG9vaygpICAtLSB0dXJuIG9mZiBob29rCmFzc2VydChhID09IDIpICAgLS0gZW5zdXJlIGFsbCB0d28gbGluZXMgd2hlcmUgaG9va2VkCgotLSB0ZXN0aW5nIHRyYWNlYmFjawoKYXNzZXJ0KGRlYnVnLnRyYWNlYmFjayhwcmludCkgPT0gcHJpbnQpCmFzc2VydChkZWJ1Zy50cmFjZWJhY2socHJpbnQsIDQpID09IHByaW50KQphc3NlcnQoc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIsIDQpLCAiXmhpXG4iKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiKSwgIl5oaVxuIikpCmFzc2VydChub3Qgc3RyaW5nLmZpbmQoZGVidWcudHJhY2ViYWNrKCJoaSIpLCAiJ2RlYnVnLnRyYWNlYmFjayciKSkKYXNzZXJ0KHN0cmluZy5maW5kKGRlYnVnLnRyYWNlYmFjaygiaGkiLCAwKSwgIidkZWJ1Zy50cmFjZWJhY2snIikpCmFzc2VydChzdHJpbmcuZmluZChkZWJ1Zy50cmFjZWJhY2soKSwgIl5zdGFjayB0cmFjZWJhY2s6XG4iKSkKCmRvICAtLSBDLWZ1bmN0aW9uIG5hbWVzIGluIHRyYWNlYmFjawogIGxvY2FsIHN0LCBtc2cgPSAoZnVuY3Rpb24gKCkgcmV0dXJuIHBjYWxsIGVuZCkoKShkZWJ1Zy50cmFjZWJhY2spCiAgYXNzZXJ0KHN0ID09IHRydWUgYW5kIHN0cmluZy5maW5kKG1zZywgInBjYWxsIikpCmVuZAoKCi0tIHRlc3RpbmcgbnBhcmFtcywgbnVwcyBlIGlzdmFyYXJnCmxvY2FsIHQgPSBkZWJ1Zy5nZXRpbmZvKHByaW50LCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAwIGFuZCB0Lm51cHMgPT0gMCkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGZ1bmN0aW9uIChhLGIsYykgZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IGZhbHNlIGFuZCB0Lm5wYXJhbXMgPT0gMyBhbmQgdC5udXBzID09IDApCgp0ID0gZGVidWcuZ2V0aW5mbyhmdW5jdGlvbiAoYSxiLC4uLikgcmV0dXJuIHRbYV0gZW5kLCAidSIpCmFzc2VydCh0LmlzdmFyYXJnID09IHRydWUgYW5kIHQubnBhcmFtcyA9PSAyIGFuZCB0Lm51cHMgPT0gMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKDEpICAgLS0gbWFpbgphc3NlcnQodC5pc3ZhcmFyZyA9PSB0cnVlIGFuZCB0Lm5wYXJhbXMgPT0gMCBhbmQgdC5udXBzID09IDEgYW5kCiAgICAgICBkZWJ1Zy5nZXR1cHZhbHVlKHQuZnVuYywgMSkgPT0gIl9FTlYiKQoKCgoKLS0gdGVzdGluZyBkZWJ1Z2dpbmcgb2YgY29yb3V0aW5lcwoKbG9jYWwgZnVuY3Rpb24gY2hlY2t0cmFjZWJhY2sgKGNvLCBwLCBsZXZlbCkKICBsb2NhbCB0YiA9IGRlYnVnLnRyYWNlYmFjayhjbywgbmlsLCBsZXZlbCkKICBsb2NhbCBpID0gMAogIGZvciBsIGluIHN0cmluZy5nbWF0Y2godGIsICJbXlxuXStcbj8iKSBkbwogICAgYXNzZXJ0KGkgPT0gMCBvciBzdHJpbmcuZmluZChsLCBwW2ldKSkKICAgIGkgPSBpKzEKICBlbmQKICBhc3NlcnQocFtpXSA9PSB1bmRlZikKZW5kCgoKbG9jYWwgZnVuY3Rpb24gZiAobikKICBpZiBuID4gMCB0aGVuIGYobi0xKQogIGVsc2UgY29yb3V0aW5lLnlpZWxkKCkgZW5kCmVuZAoKbG9jYWwgY28gPSBjb3JvdXRpbmUuY3JlYXRlKGYpCmNvcm91dGluZS5yZXN1bWUoY28sIDMpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImRiLmx1YSIsICJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSJ9KQpjaGVja3RyYWNlYmFjayhjbywgeyJkYi5sdWEiLCAiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMSkKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIiwgImRiLmx1YSIsICJkYi5sdWEifSwgMikKY2hlY2t0cmFjZWJhY2soY28sIHsiZGIubHVhIn0sIDQpCmNoZWNrdHJhY2ViYWNrKGNvLCB7fSwgNDApCgoKY28gPSBjb3JvdXRpbmUuY3JlYXRlKGZ1bmN0aW9uICh4KQogICAgICAgbG9jYWwgYSA9IDEKICAgICAgIGNvcm91dGluZS55aWVsZChkZWJ1Zy5nZXRpbmZvKDEsICJsIikpCiAgICAgICBjb3JvdXRpbmUueWllbGQoZGVidWcuZ2V0aW5mbygxLCAibCIpLmN1cnJlbnRsaW5lKQogICAgICAgcmV0dXJuIGEKICAgICBlbmQpCgpsb2NhbCB0ciA9IHt9CmxvY2FsIGZvbyA9IGZ1bmN0aW9uIChlLCBsKSBpZiBsIHRoZW4gdGFibGUuaW5zZXJ0KHRyLCBsKSBlbmQgZW5kCmRlYnVnLnNldGhvb2soY28sIGZvbywgImxjciIpCgpsb2NhbCBfLCBsID0gY29yb3V0aW5lLnJlc3VtZShjbywgMTApCmxvY2FsIHggPSBkZWJ1Zy5nZXRpbmZvKGNvLCAxLCAibGZMUyIpCmFzc2VydCh4LmN1cnJlbnRsaW5lID09IGwuY3VycmVudGxpbmUgYW5kIHguYWN0aXZlbGluZXNbeC5jdXJyZW50bGluZV0pCmFzc2VydCh0eXBlKHguZnVuYykgPT0gImZ1bmN0aW9uIikKZm9yIGk9eC5saW5lZGVmaW5lZCArIDEsIHgubGFzdGxpbmVkZWZpbmVkIGRvCiAgYXNzZXJ0KHguYWN0aXZlbGluZXNbaV0pCiAgeC5hY3RpdmVsaW5lc1tpXSA9IHVuZGVmCmVuZAphc3NlcnQobmV4dCh4LmFjdGl2ZWxpbmVzKSA9PSBuaWwpICAgLS0gbm8gJ2V4dHJhJyBlbGVtZW50cwphc3NlcnQobm90IGRlYnVnLmdldGluZm8oY28sIDIpKQpsb2NhbCBhLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphLGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMikKYXNzZXJ0KGEgPT0gImEiIGFuZCBiID09IDEpCmRlYnVnLnNldGxvY2FsKGNvLCAxLCAyLCAiaGkiKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQoI3RyID09IDIgYW5kCiAgICAgICB0clsxXSA9PSBsLmN1cnJlbnRsaW5lLTEgYW5kIHRyWzJdID09IGwuY3VycmVudGxpbmUpCgphLGIsYyA9IHBjYWxsKGNvcm91dGluZS5yZXN1bWUsIGNvKQphc3NlcnQoYSBhbmQgYiBhbmQgYyA9PSBsLmN1cnJlbnRsaW5lKzEpCmNoZWNrdHJhY2ViYWNrKGNvLCB7InlpZWxkIiwgImluIGZ1bmN0aW9uIDwifSkKCmEsYiA9IGNvcm91dGluZS5yZXN1bWUoY28pCmFzc2VydChhIGFuZCBiID09ICJoaSIpCmFzc2VydCgjdHIgPT0gNCBhbmQgdHJbNF0gPT0gbC5jdXJyZW50bGluZSsyKQphc3NlcnQoZGVidWcuZ2V0aG9vayhjbykgPT0gZm9vKQphc3NlcnQobm90IGRlYnVnLmdldGhvb2soKSkKY2hlY2t0cmFjZWJhY2soY28sIHt9KQoKCi0tIGNoZWNrIGdldC9zZXRsb2NhbCBpbiBjb3JvdXRpbmVzCmNvID0gY29yb3V0aW5lLmNyZWF0ZShmdW5jdGlvbiAoeCkKICBsb2NhbCBhLCBiID0gY29yb3V0aW5lLnlpZWxkKHgpCiAgYXNzZXJ0KGEgPT0gMTAwIGFuZCBiID09IG5pbCkKICByZXR1cm4geAplbmQpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMCkKYXNzZXJ0KGEgYW5kIGIgPT0gMTApCmEsIGIgPSBkZWJ1Zy5nZXRsb2NhbChjbywgMSwgMSkKYXNzZXJ0KGEgPT0gIngiIGFuZCBiID09IDEwKQphc3NlcnQobm90IGRlYnVnLmdldGxvY2FsKGNvLCAxLCA1KSkKYXNzZXJ0KGRlYnVnLnNldGxvY2FsKGNvLCAxLCAxLCAzMCkgPT0gIngiKQphc3NlcnQobm90IGRlYnVnLnNldGxvY2FsKGNvLCAxLCA1LCA0MCkpCmEsIGIgPSBjb3JvdXRpbmUucmVzdW1lKGNvLCAxMDApCmFzc2VydChhIGFuZCBiID09IDMwKQoKCi0tIGNoZWNrIHRyYWNlYmFjayBvZiBzdXNwZW5kZWQgY29yb3V0aW5lcwoKZnVuY3Rpb24gZihpKSBjb3JvdXRpbmUueWllbGQoaSA9PSAwKTsgZihpIC0gMSkgZW5kCgpjbyA9IGNvcm91dGluZS5jcmVhdGUoZnVuY3Rpb24gKHgpIGYoeCkgZW5kKQphLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbywgMykKdCA9IHsiJ2Nvcm91dGluZS55aWVsZCciLCAiJ2YnIiwgImluIGZ1bmN0aW9uIDwifQpyZXBlYXQKICBjaGVja3RyYWNlYmFjayhjbywgdCkKICBhLCBiID0gY29yb3V0aW5lLnJlc3VtZShjbykKICB0YWJsZS5pbnNlcnQodCwgMiwgIidmJyIpICAgLS0gb25lIG1vcmUgcmVjdXJzaXZlIGNhbGwgdG8gJ2YnCnVudGlsIGIKY2hlY2t0cmFjZWJhY2soY28sIHQpCgoKLS0gdGVzdCBhY2Vzc2luZyBsaW5lIG51bWJlcnMgb2YgYSBjb3JvdXRpbmUgZnJvbSBhIHJlc3VtZSBpbnNpZGUKLS0gYSBDIGZ1bmN0aW9uICh0aGlzIGlzIGEga25vd24gYnVnIGluIEx1YSA1LjApCgpsb2NhbCBmdW5jdGlvbiBnKHgpCiAgICBjb3JvdXRpbmUueWllbGQoeCkKZW5kCgpsb2NhbCBmdW5jdGlvbiBmIChpKQogIGRlYnVnLnNldGhvb2soZnVuY3Rpb24gKCkgZW5kLCAibCIpCiAgZm9yIGo9MSwxMDAwIGRvCiAgICBnKGkraikKICBlbmQKZW5kCgpsb2NhbCBjbyA9IGNvcm91dGluZS53cmFwKGYpCmNvKDEwKQpwY2FsbChjbykKcGNhbGwoY28pCgoKYXNzZXJ0KHR5cGUoZGVidWcuZ2V0cmVnaXN0cnkoKSkgPT0gInRhYmxlIikKCgotLSB0ZXN0IHRhZ21ldGhvZCBpbmZvcm1hdGlvbgpsb2NhbCBhID0ge30KbG9jYWwgZnVuY3Rpb24gZiAodCkKICBsb2NhbCBpbmZvID0gZGVidWcuZ2V0aW5mbygxKTsKICBhc3NlcnQoaW5mby5uYW1ld2hhdCA9PSAibWV0YW1ldGhvZCIpCiAgYS5vcCA9IGluZm8ubmFtZQogIHJldHVybiBpbmZvLm5hbWUKZW5kCnNldG1ldGF0YWJsZShhLCB7CiAgX19pbmRleCA9IGY7IF9fYWRkID0gZjsgX19kaXYgPSBmOyBfX21vZCA9IGY7IF9fY29uY2F0ID0gZjsgX19wb3cgPSBmOwogIF9fbXVsID0gZjsgX19pZGl2ID0gZjsgX191bm0gPSBmOyBfX2xlbiA9IGY7IF9fc3ViID0gZjsKICBfX3NobCA9IGY7IF9fc2hyID0gZjsgX19ib3IgPSBmOyBfX2J4b3IgPSBmOwogIF9fZXEgPSBmOyBfX2xlID0gZjsgX19sdCA9IGY7IF9fdW5tID0gZjsgX19sZW4gPSBmOyBfX2JhbmQgPSBmOwogIF9fYm5vdCA9IGY7Cn0pCgpsb2NhbCBiID0gc2V0bWV0YXRhYmxlKHt9LCBnZXRtZXRhdGFibGUoYSkpCgphc3NlcnQoYVszXSA9PSAiaW5kZXgiIGFuZCBhXjMgPT0gInBvdyIgYW5kIGEuLmEgPT0gImNvbmNhdCIpCmFzc2VydChhLzMgPT0gImRpdiIgYW5kIDMlYSA9PSAibW9kIikKYXNzZXJ0KGErMyA9PSAiYWRkIiBhbmQgMy1hID09ICJzdWIiIGFuZCBhKjMgPT0gIm11bCIgYW5kCiAgICAgICAtYSA9PSAidW5tIiBhbmQgI2EgPT0gImxlbiIgYW5kIGEmMyA9PSAiYmFuZCIpCmFzc2VydChhfDMgPT0gImJvciIgYW5kIDN+YSA9PSAiYnhvciIgYW5kIGE8PDMgPT0gInNoaWZ0IiBhbmQKICAgICAgIGE+PjEgPT0gInNoaWZ0IikKYXNzZXJ0IChhPT1iIGFuZCBhLm9wID09ICJlcSIpCmFzc2VydCAoYT49YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQgKGE+YiBhbmQgYS5vcCA9PSAib3JkZXIiKQphc3NlcnQofmEgPT0gImJub3QiKQoKZG8gICAtLSB0ZXN0aW5nIGZvci1pdGVyYXRvciBuYW1lCiAgbG9jYWwgZnVuY3Rpb24gZigpCiAgICBhc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5uYW1lID09ICJmb3IgaXRlcmF0b3IiKQogIGVuZAoKICBmb3IgaSBpbiBmIGRvIGVuZAplbmQKCgpkbyAgIC0tIHRlc3RpbmcgZGVidWcgaW5mbyBmb3IgZmluYWxpemVycwogIGxvY2FsIG5hbWUgPSBuaWwKCiAgLS0gY3JlYXRlIGEgcGllY2Ugb2YgZ2FyYmFnZSB3aXRoIGEgZmluYWxpemVyCiAgc2V0bWV0YXRhYmxlKHt9LCB7X19nYyA9IGZ1bmN0aW9uICgpCiAgICBsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbygyKSAgIC0tIGdldCBjYWxsZWUgaW5mb3JtYXRpb24KICAgIGFzc2VydCh0Lm5hbWV3aGF0ID09ICJtZXRhbWV0aG9kIikKICAgIG5hbWUgPSB0Lm5hbWUKICBlbmR9KQoKICAtLSByZXBlYXQgdW50aWwgcHJldmlvdXMgZmluYWxpemVyIHJ1bnMgKHNldHRpbmcgJ25hbWUnKQogIHJlcGVhdCBsb2NhbCBhID0ge30gdW50aWwgbmFtZQogIGFzc2VydChuYW1lID09ICJfX2djIikKZW5kCgoKZG8KICBwcmludCgidGVzdGluZyB0cmFjZWJhY2sgc2l6ZXMiKQoKICBsb2NhbCBmdW5jdGlvbiBjb3VudGxpbmVzIChzKQogICAgcmV0dXJuIHNlbGVjdCgyLCBzdHJpbmcuZ3N1YihzLCAiXG4iLCAiIikpCiAgZW5kCgogIGxvY2FsIGZ1bmN0aW9uIGRlZXAgKGx2bCwgbikKICAgIGlmIGx2bCA9PSAwIHRoZW4KICAgICAgcmV0dXJuIChkZWJ1Zy50cmFjZWJhY2soIm1lc3NhZ2UiLCBuKSkKICAgIGVsc2UKICAgICAgcmV0dXJuIChkZWVwKGx2bC0xLCBuKSkKICAgIGVuZAogIGVuZAoKICBsb2NhbCBmdW5jdGlvbiBjaGVja2RlZXAgKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHMgPSBkZWVwKHRvdGFsLCBzdGFydCkKICAgIGxvY2FsIHJlc3QgPSBzdHJpbmcubWF0Y2gocywgIl5tZXNzYWdlXG5zdGFjayB0cmFjZWJhY2s6XG4oLiopJCIpCiAgICBsb2NhbCBjbCA9IGNvdW50bGluZXMocmVzdCkKICAgIC0tIGF0IG1vc3QgMTAgbGluZXMgaW4gZmlyc3QgcGFydCwgMTEgaW4gc2Vjb25kLCBwbHVzICcuLi4nCiAgICBhc3NlcnQoY2wgPD0gMTAgKyAxMSArIDEpCiAgICBsb2NhbCBicmsgPSBzdHJpbmcuZmluZChyZXN0LCAiJS4lLiUuIikKICAgIGlmIGJyayB0aGVuICAgLS0gZG9lcyBtZXNzYWdlIGhhdmUgJy4uLic/CiAgICAgIGxvY2FsIHJlc3QxID0gc3RyaW5nLnN1YihyZXN0LCAxLCBicmspCiAgICAgIGxvY2FsIHJlc3QyID0gc3RyaW5nLnN1YihyZXN0LCBicmssICNyZXN0KQogICAgICBhc3NlcnQoY291bnRsaW5lcyhyZXN0MSkgPT0gMTAgYW5kIGNvdW50bGluZXMocmVzdDIpID09IDExKQogICAgZWxzZQogICAgICBhc3NlcnQoY2wgPT0gdG90YWwgLSBzdGFydCArIDIpCiAgICBlbmQKICBlbmQKCiAgZm9yIGQgPSAxLCA1MSwgMTAgZG8KICAgIGZvciBsID0gMSwgZCBkbwogICAgICAtLSB1c2UgY29yb3V0aW5lcyB0byBlbnN1cmUgY29tcGxldGUgY29udHJvbCBvZiB0aGUgc3RhY2sKICAgICAgY29yb3V0aW5lLndyYXAoY2hlY2tkZWVwKShkLCBsKQogICAgZW5kCiAgZW5kCgplbmQKCgpwcmludCgidGVzdGluZyBkZWJ1ZyBmdW5jdGlvbnMgb24gY2h1bmsgd2l0aG91dCBkZWJ1ZyBpbmZvIikKcHJvZyA9IFtbLS0gcHJvZ3JhbSB0byBiZSBsb2FkZWQgd2l0aG91dCBkZWJ1ZyBpbmZvcm1hdGlvbgpsb2NhbCBkZWJ1ZyA9IHJlcXVpcmUnZGVidWcnCmxvY2FsIGEgPSAxMiAgLS0gYSBsb2NhbCB2YXJpYWJsZQoKbG9jYWwgbiwgdiA9IGRlYnVnLmdldGxvY2FsKDEsIDEpCmFzc2VydChuID09ICIoKnRlbXBvcmFyeSkiIGFuZCB2ID09IGRlYnVnKSAgIC0tIHVua293biBuYW1lIGJ1dCBrbm93biB2YWx1ZQpuLCB2ID0gZGVidWcuZ2V0bG9jYWwoMSwgMikKYXNzZXJ0KG4gPT0gIigqdGVtcG9yYXJ5KSIgYW5kIHYgPT0gMTIpICAgLS0gdW5rb3duIG5hbWUgYnV0IGtub3duIHZhbHVlCgotLSBhIGZ1bmN0aW9uIHdpdGggYW4gdXB2YWx1ZQpsb2NhbCBmID0gZnVuY3Rpb24gKCkgbG9jYWwgeDsgcmV0dXJuIGEgZW5kCm4sIHYgPSBkZWJ1Zy5nZXR1cHZhbHVlKGYsIDEpCmFzc2VydChuID09ICIoKm5vIG5hbWUpIiBhbmQgdiA9PSAxMikKYXNzZXJ0KGRlYnVnLnNldHVwdmFsdWUoZiwgMSwgMTMpID09ICIoKm5vIG5hbWUpIikKYXNzZXJ0KGEgPT0gMTMpCgpsb2NhbCB0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnQgPSBkZWJ1Zy5nZXRpbmZvKGYsICJMIikuYWN0aXZlbGluZXMKYXNzZXJ0KG5leHQodCkgPT0gbmlsKSAgICAtLSBhY3RpdmUgbGluZXMgYXJlIGVtcHR5CgotLSBkdW1wL2xvYWQgYSBmdW5jdGlvbiB3aXRob3V0IGRlYnVnIGluZm8KZiA9IGxvYWQoc3RyaW5nLmR1bXAoZikpCgp0ID0gZGVidWcuZ2V0aW5mbyhmKQphc3NlcnQodC5uYW1lID09IG5pbCBhbmQgdC5saW5lZGVmaW5lZCA+IDAgYW5kCiAgICAgICB0Lmxhc3RsaW5lZGVmaW5lZCA9PSB0LmxpbmVkZWZpbmVkIGFuZAogICAgICAgdC5zaG9ydF9zcmMgPT0gIj8iKQphc3NlcnQoZGVidWcuZ2V0aW5mbygxKS5jdXJyZW50bGluZSA9PSAtMSkKCnJldHVybiBhCl1dCgoKLS0gbG9hZCAncHJvZycgd2l0aG91dCBkZWJ1ZyBpbmZvCmxvY2FsIGYgPSBhc3NlcnQobG9hZChzdHJpbmcuZHVtcChsb2FkKHByb2cpLCB0cnVlKSkpCgphc3NlcnQoZigpID09IDEzKQoKZG8gICAtLSB0ZXN0cyBmb3IgJ3NvdXJjZScgaW4gYmluYXJ5IGR1bXBzCiAgbG9jYWwgcHJvZyA9IFtbCiAgICByZXR1cm4gZnVuY3Rpb24gKHgpCiAgICAgIHJldHVybiBmdW5jdGlvbiAoeSkgCiAgICAgICAgcmV0dXJuIHggKyB5CiAgICAgIGVuZAogICAgZW5kCiAgXV0KICBsb2NhbCBuYW1lID0gc3RyaW5nLnJlcCgieCIsIDEwMDApCiAgbG9jYWwgcCA9IGFzc2VydChsb2FkKHByb2csIG5hbWUpKQogIC0tIGxvYWQgJ3AnIGFzIGEgYmluYXJ5IGNodW5rIHdpdGggZGVidWcgaW5mb3JtYXRpb24KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCkKICBhc3NlcnQoI2MgPiAxMDAwIGFuZCAjYyA8IDIwMDApICAgLS0gbm8gcmVwZXRpdGlvbiBvZiAnc291cmNlJyBpbiBkdW1wCiAgbG9jYWwgZiA9IGFzc2VydChsb2FkKGMpKQogIGxvY2FsIGcgPSBmKCkKICBsb2NhbCBoID0gZygzKQogIGFzc2VydChoKDUpID09IDgpCiAgYXNzZXJ0KGRlYnVnLmdldGluZm8oZikuc291cmNlID09IG5hbWUgYW5kICAgLS0gYWxsIGZ1bmN0aW9ucyBoYXZlICdzb3VyY2UnCiAgICAgICAgIGRlYnVnLmdldGluZm8oZykuc291cmNlID09IG5hbWUgYW5kIAogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGgpLnNvdXJjZSA9PSBuYW1lKQogIC0tIGFnYWluLCB3aXRob3V0IGRlYnVnIGluZm8KICBsb2NhbCBjID0gc3RyaW5nLmR1bXAocCwgdHJ1ZSkKICBhc3NlcnQoI2MgPCA1MDApICAgLS0gbm8gJ3NvdXJjZScgaW4gZHVtcAogIGxvY2FsIGYgPSBhc3NlcnQobG9hZChjKSkKICBsb2NhbCBnID0gZigpCiAgbG9jYWwgaCA9IGcoMzApCiAgYXNzZXJ0KGgoNTApID09IDgwKQogIGFzc2VydChkZWJ1Zy5nZXRpbmZvKGYpLnNvdXJjZSA9PSAnPT8nIGFuZCAgIC0tIG5vIGZ1bmN0aW9uIGhhcyAnc291cmNlJwogICAgICAgICBkZWJ1Zy5nZXRpbmZvKGcpLnNvdXJjZSA9PSAnPT8nIGFuZCAKICAgICAgICAgZGVidWcuZ2V0aW5mbyhoKS5zb3VyY2UgPT0gJz0/JykKZW5kCgpwcmludCJPSyIKCg==