LyoKICogIElQIE1JQiBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGlwLmMKICoKICovCgovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KCiNpZiBkZWZpbmVkKE5FVFNOTVBfSUZORVRfTkVFRFNfS0VSTkVMKSAmJiAhZGVmaW5lZChfS0VSTkVMKQojZGVmaW5lIF9LRVJORUwgMQojZGVmaW5lIF9JX0RFRklORURfS0VSTkVMCiNlbmRpZgojaWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaWZkZWYgaXJpeDYKI2RlZmluZSBfU1RBTkRBTE9ORSAxCiNlbmRpZgojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX1dJTlNPQ0tfSAojaW5jbHVkZSA8d2luc29jay5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU0NUTF9ICiNpZmRlZiBfSV9ERUZJTkVEX0tFUk5FTAojdW5kZWYgX0tFUk5FTAojZW5kaWYKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KI2lmZGVmIF9JX0RFRklORURfS0VSTkVMCiNkZWZpbmUgX0tFUk5FTCAxCiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1NZU01QX0gKI2luY2x1ZGUgPHN5cy9zeXNtcC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1RDUElQU1RBVFNfSAojaW5jbHVkZSA8c3lzL3RjcGlwc3RhdHMuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX1ZBUl9ICiNpbmNsdWRlIDxuZXQvaWZfdmFyLmg+CiNlbmRpZgojaWZkZWYgX0lfREVGSU5FRF9LRVJORUwKI3VuZGVmIF9LRVJORUwKI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fU1lTVE1fSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0hBU0hJTkdfSAojaW5jbHVkZSA8c3lzL2hhc2hpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX0gKI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSVBfVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaXBfdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfU1RSRUFNX0gKI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9ST1VURV9ICiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU0xPR19ICiNpbmNsdWRlIDxzeXNsb2cuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCgojaWYgZGVmaW5lZChNSUJfSVBDT1VOVEVSX1NZTUJPTCkgfHwgZGVmaW5lZChocHV4MTEpCiNpbmNsdWRlIDxzeXMvbWliLmg+CiNpbmNsdWRlIDxuZXRpbmV0L21pYl9rZXJuLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTUlCX0lQQ09VTlRFUl9TWU1CT0wgfHwgaHB1eDExICovCgojaWZkZWYgc29sYXJpczIKI2luY2x1ZGUgImtlcm5lbF9zdW5vczUuaCIKI2Vsc2UKI2luY2x1ZGUgImtlcm5lbC5oIgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2F1dG9fbmxpc3QuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2RhdGFfYWNjZXNzL2ludGVyZmFjZS5oPgoKI2luY2x1ZGUgImlwLmgiCiNpbmNsdWRlICJpbnRlcmZhY2VzLmgiCgojaWZkZWYgY3lnd2luCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNlbmRpZgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEtlcm5lbCAmIGludGVyZmFjZSBpbmZvcm1hdGlvbiwKCSAqICAgYW5kIGludGVybmFsIGZvcndhcmQgZGVjbGFyYXRpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbml0aWFsaXNhdGlvbiAmIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIFN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKI2lmICFkZWZpbmVkIChXSU4zMikgJiYgIWRlZmluZWQgKGN5Z3dpbikKCiNpZiAhZGVmaW5lZChORVRTTk1QX0NBTl9VU0VfU1lTQ1RMKSB8fCAhZGVmaW5lZChJUENUTF9TVEFUUykKI2lmbmRlZiBzb2xhcmlzMgoKI2lmIGRlZmluZWQoZnJlZWJzZDIpIHx8IGRlZmluZWQoaHB1eDExKSB8fCBkZWZpbmVkKGxpbnV4KQpzdGF0aWMgdm9pZCAgICAgQWRkcmVzc19TY2FuX0luaXQodm9pZCk7CiNpZmRlZiBmcmVlYnNkMgpzdGF0aWMgaW50ICAgICAgQWRkcmVzc19TY2FuX05leHQoc2hvcnQgKiwgc3RydWN0IGluX2lmYWRkciAqKTsKI2Vsc2UKI2lmZGVmIGxpbnV4CnN0YXRpYyBzdHJ1Y3QgaWZjb25mIGlmYzsKc3RhdGljIGludCAgICAgIEFkZHJlc3NfU2Nhbl9OZXh0KHNob3J0ICosIHN0cnVjdCBpZm5ldCAqKTsKI2Vsc2UKc3RhdGljIGludCAgICAgIEFkZHJlc3NfU2Nhbl9OZXh0KHNob3J0ICosIG1pYl9pcEFkRW50ICopOwojZW5kaWYKI2VuZGlmCiNlbmRpZgoKLyoKICogdmFyX2lwQWRkckVudHJ5KC4uLgogKiBBcmd1bWVudHM6CiAqIHZwICAgICBJTiAgICAgIC0gcG9pbnRlciB0byB2YXJpYWJsZSBlbnRyeSB0aGF0IHBvaW50cyBoZXJlCiAqIG5hbWUgICAgSU4vT1VUICAtIElOL25hbWUgcmVxdWVzdGVkLCBPVVQvbmFtZSBmb3VuZAogKiBsZW5ndGggIElOL09VVCAgLSBsZW5ndGggb2YgSU4vT1VUIG9pZCdzIAogKiBleGFjdCAgIElOICAgICAgLSBUUlVFIGlmIGFuIGV4YWN0IG1hdGNoIHdhcyByZXF1ZXN0ZWQKICogdmFyX2xlbiBPVVQgICAgIC0gbGVuZ3RoIG9mIHZhcmlhYmxlIG9yIDAgaWYgZnVuY3Rpb24gcmV0dXJuZWQKICogd3JpdGVfbWV0aG9kCiAqIAogKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2lwQWRkckVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIC8qCiAgICAgKiBvYmplY3QgaWRlbnRpZmllciBpcyBvZiBmb3JtOgogICAgICogMS4zLjYuMS4yLjEuNC4yMC4xLj8uQS5CLkMuRCwgIHdoZXJlIEEuQi5DLkQgaXMgSVAgYWRkcmVzcy4KICAgICAqIElQQUREUiBzdGFydHMgYXQgb2Zmc2V0IDEwLgogICAgICovCiAgICBvaWQgICAgICAgICAgICAgbG93ZXN0WzE0XTsKICAgIG9pZCAgICAgICAgICAgICBjdXJyZW50WzE0XSwgKm9wOwogICAgdV9jaGFyICAgICAgICAgKmNwOwogICAgaW50ICAgICAgICAgICAgIGxvd2ludGVyZmFjZSA9IDA7CiNpZm5kZWYgZnJlZWJzZDIKICAgIHNob3J0ICAgICAgICAgICBpbnRlcmZhY2U7CiNlbmRpZgojaWZkZWYgaHB1eDExCiAgICBzdGF0aWMgbWliX2lwQWRFbnQgaW5faWZhZGRyLCBsb3dpbl9pZmFkZHI7CiNlbHNlCiNpZiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoc3VuVjMpCiAgICBzdGF0aWMgc3RydWN0IGluX2lmYWRkciBpbl9pZmFkZHIsIGxvd2luX2lmYWRkcjsKI2Vsc2UKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgbG93aW5faWZuZXQ7CiNlbmRpZgogICAgc3RhdGljIHN0cnVjdCBpZm5ldCBpZm5ldDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KICAgIHN0YXRpYyBpbl9hZGRyX3QJYWRkcl9yZXQ7CgogICAgLyoKICAgICAqIGZpbGwgaW4gb2JqZWN0IHBhcnQgb2YgbmFtZSBmb3IgY3VycmVudCAobGVzcyBzaXplb2YgaW5zdGFuY2UgcGFydCkgCiAgICAgKi8KCiAgICBtZW1jcHkoKGNoYXIgKikgY3VycmVudCwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgojaWYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKGhwdXgxMSkgJiYgIWRlZmluZWQobGludXgpCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiNlbHNlCiAgICBBZGRyZXNzX1NjYW5fSW5pdCgpOwojZW5kaWYKICAgIGZvciAoOzspIHsKCiNpZiAhZGVmaW5lZChmcmVlYnNkMikgJiYgIWRlZmluZWQoaHB1eDExKSAmJiAhZGVmaW5lZChsaW51eCkKICAgICAgICBpZiAoSW50ZXJmYWNlX1NjYW5fTmV4dCgmaW50ZXJmYWNlLCBOVUxMLCAmaWZuZXQsICZpbl9pZmFkZHIpID09IDApCiAgICAgICAgICAgIGJyZWFrOwojaWZkZWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfQUREUkxJU1QKICAgICAgICBpZiAoaWZuZXQuaWZfYWRkcmxpc3QgPT0gMCkKICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgICAvKiBObyBhZGRyZXNzIGZvdW5kIGZvciBpbnRlcmZhY2UgKi8KI2VuZGlmCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIWZyZWVic2QyICYmICFocHV4MTEgKi8KI2lmIGRlZmluZWQobGludXgpCiAgICAgICAgaWYgKEFkZHJlc3NfU2Nhbl9OZXh0KCZpbnRlcmZhY2UsICZpZm5ldCkgPT0gMCkKICAgICAgICAgICAgYnJlYWs7CiNlbHNlCiAgICAgICAgaWYgKEFkZHJlc3NfU2Nhbl9OZXh0KCZpbnRlcmZhY2UsICZpbl9pZmFkZHIpID09IDApCiAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAhZnJlZWJzZDIgJiYgIWhwdXgxMSAmJiAhbGludXggKi8KCiNpZmRlZiBocHV4MTEKICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiBpbl9pZmFkZHIuQWRkcjsKI2VsaWYgZGVmaW5lZChsaW51eCkgfHwgZGVmaW5lZChzdW5WMykKICAgICAgICBjcCA9ICh1X2NoYXIgKikgJiAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJihpZm5ldC5pZl9hZGRyKSktPgogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZWxzZQogICAgICAgIGNwID0gKHVfY2hhciAqKSAmICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmKGluX2lmYWRkci5pYV9hZGRyKSktPgogICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5fYWRkci5zX2FkZHIpOwojZW5kaWYKCiAgICAgICAgb3AgPSBjdXJyZW50ICsgMTA7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICBpZiAoZXhhY3QpIHsKICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgMTQsIG5hbWUsICpsZW5ndGgpID09IDApIHsKICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgICAgICAgICAgbG93aW5faWZuZXQgPSBpZm5ldDsKI2Vsc2UKICAgICAgICAgICAgICAgIGxvd2luX2lmYWRkciA9IGluX2lmYWRkcjsKI2VuZGlmCiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA+IDApICYmCiAgICAgICAgICAgICAgICAoIWxvd2ludGVyZmFjZQogICAgICAgICAgICAgICAgIHx8IChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBsb3dlc3QsIDE0KSA8IDApKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0IGFuZCBjbG9zZXIgdG8gaW5wdXQgdGhhbgogICAgICAgICAgICAgICAgICogcHJldmlvdXMgbG93ZXN0LCBzYXZlIHRoaXMgb25lIGFzIHRoZSAibmV4dCIgb25lLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiNpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgICAgICAgICAgbG93aW5faWZuZXQgPSBpZm5ldDsKI2Vsc2UKICAgICAgICAgICAgICAgIGxvd2luX2lmYWRkciA9IGluX2lmYWRkcjsKI2VuZGlmCiAgICAgICAgICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBjdXJyZW50LAogICAgICAgICAgICAgICAgICAgICAgIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKI2lmIGRlZmluZWQobGludXgpCiAgICBTTk1QX0ZSRUUoaWZjLmlmY19idWYpOwojZW5kaWYKCiAgICBpZiAoIWxvd2ludGVyZmFjZSkKICAgICAgICByZXR1cm4gKE5VTEwpOwogICAgbWVtY3B5KChjaGFyICopIG5hbWUsIChjaGFyICopIGxvd2VzdCwgMTQgKiBzaXplb2Yob2lkKSk7CiAgICAqbGVuZ3RoID0gMTQ7CiAgICAqd3JpdGVfbWV0aG9kID0gKFdyaXRlTWV0aG9kKikwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBBREFERFI6CiAgICAJKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWZkZWYgaHB1eDExCiAgICAgICAgYWRkcl9yZXQgPSBsb3dpbl9pZmFkZHIuQWRkcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwojZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmxvd2luX2lmbmV0LmlmX2FkZHIpLT4KICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyOwojZWxzZQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmxvd2luX2lmYWRkci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpYV9hZGRyKS0+c2luX2FkZHIuc19hZGRyOwojZW5kaWYKICAgIGNhc2UgSVBBRElGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBsb3dpbnRlcmZhY2U7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBBRE5FVE1BU0s6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwojaWZkZWYgaHB1eDExCiAgICAgICAgYWRkcl9yZXQgPSBsb3dpbl9pZmFkZHIuTmV0TWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwojZWxpZiBkZWZpbmVkKGxpbnV4KQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmxvd2luX2lmbmV0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlhX3N1Ym5ldG1hc2spLT5zaW5fYWRkci5zX2FkZHI7CiNlbGlmICFkZWZpbmVkKHN1blYzKQogICAgICAgIGFkZHJfcmV0ID0gbG93aW5faWZhZGRyLmlhX3N1Ym5ldG1hc2s7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKI2VuZGlmCiAgICBjYXNlIElQQURCQ0FTVEFERFI6CiNpZmRlZiBocHV4MTEKICAgICAgICBsb25nX3JldHVybiA9IGxvd2luX2lmYWRkci5CY2FzdEFkZHIgJiAxOwojZWxpZiBkZWZpbmVkKGxpbnV4KSB8fCBkZWZpbmVkKHN1blYzKQogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmdfcmV0dXJuKTsKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgIG50b2hsKCgoc3RydWN0IHNvY2thZGRyX2luICopICZsb3dpbl9pZm5ldC5pZnVfYnJvYWRhZGRyKS0+CiAgICAgICAgICAgICAgICAgIHNpbl9hZGRyLnNfYWRkcikgJiAxOwojZWxpZiBkZWZpbmVkKG5ldGJzZDEpCiAgICAgICAgbG9uZ19yZXR1cm4gPQogICAgICAgICAgICAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbG93aW5faWZhZGRyLmlhX2Jyb2FkYWRkciktPnNpbl9hZGRyLgogICAgICAgICAgICBzX2FkZHIgJiAxOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgbnRvaGwoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgJmxvd2luX2lmYWRkci5pYV9icm9hZGFkZHIpLT4KICAgICAgICAgICAgICAgICAgc2luX2FkZHIuc19hZGRyKSAmIDE7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIElQQURSRUFTTU1BWDoKI2lmZGVmIGhwdXgxMQogICAgICAgIGxvbmdfcmV0dXJuID0gbG93aW5faWZhZGRyLlJlYXNtTWF4U2l6ZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZWxpZiBkZWZpbmVkKE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTKQogICAgICAgIHJldHVybiBOVUxMOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gLTE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBBZGRyRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2lmZGVmIGZyZWVic2QyCnN0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyICppbl9pZmFkZHJhZGRyID0gTlVMTDsKCnN0YXRpYyB2b2lkCkFkZHJlc3NfU2Nhbl9Jbml0KHZvaWQpCnsKICAgIGludCByYyA9IGF1dG9fbmxpc3QoSUZBRERSX1NZTUJPTCwgKGNoYXIgKikgJmluX2lmYWRkcmFkZHIsCiAgICAgICAgICAgICAgIHNpemVvZihpbl9pZmFkZHJhZGRyKSk7CiAgICBpZiAoMCA9PSByYykKICAgICAgICBpbl9pZmFkZHJhZGRyID0gTlVMTDsKfQoKLyoKICogTkI6IEluZGV4IGlzIHRoZSBudW1iZXIgb2YgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJmYWNlLCBub3Qgb2YgdGhlIGFkZHJlc3MgCiAqLwpzdGF0aWMgaW50CkFkZHJlc3NfU2Nhbl9OZXh0KEluZGV4LCBSZXRpbl9pZmFkZHIpCiAgICAgc2hvcnQgICAgICAgICAgKkluZGV4OwogICAgIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcjsKewogICAgc3RydWN0IGluX2lmYWRkciBpbl9pZmFkZHI7CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQsICppZm5ldGFkZHI7ICAvKiBOT1RBOiBzYW1lIG5hbWUgYXMgYW5vdGhlciBvbmUgKi8KICAgIHNob3J0ICAgICAgICAgICBpaW5kZXggPSAxOwoKICAgIHdoaWxlIChpbl9pZmFkZHJhZGRyKSB7CiAgICAgICAgLyoKICAgICAgICAgKiAgICAgIEdldCB0aGUgImluX2lmYWRkciIgc3RydWN0dXJlCiAgICAgICAgICovCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaW5faWZhZGRyYWRkciwgKGNoYXIgKikgJmluX2lmYWRkciwgc2l6ZW9mIGluX2lmYWRkcikpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2lwOkFkZHJlc3NfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgaW5faWZhZGRyYWRkciA9IGluX2lmYWRkci5pYV9uZXh0OwoKICAgICAgICBpZiAoUmV0aW5faWZhZGRyKQogICAgICAgICAgICAqUmV0aW5faWZhZGRyID0gaW5faWZhZGRyOwoKICAgICAgICAvKgogICAgICAgICAqIE5vdywgbW9yZSBkaWZmaWN1bHQsIGZpbmQgdGhlIGluZGV4IG9mIHRoZSBpbnRlcmZhY2UgdG8gd2hpY2gKICAgICAgICAgKiB0aGlzIGFkZHJlc3MgYmVsb25ncwogICAgICAgICAqLwoKICAgICAgICBhdXRvX25saXN0KElGTkVUX1NZTUJPTCwgKGNoYXIgKikgJmlmbmV0YWRkciwgc2l6ZW9mKGlmbmV0YWRkcikpOwogICAgICAgIHdoaWxlIChpZm5ldGFkZHIgJiYgaWZuZXRhZGRyICE9IGluX2lmYWRkci5pYV9pZnApIHsKICAgICAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXRhZGRyLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZiBpZm5ldCkpIHsKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pcDpBZGRyZXNzX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKICAgICAgICAgICAgaWluZGV4Kys7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAtIG1pZ2h0IG5vdCBmaW5kIGl0PyAKICAgICAgICAgKi8KCiAgICAgICAgaWYgKEluZGV4KQogICAgICAgICAgICAqSW5kZXggPSBpaW5kZXg7CgogICAgICAgIHJldHVybiAoMSk7ICAgICAgICAgICAgIC8qIERPTkUgKi8KICAgIH0KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBFT0YgKi8KfQoKI2VsaWYgZGVmaW5lZChocHV4MTEpCgpzdGF0aWMgaW50ICAgICAgaXB0YWJfc2l6ZSwgaXB0YWJfY3VycmVudDsKc3RhdGljIG1pYl9pcEFkRW50ICppcCA9IChtaWJfaXBBZEVudCAqKSAwOwoKc3RhdGljIHZvaWQKQWRkcmVzc19TY2FuX0luaXQodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIGZkOwogICAgc3RydWN0IG5tcGFybXMgIHA7CiAgICBpbnQgICAgICAgICAgICAgdmFsOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmIChpcCkKICAgICAgICBmcmVlKGlwKTsKICAgIGlwID0gKG1pYl9pcEFkRW50ICopIDA7CiAgICBpcHRhYl9zaXplID0gMDsKCiAgICBpZiAoKGZkID0gb3Blbl9taWIoIi9kZXYvaXAiLCBPX1JET05MWSwgMCwgTk1fQVNZTkNfT0ZGKSkgPj0gMCkgewogICAgICAgIHAub2JqaWQgPSBJRF9pcEFkZHJOdW1FbnQ7CiAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSAmdmFsOwogICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICBwLmxlbiA9ICZ1bGVuOwogICAgICAgIGlmICgocmV0ID0gZ2V0X21pYl9pbmZvKGZkLCAmcCkpID09IDApCiAgICAgICAgICAgIGlwdGFiX3NpemUgPSB2YWw7CgogICAgICAgIGlmIChpcHRhYl9zaXplID4gMCkgewogICAgICAgICAgICB1bGVuID0gKHVuc2lnbmVkKSBpcHRhYl9zaXplICpzaXplb2YobWliX2lwQWRFbnQpOwogICAgICAgICAgICBpcCA9IChtaWJfaXBBZEVudCAqKSBtYWxsb2ModWxlbik7CiAgICAgICAgICAgIHAub2JqaWQgPSBJRF9pcEFkZHJUYWJsZTsKICAgICAgICAgICAgcC5idWZmZXIgPSAodm9pZCAqKSBpcDsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPCAwKQogICAgICAgICAgICAgICAgaXB0YWJfc2l6ZSA9IDA7CiAgICAgICAgfQoKICAgICAgICBjbG9zZV9taWIoZmQpOwogICAgfQoKICAgIGlwdGFiX2N1cnJlbnQgPSAwOwp9CgovKgogKiBOQjogSW5kZXggaXMgdGhlIG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UsIG5vdCBvZiB0aGUgYWRkcmVzcyAKICovCnN0YXRpYyBpbnQKQWRkcmVzc19TY2FuX05leHQoSW5kZXgsIFJldGluX2lmYWRkcikKICAgICBzaG9ydCAgICAgICAgICAqSW5kZXg7CiAgICAgbWliX2lwQWRFbnQgICAgKlJldGluX2lmYWRkcjsKewogICAgaWYgKGlwdGFiX2N1cnJlbnQgPCBpcHRhYl9zaXplKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBjb3B5IHZhbHVlcyAKICAgICAgICAgKi8KICAgICAgICAqSW5kZXggPSBpcFtpcHRhYl9jdXJyZW50XS5JZkluZGV4OwogICAgICAgICpSZXRpbl9pZmFkZHIgPSBpcFtpcHRhYl9jdXJyZW50XTsKICAgICAgICAvKgogICAgICAgICAqIGluY3JlbWVudCB0byBwb2ludCB0byBuZXh0IGVudHJ5IAogICAgICAgICAqLwogICAgICAgIGlwdGFiX2N1cnJlbnQrKzsKICAgICAgICAvKgogICAgICAgICAqIHJldHVybiBzdWNjZXNzIAogICAgICAgICAqLwogICAgICAgIHJldHVybiAoMSk7CiAgICB9CgogICAgLyoKICAgICAqIHJldHVybiBkb25lIAogICAgICovCiAgICByZXR1cm4gKDApOwp9CgojZWxpZiBkZWZpbmVkKGxpbnV4KQpzdGF0aWMgc3RydWN0IGlmcmVxICppZnI7CnN0YXRpYyBpbnQgaWZyX2NvdW50ZXI7CgpzdGF0aWMgdm9pZApBZGRyZXNzX1NjYW5fSW5pdCh2b2lkKQp7CiAgICBpbnQgbnVtX2ludGVyZmFjZXMgPSAwOwogICAgaW50IGZkOwoKICAgIC8qIGdldCBpbmZvIGFib3V0IGFsbCBpbnRlcmZhY2VzICovCgogICAgaWZjLmlmY19sZW4gPSAwOwogICAgU05NUF9GUkVFKGlmYy5pZmNfYnVmKTsKICAgIGlmcl9jb3VudGVyID0gMDsKCiAgICBkbwogICAgewoJaWYgKChmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSkgPCAwKQoJewoJICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJzb2NrZXQgb3BlbiBmYWlsdXJlIGluIEFkZHJlc3NfU2Nhbl9Jbml0XG4iKSk7CgkgICAgcmV0dXJuOwoJfQoJbnVtX2ludGVyZmFjZXMgKz0gMTY7CgoJaWZjLmlmY19sZW4gPSBzaXplb2Yoc3RydWN0IGlmcmVxKSAqIG51bV9pbnRlcmZhY2VzOwoJaWZjLmlmY19idWYgPSAoY2hhciopIHJlYWxsb2MoaWZjLmlmY19idWYsIGlmYy5pZmNfbGVuKTsKCQoJICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkNPTkYsICZpZmMpIDwgMCkKCSAgICB7CgkJaWZyPU5VTEw7CgkJY2xvc2UoZmQpOwoJICAgCXJldHVybjsKCSAgICB9CgkgICAgY2xvc2UoZmQpOwogICAgfQogICAgd2hpbGUgKGlmYy5pZmNfbGVuID49IChzaXplb2Yoc3RydWN0IGlmcmVxKSAqIG51bV9pbnRlcmZhY2VzKSk7CiAgICAKICAgIGlmciA9IGlmYy5pZmNfcmVxOwogICAgY2xvc2UoZmQpOwp9CgovKgogKiBOQjogSW5kZXggaXMgdGhlIG51bWJlciBvZiB0aGUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UsIG5vdCBvZiB0aGUgYWRkcmVzcyAKICovCnN0YXRpYyBpbnQKQWRkcmVzc19TY2FuX05leHQoc2hvcnQgKkluZGV4LCBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0KQp7CiAgICBzdHJ1Y3QgaWZuZXQgICBpZm5ldF9zdG9yZTsKICAgIGludCBmZDsKICAgIGlmICgoZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCkpIDwgMCkKICAgIHsKCURFQlVHTVNHVEwoKCJzbm1wZCIsICJzb2NrZXQgb3BlbiBmYWlsdXJlIGluIEFkZHJlc3NfU2Nhbl9OZXh0XG4iKSk7CglyZXR1cm4oMCk7CiAgICB9CgogICAgd2hpbGUgKGlmcikgewoJCglpZm5ldF9zdG9yZS5pZl9hZGRyID0gaWZyLT5pZnJfYWRkcjsKCiAgICAgICAgaWYgKFJldGlmbmV0KQoJewoJICAgIFJldGlmbmV0LT5pZl9hZGRyID0gaWZyLT5pZnJfYWRkcjsKCSAgICAKCSAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZCUkRBRERSLCBpZnIpIDwgMCkKCSAgICB7CgkJbWVtc2V0KChjaGFyICopICZSZXRpZm5ldC0+aWZ1X2Jyb2FkYWRkciwgMCwgc2l6ZW9mKFJldGlmbmV0LT5pZnVfYnJvYWRhZGRyKSk7CgkgICAgfQoJICAgIGVsc2UKCQlSZXRpZm5ldC0+aWZ1X2Jyb2FkYWRkciA9IGlmci0+aWZyX2Jyb2FkYWRkcjsKCgkgICAgaWZyLT5pZnJfYWRkciA9IFJldGlmbmV0LT5pZl9hZGRyOwoJICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRk5FVE1BU0ssIGlmcikgPCAwKQoJICAgIHsKCQltZW1zZXQoKGNoYXIgKikgJlJldGlmbmV0LT5pYV9zdWJuZXRtYXNrLCAwLCBzaXplb2YoUmV0aWZuZXQtPmlhX3N1Ym5ldG1hc2spKTsKCSAgICB9CgkgICAgZWxzZQoJCVJldGlmbmV0LT5pYV9zdWJuZXRtYXNrID0gaWZyLT5pZnJfbmV0bWFzazsKCgl9CgogICAgICAgIGlmIChJbmRleCkKCXsKCSAgICBpZnItPmlmcl9hZGRyID0gaWZuZXRfc3RvcmUuaWZfYWRkcjsKICAgICAgICAgICAgKkluZGV4ID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoaWZyLT5pZnJfbmFtZSk7Cgl9CgkKCWlmcisrOwoJaWZyX2NvdW50ZXIrPXNpemVvZihzdHJ1Y3QgaWZyZXEpOwoJaWYgKGlmcl9jb3VudGVyID49IGlmYy5pZmNfbGVuKQoJewoJICAgIGlmciA9IE5VTEw7CS8qIGJleW9uZCB0aGUgZW5kICovCgl9CgogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgICAgICAvKiBET05FICovCiAgICB9CiAgICBjbG9zZShmZCk7CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRU9GICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZnJlZWJzZCxocHV4MTEsbGludXggKi8KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCgpzdGF0aWMgaW50CklQX0NtcCh2b2lkICphZGRyLCB2b2lkICplcCkKewogICAgaWYgKCgobWliMl9pcEFkZHJFbnRyeV90ICopIGVwKS0+aXBBZEVudEFkZHIgPT0gKihJcEFkZHJlc3MgKikgYWRkcikKICAgICAgICByZXR1cm4gKDApOwogICAgZWxzZQogICAgICAgIHJldHVybiAoMSk7Cn0KCnVfY2hhciAgICAgICAgICoKdmFyX2lwQWRkckVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICAvKgogICAgICogb2JqZWN0IGlkZW50aWZpZXIgaXMgb2YgZm9ybToKICAgICAqIDEuMy42LjEuMi4xLjQuMjAuMS4/LkEuQi5DLkQsICB3aGVyZSBBLkIuQy5EIGlzIElQIGFkZHJlc3MuCiAgICAgKiBJUEFERFIgc3RhcnRzIGF0IG9mZnNldCAxMC4KICAgICAqLwojZGVmaW5lIElQX0FERFJOQU1FX0xFTkdUSAkxNAojZGVmaW5lIElQX0FERFJJTkRFWF9PRkYJMTAKICAgIG9pZCAgICAgICAgICAgICBsb3dlc3RbSVBfQUREUk5BTUVfTEVOR1RIXTsKICAgIG9pZCAgICAgICAgICAgICBjdXJyZW50W0lQX0FERFJOQU1FX0xFTkdUSF0sICpvcDsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIElwQWRkcmVzcyAgICAgICBOZXh0QWRkcjsKICAgIG1pYjJfaXBBZGRyRW50cnlfdCBlbnRyeTsKICAgIHN0YXRpYyBtaWIyX2lwQWRkckVudHJ5X3QgTG93ZW50cnk7CiAgICBpbnQgICAgICAgICAgICAgRm91bmQgPSAwOwogICAgcmVxX2UgICAgICAgICAgIHJlcV90eXBlOwogICAgc3RhdGljIGluX2FkZHJfdCBhZGRyX3JldDsKCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pcCIsICJ2YXJfaXBBZGRyRW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaXAiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2lwIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1zZXQoJkxvd2VudHJ5LCAwLCBzaXplb2YoTG93ZW50cnkpKTsKICAgIG1lbWNweSgoY2hhciAqKSBjdXJyZW50LCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIGlmICgqbGVuZ3RoID09IElQX0FERFJOQU1FX0xFTkdUSCkgIC8qIEFzc3VtZSB0aGF0IHRoZSBpbnB1dCBuYW1lIGlzIHRoZSBsb3dlc3QgKi8KICAgICAgICBtZW1jcHkoKGNoYXIgKikgbG93ZXN0LCAoY2hhciAqKSBuYW1lLAogICAgICAgICAgICAgICBJUF9BRERSTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICBlbHNlCglsb3dlc3RbMF0gPSAweGZmOwogICAgZm9yIChOZXh0QWRkciA9ICh1X2xvbmcpIC0gMSwgcmVxX3R5cGUgPSBHRVRfRklSU1Q7OwogICAgICAgICBOZXh0QWRkciA9IGVudHJ5LmlwQWRFbnRBZGRyLCByZXFfdHlwZSA9IEdFVF9ORVhUKSB7CiAgICAgICAgaWYgKGdldE1pYnN0YXQKICAgICAgICAgICAgKE1JQl9JUF9BRERSLCAmZW50cnksIHNpemVvZihtaWIyX2lwQWRkckVudHJ5X3QpLCByZXFfdHlwZSwKICAgICAgICAgICAgICZJUF9DbXAsICZOZXh0QWRkcikgIT0gMCkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgQ09QWV9JUEFERFIoY3AsICh1X2NoYXIgKikgJiBlbnRyeS5pcEFkRW50QWRkciwgb3AsCiAgICAgICAgICAgICAgICAgICAgY3VycmVudCArIElQX0FERFJJTkRFWF9PRkYpOwogICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICBpZiAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX0FERFJOQU1FX0xFTkdUSCwgbmFtZSwgKmxlbmd0aCkgPT0gMCkgewogICAgICAgICAgICAgICAgbWVtY3B5KChjaGFyICopIGxvd2VzdCwgKGNoYXIgKikgY3VycmVudCwKICAgICAgICAgICAgICAgICAgICAgICBJUF9BRERSTkFNRV9MRU5HVEggKiBzaXplb2Yob2lkKSk7CiAgICAgICAgICAgICAgICBMb3dlbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgRm91bmQrKzsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBubyBuZWVkIHRvIHNlYXJjaCBmdXJ0aGVyICovCiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAoY3VycmVudCwgSVBfQUREUk5BTUVfTEVOR1RILCBuYW1lLCAqbGVuZ3RoKSA+IDApCiAgICAgICAgICAgICAgICAmJiAoKChOZXh0QWRkciA9PSAodV9sb25nKSAtIDEpKQogICAgICAgICAgICAgICAgICAgIHx8CiAgICAgICAgICAgICAgICAgICAgKHNubXBfb2lkX2NvbXBhcmUKICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnQsIElQX0FERFJOQU1FX0xFTkdUSCwgbG93ZXN0LAogICAgICAgICAgICAgICAgICAgICAgSVBfQUREUk5BTUVfTEVOR1RIKSA8IDApCiAgICAgICAgICAgICAgICAgICAgfHwKICAgICAgICAgICAgICAgICAgICAoc25tcF9vaWRfY29tcGFyZQogICAgICAgICAgICAgICAgICAgICAobmFtZSwgKmxlbmd0aCwgbG93ZXN0LCBJUF9BRERSTkFNRV9MRU5HVEgpID09IDApKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0IGFuZCBjbG9zZXIgdG8gaW5wdXQgdGhhbgogICAgICAgICAgICAgICAgICogcHJldmlvdXMgbG93ZXN0LCBhbmQgaXMgbm90IGVxdWFsIHRvIGl0LCBzYXZlIHRoaXMgb25lIGFzIHRoZSAibmV4dCIgb25lLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBMb3dlbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgRm91bmQrKzsKICAgICAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSBsb3dlc3QsIChjaGFyICopIGN1cnJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgSVBfQUREUk5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJL2lwIiwgIi4uLiBGb3VuZCA9ICVkXG4iLCBGb3VuZCkpOwogICAgaWYgKEZvdW5kID09IDApCiAgICAgICAgcmV0dXJuIChOVUxMKTsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBsb3dlc3QsCiAgICAgICAgICAgSVBfQUREUk5BTUVfTEVOR1RIICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IElQX0FERFJOQU1FX0xFTkdUSDsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZ19yZXR1cm4pOwogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSVBBREFERFI6CgkqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcEFkRW50QWRkcjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUEFESUZJTkRFWDoKI2lmZGVmIE5FVFNOTVBfSU5DTFVERV9JRlRBQkxFX1JFV1JJVEVTCiAgICAgICAgTG93ZW50cnkuaXBBZEVudElmSW5kZXgub19ieXRlc1tMb3dlbnRyeS5pcEFkRW50SWZJbmRleC5vX2xlbmd0aF0gPSAnXDAnOwogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2luZGV4X2ZpbmQoTG93ZW50cnkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwQWRFbnRJZkluZGV4Lm9fYnl0ZXMpOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICBJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShMb3dlbnRyeS5pcEFkRW50SWZJbmRleC5vX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvd2VudHJ5LmlwQWRFbnRJZkluZGV4Lm9fbGVuZ3RoKTsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBBRE5FVE1BU0s6CgkqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBMb3dlbnRyeS5pcEFkRW50TmV0TWFzazsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGFkZHJfcmV0OwogICAgY2FzZSBJUEFEQkNBU1RBRERSOgoJbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcEFkRW50QmNhc3RBZGRyOwoJcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgSVBBRFJFQVNNTUFYOgoJbG9uZ19yZXR1cm4gPSBMb3dlbnRyeS5pcEFkRW50UmVhc21NYXhTaXplOwoJcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pcEFkZHJFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9DQU5fVVNFX1NZU0NUTCAmJiBJUENUTF9TVEFUUyAqLwoKLyoKICogSWRlYWxseSwgdGhpcyB3b3VsZCBiZSBjb21iaW5lZCB3aXRoIHRoZSBjb2RlIGluIGludGVyZmFjZXMuYy4KICogRXZlbiBzZXBhcmF0ZSwgaXQncyBzdGlsbCBiZXR0ZXIgdGhhbiB3aGF0IHdlbnQgYmVmb3JlLgogKi8Kc3RydWN0IGlmbGlzdCB7CiAgICBpbnQgICAgICAgICAgICAgZmxhZ3M7CiAgICBpbnQgICAgICAgICAgICAgaW5kZXg7CiAgICBzdHJ1Y3QgaW5fYWRkciAgYWRkcjsKICAgIHN0cnVjdCBpbl9hZGRyICBtYXNrOwogICAgc3RydWN0IGluX2FkZHIgIGJjYXN0Owp9OwpzdGF0aWMgc3RydWN0IGlmbGlzdCAqaWZzOwpzdGF0aWMgaW50ICAgICAgbmlmczsKCnN0YXRpYyB2b2lkCmdldF9pZmxpc3Qodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG5hZGRycywgYml0OwogICAgc3RhdGljIGludCAgICAgIG1pYls2XQogICAgPSB7IENUTF9ORVQsIFBGX1JPVVRFLCAwLCBBRl9JTkVULCBORVRfUlRfSUZMSVNULCAwIH07CiAgICBjaGFyICAgICAgICAgICAqY3AsICppZmJ1ZjsKICAgIHNpemVfdCAgICAgICAgICBsZW47CiAgICBzdHJ1Y3QgcnRfbXNnaGRyICpydG07CiAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZm07CiAgICBzdHJ1Y3QgaWZhX21zZ2hkciAqaWZhbTsKICAgIHN0cnVjdCBzb2NrYWRkciAqc2E7CiAgICBpbnQgICAgICAgICAgICAgZmxhZ3M7CgogICAgbmFkZHJzID0gMDsKICAgIGlmIChpZnMpCiAgICAgICAgZnJlZShpZnMpOwogICAgaWZzID0gMDsKICAgIG5pZnMgPSAwOwogICAgbGVuID0gMDsKICAgIGlmIChzeXNjdGwobWliLCA2LCAwLCAmbGVuLCAwLCAwKSA8IDApCiAgICAgICAgcmV0dXJuOwoKICAgIGlmYnVmID0gbWFsbG9jKGxlbik7CiAgICBpZiAoaWZidWYgPT0gMCkKICAgICAgICByZXR1cm47CiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgaWZidWYsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIHN5c2xvZyhMT0dfV0FSTklORywgInN5c2N0bCBuZXQtcm91dGUtaWZsaXN0OiAlbSIpOwogICAgICAgIGZyZWUoaWZidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgbG9vcDoKICAgIGNwID0gaWZidWY7CiAgICB3aGlsZSAoY3AgPCAmaWZidWZbbGVuXSkgewogICAgICAgIGludCAgICAgICAgICAgICBnb3RhZGRyOwoKICAgICAgICBnb3RhZGRyID0gMDsKICAgICAgICBydG0gPSAoc3RydWN0IHJ0X21zZ2hkciAqKSBjcDsKICAgICAgICBpZiAocnRtLT5ydG1fdmVyc2lvbiAhPSBSVE1fVkVSU0lPTiB8fCBydG0tPnJ0bV90eXBlICE9IFJUTV9JRklORk8pIHsKICAgICAgICAgICAgZnJlZShpZnMpOwogICAgICAgICAgICBpZnMgPSAwOwogICAgICAgICAgICBuaWZzID0gMDsKICAgICAgICAgICAgZnJlZShpZmJ1Zik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWZtID0gKHN0cnVjdCBpZl9tc2doZHIgKikgcnRtOwogICAgICAgIGZsYWdzID0gaWZtLT5pZm1fZmxhZ3M7CiAgICAgICAgY3AgKz0gaWZtLT5pZm1fbXNnbGVuOwogICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIHdoaWxlIChjcCA8ICZpZmJ1ZltsZW5dICYmIHJ0bS0+cnRtX3R5cGUgPT0gUlRNX05FV0FERFIpIHsKICAgICAgICAgICAgaWZhbSA9IChzdHJ1Y3QgaWZhX21zZ2hkciAqKSBydG07CiAgICAgICAgICAgIGNwICs9IHNpemVvZigqaWZhbSk7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGZyb20gcm91dGUuYyAKICAgICAgICAgICAgICovCiNkZWZpbmUgUk9VTkQoYSkgXAogICAgICAgICgoYSkgPiAwID8gKDEgKyAoKChhKSAtIDEpIHwgKHNpemVvZihsb25nKSAtIDEpKSkgOiBzaXplb2YobG9uZykpCiAgICAgICAgICAgIGZvciAoYml0ID0gMTsgYml0ICYmIGNwIDwgJmlmYnVmW2xlbl07IGJpdCA8PD0gMSkgewogICAgICAgICAgICAgICAgaWYgKCEoaWZhbS0+aWZhbV9hZGRycyAmIGJpdCkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBzYSA9IChzdHJ1Y3Qgc29ja2FkZHIgKikgY3A7CiAgICAgICAgICAgICAgICBjcCArPSBST1VORChzYS0+c2FfbGVuKTsKCiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogTmV0bWFza3MgYXJlIHJldHVybmVkIGFzIGJpdAogICAgICAgICAgICAgICAgICogc3RyaW5ncyBvZiB0eXBlIEFGX1VOU1BFQy4gIFRoZQogICAgICAgICAgICAgICAgICogb3RoZXJzIGFyZSBwcmV0dHkgb2suCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChiaXQgPT0gUlRBX0lGQSkgewojZGVmaW5lIHNhdG9zaW4oc2EpICgoc3RydWN0IHNvY2thZGRyX2luICopKHNhKSkKICAgICAgICAgICAgICAgICAgICBpZiAoaWZzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmc1tuYWRkcnNdLmFkZHIgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmc1tuYWRkcnNdLmluZGV4ID0gaWZhbS0+aWZhbV9pbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgaWZzW25hZGRyc10uZmxhZ3MgPSBmbGFnczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZ290YWRkciA9IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdCA9PSBSVEFfTkVUTUFTSykgewogICAgICAgICAgICAgICAgICAgIGlmIChpZnMpCiAgICAgICAgICAgICAgICAgICAgICAgIGlmc1tuYWRkcnNdLm1hc2sgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdCA9PSBSVEFfQlJEKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlmcykKICAgICAgICAgICAgICAgICAgICAgICAgaWZzW25hZGRyc10uYmNhc3QgPSBzYXRvc2luKHNhKS0+c2luX2FkZHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdvdGFkZHIpCiAgICAgICAgICAgICAgICBuYWRkcnMrKzsKICAgICAgICAgICAgY3AgPSAoY2hhciAqKSBydG0gKyBydG0tPnJ0bV9tc2dsZW47CiAgICAgICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIH0KICAgIH0KICAgIGlmIChpZnMpIHsKICAgICAgICBuaWZzID0gbmFkZHJzOwogICAgICAgIGZyZWUoaWZidWYpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGlmcyA9IG1hbGxvYyhuYWRkcnMgKiBzaXplb2YoKmlmcykpOwogICAgaWYgKGlmcyA9PSAwKSB7CiAgICAgICAgZnJlZShpZmJ1Zik7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbmFkZHJzID0gMDsKICAgIGdvdG8gbG9vcDsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaXBBZGRyRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIwLjEuPy5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIG9pZCAgICAgICAgICAgICBsb3dlc3RbMTRdOwogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbMTRdLCAqb3A7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgbG93aW50ZXJmYWNlID0gLTE7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIHN0YXRpYyBpbl9hZGRyX3QJYWRkcl9yZXQ7CiAgICAKICAgIC8qCiAgICAgKiBmaWxsIGluIG9iamVjdCBwYXJ0IG9mIG5hbWUgZm9yIGN1cnJlbnQgKGxlc3Mgc2l6ZW9mIGluc3RhbmNlIHBhcnQpIAogICAgICovCiAgICBtZW1jcHkoY3VycmVudCwgdnAtPm5hbWUsIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwoKICAgIC8qCiAgICAgKiBHZXQgaW50ZXJmYWNlIHRhYmxlIGZyb20ga2VybmVsLgogICAgICovCiAgICBnZXRfaWZsaXN0KCk7CgogICAgZm9yIChpID0gMDsgaSA8IG5pZnM7IGkrKykgewogICAgICAgIG9wID0gJmN1cnJlbnRbMTBdOwogICAgICAgIGNwID0gKHVfY2hhciAqKSAmIGlmc1tpXS5hZGRyOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgKm9wKysgPSAqY3ArKzsKICAgICAgICAqb3ArKyA9ICpjcCsrOwogICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgaWYgKGV4YWN0KSB7CiAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICBtZW1jcHkobG93ZXN0LCBjdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgIGxvd2ludGVyZmFjZSA9IGk7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogbm8gbmVlZCB0byBzZWFyY2ggZnVydGhlciAqLwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA+IDApICYmCiAgICAgICAgICAgICAgICAobG93aW50ZXJmYWNlIDwgMAogICAgICAgICAgICAgICAgIHx8IChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBsb3dlc3QsIDE0KSA8IDApKSkgewogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAqIGlmIG5ldyBvbmUgaXMgZ3JlYXRlciB0aGFuIGlucHV0CiAgICAgICAgICAgICAgICAgKiBhbmQgY2xvc2VyIHRvIGlucHV0IHRoYW4gcHJldmlvdXMKICAgICAgICAgICAgICAgICAqIGxvd2VzdCwgc2F2ZSB0aGlzIG9uZSBhcyB0aGUgIm5leHQiCiAgICAgICAgICAgICAgICAgKiBvbmUuICAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbG93aW50ZXJmYWNlID0gaTsKICAgICAgICAgICAgICAgIG1lbWNweShsb3dlc3QsIGN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmIChsb3dpbnRlcmZhY2UgPCAwKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaSA9IGxvd2ludGVyZmFjZTsKICAgIG1lbWNweShuYW1lLCBsb3dlc3QsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IDE0OwogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUEFEQUREUjoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBpZnNbaV0uYWRkci5zX2FkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQQURJRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZzW2ldLmluZGV4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CgogICAgY2FzZSBJUEFETkVUTUFTSzoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBpZnNbaV0ubWFzay5zX2FkZHI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBhZGRyX3JldDsKCiAgICBjYXNlIElQQURCQ0FTVEFERFI6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBudG9obChpZnNbaV0uYmNhc3Quc19hZGRyKSAmIDE7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKCiAgICBjYXNlIElQQURSRUFTTU1BWDoKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAtMTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwojZW5kaWYKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBBZGRyRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX0NBTl9VU0VfU1lTQ1RMICYmIElQQ1RMX1NUQVRTICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFdJTjMyIGN5Z3dpbiAqLwojaW5jbHVkZSA8aXBobHBhcGkuaD4KdV9jaGFyICAgICAgICAgKgp2YXJfaXBBZGRyRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgLyoKICAgICAqIG9iamVjdCBpZGVudGlmaWVyIGlzIG9mIGZvcm06CiAgICAgKiAxLjMuNi4xLjIuMS40LjIwLjEuPy5BLkIuQy5ELCAgd2hlcmUgQS5CLkMuRCBpcyBJUCBhZGRyZXNzLgogICAgICogSVBBRERSIHN0YXJ0cyBhdCBvZmZzZXQgMTAuCiAgICAgKi8KICAgIG9pZCAgICAgICAgICAgICBsb3dlc3RbMTRdOwogICAgb2lkICAgICAgICAgICAgIGN1cnJlbnRbMTRdLCAqb3A7CiAgICB1X2NoYXIgICAgICAgICAqY3A7CiAgICBpbnQgICAgICAgICAgICAgbG93aW50ZXJmYWNlID0gLTE7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIFBNSUJfSVBBRERSVEFCTEUgcElwQWRkclRhYmxlID0gTlVMTDsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXMgPSBOT19FUlJPUjsKICAgIERXT1JEICAgICAgICAgICBzdGF0dXNSZXRyeSA9IE5PX0VSUk9SOwogICAgRFdPUkQgICAgICAgICAgIGR3QWN0dWFsU2l6ZSA9IDA7CiAgICB2b2lkICAgICAgICAgICAqcmVzdWx0ID0gTlVMTDsKICAgIHN0YXRpYyBpbl9hZGRyX3QgCWFkZHJfcmV0OwogICAgCiAgICAvKgogICAgICogZmlsbCBpbiBvYmplY3QgcGFydCBvZiBuYW1lIGZvciBjdXJyZW50IChsZXNzIHNpemVvZiBpbnN0YW5jZSBwYXJ0KSAKICAgICAqLwogICAgbWVtY3B5KGN1cnJlbnQsIHZwLT5uYW1lLCAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKCiAgICAvKgogICAgICogR2V0IGludGVyZmFjZSB0YWJsZSBmcm9tIGtlcm5lbC4KICAgICAqLwogICAgc3RhdHVzID0gR2V0SXBBZGRyVGFibGUocElwQWRkclRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgIGlmIChzdGF0dXMgPT0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUikgewogICAgICAgIHBJcEFkZHJUYWJsZSA9IChQTUlCX0lQQUREUlRBQkxFKSBtYWxsb2MoZHdBY3R1YWxTaXplKTsKICAgICAgICBpZiAocElwQWRkclRhYmxlICE9IE5VTEwpIHsKICAgICAgICAgICAgc3RhdHVzUmV0cnkgPQogICAgICAgICAgICAgICAgR2V0SXBBZGRyVGFibGUocElwQWRkclRhYmxlLCAmZHdBY3R1YWxTaXplLCBUUlVFKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHN0YXR1c1JldHJ5ID09IE5PX0VSUk9SIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKGludCkgcElwQWRkclRhYmxlLT5kd051bUVudHJpZXM7ICsraSkgewogICAgICAgICAgICBvcCA9ICZjdXJyZW50WzEwXTsKICAgICAgICAgICAgY3AgPSAodV9jaGFyICopICYgcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd0FkZHI7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgICpvcCsrID0gKmNwKys7CiAgICAgICAgICAgIGlmIChleGFjdCkgewogICAgICAgICAgICAgICAgaWYgKHNubXBfb2lkX2NvbXBhcmUoY3VycmVudCwgMTQsIG5hbWUsICpsZW5ndGgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICBtZW1jcHkobG93ZXN0LCBjdXJyZW50LCAxNCAqIHNpemVvZihvaWQpKTsKICAgICAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzbm1wX29pZF9jb21wYXJlKGN1cnJlbnQsIDE0LCBuYW1lLCAqbGVuZ3RoKSA+IDApIHsKICAgICAgICAgICAgICAgICAgICBsb3dpbnRlcmZhY2UgPSBpOwogICAgICAgICAgICAgICAgICAgIG1lbWNweShsb3dlc3QsIGN1cnJlbnQsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgIC8qIFNpbmNlIHRoZSB0YWJsZSBpcyBzb3J0ZWQsIG5vIG5lZWQgdG8gc2VhcmNoIGZ1cnRoZXIgICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgaWYgKGxvd2ludGVyZmFjZSA8IDApCiAgICAgICAgZ290byBvdXQ7CgogICAgaSA9IGxvd2ludGVyZmFjZTsKICAgIG1lbWNweShuYW1lLCBsb3dlc3QsIDE0ICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IDE0OwogICAgKndyaXRlX21ldGhvZCA9IDA7CiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBJUEFEQUREUjoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihhZGRyX3JldCk7CiAgICAgICAgYWRkcl9yZXQgPSBwSXBBZGRyVGFibGUtPnRhYmxlW2ldLmR3QWRkcjsKICAgICAgICByZXN1bHQgPSAmYWRkcl9yZXQ7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBJUEFESUZJTkRFWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBBZGRyVGFibGUtPnRhYmxlW2ldLmR3SW5kZXg7CiAgICAgICAgcmVzdWx0ID0gJmxvbmdfcmV0dXJuOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSVBBRE5FVE1BU0s6CiAgICAgICAgKnZhcl9sZW4gPSBzaXplb2YoYWRkcl9yZXQpOwogICAgICAgIGFkZHJfcmV0ID0gcElwQWRkclRhYmxlLT50YWJsZVtpXS5kd01hc2s7CiAgICAgICAgcmVzdWx0ID0gJmFkZHJfcmV0OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgSVBBREJDQVNUQUREUjoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBBZGRyVGFibGUtPnRhYmxlW2ldLmR3QkNhc3RBZGRyOwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKCiAgICBjYXNlIElQQURSRUFTTU1BWDoKICAgICAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nX3JldHVybik7CiAgICAgICAgbG9uZ19yZXR1cm4gPSBwSXBBZGRyVGFibGUtPnRhYmxlW2ldLmR3UmVhc21TaXplOwogICAgICAgIHJlc3VsdCA9ICZsb25nX3JldHVybjsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaXBBZGRyRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICAgICAgYnJlYWs7CiAgICB9CgpvdXQ6CiAgICBmcmVlKHBJcEFkZHJUYWJsZSk7CiAgICByZXR1cm4gcmVzdWx0Owp9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCg==