dXNlIFN5bWJvbDsKdXNlIHN0cmljdDsKCm15ICglcGZhZGxpc3RlKTsKCm15ICRodG1sc3RyID0gJyc7Cm15ICR0b3AgPSAkQVJHVlswXTsKCm15ICR6aWVscGZhZCA9ICRBUkdWWzFdOwpteSAkbG9jYWx6aWVscGZhZCA9ICR6aWVscGZhZDsKCm15ICRoZWFkZXIgPSAkQVJHVlsyXTsKbXkgJGZvb3RlciA9ICRBUkdWWzNdOwoKbXkgJGxvY2FscGF0aCA9ICR0b3A7Cm15ICRjaGFuZ2VkZmlsZXMgPSAwOwoKbXkgJGVpbnp1ZyA9IDE7Cgpta2RpcigkemllbHBmYWQsIDA3NzcpIHx8IHdhcm4gIktvbm50ZSBWZXJ6ZWljaG5pcyAkemllbHBmYWQgbmljaHQgYW5sZWdlbiI7Cgp0cmF2ZXJzZSgkdG9wKTsKZ2VuZXJhdGUoKTsKCnN1YiB0cmF2ZXJzZSB7CiAgICAgICAgbXkgJGxvY2FsdG9wID0gc2hpZnQ7CiAgICAgICAgbXkgJGRpcmggICAgID0gZ2Vuc3ltOwogICAgICAgIG15ICRmbmFtZTsKCgogICAgICAgIHVubGVzcyAob3BlbmRpcigkZGlyaCwgJGxvY2FsdG9wKSkgewogICAgICAgICAgICAgICAgd2FybiAiRXJyOiAkbG9jYWx0b3AgKCQhKVxuIjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHdoaWxlIChkZWZpbmVkICgkZm5hbWUgPSByZWFkZGlyKCRkaXJoKSkpIHsKICAgICAgICAgICAgICAgIG5leHQgaWYgJGZuYW1lIGVxICcuJyBvciAkZm5hbWUgZXEgJy4uJzsKICAgICAgICAgICAgICAgIG15ICRwbmFtZSA9ICRsb2NhbHRvcCAuICcvJyAuICRmbmFtZTsKCiAgICAgICAgICAgICAgICAkcGZhZGxpc3RleyRwbmFtZX0gPSAkZWluenVnIGlmIChub3QgKCRwbmFtZSA9fiAvXC9DVlMkLykpOwogICAgICAgICAgICAgICAgaWYgKC1kICRwbmFtZSkgewogICAgICAgICAgICAgICAgICAkbG9jYWx6aWVscGZhZCA9ICRwbmFtZTsKICAgICAgICAgICAgICAgICAgJGxvY2FsemllbHBmYWQgPX4gcy8kdG9wLyR6aWVscGZhZC9pZWc7CgkJICBpZiAobm90ICgkcG5hbWUgPX4gL1wvQ1ZTJC8pKSB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkxlZ2UgVmVyemVpY2huaXMgYW46IFsgJGxvY2FsemllbHBmYWQgXVxuIjsKICAgICAgICAgICAgICAgICAgICBta2RpcigkbG9jYWx6aWVscGZhZCwgMDc3NykgfHwgd2FybiAiS29ubnRlIFZlcnplaWNobmlzICR6aWVscGZhZCBuaWNodCBhbmxlZ2VuIjsKICAgICAgICAgICAgICAgICAgICAkZWluenVnKys7CiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2UoJHBuYW1lKTsKCQkgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNsb3NlZGlyKCRkaXJoKTsKICAgICAgICAkZWluenVnLS07Cn0KCnN1YiBnZW5lcmF0ZSB7CiAgICAgICBteSAoJGRpcmJsb2NrLCAkcGF0aCk7CgogICAgICAgZm9yZWFjaCAkcGF0aCAoc29ydCBrZXlzICVwZmFkbGlzdGUpIHsKICAgICAgICAgICAgICAgICAkZWluenVnID0gJHBmYWRsaXN0ZXskcGF0aH07CiAgICAgICAgICAgICAgICAgbXkgJGlzcGF0aCA9IDA7CgogICAgICAgICAgICAgICAgIG15ICR6aWVsZGF0ZWkgPSAkcGF0aDsKICAgICAgICAgICAgICAgICAkemllbGRhdGVpID1+IHMvJHRvcC8kemllbHBmYWQvaWc7CgogICAgICAgICAgICAgICAgIGlmICgkcGF0aCA9fiAvLmh0bWwqJC8pIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICBteSAkbGluZSA9ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHByb2Nlc3MgPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBlcmdlYm5pcyA9ICgnJyk7CgogICAgICAgICAgICAgICAgICAgICAgICAgbXkgJHJlbHBmYWQgPSAnJzsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobXkgJGk9MDsgJGk8JGVpbnp1Zy0xOyAkaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZWxwZmFkIC49ICcuLi8nOwogICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oSFRNTFpJRUwsICI+JHppZWxkYXRlaSIpIG9yIGRpZSAiS2FubiBaaWVsZGF0ZWkgJHppZWxkYXRlaSBuaWNodCD2ZmZuZW4hIjsKICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oSFRNTFFVRUxMRSwgIjwkaGVhZGVyIikgb3IgZGllICJDYW5ub3Qgb3BlbiBmaWxlOiAkaGVhZGVyIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRlZmluZWQgKCRsaW5lID0gPEhUTUxRVUVMTEU+KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNob21wICRsaW5lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICRsaW5lID1+IHMvaHJlZj1cIi9ocmVmPVwiJHJlbHBmYWQvaWcgaWYgKG5vdCAoJGxpbmUgPX4gL2hyZWY9XCJodHRwLykpOzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBIVE1MWklFTCAkbGluZSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJIGNsb3NlKEhUTUxRVUVMTEUpOwoKICAgICAgICAgICAgICAgICAgICAgICAgIG9wZW4oSFRNTFFVRUxMRSwgIjwkcGF0aCIpIG9yIGRpZSAiQ2Fubm90IG9wZW4gZmlsZTogJHBhdGgiOwogICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGVmaW5lZCAoJGxpbmUgPSA8SFRNTFFVRUxMRT4pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvbXAgJGxpbmU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgSFRNTFpJRUwgJGxpbmUgLiAiXG4iOwogICAgICAgICAgICAgICAgICAgICAgICAgICB9CgkJCSBjbG9zZShIVE1MUVVFTExFKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKEhUTUxRVUVMTEUsICI8JGZvb3RlciIpIG9yIGRpZSAiQ2Fubm90IG9wZW4gZmlsZTogJGZvb3RlciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZWZpbmVkICgkbGluZSA9IDxIVE1MUVVFTExFPikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaG9tcCAkbGluZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludCBIVE1MWklFTCAkbGluZSAuICJcbiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCQkJIGNsb3NlKEhUTUxRVUVMTEUpOwoJCSAgICAgICAgIGNsb3NlKEhUTUxaSUVMKTsKCQkJICRjaGFuZ2VkZmlsZXMrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiAobm90ICgtZCAkcGF0aCkpIHsKICAgICAgICAgICAgICAgICAgIHN5c3RlbSgiY3AiLCRwYXRoLCR6aWVsZGF0ZWkpOwoJCSB9fQogICAgICAgfQp9CnByaW50ICJUaGVyZSBhcmUgJGNoYW5nZWRmaWxlcyBmaWxlcyBpbiB0aGUgb2ZmbGluZSB2ZXJzaW9uLlxuIjsK