LyoKICogQ29weXJpZ2h0IChjKSAyMDA3LTIwMDggQXRoZXJvcyBDb21tdW5pY2F0aW9ucyBJbmMuCiAqCiAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQogKiBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlCiAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCiAqCiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUwogKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCiAqIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SCiAqIEFOWSBTUEVDSUFMLCBESVJFQ1QsIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMKICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOCiAqIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GCiAqIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwovKiAgTW9kdWxlIE5hbWUgOiB3d3JhcC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQWJzdHJhY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHdyYXBwZXIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgTk9URVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFBsYXRmb3JtIGRlcGVuZGVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLyogUGxlYXNlIGluY2x1ZGUgeW91ciBoZWFkZXIgZmlsZXMgaGVyZSAqLwojaW5jbHVkZSAib2FsX2R0LmgiCiNpbmNsdWRlICJ1c2JkcnYuaCIKCiNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CgojaWYgV0lSRUxFU1NfRVhUID4gMTIKI2luY2x1ZGUgPG5ldC9pd19oYW5kbGVyLmg+CiNlbmRpZgoKZXh0ZXJuIHZvaWQgemZpUmVjdjgwMjExKHpkZXZfdCogZGV2LCB6YnVmX3QqIGJ1Ziwgc3RydWN0IHpzQWRkaXRpb25JbmZvKiBhZGRJbmZvKTsKZXh0ZXJuIHZvaWQgemZDb3JlUmVjdih6ZGV2X3QqIGRldiwgemJ1Zl90KiBidWYsIHN0cnVjdCB6c0FkZGl0aW9uSW5mbyogYWRkSW5mbyk7CmV4dGVybiB2b2lkIHpmSWRsQ2hrUnNwKHpkZXZfdCogZGV2LCB1MzJfdCogcnNwLCB1MTZfdCByc3BMZW4pOwpleHRlcm4gdm9pZCB6ZklkbFJzcCh6ZGV2X3QqIGRldiwgdTMyX3QgKnJzcCwgdTE2X3QgcnNwTGVuKTsKCgoKLy9leHRlcm4gc3RydWN0IHpzV2RzU3RydWN0IHdkc1taTV9XRFNfUE9SVF9OVU1CRVJdOwpleHRlcm4gc3RydWN0IHpzVmFwU3RydWN0IHZhcFtaTV9WQVBfUE9SVF9OVU1CRVJdOwoKdTMyX3QgemZMbnhVc2JTdWJtaXRUeERhdGEoemRldl90KiBkZXYpOwp1MzJfdCB6ZkxueFVzYkluKHpkZXZfdCogZGV2LCB1cmJfdCAqdXJiLCB6YnVmX3QgKmJ1Zik7CnUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpOwp1MzJfdCB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIodXJiX3QgKnVyYiwgc3RydWN0IHVzYl9kZXZpY2UgKnVzYiwgdTE2X3QgZXBudW0sIHUxNl90IGRpcmVjdGlvbiwKICAgICAgICB2b2lkICp0cmFuc2Zlcl9idWZmZXIsIGludCBidWZmZXJfbGVuZ3RoLCB1c2JfY29tcGxldGVfdCBjb21wbGV0ZSwgdm9pZCAqY29udGV4dCk7CnUzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCiAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCiAgICAgICAgdTMyX3QgaW50ZXJ2YWwpOwoKdTE2X3QgemZMbnhHZXRGcmVlVHhVcmIoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IGlkeDsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgLy9pZHggPSAoKG1hY3AtPlR4VXJiVGFpbCArIDEpICYgKFpNX01BWF9UWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5UeFVyYkhlYWQpCiAgICBpZiAobWFjcC0+VHhVcmJDbnQgIT0gMCkKICAgIHsKICAgICAgICBpZHggPSBtYWNwLT5UeFVyYlRhaWw7CiAgICAgICAgbWFjcC0+VHhVcmJUYWlsID0gKChtYWNwLT5UeFVyYlRhaWwgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKICAgICAgICBtYWNwLT5UeFVyYkNudC0tOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJtYWNwLT5UeFVyYkNudDogJWRcbiIsIG1hY3AtPlR4VXJiQ250KTsKICAgICAgICBpZHggPSAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gaWR4Owp9Cgp2b2lkIHpmTG54UHV0VHhVcmIoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IGlkeDsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeFVyYkhlYWQgKyAxKSAmIChaTV9NQVhfVFhfVVJCX05VTSAtIDEpKTsKCiAgICAvL2lmIChpZHggIT0gbWFjcC0+VHhVcmJUYWlsKQogICAgaWYgKG1hY3AtPlR4VXJiQ250IDwgWk1fTUFYX1RYX1VSQl9OVU0pCiAgICB7CiAgICAgICAgbWFjcC0+VHhVcmJIZWFkID0gaWR4OwogICAgICAgIG1hY3AtPlR4VXJiQ250Kys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbnRrKCJVc2JUeFVyYlEgaW5jb25zaXN0ZW50OiBUeFVyYkhlYWQ6ICVkLCBUeFVyYlRhaWw6ICVkXG4iLAogICAgICAgICAgICAgICAgbWFjcC0+VHhVcmJIZWFkLCBtYWNwLT5UeFVyYlRhaWwpOwogICAgfQoKICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwp9Cgp1MTZfdCB6ZkxueENoZWNrVHhCdWZmZXJDbnQoemRldl90ICpkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKICAgIHUxNl90IFR4QnVmQ250OwogICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwoKICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKCiAgICBUeEJ1ZkNudCA9IG1hY3AtPlR4QnVmQ250OwoKICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgcmV0dXJuIFR4QnVmQ250Owp9CgpVc2JUeFFfdCAqemZMbnhHZXRVc2JUeEJ1ZmZlcih6ZGV2X3QgKmRldikKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgdTE2X3QgaWR4OwogICAgVXNiVHhRX3QgKlR4UTsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CgogICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmVGFpbCkKICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA+IDApCiAgICB7CiAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd0dldFVzYlR4QnVmZmVyICxtYWNwLT5UeEJ1ZkNudCA9ICVkXG4iLCBtYWNwLT5UeEJ1ZkNudCk7CiAgICAgICAgVHhRID0gKFVzYlR4UV90ICopJihtYWNwLT5Vc2JUeEJ1ZlFbbWFjcC0+VHhCdWZIZWFkXSk7CiAgICAgICAgbWFjcC0+VHhCdWZIZWFkID0gKChtYWNwLT5UeEJ1ZkhlYWQrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CiAgICAgICAgbWFjcC0+VHhCdWZDbnQtLTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAobWFjcC0+VHhCdWZIZWFkICE9IG1hY3AtPlR4QnVmVGFpbCkKICAgICAgICB7CiAgICAgICAgICAgIHByaW50ayhLRVJOX0VSUiAiemZ3R2V0VXNiVHhCdWYgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCk7CiAgICAgICAgfQoKICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgIHJldHVybiBUeFE7Cn0KCnUxNl90IHpmTG54UHV0VXNiVHhCdWZmZXIoemRldl90ICpkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLAogICAgICAgIHU4X3QgKnNuYXAsIHUxNl90IHNuYXBMZW4sIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sCiAgICAgICAgemJ1Zl90ICpidWYsIHUxNl90IG9mZnNldCkKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgdTE2X3QgaWR4OwogICAgVXNiVHhRX3QgKlR4UTsKICAgIHVuc2lnbmVkIGxvbmcgaXJxRmxhZzsKCiAgICBzcGluX2xvY2tfaXJxc2F2ZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CgogICAgaWR4ID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CgogICAgLyogRm9yIFR4IGRlYnVnICovCiAgICAvL3ptX2Fzc2VydChtYWNwLT5UeEJ1ZkNudCA+PSAwKTsgLy8gZGVsZXRlZCBiZWNhdXNlIG9mIGFsd2F5cyB0cnVlCgogICAgLy9pZiAoaWR4ICE9IG1hY3AtPlR4QnVmSGVhZCkKICAgIGlmIChtYWNwLT5UeEJ1ZkNudCA8IFpNX01BWF9UWF9CVUZfTlVNKQogICAgewogICAgICAgIC8vcHJpbnRrKCJDV1kgLSB6ZndQdXRVc2JUeEJ1ZmZlciAsbWFjcC0+VHhCdWZDbnQgPSAlZFxuIiwgbWFjcC0+VHhCdWZDbnQpOwogICAgICAgIFR4USA9IChVc2JUeFFfdCAqKSYobWFjcC0+VXNiVHhCdWZRW21hY3AtPlR4QnVmVGFpbF0pOwogICAgICAgIG1lbWNweShUeFEtPmhkciwgaGRyLCBoZHJsZW4pOwogICAgICAgIFR4US0+aGRybGVuID0gaGRybGVuOwogICAgICAgIG1lbWNweShUeFEtPnNuYXAsIHNuYXAsIHNuYXBMZW4pOwogICAgICAgIFR4US0+c25hcExlbiA9IHNuYXBMZW47CiAgICAgICAgbWVtY3B5KFR4US0+dGFpbCwgdGFpbCwgdGFpbExlbik7CiAgICAgICAgVHhRLT50YWlsTGVuID0gdGFpbExlbjsKICAgICAgICBUeFEtPmJ1ZiA9IGJ1ZjsKICAgICAgICBUeFEtPm9mZnNldCA9IG9mZnNldDsKCiAgICAgICAgbWFjcC0+VHhCdWZUYWlsID0gKChtYWNwLT5UeEJ1ZlRhaWwrMSkgJiAoWk1fTUFYX1RYX0JVRl9OVU0gLSAxKSk7CiAgICAgICAgbWFjcC0+VHhCdWZDbnQrKzsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBwcmludGsoS0VSTl9FUlIgInpmTG54UHV0VXNiVHhCdWZmZXIgVXNiVHhCdWZRIGluY29uc2lzdGVudDogVHhCdWZIZWFkOiAlZCwgVHhCdWZUYWlsOiAlZCwgVHhCdWZDbnQ6ICVkXG4iLAogICAgICAgICAgICBtYWNwLT5UeEJ1ZkhlYWQsIG1hY3AtPlR4QnVmVGFpbCwgbWFjcC0+VHhCdWZDbnQpOwogICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gMDsKfQoKemJ1Zl90ICp6ZkxueEdldFVzYlJ4QnVmZmVyKHpkZXZfdCAqZGV2KQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICAvL3UxNl90IGlkeDsKICAgIHpidWZfdCAqYnVmOwogICAgdW5zaWduZWQgbG9uZyBpcnFGbGFnOwoKICAgIHNwaW5fbG9ja19pcnFzYXZlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKCiAgICAvL2lkeCA9ICgobWFjcC0+UnhCdWZIZWFkKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZlRhaWwpCiAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gMCkKICAgIHsKICAgICAgICBidWYgPSBtYWNwLT5Vc2JSeEJ1ZlFbbWFjcC0+UnhCdWZIZWFkXTsKICAgICAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAoKG1hY3AtPlJ4QnVmSGVhZCsxKSAmIChaTV9NQVhfUlhfVVJCX05VTSAtIDEpKTsKICAgICAgICBtYWNwLT5SeEJ1ZkNudC0tOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50aygiUnhCdWZRIGluY29uc2lzdGVudDogUnhCdWZIZWFkOiAlZCwgUnhCdWZUYWlsOiAlZFxuIiwKICAgICAgICAgICAgICAgIG1hY3AtPlJ4QnVmSGVhZCwgbWFjcC0+UnhCdWZUYWlsKTsKICAgICAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtYWNwLT5jc19sb2NrLCBpcnFGbGFnKTsKICAgIHJldHVybiBidWY7Cn0KCnUzMl90IHpmTG54UHV0VXNiUnhCdWZmZXIoemRldl90ICpkZXYsIHpidWZfdCAqYnVmKQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICB1MTZfdCBpZHg7CiAgICB1bnNpZ25lZCBsb25nIGlycUZsYWc7CgogICAgc3Bpbl9sb2NrX2lycXNhdmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwoKICAgIGlkeCA9ICgobWFjcC0+UnhCdWZUYWlsKzEpICYgKFpNX01BWF9SWF9VUkJfTlVNIC0gMSkpOwoKICAgIC8vaWYgKGlkeCAhPSBtYWNwLT5SeEJ1ZkhlYWQpCiAgICBpZiAobWFjcC0+UnhCdWZDbnQgIT0gWk1fTUFYX1JYX1VSQl9OVU0pCiAgICB7CiAgICAgICAgbWFjcC0+VXNiUnhCdWZRW21hY3AtPlJ4QnVmVGFpbF0gPSBidWY7CiAgICAgICAgbWFjcC0+UnhCdWZUYWlsID0gaWR4OwogICAgICAgIG1hY3AtPlJ4QnVmQ250Kys7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgcHJpbnRrKCJSeEJ1ZlEgaW5jb25zaXN0ZW50OiBSeEJ1ZkhlYWQ6ICVkLCBSeEJ1ZlRhaWw6ICVkXG4iLAogICAgICAgICAgICAgICAgbWFjcC0+UnhCdWZIZWFkLCBtYWNwLT5SeEJ1ZlRhaWwpOwogICAgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1hY3AtPmNzX2xvY2ssIGlycUZsYWcpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgogICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmbWFjcC0+Y3NfbG9jaywgaXJxRmxhZyk7CiAgICByZXR1cm4gMDsKfQoKdm9pZCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CiAgICAvL1VzYlR4UV90ICpUeERhdGE7CgogICAgLyogR2l2ZSB0aGUgdXJiIGJhY2sgKi8KICAgIHpmTG54UHV0VHhVcmIoZGV2KTsKCiAgICAvKiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGFueSBwZW5kaW5nIGJ1ZmZlciBuZWVkZWQgKi8KICAgIC8qIHRvIGJlIHNlbnQgKi8KICAgIGlmICh6ZkxueENoZWNrVHhCdWZmZXJDbnQoZGV2KSAhPSAwKQogICAgewogICAgICAgIC8vVHhEYXRhID0gemZ3R2V0VXNiVHhCdWZmZXIoZGV2KTsKCiAgICAgICAgLy9pZiAoVHhEYXRhID09IE5VTEwpCiAgICAgICAgLy97CiAgICAgICAgLy8gICAgcHJpbnRrKCJHZXQgYSBOVUxMIGJ1ZmZlciBmcm9tIHpmd0dldFVzYlR4QnVmZmVyXG4iKTsKICAgICAgICAvLyAgICByZXR1cm47CiAgICAgICAgLy99CiAgICAgICAgLy9lbHNlCiAgICAgICAgLy97CiAgICAgICAgICAgIHpmTG54VXNiU3VibWl0VHhEYXRhKGRldik7CiAgICAgICAgLy99CiAgICB9Cn0KCnZvaWQgemZMbnhVc2JEYXRhSW5fY2FsbGJhY2sodXJiX3QgKnVyYikKewogICAgemRldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiAgICB6YnVmX3QgKmJ1ZjsKICAgIHpidWZfdCAqbmV3X2J1ZjsKICAgIGludCBzdGF0dXM7CgojaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKICAgIHN0YXRpYyBpbnQgcmVtYWluX2xlbiA9IDAsIGNoZWNrX3BhZCA9IDAsIGNoZWNrX2xlbiA9IDA7CiAgICBpbnQgaW5kZXggPSAwOwogICAgaW50IGNoa19pZHg7CiAgICB1MTZfdCBwa3RfbGVuOwogICAgdTE2X3QgcGt0X3RhZzsKICAgIHUxNl90IGlpOwogICAgemJ1Zl90ICpyeEJ1ZlBvb2xbOF07CiAgICB1MTZfdCByeEJ1ZlBvb2xJbmRleCA9IDA7CiNlbmRpZgoKICAgIC8qIENoZWNrIHN0YXR1cyBmb3IgVVJCICovCiAgICBpZiAodXJiLT5zdGF0dXMgIT0gMCl7CiAgICAgICAgcHJpbnRrKCJ6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaygpIDogc3RhdHVzPTB4JXhcbiIsIHVyYi0+c3RhdHVzKTsKICAgICAgICBpZiAoKHVyYi0+c3RhdHVzICE9IC1FTk9FTlQpICYmICh1cmItPnN0YXR1cyAhPSAtRUNPTk5SRVNFVCkKICAgICAgICAgICAgJiYgKHVyYi0+c3RhdHVzICE9IC1FU0hVVERPV04pKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBJUEUpewogICAgICAgICAgICAgICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJub256ZXJvIHJlYWQgYnVsayBzdGF0dXMgcmVjZWl2ZWQ6IC1FUElQRSIpOwogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICh1cmItPnN0YXR1cyA9PSAtRVBST1RPKXsKICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBST1RPIik7CiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAidXJiLT5zdGF0dXM6IDB4JTA4eFxuIiwgdXJiLT5zdGF0dXMpOwoKICAgICAgICAvKiBEZXF1ZXVlIHNrYiBidWZmZXIgKi8KICAgICAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CiAgICAgICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKICAgICAgICAjaWYgMAogICAgICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLwogICAgICAgIHpmTG54UHV0VXNiUnhCdWZmZXIoZGV2LCBidWYpOwoKICAgICAgICAvKiBTdWJtaXQgYSBSeCB1cmIgKi8KICAgICAgICB6ZkxueFVzYkluKGRldiwgdXJiLCBidWYpOwogICAgICAgICNlbmRpZgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodXJiLT5hY3R1YWxfbGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJHZXQgYW4gVVJCIHdob3NlIGxlbmd0aCBpcyB6ZXJvIik7CiAgICAgICAgc3RhdHVzID0gLTE7CiAgICB9CgogICAgLyogRGVxdWV1ZSBza2IgYnVmZmVyICovCiAgICBidWYgPSB6ZkxueEdldFVzYlJ4QnVmZmVyKGRldik7CgogICAgLy96ZndCdWZTZXRTaXplKGRldiwgYnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOwojaWZkZWYgTkVUX1NLQlVGRl9EQVRBX1VTRVNfT0ZGU0VUCiAgICBidWYtPnRhaWwgPSAwOwogICAgYnVmLT5sZW4gPSAwOwojZWxzZQogICAgYnVmLT50YWlsID0gYnVmLT5kYXRhOwogICAgYnVmLT5sZW4gPSAwOwojZW5kaWYKCiAgICBpZiAoKGJ1Zi0+dGFpbCArIHVyYi0+YWN0dWFsX2xlbmd0aCkgPiBidWYtPmVuZCkKICAgICAgICBCVUcoKTsKCiAgICBza2JfcHV0KGJ1ZiwgdXJiLT5hY3R1YWxfbGVuZ3RoKTsKCiNpZiBaTV9VU0JfU1RSRUFNX01PREUgPT0gMQogICAgaWYgKHJlbWFpbl9sZW4gIT0gMCkKICAgIHsKICAgICAgICB6YnVmX3QgKnJlbWFpbl9idWYgPSBtYWNwLT5yZWFtaW5fYnVmOwoKICAgICAgICBpbmRleCA9IHJlbWFpbl9sZW47CiAgICAgICAgcmVtYWluX2xlbiAtPSBjaGVja19wYWQ7CgogICAgICAgIC8qICBDb3B5IGRhdGEgKi8KICAgICAgICBtZW1jcHkoJihyZW1haW5fYnVmLT5kYXRhW2NoZWNrX2xlbl0pLCBidWYtPmRhdGEsIHJlbWFpbl9sZW4pOwogICAgICAgIGNoZWNrX2xlbiArPSByZW1haW5fbGVuOwogICAgICAgIHJlbWFpbl9sZW4gPSAwOwoKICAgICAgICByeEJ1ZlBvb2xbcnhCdWZQb29sSW5kZXgrK10gPSByZW1haW5fYnVmOwogICAgfQoKICAgIHdoaWxlKGluZGV4IDwgdXJiLT5hY3R1YWxfbGVuZ3RoKQogICAgewogICAgICAgIHBrdF9sZW4gPSBidWYtPmRhdGFbaW5kZXhdICsgKGJ1Zi0+ZGF0YVtpbmRleCsxXSA8PCA4KTsKICAgICAgICBwa3RfdGFnID0gYnVmLT5kYXRhW2luZGV4KzJdICsgKGJ1Zi0+ZGF0YVtpbmRleCszXSA8PCA4KTsKCiAgICAgICAgaWYgKHBrdF90YWcgPT0gMHg0ZTAwKQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhZF9sZW47CgogICAgICAgICAgICAvL3ByaW50aygiR2V0IGEgcGFja2V0LCBpbmRleDogJWQsIHBrdF9sZW46IDB4JTA0eFxuIiwgaW5kZXgsIHBrdF9sZW4pOwogICAgICAgICAgICAjaWYgMAogICAgICAgICAgICAvKiBEdW1wIGRhdGEgKi8KICAgICAgICAgICAgZm9yIChpaSA9IGluZGV4OyBpaSA8IHBrdF9sZW4rNDspCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByaW50aygiJTAyeCAiLCAoYnVmLT5kYXRhW2lpXSAmIDB4ZmYpKTsKCiAgICAgICAgICAgICAgICBpZiAoKCsraWkgJSAxNikgPT0gMCkKICAgICAgICAgICAgICAgICAgICBwcmludGsoIlxuIik7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHByaW50aygiXG4iKTsKICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICBwYWRfbGVuID0gNCAtIChwa3RfbGVuICYgMHgzKTsKCiAgICAgICAgICAgIGlmKHBhZF9sZW4gPT0gNCkKICAgICAgICAgICAgICAgIHBhZF9sZW4gPSAwOwoKICAgICAgICAgICAgY2hrX2lkeCA9IGluZGV4OwogICAgICAgICAgICBpbmRleCA9IGluZGV4ICsgNCArIHBrdF9sZW4gKyBwYWRfbGVuOwoKICAgICAgICAgICAgaWYgKGluZGV4ID4gWk1fTUFYX1JYX0JVRkZFUl9TSVpFKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZW1haW5fbGVuID0gaW5kZXggLSBaTV9NQVhfUlhfQlVGRkVSX1NJWkU7IC8vIC0gcGFkX2xlbjsKICAgICAgICAgICAgICAgIGNoZWNrX2xlbiA9IFpNX01BWF9SWF9CVUZGRVJfU0laRSAtIGNoa19pZHggLSA0OwogICAgICAgICAgICAgICAgY2hlY2tfcGFkID0gcGFkX2xlbjsKCiAgICAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBhIHNrYiBidWZmZXIgKi8KICAgICAgICAgICAgICAgIC8vbmV3X2J1ZiA9IHpmd0J1ZkFsbG9jYXRlKGRldiwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKICAgICAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CgogICAgICAgICAgICAgICAgLyogU2V0IHNrYiBidWZmZXIgbGVuZ3RoICovCiAgICAgICAgICAgICNpZmRlZiBORVRfU0tCVUZGX0RBVEFfVVNFU19PRkZTRVQKICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSAwOwogICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKICAgICAgICAgICAgI2Vsc2UKICAgICAgICAgICAgICAgIG5ld19idWYtPnRhaWwgPSBuZXdfYnVmLT5kYXRhOwogICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gMDsKICAgICAgICAgICAgI2VuZGlmCgogICAgICAgICAgICAgICAgc2tiX3B1dChuZXdfYnVmLCBwa3RfbGVuKTsKCiAgICAgICAgICAgICAgICAvKiBDb3B5IHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgICAgIG1lbWNweShuZXdfYnVmLT5kYXRhLCAmKGJ1Zi0+ZGF0YVtjaGtfaWR4KzRdKSwgY2hlY2tfbGVuKTsKCiAgICAgICAgICAgICAgICAvKiBSZWNvcmQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgICAgICAgICBtYWNwLT5yZWFtaW5fYnVmID0gbmV3X2J1ZjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAjaWZkZWYgWk1fRE9OVF9DT1BZX1JYX0JVRkZFUgogICAgICAgICAgICAgICAgaWYgKHJ4QnVmUG9vbEluZGV4ID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbmV3X2J1ZiA9IHNrYl9jbG9uZShidWYsIEdGUF9BVE9NSUMpOwoKICAgICAgICAgICAgICAgICAgICBuZXdfYnVmLT5kYXRhID0gJihidWYtPmRhdGFbY2hrX2lkeCs0XSk7CiAgICAgICAgICAgICAgICAgICAgbmV3X2J1Zi0+bGVuID0gcGt0X2xlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHsKICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgIC8qIEFsbG9jYXRlIGEgc2tiIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgbmV3X2J1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKCiAgICAgICAgICAgICAgICAvKiBTZXQgc2tiIGJ1ZmZlciBsZW5ndGggKi8KICAgICAgICAgICAgI2lmZGVmIE5FVF9TS0JVRkZfREFUQV9VU0VTX09GRlNFVAogICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IDA7CiAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOwogICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgICAgbmV3X2J1Zi0+dGFpbCA9IG5ld19idWYtPmRhdGE7CiAgICAgICAgICAgICAgICBuZXdfYnVmLT5sZW4gPSAwOwogICAgICAgICAgICAjZW5kaWYKCiAgICAgICAgICAgICAgICBza2JfcHV0KG5ld19idWYsIHBrdF9sZW4pOwoKICAgICAgICAgICAgICAgIC8qIENvcHkgdGhlIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgbWVtY3B5KG5ld19idWYtPmRhdGEsICYoYnVmLT5kYXRhW2Noa19pZHgrNF0pLCBwa3RfbGVuKTsKCiAgICAgICAgI2lmZGVmIFpNX0RPTlRfQ09QWV9SWF9CVUZGRVIKICAgICAgICAgICAgICAgIH0KICAgICAgICAjZW5kaWYKICAgICAgICAgICAgICAgIHJ4QnVmUG9vbFtyeEJ1ZlBvb2xJbmRleCsrXSA9IG5ld19idWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBmaW5kIHRhZywgcGt0X2xlbjogMHglMDR4LCB0YWc6IDB4JTA0eFxuIiwgcGt0X2xlbiwgcGt0X3RhZyk7CgogICAgICAgICAgICAvKiBGcmVlIGJ1ZmZlciAqLwogICAgICAgICAgICBkZXZfa2ZyZWVfc2tiX2FueShidWYpOwoKICAgICAgICAgICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCiAgICAgICAgICAgIG5ld19idWYgPSBkZXZfYWxsb2Nfc2tiKFpNX01BWF9SWF9CVUZGRVJfU0laRSk7CgogICAgICAgICAgICAvKiBFbnF1ZXVlIHNrYiBidWZmZXIgKi8KICAgICAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG5ld19idWYpOwoKICAgICAgICAgICAgLyogU3VibWl0IGEgUnggdXJiICovCiAgICAgICAgICAgIHpmTG54VXNiSW4oZGV2LCB1cmIsIG5ld19idWYpOwoKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBGcmVlIGJ1ZmZlciAqLwogICAgZGV2X2tmcmVlX3NrYl9hbnkoYnVmKTsKI2VuZGlmCgogICAgLyogQWxsb2NhdGUgYSBza2IgYnVmZmVyICovCiAgICBuZXdfYnVmID0gZGV2X2FsbG9jX3NrYihaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwoKICAgIC8qIEVucXVldWUgc2tiIGJ1ZmZlciAqLwogICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG5ld19idWYpOwoKICAgIC8qIFN1Ym1pdCBhIFJ4IHVyYiAqLwogICAgemZMbnhVc2JJbihkZXYsIHVyYiwgbmV3X2J1Zik7CgojaWYgWk1fVVNCX1NUUkVBTV9NT0RFID09IDEKICAgIGZvcihpaSA9IDA7IGlpIDwgcnhCdWZQb29sSW5kZXg7IGlpKyspCiAgICB7CiAgICAgICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCByeEJ1ZlBvb2xbaWldKTsKICAgIH0KI2Vsc2UKICAgIC8qIHBhc3MgZGF0YSB0byB1cHBlciBsYXllciAqLwogICAgbWFjcC0+dXNiQ2JGdW5jdGlvbnMuemZjYlVzYlJlY3YoZGV2LCBidWYpOwojZW5kaWYKfQoKdm9pZCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjayh1cmJfdCAqdXJiKQp7CiAgICAvL2Rldl90KiBkZXYgPSB1cmItPmNvbnRleHQ7CgogICAgLy9wcmludGsoS0VSTl9FUlIgInpmd1VzYlJlZ091dF9jYWxsYmFja1xuIik7Cn0KCnZvaWQgemZMbnhVc2JSZWdJbl9jYWxsYmFjayh1cmJfdCAqdXJiKQp7CiAgICB6ZGV2X3QqIGRldiA9IHVyYi0+Y29udGV4dDsKICAgIHUzMl90IHJzcFs2NC80XTsKICAgIGludCBzdGF0dXM7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogQ2hlY2sgc3RhdHVzIGZvciBVUkIgKi8KICAgIGlmICh1cmItPnN0YXR1cyAhPSAwKXsKICAgICAgICBwcmludGsoInpmTG54VXNiUmVnSW5fY2FsbGJhY2soKSA6IHN0YXR1cz0weCV4XG4iLCB1cmItPnN0YXR1cyk7CiAgICAgICAgaWYgKCh1cmItPnN0YXR1cyAhPSAtRU5PRU5UKSAmJiAodXJiLT5zdGF0dXMgIT0gLUVDT05OUkVTRVQpCiAgICAgICAgICAgICYmICh1cmItPnN0YXR1cyAhPSAtRVNIVVRET1dOKSkKICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQSVBFKXsKICAgICAgICAgICAgICAgICAgICAvL3ByaW50ayhLRVJOX0VSUiAibm9uemVybyByZWFkIGJ1bGsgc3RhdHVzIHJlY2VpdmVkOiAtRVBJUEUiKTsKICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAtMTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAodXJiLT5zdGF0dXMgPT0gLUVQUk9UTyl7CiAgICAgICAgICAgICAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgIm5vbnplcm8gcmVhZCBidWxrIHN0YXR1cyByZWNlaXZlZDogLUVQUk9UTyIpOwogICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInVyYi0+c3RhdHVzOiAweCUwOHhcbiIsIHVyYi0+c3RhdHVzKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHVyYi0+YWN0dWFsX2xlbmd0aCA9PSAwKQogICAgewogICAgICAgIHByaW50ayhLRVJOX0VSUiAiR2V0IGFuIFVSQiB3aG9zZSBsZW5ndGggaXMgemVybyIpOwogICAgICAgIHN0YXR1cyA9IC0xOwogICAgfQoKICAgIC8qIENvcHkgZGF0YSBpbnRvIHJlc3BvbmUgYnVmZmVyICovCiAgICBtZW1jcHkocnNwLCBtYWNwLT5yZWdVc2JSZWFkQnVmLCB1cmItPmFjdHVhbF9sZW5ndGgpOwoKICAgIC8qIE5vdGlmeSB0byB1cHBlciBsYXllciAqLwogICAgLy96ZklkbENoa1JzcChkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CiAgICAvL3pmaVVzYlJlZ0luKGRldiwgcnNwLCAodTE2X3QpdXJiLT5hY3R1YWxfbGVuZ3RoKTsKICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JSZWdJbihkZXYsIHJzcCwgKHUxNl90KXVyYi0+YWN0dWFsX2xlbmd0aCk7CgogICAgLyogSXNzdWUgYW5vdGhlciBVU0IgSU4gVVJCICovCiAgICB6ZkxueFN1Ym1pdFJlZ0luVXJiKGRldik7Cn0KCnUzMl90IHpmTG54U3VibWl0UmVnSW5VcmIoemRldl90ICpkZXYpCnsKICAgIHUzMl90IHJldDsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICAvKiBTdWJtaXQgYSByeCB1cmIgKi8KICAgIC8vcmV0ID0gemZMbnhVc2JTdWJtaXRCdWxrVXJiKG1hY3AtPlJlZ0luVXJiLCBtYWNwLT51ZGV2LAogICAgLy8gICAgICAgIFVTQl9SRUdfSU5fUElQRSwgVVNCX0RJUl9JTiwgbWFjcC0+cmVnVXNiUmVhZEJ1ZiwKICAgIC8vICAgICAgICBaTV9VU0JfUkVHX01BWF9CVUZfU0laRSwgemZMbnhVc2JSZWdJbl9jYWxsYmFjaywgZGV2KTsKICAgIC8vQ1dZYW5nKC0pCiAgICAvL2lmIChyZXQgIT0gMCkKICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOwoKICAgIHJldCA9IHpmTG54VXNiU3VibWl0SW50VXJiKG1hY3AtPlJlZ0luVXJiLCBtYWNwLT51ZGV2LAogICAgICAgICAgICBVU0JfUkVHX0lOX1BJUEUsIFVTQl9ESVJfSU4sIG1hY3AtPnJlZ1VzYlJlYWRCdWYsCiAgICAgICAgICAgIFpNX1VTQl9SRUdfTUFYX0JVRl9TSVpFLCB6ZkxueFVzYlJlZ0luX2NhbGxiYWNrLCBkZXYsIDEpOwoKICAgIHJldHVybiByZXQ7Cn0KCnUzMl90IHpmTG54VXNiU3VibWl0VHhEYXRhKHpkZXZfdCogZGV2KQp7CiAgICB1MzJfdCBpOwogICAgdTMyX3QgcmV0OwogICAgdTE2X3QgZnJlZVR4VXJiOwogICAgdThfdCAqcHVUeEJ1ZiA9IE5VTEw7CiAgICBVc2JUeFFfdCAqVHhEYXRhOwogICAgaW50IGxlbiA9IDA7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CiNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQogICAgdThfdCAgICAgICAgICAgICAgIGlpOwogICAgdTE2X3QgICAgICAgICAgICAgIG9mZnNldCA9IDA7CiAgICB1MTZfdCAgICAgICAgICAgICAgdXNiVHhBZ2dDbnQ7CiAgICB1MTZfdCAgICAgICAgICAgICAgKnBVc2JUeEhkcjsKICAgIFVzYlR4UV90ICAgICAgICAgICAqVHhRUG9vbFtaTV9NQVhfVFhfQUdHUkVHQVRFX05VTV07CiNlbmRpZgoKICAgIC8qIEZpcnN0IGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBmcmVlIFVSQiAqLwogICAgZnJlZVR4VXJiID0gemZMbnhHZXRGcmVlVHhVcmIoZGV2KTsKCiAgICAvKiBJZiB0aGVyZSBpcyBubyBhbnkgZnJlZSBUeCBVcmIgKi8KICAgIGlmIChmcmVlVHhVcmIgPT0gMHhmZmZmKQogICAgewogICAgICAgIC8vcHJpbnRrKEtFUk5fRVJSICJDYW4ndCBnZXQgZnJlZSBUeCBVcmJcbiIpOwogICAgICAgIC8vcHJpbnRrKCJDV1kgLSBDYW4ndCBnZXQgZnJlZSBUeCBVcmJcbiIpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgojaWYgWk1fVVNCX1RYX1NUUkVBTV9NT0RFID09IDEKICAgIHVzYlR4QWdnQ250ID0gemZMbnhDaGVja1R4QnVmZmVyQ250KGRldik7CgogICAgaWYgKHVzYlR4QWdnQ250ID49IFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNKQogICAgewogICAgICAgdXNiVHhBZ2dDbnQgPSBaTV9NQVhfVFhfQUdHUkVHQVRFX05VTTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgIHVzYlR4QWdnQ250ID0gMTsKICAgIH0KCiAgICAvL3ByaW50aygidXNiVHhBZ2dDbnQ6ICVkXG4iLCB1c2JUeEFnZ0NudCk7CiNlbmRpZgoKI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCiAgICBmb3IoaWkgPSAwOyBpaSA8IHVzYlR4QWdnQ250OyBpaSsrKQogICAgewojZW5kaWYKICAgIC8qIERlcXVldWUgdGhlIHBhY2tldCBmcm9tIFVzYlR4QnVmUSAqLwogICAgVHhEYXRhID0gemZMbnhHZXRVc2JUeEJ1ZmZlcihkZXYpOwogICAgaWYgKFR4RGF0YSA9PSBOVUxMKQogICAgewogICAgICAgIC8qIEdpdmUgdGhlIHVyYiBiYWNrICovCiAgICAgICAgemZMbnhQdXRUeFVyYihkZXYpOwogICAgICAgIHJldHVybiAweGZmZmY7CiAgICB9CgogICAgLyogUG9pbnQgdG8gdGhlIGZyZWVUeFVyYiBidWZmZXIgKi8KICAgIHB1VHhCdWYgPSBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdOwoKI2lmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERSA9PSAxCiAgICBwdVR4QnVmICs9IG9mZnNldDsKICAgIHBVc2JUeEhkciA9ICh1MTZfdCAqKXB1VHhCdWY7CgogICAgLyogQWRkIHRoZSBwYWNrZXQgbGVuZ3RoIGFuZCB0YWcgaW5mb3JtYXRpb24gKi8KICAgICpwVXNiVHhIZHIrKyA9IFR4RGF0YS0+aGRybGVuICsgVHhEYXRhLT5zbmFwTGVuICsKICAgICAgICAgICAgIChUeERhdGEtPmJ1Zi0+bGVuIC0gVHhEYXRhLT5vZmZzZXQpICsgIFR4RGF0YS0+dGFpbExlbjsKCiAgICAqcFVzYlR4SGRyKysgPSAweDY5N2U7CgogICAgcHVUeEJ1ZiArPSA0OwojZW5kaWYgLy8gI2lmZGVmIFpNX1VTQl9UWF9TVFJFQU1fTU9ERQoKICAgIC8qIENvcHkgV0xBTiBoZWFkZXIgYW5kIHBhY2tldCBidWZmZXIgaW50byBVU0IgYnVmZmVyICovCiAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPmhkcmxlbjsgaSsrKQogICAgewogICAgICAgICpwdVR4QnVmKysgPSBUeERhdGEtPmhkcltpXTsKICAgIH0KCiAgICAvKiBDb3B5IFNOQVAgaGVhZGVyICovCiAgICBmb3IoaSA9IDA7IGkgPCBUeERhdGEtPnNuYXBMZW47IGkrKykKICAgIHsKICAgICAgICAqcHVUeEJ1ZisrID0gVHhEYXRhLT5zbmFwW2ldOwogICAgfQoKICAgIC8qIENvcHkgcGFja2V0IGJ1ZmZlciAqLwogICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT5idWYtPmxlbiAtIFR4RGF0YS0+b2Zmc2V0OyBpKyspCiAgICB7CiAgICAJLy8qcHVUeEJ1ZisrID0gem13X3J4X2J1Zl9yZWFkYihkZXYsIFR4RGF0YS0+YnVmLCBpKTsKICAgIAkqcHVUeEJ1ZisrID0gKih1OF90KikoKHU4X3QqKVR4RGF0YS0+YnVmLT5kYXRhK2krVHhEYXRhLT5vZmZzZXQpOwogICAgfQoKICAgIC8qIENvcHkgdGFpbCAqLwogICAgZm9yKGkgPSAwOyBpIDwgVHhEYXRhLT50YWlsTGVuOyBpKyspCiAgICB7CiAgICAgICAgKnB1VHhCdWYrKyA9IFR4RGF0YS0+dGFpbFtpXTsKICAgIH0KCiAgICBsZW4gPSBUeERhdGEtPmhkcmxlbitUeERhdGEtPnNuYXBMZW4rVHhEYXRhLT5idWYtPmxlbitUeERhdGEtPnRhaWxMZW4tVHhEYXRhLT5vZmZzZXQ7CgogICAgI2lmIDAKICAgIGlmIChUeERhdGEtPmhkcmxlbiAhPSAwKQogICAgewogICAgICAgIHB1VHhCdWYgPSBtYWNwLT50eFVzYkJ1ZltmcmVlVHhVcmJdOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIHByaW50aygiJTAyeCAiLCBwdVR4QnVmW2ldKTsKICAgICAgICAgICAgaWYgKGkgJSAxNiA9PSAxNSkKICAgICAgICAgICAgICAgIHByaW50aygiXG4iKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRrKCJcbiIpOwogICAgfQogICAgI2VuZGlmCiAgICAjaWYgMAogICAgLyogRm9yIGRlYnVnIHB1cnBvc2UgKi8KICAgIGlmKFR4RGF0YS0+aGRyWzldICYgMHg0MCkKICAgIHsKICAgICAgICBpbnQgaTsKICAgICAgICB1MTZfdCBjdHJsTGVuID0gVHhEYXRhLT5oZHJbMF0gKyAoVHhEYXRhLT5oZHJbMV0gPDwgOCk7CgogICAgICAgIGlmIChjdHJsTGVuICE9IGxlbiArIDQpCiAgICAgICAgewogICAgICAgIC8qIER1bXAgY29udHJvbCBzZXR0aW5nICovCiAgICAgICAgZm9yKGkgPSAwOyBpIDwgODsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRrKEtFUk5fRVJSICIweCUwMnggIiwgVHhEYXRhLT5oZHJbaV0pOwogICAgICAgIH0KICAgICAgICBwcmludGsoS0VSTl9FUlIgIlxuIik7CgogICAgICAgIHByaW50ayhLRVJOX0VSUiAiY3RyTGVuOiAlZCwgaGRyTGVuOiAlZCwgc25hcExlbjogJWRcbiIsIGN0cmxMZW4sIFR4RGF0YS0+aGRybGVuLCBUeERhdGEtPnNuYXBMZW4pOwogICAgICAgIHByaW50ayhLRVJOX0VSUiAiYnVmTGVuOiAlZCwgdGFpbExlbjogJWQsIGxlbjogJWRcbiIsIFR4RGF0YS0+YnVmLT5sZW4sIFR4RGF0YS0+dGFpbExlbiwgbGVuKTsKICAgICAgICB9CiAgICB9CiAgICAjZW5kaWYKCiNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQogICAgLy8gQWRkIHRoZSBMZW5ndGggYW5kIFRhZwogICAgbGVuICs9IDQ7CgogICAgLy9wcmludGsoIiVkIHBhY2tldCwgbGVuZ3RoOiAlZFxuIiwgaWkrMSwgbGVuKTsKCiAgICBpZiAoaWkgPCAoWk1fTUFYX1RYX0FHR1JFR0FURV9OVU0tMSkpCiAgICB7CiAgICAgICAgLyogUGFkIHRoZSBidWZmZXIgdG8gZmlybXdhcmUgZGVzY3JpcHRvciBib3VuZGFyeSAqLwogICAgICAgIG9mZnNldCArPSAoKChsZW4tMSkgLyA0KSArIDEpICogNDsKICAgIH0KCiAgICBpZiAoaWkgPT0gKFpNX01BWF9UWF9BR0dSRUdBVEVfTlVNLTEpKQogICAgewogICAgICAgIGxlbiArPSBvZmZzZXQ7CiAgICB9CgogICAgVHhRUG9vbFtpaV0gPSBUeERhdGE7CgogICAgLy9EYmdQcmludCgiJWQgcGFja2V0LCBvZmZzZXQ6ICVkXG4iLCBpaSsxLCBwVXNiVHhUcmFuc2Zlci0+b2Zmc2V0KTsKCiAgICAvKiBmcmVlIHBhY2tldCAqLwogICAgLy96ZkJ1ZkZyZWUoZGV2LCB0eERhdGEtPmJ1Zik7CiAgICB9CiNlbmRpZgogICAgLy9wcmludGsoIkNXWSAtIGNhbGwgemZ3VXNiU3VibWl0QnVsa1VyYigpLCBsZW4gPSAweCVkXG4iLCBsZW4pOwogICAgLyogU3VibWl0IGEgdHggdXJiICovCiAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEJ1bGtVcmIobWFjcC0+V2xhblR4RGF0YVVyYltmcmVlVHhVcmJdLCBtYWNwLT51ZGV2LAogICAgICAgICAgICBVU0JfV0xBTl9UWF9QSVBFLCBVU0JfRElSX09VVCwgbWFjcC0+dHhVc2JCdWZbZnJlZVR4VXJiXSwKICAgICAgICAgICAgbGVuLCB6ZkxueFVzYkRhdGFPdXRfY2FsbGJhY2ssIGRldik7CiAgICAvL0NXWWFuZygtKQogICAgLy9pZiAocmV0ICE9IDApCiAgICAvLyAgICBwcmludGsoInpmd1VzYlN1Ym1pdEJ1bGtVcmIgZmFpbCwgc3RhdHVzOiAweCUwOHhcbiIsIChpbnQpcmV0KTsKCiAgICAvKiBmcmVlIHBhY2tldCAqLwogICAgLy9kZXZfa2ZyZWVfc2tiX2FueShUeERhdGEtPmJ1Zik7CiNpZiBaTV9VU0JfVFhfU1RSRUFNX01PREUgPT0gMQogICAgZm9yKGlpID0gMDsgaWkgPCB1c2JUeEFnZ0NudDsgaWkrKykKICAgICAgICBtYWNwLT51c2JDYkZ1bmN0aW9ucy56ZmNiVXNiT3V0Q29tcGxldGUoZGV2LCBUeFFQb29sW2lpXS0+YnVmLCAxLCBUeFFQb29sW2lpXS0+aGRyKTsKI2Vsc2UKICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIFR4RGF0YS0+YnVmLCAxLCBUeERhdGEtPmhkcik7CiNlbmRpZgoKICAgIHJldHVybiByZXQ7Cn0KCgoKdTMyX3QgemZMbnhVc2JJbih6ZGV2X3QqIGRldiwgdXJiX3QgKnVyYiwgemJ1Zl90ICpidWYpCnsKICAgIHUzMl90IHJldDsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICAvKiBTdWJtaXQgYSByeCB1cmIgKi8KICAgIHJldCA9IHpmTG54VXNiU3VibWl0QnVsa1VyYih1cmIsIG1hY3AtPnVkZXYsIFVTQl9XTEFOX1JYX1BJUEUsCiAgICAgICAgICAgIFVTQl9ESVJfSU4sIGJ1Zi0+ZGF0YSwgWk1fTUFYX1JYX0JVRkZFUl9TSVpFLAogICAgICAgICAgICB6ZkxueFVzYkRhdGFJbl9jYWxsYmFjaywgZGV2KTsKICAgIC8vQ1dZYW5nKC0pCiAgICAvL2lmIChyZXQgIT0gMCkKICAgIC8vICAgIHByaW50aygiemZ3VXNiU3VibWl0QnVsa1VyYiBmYWlsLCBzdGF0dXM6IDB4JTA4eFxuIiwgKGludClyZXQpOwoKICAgIHJldHVybiByZXQ7Cn0KCnUzMl90IHpmTG54VXNiV3JpdGVSZWcoemRldl90KiBkZXYsIHUzMl90KiBjbWQsIHUxNl90IGNtZExlbikKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0gZGV2LT5tbF9wcml2OwogICAgdTMyX3QgcmV0OwoKI2lmZGVmIFpNX0NPTkZJR19CSUdfRU5ESUFOCiAgICBpbnQgaWkgPSAwOwoKICAgIGZvcihpaT0wOyBpaTwoY21kTGVuPj4yKTsgaWkrKykKCWNtZFtpaV0gPSBjcHVfdG9fbGUzMihjbWRbaWldKTsKI2VuZGlmCgogICAgbWVtY3B5KG1hY3AtPnJlZ1VzYldyaXRlQnVmLCBjbWQsIGNtZExlbik7CgogICAgLyogSXNzdWUgYW4gVVNCIE91dCB0cmFuc2ZlciAqLwogICAgLyogU3VibWl0IGEgdHggdXJiICovCiAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdEludFVyYihtYWNwLT5SZWdPdXRVcmIsIG1hY3AtPnVkZXYsCiAgICAgICAgICAgIFVTQl9SRUdfT1VUX1BJUEUsIFVTQl9ESVJfT1VULCBtYWNwLT5yZWdVc2JXcml0ZUJ1ZiwKICAgICAgICAgICAgY21kTGVuLCB6ZkxueFVzYlJlZ091dF9jYWxsYmFjaywgZGV2LCAxKTsKCiAgICByZXR1cm4gcmV0Owp9CgoKdTMyX3QgemZMbnhVc2JPdXQoemRldl90KiBkZXYsIHU4X3QgKmhkciwgdTE2X3QgaGRybGVuLCB1OF90ICpzbmFwLCB1MTZfdCBzbmFwTGVuLAogICAgICAgIHU4X3QgKnRhaWwsIHUxNl90IHRhaWxMZW4sIHpidWZfdCAqYnVmLCB1MTZfdCBvZmZzZXQpCnsKICAgIHUzMl90IHJldDsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICAvKiBDaGVjayBsZW5ndGggb2YgdGFpbCBidWZmZXIgKi8KICAgIC8vem1fYXNzZXJ0KCh0YWlsTGVuIDw9IDE2KSk7CgogICAgLyogRW5xdWV1ZSB0aGUgcGFja2V0IGludG8gVXNiVHhCdWZRICovCiAgICBpZiAoemZMbnhQdXRVc2JUeEJ1ZmZlcihkZXYsIGhkciwgaGRybGVuLCBzbmFwLCBzbmFwTGVuLCB0YWlsLCB0YWlsTGVuLCBidWYsIG9mZnNldCkgPT0gMHhmZmZmKQogICAgewogICAgICAgIC8qIGZyZWUgcGFja2V0ICovCiAgICAgICAgLy9wcmludGsoIkNXWSAtIHpmd1B1dFVzYlR4QnVmZmVyIEVycm9yLCBmcmVlIHBhY2tldFxuIik7CiAgICAgICAgLy9kZXZfa2ZyZWVfc2tiX2FueShidWYpOwogICAgICAgIG1hY3AtPnVzYkNiRnVuY3Rpb25zLnpmY2JVc2JPdXRDb21wbGV0ZShkZXYsIGJ1ZiwgMCwgaGRyKTsKICAgICAgICByZXR1cm4gMHhmZmZmOwogICAgfQoKICAgIC8vcmV0dXJuIDA7CiAgICAvL3ByaW50aygiQ1dZIC0gY2FsbCB6ZndVc2JTdWJtaXRUeERhdGEoKVxuIik7CiAgICByZXQgPSB6ZkxueFVzYlN1Ym1pdFR4RGF0YShkZXYpOwogICAgcmV0dXJuIHJldDsKfQoKdm9pZCB6ZkxueEluaXRVc2JUeFEoemRldl90KiBkZXYpCnsKICAgIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSAqbWFjcCA9IGRldi0+bWxfcHJpdjsKCiAgICBwcmludGsoS0VSTl9FUlIgInpmd0luaXRVc2JUeFFcbiIpOwoKICAgIC8qIFplcm8gbWVtb3J5IGZvciBVc2JUeEJ1ZlEgKi8KICAgIG1lbXNldChtYWNwLT5Vc2JUeEJ1ZlEsIDAsIHNpemVvZihVc2JUeFFfdCkgKiBaTV9NQVhfVFhfVVJCX05VTSk7CgogICAgbWFjcC0+VHhCdWZIZWFkID0gMDsKICAgIG1hY3AtPlR4QnVmVGFpbCA9IDA7CiAgICBtYWNwLT5UeFVyYkhlYWQgPSAwOwogICAgbWFjcC0+VHhVcmJUYWlsID0gMDsKICAgIG1hY3AtPlR4VXJiQ250ID0gWk1fTUFYX1RYX1VSQl9OVU07Cn0KCnZvaWQgemZMbnhJbml0VXNiUnhRKHpkZXZfdCogZGV2KQp7CiAgICB1MTZfdCBpOwogICAgemJ1Zl90ICpidWY7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogWmVybyBtZW1vcnkgZm9yIFVzYlJ4QnVmUSAqLwogICAgbWVtc2V0KG1hY3AtPlVzYlJ4QnVmUSwgMCwgc2l6ZW9mKHpidWZfdCAqKSAqIFpNX01BWF9SWF9VUkJfTlVNKTsKCiAgICBtYWNwLT5SeEJ1ZkhlYWQgPSAwOwoKICAgIGZvciAoaSA9IDA7IGkgPCBaTV9NQVhfUlhfVVJCX05VTTsgaSsrKQogICAgewogICAgICAgIC8vYnVmID0gemZ3QnVmQWxsb2NhdGUoZGV2LCBaTV9NQVhfUlhfQlVGRkVSX1NJWkUpOwogICAgICAgIGJ1ZiA9IGRldl9hbGxvY19za2IoWk1fTUFYX1JYX0JVRkZFUl9TSVpFKTsKICAgICAgICBtYWNwLT5Vc2JSeEJ1ZlFbaV0gPSBidWY7CiAgICB9CgogICAgLy9tYWNwLT5SeEJ1ZlRhaWwgPSBaTV9NQVhfUlhfVVJCX05VTSAtIDE7CiAgICBtYWNwLT5SeEJ1ZlRhaWwgPSAwOwoKICAgIC8qIFN1Ym1pdCBhbGwgUnggdXJicyAqLwogICAgZm9yIChpID0gMDsgaSA8IFpNX01BWF9SWF9VUkJfTlVNOyBpKyspCiAgICB7CiAgICAgICAgemZMbnhQdXRVc2JSeEJ1ZmZlcihkZXYsIG1hY3AtPlVzYlJ4QnVmUVtpXSk7CiAgICAgICAgemZMbnhVc2JJbihkZXYsIG1hY3AtPldsYW5SeERhdGFVcmJbaV0sIG1hY3AtPlVzYlJ4QnVmUVtpXSk7CiAgICB9Cn0KCgoKdTMyX3QgemZMbnhVc2JTdWJtaXRCdWxrVXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCiAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQpCnsKICAgIHUzMl90IHJldDsKCiAgICBpZihkaXJlY3Rpb24gPT0gVVNCX0RJUl9PVVQpCiAgICB7CiAgICAgICAgdXNiX2ZpbGxfYnVsa191cmIodXJiLCB1c2IsIHVzYl9zbmRidWxrcGlwZSh1c2IsIGVwbnVtKSwKICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQpOwoKICAgICAgICB1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9aRVJPX1BBQ0tFVDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICB1c2JfZmlsbF9idWxrX3VyYih1cmIsIHVzYiwgdXNiX3JjdmJ1bGtwaXBlKHVzYiwgZXBudW0pLAogICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCk7CiAgICB9CgogICAgaWYgKGVwbnVtID09IDQpCiAgICB7CiAgICAgICAgaWYgKHVyYi0+aGNwcml2KQogICAgICAgIHsKICAgICAgICAgICAgLy9wcmludGsoIkNXWSAtIHVyYi0+aGNwcml2IHNldCBieSB1bmtub3duIHJlYXNvbiwgcmVzZXQgaXRcbiIpOwogICAgICAgICAgICAvL3VyYi0+aGNwcml2ID0gMDsKICAgICAgICB9CiAgICB9CgogICAgcmV0ID0gdXNiX3N1Ym1pdF91cmIodXJiLCBHRlBfQVRPTUlDKTsKICAgIGlmICgoZXBudW0gPT0gNCkgJiAocmV0ICE9IDApKQogICAgewogICAgICAgIC8vcHJpbnRrKCJDV1kgLSByZXQgPSAleFxuIiwgcmV0KTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCnUzMl90IHpmTG54VXNiU3VibWl0SW50VXJiKHVyYl90ICp1cmIsIHN0cnVjdCB1c2JfZGV2aWNlICp1c2IsIHUxNl90IGVwbnVtLCB1MTZfdCBkaXJlY3Rpb24sCiAgICAgICAgdm9pZCAqdHJhbnNmZXJfYnVmZmVyLCBpbnQgYnVmZmVyX2xlbmd0aCwgdXNiX2NvbXBsZXRlX3QgY29tcGxldGUsIHZvaWQgKmNvbnRleHQsCiAgICAgICAgdTMyX3QgaW50ZXJ2YWwpCnsKICAgIHUzMl90IHJldDsKCiAgICBpZihkaXJlY3Rpb24gPT0gVVNCX0RJUl9PVVQpCiAgICB7CiAgICAgICAgdXNiX2ZpbGxfaW50X3VyYih1cmIsIHVzYiwgdXNiX3NuZGJ1bGtwaXBlKHVzYiwgZXBudW0pLAogICAgICAgICAgICAgICAgdHJhbnNmZXJfYnVmZmVyLCBidWZmZXJfbGVuZ3RoLCBjb21wbGV0ZSwgY29udGV4dCwgaW50ZXJ2YWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHVzYl9maWxsX2ludF91cmIodXJiLCB1c2IsIHVzYl9yY3ZidWxrcGlwZSh1c2IsIGVwbnVtKSwKICAgICAgICAgICAgICAgIHRyYW5zZmVyX2J1ZmZlciwgYnVmZmVyX2xlbmd0aCwgY29tcGxldGUsIGNvbnRleHQsIGludGVydmFsKTsKICAgIH0KCiAgICByZXQgPSB1c2Jfc3VibWl0X3VyYih1cmIsIEdGUF9BVE9NSUMpOwoKICAgIHJldHVybiByZXQ7Cn0KCiNpZmRlZiBaTV9FTkFCTEVfQ0VOQwppbnQgemZMbnhDZW5jU2VuZE1zZyhzdHJ1Y3Qgc29jayAqbmV0bGlua19zaywgdV9pbnQ4X3QgKm1zZywgaW50IGxlbikKewojZGVmaW5lIENPTU1UWVBFX0dST1VQICAgOAojZGVmaW5lIFdBSV9LX01TRyAgICAgICAgMHgxMQoKCWludCByZXQgPSAtMTsKCWludCBzaXplOwoJdW5zaWduZWQgY2hhciAqb2xkX3RhaWw7CglzdHJ1Y3Qgc2tfYnVmZiAqc2tiOwoJc3RydWN0IG5sbXNnaGRyICpubGg7CgljaGFyICpwb3MgPSBOVUxMOwoKCXNpemUgPSBOTE1TR19TUEFDRShsZW4pOwoJc2tiID0gYWxsb2Nfc2tiKHNpemUsIEdGUF9BVE9NSUMpOwoKCWlmKHNrYiA9PSBOVUxMKQoJewoJCXByaW50aygiZGV2X2FsbG9jX3NrYiBmYWlsdXJlIFxuIik7CgkJZ290byBvdXQ7Cgl9CglvbGRfdGFpbCA9IHNrYi0+dGFpbDsKCgkvKszu0LTK/b7dsajP4LnY0MXPoiovCglubGggPSBOTE1TR19QVVQoc2tiLCAwLCAwLCBXQUlfS19NU0csIHNpemUtc2l6ZW9mKCpubGgpKTsKCXBvcyA9IE5MTVNHX0RBVEEobmxoKTsKCW1lbXNldChwb3MsIDAsIGxlbik7CgoJLyq0q8rktb3Tw7unv9W85LXEyv2+3SovCgltZW1jcHkocG9zLCBtc2csICBsZW4pOwoJLyq8xsvjvq25/dfWvdq21MbkuvO1xMr9vt3KtbzKs6S2yCovCglubGgtPm5sbXNnX2xlbiA9IHNrYi0+dGFpbCAtIG9sZF90YWlsOwoJTkVUTElOS19DQihza2IpLmRzdF9ncm91cCA9IENPTU1UWVBFX0dST1VQOwoJbmV0bGlua19icm9hZGNhc3QobmV0bGlua19zaywgc2tiLCAwLCBDT01NVFlQRV9HUk9VUCwgR0ZQX0FUT01JQyk7CglyZXQgPSAwOwpvdXQ6CglyZXR1cm4gcmV0OwpubG1zZ19mYWlsdXJlOiAvKk5MTVNHX1BVVCDKp7Dco6zU8rO3z/rM173T19a7urTmKi8KICAJaWYoc2tiKQogICAgCQlrZnJlZV9za2Ioc2tiKTsKCWdvdG8gb3V0OwoKI3VuZGVmIENPTU1UWVBFX0dST1VQCiN1bmRlZiBXQUlfS19NU0cKfQojZW5kaWYgLy9aTV9FTkFCTEVfQ0VOQwoKLyogU2ltcGx5IHJldHVybiAweGZmZmYgaWYgVkFQIGZ1bmN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgKi8KdTE2X3QgemZMbnhHZXRWYXBJZCh6ZGV2X3QqIGRldikKewogICAgdTE2X3QgaTsKCiAgICBmb3IgKGk9MDsgaTxaTV9WQVBfUE9SVF9OVU1CRVI7IGkrKykKICAgIHsKICAgICAgICBpZiAodmFwW2ldLmRldiA9PSBkZXYpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMHhmZmZmOwp9Cgp1MzJfdCB6ZndSZWFkUmVnKHpkZXZfdCogZGV2LCB1MzJfdCBvZmZzZXQpCnsKICAgIHJldHVybiAwOwp9CgojaWZuZGVmIElOSVRfV09SSwojZGVmaW5lIHdvcmtfc3RydWN0IHRxX3N0cnVjdAoKI2RlZmluZSBzY2hlZHVsZV93b3JrKGEpICBzY2hlZHVsZV90YXNrKGEpCgojZGVmaW5lIGZsdXNoX3NjaGVkdWxlZF93b3JrICBmbHVzaF9zY2hlZHVsZWRfdGFza3MKI2RlZmluZSBJTklUX1dPUksoX3dxLCBfcm91dGluZSwgX2RhdGEpICBJTklUX1RRVUVVRShfd3EsIF9yb3V0aW5lLCBfZGF0YSkKI2RlZmluZSBQUkVQQVJFX1dPUksoX3dxLCBfcm91dGluZSwgX2RhdGEpICBQUkVQQVJFX1RRVUVVRShfd3EsIF9yb3V0aW5lLCBfZGF0YSkKI2VuZGlmCgojZGVmaW5lIEtFVkVOVF9XQVRDSERPRyAgICAgICAgMHgwMDAwMDAwMQoKdTMyX3Qgc21wX2tldmVudF9Mb2NrID0gMDsKCnZvaWQga2V2ZW50KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKewogICAgc3RydWN0IHVzYmRydl9wcml2YXRlICptYWNwID0KICAgICAgICAgICAgICAgY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCB1c2JkcnZfcHJpdmF0ZSwga2V2ZW50KTsKICAgIHpkZXZfdCAqZGV2ID0gbWFjcC0+ZGV2aWNlOwoKICAgIGlmIChtYWNwID09IE5VTEwpCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICh0ZXN0X2FuZF9zZXRfYml0KDAsICh2b2lkICopJnNtcF9rZXZlbnRfTG9jaykpCiAgICB7CiAgICAgICAgLy9zY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBkb3duKCZtYWNwLT5pb2N0bF9zZW0pOwoKICAgIGlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoS0VWRU5UX1dBVENIRE9HLCAmbWFjcC0+a2V2ZW50X2ZsYWdzKSkKICAgIHsKICAgIGV4dGVybiB1MTZfdCB6ZkhwU3RhcnRSZWN2KHpkZXZfdCAqZGV2KTsKICAgICAgICAvL3pmaUh3V2F0Y2hEb2dSZWluaXQoZGV2KTsKICAgICAgICBwcmludGsoKCJcbiAqKioqKioqKioqKiogSHcgd2F0Y2hEb2cgb2NjdXIhISAqKioqKioqKioqKioqKiBcbiIpKTsKICAgICAgICB6ZmlXbGFuU3VzcGVuZChkZXYpOwogICAgICAgIHpmaVdsYW5SZXN1bWUoZGV2LDApOwogICAgICAgIHpmSHBTdGFydFJlY3YoZGV2KTsKICAgIH0KCiAgICBjbGVhcl9iaXQoMCwgKHZvaWQgKikmc21wX2tldmVudF9Mb2NrKTsKICAgIHVwKCZtYWNwLT5pb2N0bF9zZW0pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVU5DVElPTiBERVNDUklQVElPTiAgICAgICAgICAgICAgICAgemZMbnhDcmVhdGVUaHJlYWQgICAgICAgICAgICAqLwovKiAgICAgIENyZWF0ZSBhIFRocmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBJTlBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGRldiA6IGRldmljZSBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBPVVRQVVRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIGFsd2F5cyAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBBVVRIT1IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgIFl1YW4tR3UgV2VpICAgICAgICAgQXRoZXJvcyBDb21tdW5pY2F0aW9ucywgSU5DLiAgICAyMDA3LjMgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp1OF90IHpmTG54Q3JlYXRlVGhyZWFkKHpkZXZfdCAqZGV2KQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgLyogQ3JlYXRlIE11dGV4IGFuZCBrZXZlbnRkICovCiAgICBJTklUX1dPUksoJm1hY3AtPmtldmVudCwga2V2ZW50KTsKICAgIGluaXRfTVVURVgoJm1hY3AtPmlvY3RsX3NlbSk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEZVTkNUSU9OIERFU0NSSVBUSU9OICAgICAgICAgICAgICAgICB6ZkxueFNpZ25hbFRocmVhZCAgICAgICAgICAgICovCi8qICAgICAgU2lnbmFsIFRocmVhZCB3aXRoIEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIElOUFVUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZGV2IDogZGV2aWNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgZmxhZyA6IHNpZ25hbCB0aHJlYWQgZmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIE9VVFBVVFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgbm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIEFVVEhPUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgWXVhbi1HdSBXZWkgICAgICAgICBBdGhlcm9zIENvbW11bmljYXRpb25zLCBJTkMuICAgIDIwMDcuMyAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgemZMbnhTaWduYWxUaHJlYWQoemRldl90ICpkZXYsIGludCBmbGFnKQp7CiAgICBzdHJ1Y3QgdXNiZHJ2X3ByaXZhdGUgKm1hY3AgPSBkZXYtPm1sX3ByaXY7CgogICAgaWYgKG1hY3AgPT0gTlVMTCkKICAgIHsKICAgICAgICBwcmludGsoIm1hY3AgaXMgTlVMTFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICgwICYmIG1hY3AtPmtldmVudF9yZWFkeSAhPSAxKQogICAgewogICAgICAgIHByaW50aygiS2V2ZW50IG5vdCByZWFkeVxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHNldF9iaXQoZmxhZywgJm1hY3AtPmtldmVudF9mbGFncyk7CgogICAgaWYgKCFzY2hlZHVsZV93b3JrKCZtYWNwLT5rZXZlbnQpKQogICAgewogICAgICAgIC8vRmFpbHMgaXMgTm9ybWFsCiAgICAgICAgLy9wcmludGsoS0VSTl9FUlIgInNjaGVkdWxlX3Rhc2sgZmFpbGVkLCBmbGFnID0gJXhcbiIsIGZsYWcpOwogICAgfQp9CgovKiBOb3RpZnkgd3JhcHBlciB0b2RvIHJlZG93bmxvYWQgZmlybXdhcmUgYW5kIHJlaW5pdCBwcm9jZWR1cmUgd2hlbiAqLwovKiBoYXJkd2FyZSB3YXRjaGRvZyBvY2N1ciA6IHpmaUh3V2F0Y2hEb2dSZWluaXQoKSAqLwp2b2lkIHpmTG54V2F0Y2hEb2dOb3RpZnkoemRldl90KiBkZXYpCnsKICAgIHpmTG54U2lnbmFsVGhyZWFkKGRldiwgS0VWRU5UX1dBVENIRE9HKTsKfQoKLyogUXVlcnkgRHVyYW50aW9uIG9mIEFjdGl2ZSBTY2FuICovCnZvaWQgemZ3R2V0QWN0aXZlU2NhbkR1cih6ZGV2X3QqIGRldiwgdThfdCogRHVyKQp7CiAgICAqRHVyID0gMzA7IC8vIGRlZmF1bHQgMzAgbXMKfQoKdm9pZCB6ZndHZXRTaG93WmVyb0xlbmd0aFNTSUQoemRldl90KiBkZXYsIHU4X3QqIER1cikKewogICAgKkR1ciA9IDA7Cn0KCg==