LyogZmRmb3JtYXQuYyAgLSAgTG93LWxldmVsIGZvcm1hdHMgYSBmbG9wcHkgZGlzayAtIFdlcm5lciBBbG1lc2JlcmdlciAqLwoKLyogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogMTk5OS0wMy0yMCBBcm5hbGRvIENhcnZhbGhvIGRlIE1lbG8gPGFjbWVAY29uZWN0aXZhLmNvbS5icj4KICYgLSBtb3JlIGkxOG4vbmxzIHRyYW5zbGF0YWJsZSBzdHJpbmdzIG1hcmtlZAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpbmNsdWRlIDxsaW51eC9mZC5oPgoKI2luY2x1ZGUgIm5scy5oIgoKc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CgojZGVmaW5lIFNFQ1RPUl9TSVpFIDUxMgojZGVmaW5lIFBFUlJPUihtc2cpIHsgcGVycm9yKG1zZyk7IGV4aXQoMSk7IH0KCnN0YXRpYyB2b2lkIGZvcm1hdF9kaXNrKGludCBjdHJsLCBjaGFyICpuYW1lKQp7CiAgICBzdHJ1Y3QgZm9ybWF0X2Rlc2NyIGRlc2NyOwogICAgaW50IHRyYWNrOwoKICAgIHByaW50ZihfKCJGb3JtYXR0aW5nIC4uLiAiKSk7CiAgICBmZmx1c2goc3Rkb3V0KTsKICAgIGlmIChpb2N0bChjdHJsLEZERk1UQkVHLE5VTEwpIDwgMCkgUEVSUk9SKCJcbmlvY3RsKEZERk1UQkVHKSIpOwogICAgZm9yICh0cmFjayA9IDA7IHRyYWNrIDwgcGFyYW0udHJhY2s7IHRyYWNrKyspIHsKCWRlc2NyLnRyYWNrID0gdHJhY2s7CglkZXNjci5oZWFkID0gMDsKCWlmIChpb2N0bChjdHJsLEZERk1UVFJLLChsb25nKSAmZGVzY3IpIDwgMCkKCSAgUEVSUk9SKCJcbmlvY3RsKEZERk1UVFJLKSIpOwoKCXByaW50ZigiJTNkXGJcYlxiIix0cmFjayk7CglmZmx1c2goc3Rkb3V0KTsKCWlmIChwYXJhbS5oZWFkID09IDIpIHsKCSAgICBkZXNjci5oZWFkID0gMTsKCSAgICBpZiAoaW9jdGwoY3RybCxGREZNVFRSSywobG9uZykgJmRlc2NyKSA8IDApCgkgICAgICBQRVJST1IoIlxuaW9jdGwoRkRGTVRUUkspIik7Cgl9CiAgICB9CiAgICBpZiAoaW9jdGwoY3RybCxGREZNVEVORCxOVUxMKSA8IDApIFBFUlJPUigiXG5pb2N0bChGREZNVEVORCkiKTsKICAgIHByaW50ZihfKCJkb25lXG4iKSk7Cn0KCgpzdGF0aWMgdm9pZCB2ZXJpZnlfZGlzayhjaGFyICpuYW1lKQp7CiAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwogICAgaW50IGZkLGN5bF9zaXplLGN5bCxjb3VudDsKCiAgICBjeWxfc2l6ZSA9IHBhcmFtLnNlY3QqcGFyYW0uaGVhZCo1MTI7CiAgICBpZiAoKGRhdGEgPSAodW5zaWduZWQgY2hhciAqKSBtYWxsb2MoY3lsX3NpemUpKSA9PSBOVUxMKSBQRVJST1IoIm1hbGxvYyIpOwogICAgcHJpbnRmKF8oIlZlcmlmeWluZyAuLi4gIikpOwogICAgZmZsdXNoKHN0ZG91dCk7CiAgICBpZiAoKGZkID0gb3BlbihuYW1lLE9fUkRPTkxZKSkgPCAwKSBQRVJST1IobmFtZSk7CiAgICBmb3IgKGN5bCA9IDA7IGN5bCA8IHBhcmFtLnRyYWNrOyBjeWwrKykgewoJaW50IHJlYWRfYnl0ZXM7CgoJcHJpbnRmKCIlM2RcYlxiXGIiLGN5bCk7CglmZmx1c2goc3Rkb3V0KTsKCXJlYWRfYnl0ZXMgPSByZWFkKGZkLGRhdGEsY3lsX3NpemUpOwoJaWYocmVhZF9ieXRlcyAhPSBjeWxfc2l6ZSkgewoJICAgIGlmKHJlYWRfYnl0ZXMgPCAwKQoJCSAgICBwZXJyb3IoXygiUmVhZDogIikpOwoJICAgIGZwcmludGYoc3RkZXJyLAoJCSAgICBfKCJQcm9ibGVtIHJlYWRpbmcgY3lsaW5kZXIgJWQsIGV4cGVjdGVkICVkLCByZWFkICVkXG4iKSwKCQkgICAgY3lsLCBjeWxfc2l6ZSwgcmVhZF9ieXRlcyk7CgkgICAgZnJlZShkYXRhKTsKCSAgICBleGl0KDEpOwoJfQoJZm9yIChjb3VudCA9IDA7IGNvdW50IDwgY3lsX3NpemU7IGNvdW50KyspCgkgICAgaWYgKGRhdGFbY291bnRdICE9IEZEX0ZJTExfQllURSkgewoJCXByaW50ZihfKCJiYWQgZGF0YSBpbiBjeWwgJWRcbkNvbnRpbnVpbmcgLi4uICIpLGN5bCk7CgkJZmZsdXNoKHN0ZG91dCk7CgkJYnJlYWs7CgkgICAgfQogICAgfQogICAgZnJlZShkYXRhKTsKICAgIHByaW50ZihfKCJkb25lXG4iKSk7CiAgICBpZiAoY2xvc2UoZmQpIDwgMCkgUEVSUk9SKCJjbG9zZSIpOwp9CgoKc3RhdGljIHZvaWQgdXNhZ2UoY2hhciAqbmFtZSkKewogICAgY2hhciAqdGhpczsKCiAgICBpZiAoKHRoaXMgPSBzdHJyY2hyKG5hbWUsJy8nKSkgIT0gTlVMTCkgbmFtZSA9IHRoaXMrMTsKICAgIGZwcmludGYoc3RkZXJyLF8oInVzYWdlOiAlcyBbIC1uIF0gZGV2aWNlXG4iKSxuYW1lKTsKICAgIGV4aXQoMSk7Cn0KCgppbnQgbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKewogICAgaW50IGN0cmw7CiAgICBpbnQgdmVyaWZ5OwogICAgc3RydWN0IHN0YXQgc3Q7CiAgICBjaGFyICpwcm9nbmFtZSwgKnA7CgogICAgcHJvZ25hbWUgPSBhcmd2WzBdOwogICAgaWYgKChwID0gc3RycmNocihwcm9nbmFtZSwgJy8nKSkgIT0gTlVMTCkKCSAgICBwcm9nbmFtZSA9IHArMTsKCiAgICBzZXRsb2NhbGUoTENfQUxMLCAiIik7CiAgICBiaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOwogICAgdGV4dGRvbWFpbihQQUNLQUdFKTsKCiAgICBpZiAoYXJnYyA9PSAyICYmCgkoIXN0cmNtcChhcmd2WzFdLCAiLVYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLXZlcnNpb24iKSkpIHsKCSAgICBwcmludGYoXygiJXMgKCVzKVxuIiksIHByb2duYW1lLCBQQUNLQUdFX1NUUklORyk7CgkgICAgZXhpdCgwKTsKICAgIH0KCiAgICB2ZXJpZnkgPSAxOwogICAgaWYgKGFyZ2MgPiAxICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CglpZiAoYXJndlsxXVsxXSAhPSAnbicpIHVzYWdlKHByb2duYW1lKTsKCXZlcmlmeSA9IDA7CglhcmdjLS07Cglhcmd2Kys7CiAgICB9CiAgICBpZiAoYXJnYyAhPSAyKSB1c2FnZShwcm9nbmFtZSk7CiAgICBpZiAoc3RhdChhcmd2WzFdLCZzdCkgPCAwKSBQRVJST1IoYXJndlsxXSk7CiAgICBpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkpIHsKCWZwcmludGYoc3RkZXJyLF8oIiVzOiBub3QgYSBibG9jayBkZXZpY2VcbiIpLGFyZ3ZbMV0pOwoJZXhpdCgxKTsKCS8qIGRvIG5vdCB0ZXN0IG1ham9yIC0gcGVyaGFwcyB0aGlzIHdhcyBhbiBVU0IgZmxvcHB5ICovCiAgICB9CiAgICBpZiAoYWNjZXNzKGFyZ3ZbMV0sV19PSykgPCAwKSBQRVJST1IoYXJndlsxXSk7CgogICAgY3RybCA9IG9wZW4oYXJndlsxXSxPX1dST05MWSk7CiAgICBpZiAoY3RybCA8IDApCgkgICAgUEVSUk9SKGFyZ3ZbMV0pOwogICAgaWYgKGlvY3RsKGN0cmwsRkRHRVRQUk0sKGxvbmcpICZwYXJhbSkgPCAwKSAKCSAgICBQRVJST1IoXygiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IGZvcm1hdCB0eXBlIikpOwogICAgcHJpbnRmKF8oIiVzLXNpZGVkLCAlZCB0cmFja3MsICVkIHNlYy90cmFjay4gVG90YWwgY2FwYWNpdHkgJWQga0IuXG4iKSwKCSAgIChwYXJhbS5oZWFkID09IDIpID8gXygiRG91YmxlIikgOiBfKCJTaW5nbGUiKSwKCSAgIHBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LHBhcmFtLnNpemUgPj4gMSk7CiAgICBmb3JtYXRfZGlzayhjdHJsLCBhcmd2WzFdKTsKICAgIGNsb3NlKGN0cmwpOwoKICAgIGlmICh2ZXJpZnkpCgkgICAgdmVyaWZ5X2Rpc2soYXJndlsxXSk7CiAgICByZXR1cm4gMDsKfQo=