I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGludC5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CiNpbmNsdWRlICJzb2Z0YXBfYXBpLmgiCiNpbmNsdWRlICJ6dGVfdnNpbV9hcGkuaCIKCiNkZWZpbmUgVlNJTV9NQVhfTVNHX0xFTgkxMDI0CiNkZWZpbmUgdnNpbV9kZWJ1Z19wcmludGYgcHJpbnRmIAoKZW51bXsKCU1TR19DTURfVlNJTV9HRVRfU1dJVENIID0gMSwvL0FU1NrExNK7tP23ogoJTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gsCglNU0dfQ01EX1ZTSU1fR0VUX1NUQU5EQlksLy+/zbunyejWw7T9u/qy4Cy/ycTcsrvKx7Wxx7C1scewtP27+rLgLLHIyOdUQVUKCU1TR19DTURfVlNJTV9TRVRfU1RBTkRCWSwKCU1TR19DTURfVlNJTV9HRVRfVEFVSU5HLC8v1f3U2tf2VEFVLNPD09q8+MiowfezzMfQu9jKtczlv6jF0LbPCglNU0dfQ01EX1ZTSU1fU0VUX1RBVUlORywKCU1TR19DTURfVlNJTV9HRVRfQVVUSElORywvL9X91NrX9rz4yKgstMvKsb371rlUQVUKCU1TR19DTURfVlNJTV9TRVRfQVVUSElORywKCU1TR19DTURfVlNJTV9HRVRfQ0FSRF9TVEFULC8vu/HIobWxx7C117LjyrW8yrT9u/qy4AoJTVNHX0NNRF9WU0lNX0FQRFUsCglNU0dfQ01EX1ZTSU1fR0VUX0ZMT1dfU1RBVElTVElDLC8vu/HIobWxx7DB98G/zbO8xgoJTVNHX0NNRF9WU0lNX1JFU0VUX0ZMT1dfU1RBVElTVElDLC8v1tjWw7Wxx7DB98G/zbO8xgoJTVNHX0NNRF9WU0lNX01BWCwKfTsKCnR5cGVkZWYgc3RydWN0IHsKICAgIHVuc2lnbmVkIHNob3J0IHVzTXNnQ21kOyAgICAgICAgICAgICAgIC8qIM/7z6LA4NDNICovICAKICAgIHVuc2lnbmVkIHNob3J0IHVzRGF0YUxlbjsgICAgICAgICAgICAgICAgLyogz/vPorOktsijrLD8wKjNt7K/ICovICAKICAgIHVuc2lnbmVkIGNoYXIgYXVjRGF0YUJ1ZltWU0lNX01BWF9NU0dfTEVOXTsgIC8qIM/7z6LV/c7EICovICAKfSBWU0lNX01TR19CVUY7CgpwdGhyZWFkX3QgcmVhZF90aHJlYWRfdGlkOwpwdGhyZWFkX3QgbXNnX3RocmVhZF90aWQ7CmludCBnX3JlYWRfdGhyZWFkX3N0YXRlID0gLTE7CmludCBnX21zZ190aHJlYWRfc3RhdGUgPSAtMTsKVlNJTV9DT01NQU5EIGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2I7Cnp0ZV9tZG1fZXZlbnRfaW5kX2NhbGxiYWNrIGdfdnNpbV9ldmVudF9pbmRfY2I7CgppbnQzMl90IHp0ZV9tZG1fZXZlbnRfaW5kX2NiKEVfTU9ERU1fRVZFTlRfSUQgZXZlbnRfaWQsIHZvaWQgKmluZF9kYXRhLCB1aW50MzJfdCAgaW5kX2RhdGFfbGVuKQp7CglyZXR1cm4gMDsKfQppbnQgenRlX3ZzaW1faW5kX2NiKHVpbnQ4X3QgKmFwZHVfcmVxLCB1aW50MTZfdCBhcGR1X3JlcV9sZW4sdWludDhfdCAqYXBkdV9yc3AsIHVpbnQxNl90ICphcGR1X3JzcF9sZW4sIHVpbnQ4X3Qgc2xvdCkKewoJY2hhciBhZGRyWzY0XSA9IHswfTsKCWNoYXIgY21kWzEyOF0gPSB7MH07CgkKCXNjX2NmZ19nZXQoInZzaW1fZGVidWdfaXAiLGFkZHIsc2l6ZW9mKGFkZHIpKTsKCWlmKHN0cmxlbihhZGRyKSl7CgkJc25wcmludGYoY21kLCBzaXplb2YoY21kKSwgInBpbmcgJXMgLXcgNSIsIGFkZHIpOwoJCXN5c3RlbShjbWQpOwoJfWVsc2UKCQlzeXN0ZW0oInBpbmcgMTkyLjE2OC4zMC4xMTAgLXcgNSIpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgdnNpbV9jYXJkX3N3aXRjaF9yZXEodW5zaWduZWQgY2hhciBzaW0pCnsKCWludCByZXQgPSAwOwoJaWYoc2ltKQoJCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtaQ0FSRFNXSVRDSFJFUT0wLDFcclxuIiwgTlVMTCwgTlVMTCk7CgllbHNlCgkJcmV0ID0gZ2V0X21vZGVtX2luZm8oIkFUK1pDQVJEU1dJVENIUkVRPTEsMFxyXG4iLCBOVUxMLCBOVUxMKTsKCWlmKHJldCAhPSAwKXsKCQlwcmludGYoIiMjdnNpbSMjIFslc10gc2ltPSVkIHJldD0lZCBlcnJcbiIsIF9fRlVOQ1RJT05fXywgc2ltLCByZXQpOwoJfQoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc2ltPSVkIHJldD0lZFxuIiwgX19GVU5DVElPTl9fLCBzaW0sIHJldCk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IHZzaW1fc2V0KHVuc2lnbmVkIHNob3J0IG1zZywgdW5zaWduZWQgY2hhciBwYXJhbSkKewoJVlNJTV9NU0dfQlVGIG1zZ19pbiA9IHswfTsKCVZTSU1fTVNHX0JVRiBtc2dfb3V0ID0gezB9OwoJaW50IHJldCA9IDA7CgkKCW1zZ19pbi51c01zZ0NtZCA9IG1zZzsKCW1zZ19pbi5hdWNEYXRhQnVmWzBdID0gcGFyYW07Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBtc2c9JWQgcGFyYW09JWQgc3RhcnRcbiIsIF9fRlVOQ1RJT05fXywgbXNnLCBwYXJhbSk7CglyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV9wcm9jLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbiwgKHVuc2lnbmVkIGNoYXIgKikmbXNnX291dCk7CglpZihyZXQgPT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIG1zZz0lZCBwYXJhbT0lZCBlcnJcbiIsIF9fRlVOQ1RJT05fXywgbXNnLCBwYXJhbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgdW5zaWduZWQgY2hhciB2c2ltX2dldCh1bnNpZ25lZCBzaG9ydCBtc2cpCnsKCVZTSU1fTVNHX0JVRiBtc2dfaW4gPSB7MH07CglWU0lNX01TR19CVUYgbXNnX291dCA9IHswfTsKCWludCByZXQgPSAwOwoJCgltc2dfaW4udXNNc2dDbWQgPSBtc2c7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBtc2c9JWQgc3RhcnRcbiIsIF9fRlVOQ1RJT05fXywgbXNnKTsKCXJldCA9IHN5c2NhbGwoX19OUl92c2ltX3Byb2MsKHVuc2lnbmVkIGNoYXIgKikmbXNnX2luLCAodW5zaWduZWQgY2hhciAqKSZtc2dfb3V0KTsKCWlmKHJldCA9PSAwKXsKCQlwcmludGYoIiMjdnNpbSMjIFslc10gbXNnPSVkIGVyclxuIiwgX19GVU5DVElPTl9fLCBtc2cpOwoJfQoJcmV0dXJuIG1zZ19vdXQuYXVjRGF0YUJ1ZlswXTsKfQoKc3RhdGljIGludCB2c2ltX2dldF9jYXJkc3RhdF9mcm9tcHModm9pZCkKewoJVlNJTV9NU0dfQlVGIG1zZ19pbiA9IHswfTsKCVZTSU1fTVNHX0JVRiBtc2dfb3V0ID0gezB9OwoJaW50IHJldCA9IDA7CgkKCW1zZ19pbi51c01zZ0NtZCA9IE1TR19DTURfVlNJTV9HRVRfQ0FSRF9TVEFUOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV9wcm9jLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbiwgKHVuc2lnbmVkIGNoYXIgKikmbXNnX291dCk7CglpZihyZXQgPT0gMCB8fCBtc2dfb3V0LmF1Y0RhdGFCdWZbMF0gPT0gbXNnX291dC5hdWNEYXRhQnVmWzFdIHx8IG1zZ19vdXQuYXVjRGF0YUJ1ZlsyXSl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIGVyciByZXQ9JWQgc2ltMT0lZCBzaW0yPSVkIGJ1c3k9JWRcbiIsIF9fRlVOQ1RJT05fXywgcmV0LCBtc2dfb3V0LmF1Y0RhdGFCdWZbMF0sIG1zZ19vdXQuYXVjRGF0YUJ1ZlsxXSwgbXNnX291dC5hdWNEYXRhQnVmWzJdKTsKCQlyZXR1cm4gLTE7Cgl9CglpZihtc2dfb3V0LmF1Y0RhdGFCdWZbMF0pCgkJcmV0dXJuIDA7CglpZihtc2dfb3V0LmF1Y0RhdGFCdWZbMV0pCgkJcmV0dXJuIDE7CglyZXR1cm4gLTE7Cn0KCnN0YXRpYyB2b2lkIHJlYWRfdGhyZWFkX2VudHJ5KHZvaWQgKmFyZykKewoJcHJjdGwoUFJfU0VUX05BTUUsICJ2c2ltX3JlYWQiLCAwLCAwLCAwKTsKCXdoaWxlKGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IpCgl7CgkJVlNJTV9NU0dfQlVGIG1zZ19pbiA9IHswfTsKCQlWU0lNX01TR19CVUYgbXNnX291dCA9IHswfTsKCQlpbnQgcmV0ID0gMDsKCQlpbnQgaXNfYXV0aCA9IDA7CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CgkJcmV0ID0gc3lzY2FsbChfX05SX3ZzaW1fcmVhZCwodW5zaWduZWQgY2hhciAqKSZtc2dfb3V0KTsKCQlpZihyZXQgPT0gMCl7CgkJCXByaW50ZigiIyN2c2ltIyMgcmVhZCBmYWlsXG4iKTsKCQl9CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIHJlYWQgbXNnPSVkXG4iLCBtc2dfb3V0LnVzTXNnQ21kKTsKCQlpZihtc2dfb3V0LnVzTXNnQ21kICE9IE1TR19DTURfVlNJTV9BUERVIHx8IHJldCA9PSAwKXsKCQkJcHJpbnRmKCIjI3ZzaW0jIyByZWFkIG1zZz0lZCByZXQ9JWQgZXJyXG4iLCBtc2dfb3V0LnVzTXNnQ21kLCByZXQpOwoJCX0KCQlpc19hdXRoID0gbXNnX291dC5hdWNEYXRhQnVmWzFdOwoJCS8vx9DKtczlv6gKCQlpZihpc19hdXRoKXsKCQkJcHJpbnRmKCIjI3ZzaW0jIyB2c2ltX2FwZHVfYXV0aCBzdGFuZGJ5PSVkXG4iLCB2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX1NUQU5EQlkpKTsKCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9BVVRISU5HLDEpOwoJCQl1c2xlZXAoMjAwMDApOy8vsaO7pLTryqks0dOz2TIwusHD69TZz8K3osfQv6ijrLGj1qS8+Miox+vH87XEcmxjIGFja7vYuLS4+M34suAKCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoMCk7Ly+0y8qxyrXM5b+ov8nE3LTm1NrN+MLnwbS906Osz8jH0M341NnH0Mr9vt0KCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLDApOwoJCX0KCQltc2dfaW4udXNEYXRhTGVuID0gc2l6ZW9mKG1zZ19pbi5hdWNEYXRhQnVmKTsKCQlyZXQgPSBnX3ZzaW1fYXBkdV9wcm9jZXNzX2NiKCZtc2dfb3V0LmF1Y0RhdGFCdWZbMl0sIG1zZ19vdXQudXNEYXRhTGVuLCBtc2dfaW4uYXVjRGF0YUJ1ZiwgCgkJJm1zZ19pbi51c0RhdGFMZW4sIG1zZ19vdXQuYXVjRGF0YUJ1ZlswXSk7CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIGdfdnNpbV9hcGR1X3Byb2Nlc3NfY2IgcmV0PTB4JXggbGVuPSVkXG4iLCByZXQsIG1zZ19pbi51c0RhdGFMZW4pOwoJCS8vx9DQ6cTiv6gKCQlpZihpc19hdXRoKXsKCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLDEpOy8vtMvKsdTGv6jTprjDzrS9qM34wufBtL3To6zPyMfQyv2+3dTZx9DN+AoJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcSgxKTsKCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9BVVRISU5HLDApOwoJCX0KCQkvL21zZ19pbi51c0RhdGFMZW4gPSByZXQ7t7W72LK7ysezpLbIysfXtMys19YKCQltc2dfaW4udXNNc2dDbWQgPSBNU0dfQ01EX1ZTSU1fQVBEVTsKCQlyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV93cml0ZSwodW5zaWduZWQgY2hhciAqKSZtc2dfaW4pOwoJCWlmKHJldCA9PSAwKXsKCQkJcHJpbnRmKCIjI3ZzaW0jIyB3cml0ZSBmYWlsXG4iKTsKCQl9Cgl9CglwcmludGYoIiMjdnNpbSMjIHJlYWRfdGhyZWFkIHF1aXRcbiIpOwoJZ19yZWFkX3RocmVhZF9zdGF0ZSA9IC0xOwoJcHRocmVhZF9leGl0KDApOwp9CgpzdGF0aWMgdm9pZCBtc2dfdGhyZWFkX2VudHJ5KHZvaWQgKmFyZykKewoJaW50IGlNc2dIYW5kbGUgPSBtc2dnZXQoTU9EVUxFX0lEX1ZTSU0sIElQQ19DUkVBVHwwNjAwKTsKCUxPTkcgbXNnU2l6ZSA9IHNpemVvZihNU0dfQlVGKS1zaXplb2YoTE9ORyk7Cgl1bnNpZ25lZCBjaGFyIFN3aXRjaFN0YXQ7CgkKCXByY3RsKFBSX1NFVF9OQU1FLCAidnNpbV9tc2ciLCAwLCAwLCAwKTsKCXdoaWxlKGdfdnNpbV9ldmVudF9pbmRfY2IpCgl7CgkJTVNHX0JVRiBzdE1zZyA9IHswfTsKCQl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCQlpZiAobXNncmN2KGlNc2dIYW5kbGUsICZzdE1zZywgbXNnU2l6ZSwgMCwgMCkgPj0gMCkKCQl7CgkJCXN3aXRjaCAoc3RNc2cudXNNc2dDbWQpCgkJCXsKCQkJY2FzZSBNU0dfQ01EX1pDQVJEU1dJVENISU5EX0lORDoKCQkJCS8vY2FsbGJhY2sgdG9kbwoJCQkJU3dpdGNoU3RhdCA9IHN0TXNnLmF1Y0RhdGFCdWZbMV07CgkJCQlpZih2c2ltX2dldChNU0dfQ01EX1ZTSU1fR0VUX0FVVEhJTkcpKXsKCQkJCQlwcmludGYoIiMjdnNpbSMjIFpDQVJEU1dJVENISU5EIEFVVEhJTkcgYWJvcnRcbiIpOwoJCQkJCWlmKFN3aXRjaFN0YXQpCgkJCQkJCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfVEFVSU5HLDApOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJaWYoU3dpdGNoU3RhdCA9PSAwKXsKCQkJCQl2c2ltX3NldChNU0dfQ01EX1ZTSU1fU0VUX1RBVUlORywxKTsKCQkJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShzdE1zZy5hdWNEYXRhQnVmWzBdKTsKCQkJCX1lbHNlewoJCQkJCWlmKHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfU1RBTkRCWSkgPT0gc3RNc2cuYXVjRGF0YUJ1ZlswXSkKCQkJCQkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoc3RNc2cuYXVjRGF0YUJ1ZlswXSk7CgkJCQkJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9UQVVJTkcsMCk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSBNU0dfQ01EX0NSRUdfSU5EOgoJCQkJaWYodnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TVEFOREJZKSA9PSAxKXsKCQkJCS8vY2FsbGJhY2sgdG9kbwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgTVNHX0NNRF9WU0lNREVCVUdfSU5EOgoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAxKXsKCQkJCQljaGFyIGltZWlbXT0iODYyNzY5MDI1NDM1OTU2IjsKCQkJCQlmaWJvX3NldF9JTUVJX2J5X3NpbWlkKGltZWksc2l6ZW9mKGltZWkpLDEpOwoJCQkJCWZpYm9fbWRtX2V2ZW50X3JlZ2lzdCh6dGVfbWRtX2V2ZW50X2luZF9jYik7CgkJCQkJZmlib192c2ltX2luaXQoenRlX3ZzaW1faW5kX2NiLDEpOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAyKXsKCQkJCQlmaWJvX3ZzaW1fY2xvc2UoenRlX3ZzaW1faW5kX2NiLDEpOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAxMCl7CgkJCQkJenRlX1NldEdUREFUQVNJTSgwKTsKCQkJCX0KCQkJCWlmKHN0TXNnLmF1Y0RhdGFCdWZbMF0gPT0gMTEpewoJCQkJCXp0ZV9TZXRHVERBVEFTSU0oMSk7CgkJCQl9CgkJCQlpZihzdE1zZy5hdWNEYXRhQnVmWzBdID09IDIwKXsKCQkJCQl6dGVfU2V0R1REVUFMU0lNKDApOwoJCQkJfQoJCQkJaWYoc3RNc2cuYXVjRGF0YUJ1ZlswXSA9PSAyMSl7CgkJCQkJenRlX1NldEdURFVBTFNJTSgxKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJcHJpbnRmKCIjI3ZzaW0jIyByY3ZfbXNnIGVyciBtc2dpZCAweCV4XG4iLHN0TXNnLnVzTXNnQ21kKTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyByY3ZfbXNnIG1zZ2lkIDB4JXggcGFyYW09JWQgZW5kXG4iLHN0TXNnLnVzTXNnQ21kLCBzdE1zZy5hdWNEYXRhQnVmWzBdKTsKCX0KCXByaW50ZigiIyN2c2ltIyMgbXNnX3RocmVhZCBxdWl0XG4iKTsKCWdfbXNnX3RocmVhZF9zdGF0ZSA9IC0xOwoJcHRocmVhZF9leGl0KDApOwp9CgppbnQzMl90IHp0ZV9hdFZzaW1Jbml0KFZTSU1fQ09NTUFORCB2c2ltX2FwZHVfcHJvY2Vzc19mbiwgdWludDhfdCBuU2ltSUQpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYodnNpbV9hcGR1X3Byb2Nlc3NfZm4gPT0gTlVMTCB8fCBuU2ltSUQgIT0gMSl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBpbml0IHBhcmFtIGVyciBmbj0weCV4IHNpbT0lZFxuIiwgdnNpbV9hcGR1X3Byb2Nlc3NfZm4sIG5TaW1JRCk7CgkJcmV0dXJuIC0xOwoJfQoJZ192c2ltX2FwZHVfcHJvY2Vzc19jYiA9IHZzaW1fYXBkdV9wcm9jZXNzX2ZuOwoJaWYoZ19yZWFkX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfcmVhZF90aHJlYWRfc3RhdGUgPSBwdGhyZWFkX2NyZWF0ZSgmcmVhZF90aHJlYWRfdGlkLCBOVUxMLCAodm9pZCAqKXJlYWRfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfbXNnX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfbXNnX3RocmVhZF9zdGF0ZSA9IHB0aHJlYWRfY3JlYXRlKCZtc2dfdGhyZWFkX3RpZCwgTlVMTCwgKHZvaWQgKiltc2dfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfcmVhZF90aHJlYWRfc3RhdGUgIT0gMCB8fCBnX21zZ190aHJlYWRfc3RhdGUgIT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBpbml0IGZhaWwgcmVhZD0lZCBtc2c9JWRcbiIsIGdfcmVhZF90aHJlYWRfc3RhdGUsIGdfbXNnX3RocmVhZF9zdGF0ZSk7CgkJcmV0dXJuIC0xOwoJfQoJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLDEpOy8vtMvKsdTGv6jOtL2ozfjC58G0vdOjrM/Ix9DK/b7d1NnH0M34Cgl2c2ltX2NhcmRfc3dpdGNoX3JlcSgxKTsKCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfU1dJVENILDEpOwoJZ2V0X21vZGVtX2luZm8oIkFUK0NGVU49MVxyXG4iLCBOVUxMLCBOVUxMKTsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9hdFZzaW1DbG9zZShWU0lNX0NPTU1BTkQgdnNpbV9hcGR1X3Byb2Nlc3NfZm4sIHVpbnQ4X3QgblNpbUlEKQp7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCXp0ZV9TZXRHVERBVEFTSU0oMSk7CglnZXRfbW9kZW1faW5mbygiQVQrQ0ZVTj0wXHJcbiIsIE5VTEwsIE5VTEwpOwoJdnNpbV9jYXJkX3N3aXRjaF9yZXEoMCk7Cgl6dGVfU2V0R1REVUFMU0lNKDApOwoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX1NldEdUREFUQVNJTSh1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IDA7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfQVVUSElORykpewoJCXByaW50ZigiIyN2c2ltIyMgWyVzXS0+JWQgZmFpbCBBVVRISU5HXG4iLCBfX0ZVTkNUSU9OX18sIG5TaW1JRCk7CgkJcmV0dXJuIC0xOwoJfQoJdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TVEFOREJZLG5TaW1JRCk7CglyZXQgPSB2c2ltX2dldF9jYXJkc3RhdF9mcm9tcHMoKTsKCWlmKHJldCA+PSAwKXsKCQlpZihuU2ltSUQgIT0gcmV0KXsKCQkJLy/I57n7yejWw7rNtbHHsLXXsuO0/bv6suCyu9K71sKyxcfQLGZvclRBVUlORwoJCQl2c2ltX2NhcmRfc3dpdGNoX3JlcShuU2ltSUQpOwoJCX0KCX1lbHNlCgkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoblNpbUlEKTsKCXZzaW1fc2V0KE1TR19DTURfVlNJTV9TRVRfU1dJVENILCBuU2ltSUQpOwoJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIGNhcmRzdGF0PSVkIHNpbT0lZFxuIiwgX19GVU5DVElPTl9fLCByZXQsIG5TaW1JRCk7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfR2V0R1REQVRBU0lNKHVpbnQ4X3QgKm5TaW1JRCkKewoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CgkqblNpbUlEID0gdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TVEFOREJZKTsKCXJldHVybiAwOwp9CgppbnQzMl90IHp0ZV9TZXRHVERVQUxTSU0odWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAwOwoJdW5zaWduZWQgY2hhciBzdGFuZGJ5ID0gdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TVEFOREJZKTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJcmV0ID0gdnNpbV9zZXQoTVNHX0NNRF9WU0lNX1NFVF9TV0lUQ0gsblNpbUlEKTsKCWlmKHJldCA9PSAwKXsKCQlwcmludGYoIiMjdnNpbSMjIFslc10gZXJyIHNpbT0lZFxuIiwgX19GVU5DVElPTl9fLCBuU2ltSUQpOwoJCXJldHVybiAtMTsKCX0KCS8vQVTS0b6tx9C6w6Osz8LD5srHxdC2z8rHt/HSqsfQv6gKCWlmKHZzaW1fZ2V0KE1TR19DTURfVlNJTV9HRVRfVEFVSU5HKSl7Ly9UQVW1xLn9s8zW0Cyyu8fQv6gKCQlwcmludGYoIiMjdnNpbSMjIFslc10gVEFVSU5HXG4iLCBfX0ZVTkNUSU9OX18pOwoJCXJldHVybiAwOwoJfQoJcmV0ID0gdnNpbV9nZXRfY2FyZHN0YXRfZnJvbXBzKCk7CglpZihyZXQgPj0gMCAmJiBzdGFuZGJ5ICE9IHJldCAmJiBzdGFuZGJ5ID09IG5TaW1JRCl7CgkJLy+1scfQu7tBVLXExL+x6rT9u/qy4LrNyc+y49aux7DJ6LaotcS0/bv6suDP4M2sLMfSus2117LjyrW8yrXEtP27+rLgsrvNrCzT1rK7ysdUQVW1xLn9s8zW0Cy+zbSlt6LH0L+oCgkJdnNpbV9jYXJkX3N3aXRjaF9yZXEoblNpbUlEKTsKCX0KCXByaW50ZigiIyN2c2ltIyMgWyVzXSBjYXJkc3RhdD0lZCBzdGFuZGJ5PSVkIHNpbT0lZFxuIiwgX19GVU5DVElPTl9fLCByZXQsIHN0YW5kYnksIG5TaW1JRCk7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfR2V0R1REVUFMU0lNKHVpbnQ4X3QgKm5TaW1JRCkKewoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CgkqblNpbUlEID0gdnNpbV9nZXQoTVNHX0NNRF9WU0lNX0dFVF9TV0lUQ0gpOwoJcmV0dXJuIDA7Cn0KCmludDMyX3QgenRlX21kbV9ldmVudF9yZWdpc3QoenRlX21kbV9ldmVudF9pbmRfY2FsbGJhY2sgaW5kX2NiKQp7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWdfdnNpbV9ldmVudF9pbmRfY2IgPSBpbmRfY2I7CglyZXR1cm4gMDsKfQoKdm9pZCB6dGVfdnNpbV9kZWJ1Zyh2b2lkKQp7CglnX3ZzaW1fZXZlbnRfaW5kX2NiID0genRlX21kbV9ldmVudF9pbmRfY2I7CglnX3ZzaW1fYXBkdV9wcm9jZXNzX2NiID0genRlX3ZzaW1faW5kX2NiOwoJaWYoZ19yZWFkX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfcmVhZF90aHJlYWRfc3RhdGUgPSBwdGhyZWFkX2NyZWF0ZSgmcmVhZF90aHJlYWRfdGlkLCBOVUxMLCAodm9pZCAqKXJlYWRfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfbXNnX3RocmVhZF9zdGF0ZSAhPSAwKQoJCWdfbXNnX3RocmVhZF9zdGF0ZSA9IHB0aHJlYWRfY3JlYXRlKCZtc2dfdGhyZWFkX3RpZCwgTlVMTCwgKHZvaWQgKiltc2dfdGhyZWFkX2VudHJ5LCBOVUxMKTsKCWlmKGdfcmVhZF90aHJlYWRfc3RhdGUgIT0gMCB8fCBnX21zZ190aHJlYWRfc3RhdGUgIT0gMCl7CgkJcHJpbnRmKCIjI3ZzaW0jIyBkZWJ1ZyBmYWlsIHJlYWQ9JWQgbXNnPSVkXG4iLCBnX3JlYWRfdGhyZWFkX3N0YXRlLCBnX21zZ190aHJlYWRfc3RhdGUpOwoJfQp9CgppbnQzMl90IHp0ZV9hdFZzaW1SZXNldCh2b2lkKQp7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCXJldHVybiByZXN0YXJ0X3JlcXVlc3QoTU9EVUxFX0lEX1ZTSU0pOwp9CgppbnQzMl90IHp0ZV9TZXRDZnVuTW9kZSh1aW50OF90IG1vZGUpCnsKCWNoYXIgYXRfY21kWzY0XSA9IHswfTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtDRlVOPSVkXHJcbiIsIG1vZGUpOwoJcmV0dXJuIGdldF9tb2RlbV9pbmZvKGF0X2NtZCwgTlVMTCwgTlVMTCk7Cn0KCmludDMyX3QgenRlX0dldENmdW5Nb2RlKHVpbnQ4X3QgKm1vZGUpCnsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYobW9kZSkKCQlyZXR1cm4gZ2V0X21vZGVtX2luZm8oIkFUK0NGVU4/XHJcbiIsICIlMWQiLCAodm9pZCoqKSZtb2RlKTsKCXJldHVybiAtMTsKfQoKaW50MzJfdCB6dGVfU2V0SU1FSWJ5U2ltSWQodWludDhfdCAqaW1laSwgdWludDhfdCBpbWVpX2xlbiwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoaW1laSl7CgkJY2hhciBhdF9jbWRbNjRdID0gezB9OwoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlzbnByaW50ZihhdF9jbWQsc2l6ZW9mKGF0X2NtZCksIkFUK0NHU049JXNcclxuIixpbWVpKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbyhhdF9jbWQsIE5VTEwsIE5VTEwpOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX0dldElNRUlieVNpbUlkKHVpbnQ4X3QgKmltZWksIHVpbnQ4X3QgaW1laV9sZW4sIHVpbnQ4X3QgblNpbUlEKQp7CglpbnQgcmV0ID0gLTE7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKGltZWkpewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbygiQVQrQ0dTTlxyXG4iLCAiJXMiLCAodm9pZCoqKSZpbWVpKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgoKaW50MzJfdCB6dGVfR2V0Q0NJRGJ5U2ltSWQodWludDhfdCAqY2NpZCwgdWludDhfdCBjY2lkX2xlbiwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoY2NpZCl7CgkJdWludDhfdCBzaW0gPSAwOwoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtaSUNDSUQ/XHJcbiIsICIlcyIsICh2b2lkKiopJmNjaWQpOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX0dldE1DQ01OQ2J5U2ltSWQoY2hhciAqbWNjLCBjaGFyICptbmMsIHVpbnQ4X3QgblNpbUlEKQp7CglpbnQgcmV0ID0gLTE7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKG1jYyAmJiBtbmMpewojaWYgMAoJCWludCBzdzE9MDsKCQlpbnQgc3cyPS0xOwoJCWNoYXIgcmVzcG9uc2VbNTEzXSA9IHswfTsvL7Oktsi3ts6nMC0yNTbX1r3ao6w3RjIwNUY3MLHtyr40uPbX1r3as6S2yAoJCXZvaWQgKnBbXSA9IHsmc3cxLCZzdzIscmVzcG9uc2V9OwoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlnZXRfbW9kZW1faW5mbygiQVQrQ1JTTT0xNzYsMjg1ODksMCwwLDRcclxuIiwgIiVkLCVkLCVzIiwgKHZvaWQqKilwKTsKCQlpZihzdzEgPT0gMTQ0ICYmIHN3MiA9PSAwKXsKCQkJY2hhciBpbXNpWzY0XSA9IHswfTsKCQkJY2hhciBzdHJQbG1uTGFzdFsxMF0gPSB7MH07CgkJCXZvaWQgKnAxW10gPSB7aW1zaX07CgkJCgkJCWdldF9tb2RlbV9pbmZvKCJBVCtDSU1JXHJcbiIsICIlcyIsICh2b2lkKiopcDEpOwoJCQlzdHJuY3B5KHN0clBsbW5MYXN0LCAmcmVzcG9uc2Vbc3RybGVuKHJlc3BvbnNlKS0yXSwgMik7CgkJCW1lbXNldChtY2MsIDAsIDQpOwoJCQltZW1zZXQobW5jLCAwLCA0KTsKCQkJbWVtY3B5KG1jYywgaW1zaSwgMyk7CgkJCWlmKDAgPT0gc3RyY21wKCIwMyIsIHN0clBsbW5MYXN0KSkKCQkJCW1lbWNweShtbmMsIGltc2krMywgMyk7CgkJCWVsc2UKCQkJCW1lbWNweShtbmMsIGltc2krMywgMik7CgkJfQoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCQlyZXR1cm4gIShzdzEgPT0gMTQ0ICYmIHN3MiA9PSAwKTsKI2Vsc2UKCQlpbnQgaTEsaTIsaTMsaTQsaTU7CgkJY2hhciBwbG1uWzhdID0gezB9OwoJCXZvaWQgKnBbXSA9IHsmaTEsJmkyLCZpMywmaTQsJmk1LHBsbW59OwoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbygiQVQrWkVNU0NJUT0xXHJcbiIsICIlZCwlZCwlZCwlZCwlZCwlcyIsICh2b2lkKiopcCk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShzaW0pOwoJCW1lbXNldChtY2MsIDAsIDQpOwoJCW1lbXNldChtbmMsIDAsIDQpOwoJCW1lbWNweShtY2MsIHBsbW4sIDMpOwoJCW1lbWNweShtbmMsIHBsbW4rMywgMyk7CiNlbmRpZgoJfQoJcmV0dXJuIHJldDsKfQoKaW50MzJfdCB6dGVfU3dpdGNoU2ltSGFuZGxlKHVpbnQ4X3QgbW9kZSkKewoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfR2V0Q1NRYnlTaW1JZChpbnQzMl90ICpyc3NpLCBpbnQzMl90ICpiZXIsIHVpbnQ4X3QgblNpbUlEKQp7CglpbnQgcmV0ID0gLTE7Cgl2c2ltX2RlYnVnX3ByaW50ZigiIyN2c2ltIyMgWyVzXSBzdGFydFxuIiwgX19GVU5DVElPTl9fKTsKCWlmKHJzc2kgJiYgYmVyKXsKCQl2b2lkICpwW10gPSB7cnNzaSxiZXJ9OwoJCXVpbnQ4X3Qgc2ltID0gMDsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbygiQVQrQ1NRXHJcbiIsICIlZCwlZCIsICh2b2lkKiopcCk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShzaW0pOwoJfQoJcmV0dXJuIHJldDsKfQoKaW50MzJfdCB6dGVfR2V0UmVnSW5mb2J5U2ltaWQoUmVnSW5mb190ICpyZWdfaW5mbywgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYocmVnX2luZm8pewoJCWludCBpLGFjdCxyYWM7CgkJdm9pZCAqcFtdID0geyZpLCZhY3QsJnJlZ19pbmZvLT5sdGVfc2NlbGxfaW5mby5jZWxsX2lkLCZyYWMsJnJlZ19pbmZvLT5sdGVfc2NlbGxfaW5mby50YWN9OwoJCXZvaWQgKnAxW10gPSB7JnJlZ19pbmZvLT5uU3RhdHVzfTsKCQl1aW50OF90IHNpbSA9IDA7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmVnX2luZm8tPm5TdGF0dXMgPSAwOwoJCWdldF9tb2RlbV9pbmZvKCJBVF5TWVNJTkZPXHJcbiIsICIlZCIsICh2b2lkKiopcDEpOwoJCXJldCA9IGdldF9tb2RlbV9pbmZvKCJBVCtaRU1TQ0lRPTFcclxuIiwgIiVkLCVkLCVkLCVkLCVkIiwgKHZvaWQqKilwKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7CgkJaWYocmV0IHx8IHJlZ19pbmZvLT5uU3RhdHVzICE9IDIpCgkJCXJldHVybiAtMTsKCQlpZihhY3QgPT0gMTYpewoJCQlyZWdfaW5mby0+Y3Vycl9yYXQgPSBFX05XX1JBRElPX0lGX0xURTsKCQl9IGVsc2UgewoJCQlpZihhY3QgPT0gMSkKCQkJCXJlZ19pbmZvLT5jdXJyX3JhdCA9IEVfTldfUkFESU9fSUZfVERTQ0RNQTsKCQkJZWxzZSBpZihhY3QgPT0gMikKCQkJCXJlZ19pbmZvLT5jdXJyX3JhdCA9IEVfTldfUkFESU9fSUZfV0NETUE7CgkJCWVsc2UgaWYoYWN0ID09IDQpCgkJCQlyZWdfaW5mby0+Y3Vycl9yYXQgPSBFX05XX1JBRElPX0lGX0dTTTsKCQkJZWxzZQoJCQkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIGFjdD0lZCA/Pz9cbiIsIF9fRlVOQ1RJT05fXywgYWN0KTsKCQl9Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXRDZWxsSW5mb2J5U2ltSWQoQ2VsbEluZm9fdCAqcGNlbGxpbmZvLCB1aW50OF90IG5TaW1JRCkKewoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfR2V0TmV0SW5mb2J5U2ltSWQoTmV0SW5mb190ICpwTmV0SW5mbywgdWludDhfdCBuU2ltSUQpCnsKCVZTSU1fTVNHX0JVRiBtc2dfaW4gPSB7MH07CglWU0lNX01TR19CVUYgbXNnX291dCA9IHswfTsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYocE5ldEluZm8gJiYgblNpbUlEIDwgMil7CgkJbXNnX2luLnVzTXNnQ21kID0gTVNHX0NNRF9WU0lNX0dFVF9GTE9XX1NUQVRJU1RJQzsKCQltc2dfaW4uYXVjRGF0YUJ1ZlswXSA9IG5TaW1JRDsKCQlyZXQgPSBzeXNjYWxsKF9fTlJfdnNpbV9wcm9jLCh1bnNpZ25lZCBjaGFyICopJm1zZ19pbiwgKHVuc2lnbmVkIGNoYXIgKikmbXNnX291dCk7CgkJaWYocmV0ID09IDApewoJCQlwcmludGYoIiMjdnNpbSMjIFslc10gdnNpbV9wcm9jIGVyclxuIiwgX19GVU5DVElPTl9fKTsKCQl9CgkJaWYoc2l6ZW9mKE5ldEluZm9fdCkgPiBtc2dfb3V0LnVzRGF0YUxlbikKCQkJbWVtY3B5KHBOZXRJbmZvLCBtc2dfb3V0LmF1Y0RhdGFCdWYsIG1zZ19vdXQudXNEYXRhTGVuKTsKCQllbHNlCgkJCW1lbWNweShwTmV0SW5mbywgbXNnX291dC5hdWNEYXRhQnVmLCBzaXplb2YoTmV0SW5mb190KSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9TZXRBUE5ieVNpbUlEKERhdGFfY2FsbF9jb25maWdfaW5mb190ICpkYXRhX2NhbGwsIHVpbnQ4X3QgblNpbUlEKQp7CglyZXR1cm4gMDsKfQoKaW50MzJfdCB6dGVfU3RhcnREYXRhQ2FsbGJ5U2ltSWQoRGF0YV9jYWxsX2NvbmZpZ19pbmZvX3QgKmRhdGFfY2FsbCwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYoZGF0YV9jYWxsKXsKCQl1aW50OF90IHNpbSA9IDA7CgkJY2hhciBhdF9jbWRbMTI4XSA9IHswfTsKCQl2b2lkICpwW10gPSB7JmRhdGFfY2FsbC0+cHJvZmlsZV9pZH07CgkJY2hhciByZXNlcnZlY2lkWzMwXSA9IHswfTsKCQl1bnNpZ25lZCBjaGFyIGNpZF9yZXNlcnZlZCA9IDA7CgkJdW5zaWduZWQgY2hhciBjaWRfcmVzZXJ2ZWRfdnNpbSA9IDA7CgkJCgkJenRlX0dldEdUREFUQVNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKXsKCQkJcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIG5TaW1JRD0lZCBzdGFuZGJ5PSVkIGVyclxuIiwgX19GVU5DVElPTl9fLCBuU2ltSUQsIHNpbSk7CgkJCXJldHVybiByZXQ7CgkJfQoJCWlmKG5TaW1JRCl7CgkJCXNjX2NmZ19nZXQoImNpZF9yZXNlcnZlZCIscmVzZXJ2ZWNpZCxzaXplb2YocmVzZXJ2ZWNpZCkpOwoJCQlpZihzdHJsZW4ocmVzZXJ2ZWNpZCkpCgkJCQljaWRfcmVzZXJ2ZWQgPSBhdG9pKHJlc2VydmVjaWQpOwoJCQljaWRfcmVzZXJ2ZWRfdnNpbSA9IGNpZF9yZXNlcnZlZHwxNTsKCQkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtDSURSRVNFUlZFRD0lZFxyXG4iLCBjaWRfcmVzZXJ2ZWRfdnNpbSk7CgkJCWdldF9tb2RlbV9pbmZvKGF0X2NtZCwgTlVMTCwgTlVMTCk7CgkJfQoJCWlmKGRhdGFfY2FsbC0+aXBfZmFtaWx5ID09IEVfREFUQV9JUF9GQU1JTFlfSVBWNCkKCQkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtaUERQQUNUPTAsXCJJUFwiLFwiJXNcIiwsLCwlZCxcIiVzXCIsXCIlc1wiXHJcbiIsIGRhdGFfY2FsbC0+YXBuX25hbWUsIGRhdGFfY2FsbC0+YXV0aF9wcmVmLCBkYXRhX2NhbGwtPnVzZXJfbmFtZSwgZGF0YV9jYWxsLT5wYXNzd29yZCk7CgkJZWxzZSBpZihkYXRhX2NhbGwtPmlwX2ZhbWlseSA9PSBFX0RBVEFfSVBfRkFNSUxZX0lQVjYpCgkJCXNucHJpbnRmKGF0X2NtZCxzaXplb2YoYXRfY21kKSwiQVQrWlBEUEFDVD0wLFwiSVBWNlwiLFwiJXNcIiwsLCwlZCxcIiVzXCIsXCIlc1wiXHJcbiIsIGRhdGFfY2FsbC0+YXBuX25hbWUsIGRhdGFfY2FsbC0+YXV0aF9wcmVmLCBkYXRhX2NhbGwtPnVzZXJfbmFtZSwgZGF0YV9jYWxsLT5wYXNzd29yZCk7CgkJZWxzZSBpZihkYXRhX2NhbGwtPmlwX2ZhbWlseSA9PSBFX0RBVEFfSVBfRkFNSUxZX0lQVjRWNikKCQkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtaUERQQUNUPTAsXCJJUFY0VjZcIixcIiVzXCIsLCwsJWQsXCIlc1wiLFwiJXNcIlxyXG4iLCBkYXRhX2NhbGwtPmFwbl9uYW1lLCBkYXRhX2NhbGwtPmF1dGhfcHJlZiwgZGF0YV9jYWxsLT51c2VyX25hbWUsIGRhdGFfY2FsbC0+cGFzc3dvcmQpOwoJCWVsc2UgewoJCQlwcmludGYoIiMjdnNpbSMjIFslc10gaXBfZmFtaWx5PSVkID8/P1xuIiwgX19GVU5DVElPTl9fLCBkYXRhX2NhbGwtPmlwX2ZhbWlseSk7CgkJCXNucHJpbnRmKGF0X2NtZCxzaXplb2YoYXRfY21kKSwiQVQrWlBEUEFDVD0wLFwiSVBcIixcIiVzXCIsLCwsJWQsXCIlc1wiLFwiJXNcIlxyXG4iLCBkYXRhX2NhbGwtPmFwbl9uYW1lLCBkYXRhX2NhbGwtPmF1dGhfcHJlZiwgZGF0YV9jYWxsLT51c2VyX25hbWUsIGRhdGFfY2FsbC0+cGFzc3dvcmQpOwoJCX0KCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbyhhdF9jbWQsICIlZCIsICh2b2lkKiopcCk7CgkJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gcmV0PSVkIGNpZD0lZFxuIiwgX19GVU5DVElPTl9fLCByZXQsIGRhdGFfY2FsbC0+cHJvZmlsZV9pZCk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShzaW0pOwoJCWlmKG5TaW1JRCl7CgkJCXNucHJpbnRmKGF0X2NtZCxzaXplb2YoYXRfY21kKSwiQVQrQ0lEUkVTRVJWRUQ9JWRcclxuIiwgY2lkX3Jlc2VydmVkKTsKCQkJZ2V0X21vZGVtX2luZm8oYXRfY21kLCBOVUxMLCBOVUxMKTsKCQl9Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9TdG9wRGF0YUNhbGxieVNpbUlkKHVpbnQ4X3QgcHJvZmlsZV9pZCwgdWludDhfdCBuU2ltSUQpCnsKCWludCByZXQgPSAtMTsKCXZzaW1fZGVidWdfcHJpbnRmKCIjI3ZzaW0jIyBbJXNdIHN0YXJ0XG4iLCBfX0ZVTkNUSU9OX18pOwoJaWYocHJvZmlsZV9pZCA+IDAgJiYgcHJvZmlsZV9pZCA8IDkpewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQljaGFyIGF0X2NtZFs2NF0gPSB7MH07CgkJCgkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtaUERQREVBQ1Q9JWRcclxuIiwgcHJvZmlsZV9pZCk7CgkJenRlX0dldEdURFVBTFNJTSgmc2ltKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CgkJcmV0ID0gZ2V0X21vZGVtX2luZm8oYXRfY21kLCBOVUxMLCBOVUxMKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQzMl90IHp0ZV9HZXREYXRhQWRkcmJ5U2ltSUQodWludDhfdCBwcm9maWxlX2lkLCBEYXRhX2NhbGxfYWRkcl9pbmZvX2xpc3RfdCAqYWRkcl9saXN0LCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihwcm9maWxlX2lkID4gMCAmJiBwcm9maWxlX2lkIDwgOSAmJiBhZGRyX2xpc3QpewoJCXVpbnQ4X3Qgc2ltID0gMDsKCQljaGFyIGF0X2NtZFs2NF0gPSB7MH07CgkJaW50IGNpZCA9IDA7CgkJdm9pZCAqcFtdID0geyZjaWQsIGFkZHJfbGlzdH07CgkJCgkJc25wcmludGYoYXRfY21kLHNpemVvZihhdF9jbWQpLCJBVCtDR1BBRERSPSVkXHJcbiIsIHByb2ZpbGVfaWQpOwoJCXp0ZV9HZXRHVERVQUxTSU0oJnNpbSk7CgkJaWYoc2ltICE9IG5TaW1JRCkKCQkJenRlX1NldEdURFVBTFNJTShuU2ltSUQpOwoJCXJldCA9IGdldF9tb2RlbV9pbmZvKGF0X2NtZCwgIiVkLCUxN3MiLCAodm9pZCoqKXApOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCX0KCXJldHVybiByZXQ7Cn0KCmludDMyX3QgenRlX0dldFNpbVN0YXR1c2J5U2ltSWQoRV9TSU1fU1RBVFVTICpzaW1fc3RhdHVzLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7CglpZihzaW1fc3RhdHVzKXsKCQl1aW50OF90IHNpbSA9IDA7CgkJY2hhciBhdF9wYXJhc1s2NF0gPSB7MH07CgkJdm9pZCAqcFtdID0ge2F0X3BhcmFzfTsKCQl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJCWlmKHNpbSAhPSBuU2ltSUQpCgkJCXp0ZV9TZXRHVERVQUxTSU0oblNpbUlEKTsKCQlyZXQgPSBnZXRfbW9kZW1faW5mbygiQVQrQ1BJTj9cclxuIiwgIiVzIiwgKHZvaWQqKilwKTsKCQlpZihzaW0gIT0gblNpbUlEKQoJCQl6dGVfU2V0R1REVUFMU0lNKHNpbSk7CgkJaWYocmV0ID09IDApewoJCQlpZiAoc3RybmNtcCgiUkVBRFkiLCBhdF9wYXJhcywgc3RybGVuKCJSRUFEWSIpKSA9PSAwKQoJCQl7CgkJCQkqc2ltX3N0YXR1cyA9IEVfU0lNX1NUQVRfUkVBRFk7CgkJCX0KCQkJLyrI57n7tbHHsMPcwuvK5Mjrx+vH886qUElOu/JQSU4yo6zU8srkyOsrQ1BJTj08cGluPr340NDQo9HpKi8KCQkJZWxzZSBpZihzdHJuY21wKCJTSU0gUElOIixhdF9wYXJhcywgc3RybGVuKCJTSU0gUElOIikpID09IDApCgkJCXsKCQkJCSpzaW1fc3RhdHVzID0gRV9TSU1fU1RBVF9QSU47CgkJCX0KCQkJLyrI57n7tbHHsMPcwuvK5Mjrx+vH886qUFVLu/JQVUsyo6zU8srkyOsrQ1BJTj08cGluPiw8bmV3cGluPr340NC94sv4Ki8KCQkJZWxzZSBpZihzdHJuY21wKCJTSU0gUFVLIixhdF9wYXJhcywgc3RybGVuKCJTSU0gUFVLIikpID09IDApCgkJCXsKCQkJCSpzaW1fc3RhdHVzID0gRV9TSU1fU1RBVF9QVUs7CgkJCX0KCQl9IGVsc2UgaWYocmV0ID09IDEwKXsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX05PVF9JTlNFUlRFRDsKCQl9IGVsc2UgaWYocmV0ID09IDE0KXsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX0JVU1k7CgkJfSBlbHNlIHsKCQkJKnNpbV9zdGF0dXMgPSBFX1NJTV9TVEFUX1VOS05PV047CgkJfQoJCXJldHVybiAwOwoJfQoJcmV0dXJuIC0xOwp9CgppbnQzMl90IHp0ZV9TZW5kQVRieVNpbUlkKGNoYXIgKnJlcV9hdCwgY2hhciAqaW5mb19mbXQsIHZvaWQgKipwdmFsLCB1aW50OF90IG5TaW1JRCkKewoJaW50IHJldCA9IC0xOwoJdWludDhfdCBzaW0gPSAwOwoJdnNpbV9kZWJ1Z19wcmludGYoIiMjdnNpbSMjIFslc10gc3RhcnRcbiIsIF9fRlVOQ1RJT05fXyk7Cgl6dGVfR2V0R1REVUFMU0lNKCZzaW0pOwoJaWYoc2ltICE9IG5TaW1JRCkKCQl6dGVfU2V0R1REVUFMU0lNKG5TaW1JRCk7CglwcmludGYoIiMjdnNpbSMjIFslc10gblNpbUlEPSVkIHN3PSVkIGF0PSVzXG4iLCBfX0ZVTkNUSU9OX18sIG5TaW1JRCwgc2ltLCByZXFfYXQpOwoJcmV0ID0gZ2V0X21vZGVtX2luZm8ocmVxX2F0LCBpbmZvX2ZtdCwgcHZhbCk7CglpZihzaW0gIT0gblNpbUlEKQoJCXp0ZV9TZXRHVERVQUxTSU0oc2ltKTsKCXJldHVybiByZXQ7Cn0KCgo=