LyoKICogcHRocmVhZCBlbXVsYXRpb24gZm9yIHJlLWVudHJhbnQgbGliY3MKICoKICogV2UgY2FuJ3QgdXNlIHB0aHJlYWRzIGRpcmVjdGx5LCBzbyB3aHkgbm90IGxldCBsaWJjcwogKiB0aGF0IHdhbnQgcHRocmVhZHMgdXNlIFdpbmUncyBvd24gdGhyZWFkaW5nIGluc3RlYWQuLi4KICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojZGVmaW5lIF9HTlVfU09VUkNFIC8qIHdlIG1heSBuZWVkIHRvIG92ZXJyaWRlIHNvbWUgR05VIGV4dGVuc2lvbnMgKi8KCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJudGRkay5oIgoKc3RhdGljIGludCBpbml0X2RvbmU7Cgp2b2lkIFBUSFJFQURfaW5pdF9kb25lKHZvaWQpCnsKICAgIGluaXRfZG9uZSA9IDE7Cn0KCi8qIEN1cnJlbnRseSB0aGlzIHByb2JhYmx5IHdvcmtzIG9ubHkgZm9yIGdsaWJjMiwKICogd2hpY2ggY2hlY2tzIGZvciB0aGUgcHJlc2VuY2Ugb2YgZG91YmxlLXVuZGVyc2NvcmUtcHJlcGVuZGVkCiAqIHB0aHJlYWQgcHJpbWl0aXZlcywgYW5kIHVzZSB0aGVtIGlmIGF2YWlsYWJsZS4KICogSWYgdGhleSBhcmUgbm90IGF2YWlsYWJsZSwgdGhlIGxpYmMgZGVmYXVsdHMgdG8KICogbm9uLXRocmVhZHNhZmUgb3BlcmF0aW9uIChub3QgZ29vZCkuICovCgojaWYgZGVmaW5lZChfX0dMSUJDX18pCiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KCiNpZmRlZiBORUVEX1VOREVSU0NPUkVfUFJFRklYCiMgZGVmaW5lIFBSRUZJWCAiXyIKI2Vsc2UKIyBkZWZpbmUgUFJFRklYCiNlbmRpZgoKI2RlZmluZSBQU1RSKHN0cikgUFJFRklYICNzdHIKCi8qIGFkYXB0IGFzIG5lY2Vzc2FyeSAoYSBjb25zdHJ1Y3QgbGlrZSB0aGlzIGlzIHVzZWQgaW4gZ2xpYmMgc291cmNlcykgKi8KI2RlZmluZSBzdHJvbmdfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnNldCAiIFBTVFIoYWxpYXMpICIsIiBQU1RSKG9yaWcpKQoKLyogc3Ryb25nX2FsaWFzIGRvZXMgbm90IHdvcmsgb24gZXh0ZXJuYWwgc3ltYm9scyAoLm8gZm9ybWF0IGxpbWl0YXRpb24/KSwKICogc28gZm9yIHRob3NlLCB3ZSBuZWVkIHRvIHVzZSB0aGUgcG9nbyBzdGljayAqLwojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgIWRlZmluZWQoX19QSUNfXykKLyogRklYTUU6IFBJQyAqLwojZGVmaW5lIGp1bXBfYWxpYXMob3JpZywgYWxpYXMpIFwKIGFzbSgiLmdsb2JsICIgUFNUUihhbGlhcykgIlxuIiBcCiAgICAgIlx0LnR5cGUgIiBQU1RSKGFsaWFzKSAiLEBmdW5jdGlvblxuIiBcCiAgICAgUFNUUihhbGlhcykgIjpcbiIgXAogICAgICJcdGptcCAiIFBTVFIob3JpZykpCiNlbmRpZgoKLyogZ2V0IG5lY2Vzc2FyeSBsaWJjIHN5bWJvbHMgKi8KI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAxKSAmJiBkZWZpbmVkKEhBVkVfX19MSUJDX0ZPUkspCiNkZWZpbmUgTElCQ19GT1JLIF9fbGliY19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIF9fZm9yawojZGVmaW5lIEFMSUFTX0ZPUksKI2Vsc2UKI2RlZmluZSBMSUJDX0ZPUksgX19mb3JrCiNkZWZpbmUgUFRIUkVBRF9GT1JLIGZvcmsKI2VuZGlmCmV4dGVybiBwaWRfdCBMSUJDX0ZPUksodm9pZCk7CgojZGVmaW5lIExJQkNfU0lHQUNUSU9OIF9fc2lnYWN0aW9uCmV4dGVybiBpbnQgTElCQ19TSUdBQ1RJT04oaW50IHNpZ251bSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIAogICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNpZ2FjdGlvbiAqb2xkYWN0KTsKCi8qIE5PVEU6IFRoaXMgaXMgYSB0cnVseSBleHRyZW1lbHkgaW5jcmVkaWJseSB1Z2x5IGhhY2shCiAqIEJ1dCBpdCBkb2VzIHNlZW0gdG8gd29yay4uLiAqLwoKLyogYXNzdW1lIHRoYXQgcHRocmVhZF9tdXRleF90IGhhcyByb29tIGZvciBhdCBsZWFzdCBvbmUgcG9pbnRlciwKICogYW5kIGhvcGUgdGhhdCB0aGUgdXNlcnMgb2YgcHRocmVhZF9tdXRleF90IGNvbnNpZGVycyBpdCBvcGFxdWUKICogKG5ldmVyIGNoZWNrcyB3aGF0J3MgaW4gaXQpIAogKiBhbHNvOiBhc3N1bWUgdGhhdCBzdGF0aWMgaW5pdGlhbGl6ZXIgc2V0cyBwb2ludGVyIHRvIE5VTEwKICovCnR5cGVkZWYgc3RydWN0IHsKICBDUklUSUNBTF9TRUNUSU9OICpjcml0c2VjdDsKfSAqd2luZV9tdXRleDsKCi8qIHNlZSB3aW5lX211dGV4IGFib3ZlIGZvciBjb21tZW50cyAqLwp0eXBlZGVmIHN0cnVjdCB7CiAgUlRMX1JXTE9DSyAqbG9jazsKfSAqd2luZV9yd2xvY2s7Cgp0eXBlZGVmIHN0cnVjdCBfd2luZV9jbGVhbnVwIHsKICB2b2lkICgqcm91dGluZSkodm9pZCAqKTsKICB2b2lkICphcmc7Cn0gKndpbmVfY2xlYW51cDsKCnR5cGVkZWYgY29uc3Qgdm9pZCAqa2V5X2RhdGE7CgojZGVmaW5lIEZJUlNUX0tFWSAwCiNkZWZpbmUgTUFYX0tFWVMgMTYgLyogbGliYzYgZG9lc24ndCB1c2UgdGhhdCBtYW55LCBidXQuLi4gKi8KCiNkZWZpbmUgUF9PVVRQVVQoc3R1ZmYpIHdyaXRlKDIsc3R1ZmYsc3RybGVuKHN0dWZmKSkKCnZvaWQgX19wdGhyZWFkX2luaXRpYWxpemUodm9pZCkKewp9CgppbnQgX19wdGhyZWFkX29uY2UocHRocmVhZF9vbmNlX3QgKm9uY2VfY29udHJvbCwgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkpCnsKICBzdGF0aWMgcHRocmVhZF9vbmNlX3QgdGhlX29uY2UgPSBQVEhSRUFEX09OQ0VfSU5JVDsKICBMT05HIG9uY2Vfbm93ID0gKihMT05HICopJnRoZV9vbmNlOwoKICBpZiAoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoKExPTkcqKW9uY2VfY29udHJvbCwgb25jZV9ub3crMSwgb25jZV9ub3cpID09IG9uY2Vfbm93KQogICAgKCppbml0X3JvdXRpbmUpKCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9vbmNlLCBwdGhyZWFkX29uY2UpOwoKdm9pZCBfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wKHZvaWQpCnsKICAgIC8qIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgaGVyZSAqLwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfa2lsbF9vdGhlcl90aHJlYWRzX25wLCBwdGhyZWFkX2tpbGxfb3RoZXJfdGhyZWFkc19ucCk7CgovKioqKiogYXRmb3JrICoqKioqLwoKI2RlZmluZSBNQVhfQVRGT1JLIDggIC8qIGxpYmMgZG9lc24ndCBuZWVkIHRoYXQgbWFueSBhbnl3YXkgKi8KCnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIGF0Zm9ya19zZWN0aW9uID0gQ1JJVElDQUxfU0VDVElPTl9JTklUKCJhdGZvcmtfc2VjdGlvbiIpOwp0eXBlZGVmIHZvaWQgKCphdGZvcmtfaGFuZGxlcikoKTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19wcmVwYXJlW01BWF9BVEZPUktdOwpzdGF0aWMgYXRmb3JrX2hhbmRsZXIgYXRmb3JrX3BhcmVudFtNQVhfQVRGT1JLXTsKc3RhdGljIGF0Zm9ya19oYW5kbGVyIGF0Zm9ya19jaGlsZFtNQVhfQVRGT1JLXTsKc3RhdGljIGludCBhdGZvcmtfY291bnQ7CgppbnQgX19wdGhyZWFkX2F0Zm9yayh2b2lkICgqcHJlcGFyZSkodm9pZCksCgkJICAgICB2b2lkICgqcGFyZW50KSh2b2lkKSwKCQkgICAgIHZvaWQgKCpjaGlsZCkodm9pZCkpCnsKICAgIGlmIChpbml0X2RvbmUpIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIGFzc2VydCggYXRmb3JrX2NvdW50IDwgTUFYX0FURk9SSyApOwogICAgYXRmb3JrX3ByZXBhcmVbYXRmb3JrX2NvdW50XSA9IHByZXBhcmU7CiAgICBhdGZvcmtfcGFyZW50W2F0Zm9ya19jb3VudF0gPSBwYXJlbnQ7CiAgICBhdGZvcmtfY2hpbGRbYXRmb3JrX2NvdW50XSA9IGNoaWxkOwogICAgYXRmb3JrX2NvdW50Kys7CiAgICBpZiAoaW5pdF9kb25lKSBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX2F0Zm9yaywgcHRocmVhZF9hdGZvcmspOwoKcGlkX3QgUFRIUkVBRF9GT1JLKHZvaWQpCnsKICAgIHBpZF90IHBpZDsKICAgIGludCBpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgIC8qIHByZXBhcmUgaGFuZGxlcnMgYXJlIGNhbGxlZCBpbiByZXZlcnNlIGluc2VydGlvbiBvcmRlciAqLwogICAgZm9yIChpID0gYXRmb3JrX2NvdW50IC0gMTsgaSA+PSAwOyBpLS0pIGlmIChhdGZvcmtfcHJlcGFyZVtpXSkgYXRmb3JrX3ByZXBhcmVbaV0oKTsKICAgIGlmICghKHBpZCA9IExJQkNfRk9SSygpKSkKICAgIHsKICAgICAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmYXRmb3JrX3NlY3Rpb24gKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXRmb3JrX2NvdW50OyBpKyspIGlmIChhdGZvcmtfY2hpbGRbaV0pIGF0Zm9ya19jaGlsZFtpXSgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBhdGZvcmtfY291bnQ7IGkrKykgaWYgKGF0Zm9ya19wYXJlbnRbaV0pIGF0Zm9ya19wYXJlbnRbaV0oKTsKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJmF0Zm9ya19zZWN0aW9uICk7CiAgICB9CiAgICByZXR1cm4gcGlkOwp9CiNpZmRlZiBBTElBU19GT1JLCnN0cm9uZ19hbGlhcyhQVEhSRUFEX0ZPUkssIGZvcmspOwojZW5kaWYKCi8qKioqKiBNVVRFWEVTICoqKioqLwoKaW50IF9fcHRocmVhZF9tdXRleF9pbml0KHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0aHJlYWRfbXV0ZXhhdHRyX3QgKm11dGV4YXR0cikKewogIC8qIGdsaWJjIGhhcyBhIHRlbmRlbmN5IHRvIGluaXRpYWxpemUgbXV0ZXhlcyB2ZXJ5IG9mdGVuLCBldmVuCiAgICAgaW4gc2l0dWF0aW9ucyB3aGVyZSB0aGV5IGFyZSBub3QgcmVhbGx5IHVzZWQgbGF0ZXIgb24uCgogICAgIEFzIGZvciB1cywgaW5pdGlhbGl6aW5nIGEgbXV0ZXggaXMgdmVyeSBleHBlbnNpdmUsIHdlIHBvc3Rwb25lCiAgICAgdGhlIHJlYWwgaW5pdGlhbGl6YXRpb24gdW50aWwgdGhlIHRpbWUgdGhlIG11dGV4IGlzIGZpcnN0IHVzZWQuICovCgogICgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0ID0gTlVMTDsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X2luaXQsIHB0aHJlYWRfbXV0ZXhfaW5pdCk7CgpzdGF0aWMgdm9pZCBtdXRleF9yZWFsX2luaXQoIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXggKQp7CiAgQ1JJVElDQUxfU0VDVElPTiAqY3JpdHNlY3QgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKENSSVRJQ0FMX1NFQ1RJT04pKTsKICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpLGNyaXRzZWN0LE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKGNyaXRzZWN0KTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGNyaXRzZWN0KTsKICB9Cn0KCmludCBfX3B0aHJlYWRfbXV0ZXhfbG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIAogICAgbXV0ZXhfcmVhbF9pbml0KCBtdXRleCApOwoKICBFbnRlckNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleF9sb2NrLCBwdGhyZWFkX211dGV4X2xvY2spOwoKaW50IF9fcHRocmVhZF9tdXRleF90cnlsb2NrKHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgCiAgICBtdXRleF9yZWFsX2luaXQoIG11dGV4ICk7CgogIGlmICghVHJ5RW50ZXJDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4X3RyeWxvY2ssIHB0aHJlYWRfbXV0ZXhfdHJ5bG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X3VubG9jayhwdGhyZWFkX211dGV4X3QgKm11dGV4KQp7CiAgaWYgKCEoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCkgcmV0dXJuIDA7CiAgTGVhdmVDcml0aWNhbFNlY3Rpb24oKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfdW5sb2NrLCBwdGhyZWFkX211dGV4X3VubG9jayk7CgppbnQgX19wdGhyZWFkX211dGV4X2Rlc3Ryb3kocHRocmVhZF9tdXRleF90ICptdXRleCkKewogIGlmICghKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpIHJldHVybiAwOwogIGlmICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpIHsKI2lmIDAgLyogdGhlcmUgc2VlbXMgdG8gYmUgYSBidWcgaW4gbGliYzYgdGhhdCBtYWtlcyB0aGlzIGEgYmFkIGlkZWEgKi8KICAgIHJldHVybiBFQlVTWTsKI2Vsc2UKICAgIHdoaWxlICgoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdC0+UmVjdXJzaW9uQ291bnQpCiAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCgod2luZV9tdXRleCltdXRleCktPmNyaXRzZWN0KTsKI2VuZGlmCiAgfQogIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigoKHdpbmVfbXV0ZXgpbXV0ZXgpLT5jcml0c2VjdCk7CiAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgKCh3aW5lX211dGV4KW11dGV4KS0+Y3JpdHNlY3QpOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfbXV0ZXhfZGVzdHJveSwgcHRocmVhZF9tdXRleF9kZXN0cm95KTsKCgovKioqKiogTVVURVggQVRUUklCVVRFUyAqKioqKi8KLyoganVzdCBkdW1taWVzLCBzaW5jZSBjcml0aWNhbCBzZWN0aW9ucyBhcmUgYWx3YXlzIHJlY3Vyc2l2ZSAqLwoKaW50IF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdChwdGhyZWFkX211dGV4YXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9tdXRleGF0dHJfaW5pdCwgcHRocmVhZF9tdXRleGF0dHJfaW5pdCk7CgppbnQgX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KHB0aHJlYWRfbXV0ZXhhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9kZXN0cm95LCBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9zZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldGtpbmRfbnAocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUDsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wLCBwdGhyZWFkX211dGV4YXR0cl9nZXRraW5kX25wKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX3NldHR5cGUocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50IGtpbmQpCnsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKTsKCmludCBfX3B0aHJlYWRfbXV0ZXhhdHRyX2dldHR5cGUocHRocmVhZF9tdXRleGF0dHJfdCAqYXR0ciwgaW50ICpraW5kKQp7CiAgKmtpbmQgPSBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRV9OUDsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlLCBwdGhyZWFkX211dGV4YXR0cl9nZXR0eXBlKTsKCgovKioqKiogVEhSRUFELVNQRUNJRklDIFZBUklBQkxFUyAoS0VZUykgKioqKiovCgppbnQgX19wdGhyZWFkX2tleV9jcmVhdGUocHRocmVhZF9rZXlfdCAqa2V5LCB2b2lkICgqZGVzdHJfZnVuY3Rpb24pKHZvaWQgKikpCnsKICBzdGF0aWMgTE9ORyBrZXljbnQgPSBGSVJTVF9LRVk7CiAgKmtleSA9IEludGVybG9ja2VkRXhjaGFuZ2VBZGQoJmtleWNudCwgMSk7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfY3JlYXRlLCBwdGhyZWFkX2tleV9jcmVhdGUpOwoKaW50IF9fcHRocmVhZF9rZXlfZGVsZXRlKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9rZXlfZGVsZXRlLCBwdGhyZWFkX2tleV9kZWxldGUpOwoKaW50IF9fcHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqcG9pbnRlcikKewogIFRFQiAqdGViID0gTnRDdXJyZW50VGViKCk7CiAgaWYgKCF0ZWItPnB0aHJlYWRfZGF0YSkgewogICAgdGViLT5wdGhyZWFkX2RhdGEgPSBjYWxsb2MoTUFYX0tFWVMsc2l6ZW9mKGtleV9kYXRhKSk7CiAgfQogICgoa2V5X2RhdGEqKSh0ZWItPnB0aHJlYWRfZGF0YSkpW2tleV0gPSBwb2ludGVyOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfc2V0c3BlY2lmaWMsIHB0aHJlYWRfc2V0c3BlY2lmaWMpOwoKdm9pZCAqX19wdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQp7CiAgVEVCICp0ZWIgPSBOdEN1cnJlbnRUZWIoKTsKICBpZiAoIXRlYikgcmV0dXJuIE5VTEw7CiAgaWYgKCF0ZWItPnB0aHJlYWRfZGF0YSkgcmV0dXJuIE5VTEw7CiAgcmV0dXJuICh2b2lkICopKCgoa2V5X2RhdGEqKSh0ZWItPnB0aHJlYWRfZGF0YSkpW2tleV0pOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfZ2V0c3BlY2lmaWMsIHB0aHJlYWRfZ2V0c3BlY2lmaWMpOwoKCi8qKioqKiAiRVhDRVBUSU9OIiBGUkFNRVMgKioqKiovCi8qIG5vdCBpbXBsZW1lbnRlZCByaWdodCBub3cgKi8KCnZvaWQgX3B0aHJlYWRfY2xlYW51cF9wdXNoKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCB2b2lkICgqcm91dGluZSkodm9pZCAqKSwgdm9pZCAqYXJnKQp7CiAgKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+cm91dGluZSA9IHJvdXRpbmU7CiAgKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+YXJnID0gYXJnOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wKHN0cnVjdCBfcHRocmVhZF9jbGVhbnVwX2J1ZmZlciAqYnVmZmVyLCBpbnQgZXhlY3V0ZSkKewogIGlmIChleGVjdXRlKSAoKigoKHdpbmVfY2xlYW51cClidWZmZXIpLT5yb3V0aW5lKSkoKCh3aW5lX2NsZWFudXApYnVmZmVyKS0+YXJnKTsKfQoKdm9pZCBfcHRocmVhZF9jbGVhbnVwX3B1c2hfZGVmZXIoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIHZvaWQgKCpyb3V0aW5lKSh2b2lkICopLCB2b2lkICphcmcpCnsKICBfcHRocmVhZF9jbGVhbnVwX3B1c2goYnVmZmVyLCByb3V0aW5lLCBhcmcpOwp9Cgp2b2lkIF9wdGhyZWFkX2NsZWFudXBfcG9wX3Jlc3RvcmUoc3RydWN0IF9wdGhyZWFkX2NsZWFudXBfYnVmZmVyICpidWZmZXIsIGludCBleGVjdXRlKQp7CiAgX3B0aHJlYWRfY2xlYW51cF9wb3AoYnVmZmVyLCBleGVjdXRlKTsKfQoKCi8qKioqKiBDT05ESVRJT05TICoqKioqLwovKiBub3QgaW1wbGVtZW50ZWQgcmlnaHQgbm93ICovCgppbnQgcHRocmVhZF9jb25kX2luaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIGNvbnN0IHB0aHJlYWRfY29uZGF0dHJfdCAqY29uZF9hdHRyKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9pbml0XG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9kZXN0cm95KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9kZXN0cm95XG4iKTsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZF9zaWduYWwocHRocmVhZF9jb25kX3QgKmNvbmQpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3NpZ25hbFxuIik7CiAgcmV0dXJuIDA7Cn0KCmludCBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KHB0aHJlYWRfY29uZF90ICpjb25kKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF9icm9hZGNhc3RcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3dhaXQocHRocmVhZF9jb25kX3QgKmNvbmQsIHB0aHJlYWRfbXV0ZXhfdCAqbXV0ZXgpCnsKICBQX09VVFBVVCgiRklYTUU6cHRocmVhZF9jb25kX3dhaXRcbiIpOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9jb25kX3RpbWVkd2FpdChwdGhyZWFkX2NvbmRfdCAqY29uZCwgcHRocmVhZF9tdXRleF90ICptdXRleCwgY29uc3Qgc3RydWN0IHRpbWVzcGVjICphYnN0aW1lKQp7CiAgUF9PVVRQVVQoIkZJWE1FOnB0aHJlYWRfY29uZF90aW1lZHdhaXRcbiIpOwogIHJldHVybiAwOwp9CgovKioqKiBDT05ESVRJT04gQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfY29uZGF0dHJfaW5pdChwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKaW50IHB0aHJlYWRfY29uZGF0dHJfZGVzdHJveShwdGhyZWFkX2NvbmRhdHRyX3QgKmF0dHIpCnsKICByZXR1cm4gMDsKfQoKI2lmIChfX0dMSUJDX18gPT0gMikgJiYgKF9fR0xJQkNfTUlOT1JfXyA+PSAyKQovKioqKiogUkVBRC1XUklURSBMT0NLUyAqKioqKi8KCnN0YXRpYyB2b2lkIHJ3bG9ja19yZWFsX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgUlRMX1JXTE9DSyAqbG9jayA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoUlRMX1JXTE9DSykpOwogIFJ0bEluaXRpYWxpemVSZXNvdXJjZShsb2NrKTsKCiAgaWYgKEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigodm9pZCoqKSYoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKSxsb2NrLE5VTEwpICE9IE5VTEwpIHsKICAgIC8qIHRvbyBsYXRlLCBzb21lIG90aGVyIHRocmVhZCBhbHJlYWR5IGRpZCBpdCAqLwogICAgUnRsRGVsZXRlUmVzb3VyY2UobG9jayk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBsb2NrKTsKICB9Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrX2luaXQocHRocmVhZF9yd2xvY2tfdCAqcndsb2NrLCBjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqcndsb2NrX2F0dHIpCnsKICAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgPSBOVUxMOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2luaXQsIHB0aHJlYWRfcndsb2NrX2luaXQpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfZGVzdHJveShwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsRGVsZXRlUmVzb3VyY2UoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKTsKICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spOwogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrX2Rlc3Ryb3kpOwoKaW50IF9fcHRocmVhZF9yd2xvY2tfcmRsb2NrKHB0aHJlYWRfcndsb2NrX3QgKnJ3bG9jaykKewogIGlmICghaW5pdF9kb25lKSByZXR1cm4gMDsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykKICAgIHJ3bG9ja19yZWFsX2luaXQoIHJ3bG9jayApOwoKICB3aGlsZShUUlVFKQogICAgaWYgKFJ0bEFjcXVpcmVSZXNvdXJjZVNoYXJlZCgoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2ssIFRSVUUpKQogICAgICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja19yZGxvY2ssIHB0aHJlYWRfcndsb2NrX3JkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIGlmICghUnRsQWNxdWlyZVJlc291cmNlU2hhcmVkKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgRkFMU0UpKSB7CiAgICBlcnJubyA9IEVCVVNZOwogICAgcmV0dXJuIC0xOwogIH0KICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja190cnlyZGxvY2ssIHB0aHJlYWRfcndsb2NrX3RyeXJkbG9jayk7CgppbnQgX19wdGhyZWFkX3J3bG9ja193cmxvY2socHRocmVhZF9yd2xvY2tfdCAqcndsb2NrKQp7CiAgaWYgKCFpbml0X2RvbmUpIHJldHVybiAwOwogIGlmICghKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrKQogICAgcndsb2NrX3JlYWxfaW5pdCggcndsb2NrICk7CgogIHdoaWxlKFRSVUUpCiAgICBpZiAoUnRsQWNxdWlyZVJlc291cmNlRXhjbHVzaXZlKCgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaywgVFJVRSkpCiAgICAgIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3dybG9jaywgcHRocmVhZF9yd2xvY2tfd3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoIWluaXRfZG9uZSkgcmV0dXJuIDA7CiAgaWYgKCEoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2spCiAgICByd2xvY2tfcmVhbF9pbml0KCByd2xvY2sgKTsKCiAgaWYgKCFSdGxBY3F1aXJlUmVzb3VyY2VFeGNsdXNpdmUoKCh3aW5lX3J3bG9jaylyd2xvY2spLT5sb2NrLCBGQUxTRSkpIHsKICAgIGVycm5vID0gRUJVU1k7CiAgICByZXR1cm4gLTE7CiAgfQogIHJldHVybiAwOwp9CnN0cm9uZ19hbGlhcyhfX3B0aHJlYWRfcndsb2NrX3RyeXdybG9jaywgcHRocmVhZF9yd2xvY2tfdHJ5d3Jsb2NrKTsKCmludCBfX3B0aHJlYWRfcndsb2NrX3VubG9jayhwdGhyZWFkX3J3bG9ja190ICpyd2xvY2spCnsKICBpZiAoISgod2luZV9yd2xvY2spcndsb2NrKS0+bG9jaykgcmV0dXJuIDA7CiAgUnRsUmVsZWFzZVJlc291cmNlKCAoKHdpbmVfcndsb2NrKXJ3bG9jayktPmxvY2sgKTsKICByZXR1cm4gMDsKfQpzdHJvbmdfYWxpYXMoX19wdGhyZWFkX3J3bG9ja191bmxvY2ssIHB0aHJlYWRfcndsb2NrX3VubG9jayk7CgovKioqKiBSRUFELVdSSVRFIExPQ0sgQVRUUklCVVRFUyAqKioqKi8KLyogbm90IGltcGxlbWVudGVkIHJpZ2h0IG5vdyAqLwoKaW50IHB0aHJlYWRfcndsb2NrYXR0cl9pbml0KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0KCmludCBfX3B0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KHB0aHJlYWRfcndsb2NrYXR0cl90ICphdHRyKQp7CiAgcmV0dXJuIDA7Cn0Kc3Ryb25nX2FsaWFzKF9fcHRocmVhZF9yd2xvY2thdHRyX2Rlc3Ryb3ksIHB0aHJlYWRfcndsb2NrYXR0cl9kZXN0cm95KTsKCmludCBwdGhyZWFkX3J3bG9ja2F0dHJfZ2V0a2luZF9ucChjb25zdCBwdGhyZWFkX3J3bG9ja2F0dHJfdCAqYXR0ciwgaW50ICpwcmVmKQp7CiAgKnByZWYgPSAwOwogIHJldHVybiAwOwp9CgppbnQgcHRocmVhZF9yd2xvY2thdHRyX3NldGtpbmRfbnAocHRocmVhZF9yd2xvY2thdHRyX3QgKmF0dHIsIGludCBwcmVmKQp7CiAgcmV0dXJuIDA7Cn0KI2VuZGlmIC8qIGdsaWJjIDIuMiAqLwoKLyoqKioqIE1JU0MgKioqKiovCgpwdGhyZWFkX3QgcHRocmVhZF9zZWxmKHZvaWQpCnsKICByZXR1cm4gKHB0aHJlYWRfdClHZXRDdXJyZW50VGhyZWFkSWQoKTsKfQoKaW50IHB0aHJlYWRfZXF1YWwocHRocmVhZF90IHRocmVhZDEsIHB0aHJlYWRfdCB0aHJlYWQyKQp7CiAgcmV0dXJuIChEV09SRCl0aHJlYWQxID09IChEV09SRCl0aHJlYWQyOwp9Cgp2b2lkIHB0aHJlYWRfZXhpdCh2b2lkICpyZXR2YWwpCnsKICAvKiBGSVhNRTogcHRocmVhZCBjbGVhbnVwICovCiAgRXhpdFRocmVhZCgoRFdPUkQpcmV0dmFsKTsKfQoKaW50IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZShpbnQgdHlwZSwgaW50ICpvbGR0eXBlKQp7CiAgaWYgKG9sZHR5cGUpICpvbGR0eXBlID0gUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTOwogIHJldHVybiAwOwp9CgovKioqKiogQU5USS1PVkVSUklERVMgKioqKiovCi8qIHB0aHJlYWRzIHRyaWVzIHRvIG92ZXJyaWRlIHRoZXNlLCBwb2ludCB0aGVtIGJhY2sgdG8gbGliYyAqLwoKI2lmZGVmIGp1bXBfYWxpYXMKanVtcF9hbGlhcyhMSUJDX1NJR0FDVElPTiwgc2lnYWN0aW9uKTsKI2Vsc2UKaW50IHNpZ2FjdGlvbihpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QsIHN0cnVjdCBzaWdhY3Rpb24gKm9sZGFjdCkKewogIHJldHVybiBMSUJDX1NJR0FDVElPTihzaWdudW0sIGFjdCwgb2xkYWN0KTsKfQojZW5kaWYKCiNlbmRpZiAvKiBfX0dMSUJDX18gKi8K