I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4gCiAKI2luY2x1ZGUgPGxpbnV4L3ZvbHRlX2Rydi5oPgojaW5jbHVkZSAiLi4vbGliYXVkaW9taXgvaW5jbHVkZS9hdWRpb21peF9saWIuaCIKClRfWkRydkF1ZGlvTWl4X0NmZyB0ZXN0UGFyYW07CiNkZWZpbmUgQlVGRkVSX0JZVEVTIDEwMjQvL9futPMxMDI019a92iAKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSAvL9eiys219LHg0uu/yda00NDOxLz+KysrKysKewogICAgRklMRSAqZmlsZTsgIAogICAgCiAgICBjaGFyICpmaWxlbmFtZTsgIAogICAgaW50IG1vcmVfY2h1bmtzID0gMTsKICAgIHVuc2lnbmVkIGNoYXIgYnVmZmVyW0JVRkZFUl9CWVRFU10gPSB7MH07ICAKICAgIGludCByZXQgPSAwOwogICAgCiAgICB0ZXN0UGFyYW0uc2FtcGxlX3JhdGUgPSA4MDAwOy8v0qqxo9akzayyydH5xrXCyii99s/eMTZLus04SykKICAgIHRlc3RQYXJhbS5hdWRpb1R5cGUgPSAxOy8vMS1UWCwyLVJYLy9SWLG716LKzbX0o6zWp7PWuvPQ+MCp1bkKICAgIAogICAgcHJpbnRmKCJlbnRlciBtYWluXG4iKTsgCiAgICAKICAgIGlmIChhcmdjIDwgMikgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFxuIiwgYXJndlswXSk7CiAgICAgICAgcHJpbnRmKCJVc2FnZTogJXMgXG4iLCBhcmd2WzBdKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBmaWxlbmFtZSA9IGFyZ3ZbMV07CiAgICBmaWxlID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwogICAgcHJpbnRmKCJmb3BlbiAnJXMnIGVuZFxuIiwgZmlsZW5hbWUpOyAKICAgIGlmICghZmlsZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gZmlsZSAnJXMnXG4iLCBmaWxlbmFtZSk7CiAgICAgICAgcHJpbnRmKCJVbmFibGUgdG8gb3BlbiBmaWxlICclcydcbiIsIGZpbGVuYW1lKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7CiAgICBsb25nIGJlZ2luID0gZnRlbGwoZmlsZSk7CiAgICBmc2VlayhmaWxlLCAwLCBTRUVLX0VORCk7CiAgICBsb25nIGVuZCA9IGZ0ZWxsKGZpbGUpOwogICAgbG9uZyBmaWxlX3NpemUgPSBlbmQgLSBiZWdpbjsvL9fWvdrK/QogICAgaW50IHJlYWRfdGltZXMgPSAwOwogICAgaW50IHJlbWFpbl9zaXplID0gMDsKCiAgICBmc2VlayhmaWxlLCAwLCBTRUVLX1NFVCk7Ly/W2NDC1sO72M7EvP6/qs23CiAgICAKICAgIHByaW50ZigiekRydkF1ZGlvTWl4X09wZW4gc3RhcnQsIGZpbGUgc2l6ZSBpcyAlbGRcbiIsIGZpbGVfc2l6ZSk7ICAKICAgIHJldCA9IHpEcnZBdWRpb01peF9PcGVuKCZ0ZXN0UGFyYW0pOyAKICAgIGlmKHJldCAhPSAwKQogICAgICAgIHJldHVybiAxOwogICAgcHJpbnRmKCJ6RHJ2QXVkaW9NaXhfT3BlbiBlbmRcbiIpOyAKCiAgICB3aGlsZSAobW9yZV9jaHVua3MpewogICAgICAgIG1vcmVfY2h1bmtzID0gZnJlYWQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgMSwgZmlsZSk7CiAgICAgICAgCiAgICAgICAgaWYobW9yZV9jaHVua3MgPT0gMSl7CiAgICAgICAgICAgIHJlYWRfdGltZXMrKzsKICAgICAgICAgICAgcmV0ID0gekRydkF1ZGlvTWl4X1dyaXRlKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwogICAgICAgICAgICBpZihyZXQgIT0gMCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNleyAKICAgICAgICAgICAgcmVtYWluX3NpemUgPSBmaWxlX3NpemUgLSByZWFkX3RpbWVzICogc2l6ZW9mKGJ1ZmZlcik7CiAgICAgICAgICAgIHByaW50ZigibW9yZV9jaHVua3M9JWQsIHJlYWRfdGltZXM9JWQsIHJlbWFpbl9zaXplIGlzICVkXG4iLCBtb3JlX2NodW5rcywgcmVhZF90aW1lcywgcmVtYWluX3NpemUpOwogICAgICAgICAgICBpZihyZW1haW5fc2l6ZSA9PSAwKQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIHJldCA9IHpEcnZBdWRpb01peF9Xcml0ZShidWZmZXIsIHJlbWFpbl9zaXplKTsKICAgICAgICAgICAgaWYocmV0ICE9IDApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9IAogICAgfSAKICAgIHByaW50Zigid2hpbGUobW9yZV9jaHVua3MpIGVuZFxuIik7IAoKICAgIHJldCA9IHpEcnZBdWRpb01peF9DbG9zZSgpOwogICAgaWYocmV0ICE9IDApCiAgICAgICAgcmV0dXJuIDE7CiAgICBwcmludGYoInpEcnZBdWRpb01peF9DbG9zZSBlbmRcbiIpOwogICAgZmNsb3NlKGZpbGUpOwogICAgcHJpbnRmKCJmY2xvc2UgZW5kXG4iKTsKCiAgICByZXR1cm4gcmV0Owp9Cgo=