LyoKICogaXNkbmhkbGMuYyAgLS0gIEdlbmVyYWwgcHVycG9zZSBJU0ROIEhETEMgZGVjb2Rlci4KICoKICpDb3B5cmlnaHQgKEMpIDIwMDIJV29sZmdhbmcgTfxlcyAgICAgIDx3b2xmZ2FuZ0Bpa3N3LW11ZWVzLmRlPgogKgkJMjAwMSAJRnJvZGUgSXNha3NlbiAgICAgIDxmaXNha3NlbkBiZXdhbi5jb20+CiAqICAgICAgICAgICAgICAyMDAxIAlLYWkgR2VybWFzY2hld3NraSAgPGthaS5nZXJtYXNjaGV3c2tpQGdteC5kZT4KICoKICogICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogKiAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiAqICAgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKICogICAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiAgICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiAgICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqICAgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiAgICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqICAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogICAgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiAgICAgIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgogKi8KCiNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2NyYy1jY2l0dC5oPgojaW5jbHVkZSAiaXNkbmhkbGMuaCIKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgpNT0RVTEVfQVVUSE9SKCJXb2xmZ2FuZyBN/GVzIDx3b2xmZ2FuZ0Bpa3N3LW11ZWVzLmRlPiwgIgoJICAgICAgIkZyb2RlIElzYWtzZW4gPGZpc2Frc2VuQGJld2FuLmNvbT4sICIKCSAgICAgICJLYWkgR2VybWFzY2hld3NraSA8a2FpLmdlcm1hc2NoZXdza2lAZ214LmRlPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkdlbmVyYWwgcHVycG9zZSBJU0ROIEhETEMgZGVjb2RlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIik7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyogYml0IHN3YXAgdGFibGUuCiAqIFZlcnkgaGFuZHkgZm9yIGRldmljZXMgd2l0aCBkaWZmZXJlbnQgYml0IG9yZGVyLAogKiBhbmQgbmVjY2Vzc2FyeSBmb3IgZWFjaCB0cmFuc3BhcmVudCBCLWNoYW5uZWwgYWNjZXNzIGZvciBhbGwKICogZGV2aWNlcyB3aGljaCB3b3JrcyB3aXRoIHRoaXMgSERMQyBkZWNvZGVyIHdpdGhvdXQgYml0IHJldmVyc2FsLgogKi8KY29uc3QgdW5zaWduZWQgY2hhciBpc2RuaGRsY19iaXRfcmV2X3RhYlsyNTZdID0gewoJMHgwMCwweDgwLDB4NDAsMHhDMCwweDIwLDB4QTAsMHg2MCwweEUwLDB4MTAsMHg5MCwweDUwLDB4RDAsMHgzMCwweEIwLDB4NzAsMHhGMCwKCTB4MDgsMHg4OCwweDQ4LDB4QzgsMHgyOCwweEE4LDB4NjgsMHhFOCwweDE4LDB4OTgsMHg1OCwweEQ4LDB4MzgsMHhCOCwweDc4LDB4RjgsCgkweDA0LDB4ODQsMHg0NCwweEM0LDB4MjQsMHhBNCwweDY0LDB4RTQsMHgxNCwweDk0LDB4NTQsMHhENCwweDM0LDB4QjQsMHg3NCwweEY0LAoJMHgwQywweDhDLDB4NEMsMHhDQywweDJDLDB4QUMsMHg2QywweEVDLDB4MUMsMHg5QywweDVDLDB4REMsMHgzQywweEJDLDB4N0MsMHhGQywKCTB4MDIsMHg4MiwweDQyLDB4QzIsMHgyMiwweEEyLDB4NjIsMHhFMiwweDEyLDB4OTIsMHg1MiwweEQyLDB4MzIsMHhCMiwweDcyLDB4RjIsCgkweDBBLDB4OEEsMHg0QSwweENBLDB4MkEsMHhBQSwweDZBLDB4RUEsMHgxQSwweDlBLDB4NUEsMHhEQSwweDNBLDB4QkEsMHg3QSwweEZBLAoJMHgwNiwweDg2LDB4NDYsMHhDNiwweDI2LDB4QTYsMHg2NiwweEU2LDB4MTYsMHg5NiwweDU2LDB4RDYsMHgzNiwweEI2LDB4NzYsMHhGNiwKCTB4MEUsMHg4RSwweDRFLDB4Q0UsMHgyRSwweEFFLDB4NkUsMHhFRSwweDFFLDB4OUUsMHg1RSwweERFLDB4M0UsMHhCRSwweDdFLDB4RkUsCgkweDAxLDB4ODEsMHg0MSwweEMxLDB4MjEsMHhBMSwweDYxLDB4RTEsMHgxMSwweDkxLDB4NTEsMHhEMSwweDMxLDB4QjEsMHg3MSwweEYxLAoJMHgwOSwweDg5LDB4NDksMHhDOSwweDI5LDB4QTksMHg2OSwweEU5LDB4MTksMHg5OSwweDU5LDB4RDksMHgzOSwweEI5LDB4NzksMHhGOSwKCTB4MDUsMHg4NSwweDQ1LDB4QzUsMHgyNSwweEE1LDB4NjUsMHhFNSwweDE1LDB4OTUsMHg1NSwweEQ1LDB4MzUsMHhCNSwweDc1LDB4RjUsCgkweDBELDB4OEQsMHg0RCwweENELDB4MkQsMHhBRCwweDZELDB4RUQsMHgxRCwweDlELDB4NUQsMHhERCwweDNELDB4QkQsMHg3RCwweEZELAoJMHgwMywweDgzLDB4NDMsMHhDMywweDIzLDB4QTMsMHg2MywweEUzLDB4MTMsMHg5MywweDUzLDB4RDMsMHgzMywweEIzLDB4NzMsMHhGMywKCTB4MEIsMHg4QiwweDRCLDB4Q0IsMHgyQiwweEFCLDB4NkIsMHhFQiwweDFCLDB4OUIsMHg1QiwweERCLDB4M0IsMHhCQiwweDdCLDB4RkIsCgkweDA3LDB4ODcsMHg0NywweEM3LDB4MjcsMHhBNywweDY3LDB4RTcsMHgxNywweDk3LDB4NTcsMHhENywweDM3LDB4QjcsMHg3NywweEY3LAoJMHgwRiwweDhGLDB4NEYsMHhDRiwweDJGLDB4QUYsMHg2RiwweEVGLDB4MUYsMHg5RiwweDVGLDB4REYsMHgzRiwweEJGLDB4N0YsMHhGRgp9OwoKZW51bSB7CglIRExDX0ZBU1RfSURMRSxIRExDX0dFVF9GTEFHX0IwLEhETENfR0VURkxBR19CMUE2LEhETENfR0VURkxBR19CNywKCUhETENfR0VUX0RBVEEsSERMQ19GQVNUX0ZMQUcKfTsKCmVudW0gewoJSERMQ19TRU5EX0RBVEEsSERMQ19TRU5EX0NSQzEsSERMQ19TRU5EX0ZBU1RfRkxBRywKCUhETENfU0VORF9GSVJTVF9GTEFHLEhETENfU0VORF9DUkMyLEhETENfU0VORF9DTE9TSU5HX0ZMQUcsCglIRExDX1NFTkRfSURMRTEsSERMQ19TRU5EX0ZBU1RfSURMRSxIRExDX1NFTkRGTEFHX0IwLAoJSERMQ19TRU5ERkxBR19CMUE2LEhETENfU0VOREZMQUdfQjcsU1RPUFBFRAp9OwoKdm9pZCBpc2RuaGRsY19yY3ZfaW5pdCAoc3RydWN0IGlzZG5oZGxjX3ZhcnMgKmhkbGMsIGludCBkb19hZGFwdDU2KQp7CiAgIAloZGxjLT5iaXRfc2hpZnQgPSAwOwoJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgloZGxjLT5kYXRhX2JpdHMgPSAwOwoJaGRsYy0+ZmZiaXRfc2hpZnQgPSAwOwoJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7CgloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0RBVEE7CgloZGxjLT5kb19hZGFwdDU2ID0gZG9fYWRhcHQ1NjsKCWhkbGMtPmRjaGFubmVsID0gMDsKCWhkbGMtPmNyYyA9IDA7CgloZGxjLT5jYmluID0gMDsKCWhkbGMtPnNoaWZ0X3JlZyA9IDA7CgloZGxjLT5mZnZhbHVlID0gMDsKCWhkbGMtPmRzdHBvcyA9IDA7Cn0KCnZvaWQgaXNkbmhkbGNfb3V0X2luaXQgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLCBpbnQgaXNfZF9jaGFubmVsLCBpbnQgZG9fYWRhcHQ1NikKewogICAJaGRsYy0+Yml0X3NoaWZ0ID0gMDsKCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJaGRsYy0+ZGF0YV9iaXRzID0gMDsKCWhkbGMtPmZmYml0X3NoaWZ0ID0gMDsKCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAwOwoJaGRsYy0+ZG9fY2xvc2luZyA9IDA7CgloZGxjLT5mZnZhbHVlID0gMDsKCWlmIChpc19kX2NoYW5uZWwpIHsKCQloZGxjLT5kY2hhbm5lbCA9IDE7CgkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfRklSU1RfRkxBRzsKCX0gZWxzZSB7CgkJaGRsYy0+ZGNoYW5uZWwgPSAwOwoJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZBU1RfRkxBRzsKCQloZGxjLT5mZnZhbHVlID0gMHg3ZTsKCX0KCWhkbGMtPmNiaW4gPSAweDdlOwoJaGRsYy0+Yml0X3NoaWZ0ID0gMDsKCWlmKGRvX2FkYXB0NTYpewoJCWhkbGMtPmRvX2FkYXB0NTYgPSAxOwoJCWhkbGMtPmRhdGFfYml0cyA9IDA7CgkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRGTEFHX0IwOwoJfSBlbHNlIHsKCQloZGxjLT5kb19hZGFwdDU2ID0gMDsKCQloZGxjLT5kYXRhX2JpdHMgPSA4OwoJfQoJaGRsYy0+c2hpZnRfcmVnID0gMDsKfQoKLyoKICBpc2RuaGRsY19kZWNvZGUgLSBkZWNvZGVzIEhETEMgZnJhbWVzIGZyb20gYSB0cmFuc3BhcmVudCBiaXQgc3RyZWFtLgoKICBUaGUgc291cmNlIGJ1ZmZlciBpcyBzY2FubmVkIGZvciB2YWxpZCBIRExDIGZyYW1lcyBsb29raW5nIGZvcgogIGZsYWdzICgwMTExMTExMCkgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgZnJhbWUuIElmIHRoZSBzdGFydCBvZgogIHRoZSBmcmFtZSBpcyBmb3VuZCwgdGhlIGJpdCBzdHVmZmluZyBpcyByZW1vdmVkICgwIGFmdGVyIDUgMSdzKS4KICBXaGVuIGEgbmV3IGZsYWcgaXMgZm91bmQsIHRoZSBjb21wbGV0ZSBmcmFtZSBoYXMgYmVlbiByZWNlaXZlZAogIGFuZCB0aGUgQ1JDIGlzIGNoZWNrZWQuCiAgSWYgYSB2YWxpZCBmcmFtZSBpcyBmb3VuZCwgdGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIGZyYW1lIGxlbmd0aAogIGV4Y2x1ZGluZyB0aGUgQ1JDIHdpdGggdGhlIGJpdCBIRExDX0VORF9PRl9GUkFNRSBzZXQuCiAgSWYgdGhlIGJlZ2lubmluZyBvZiBhIHZhbGlkIGZyYW1lIGlzIGZvdW5kLCB0aGUgZnVuY3Rpb24gcmV0dXJucwogIHRoZSBsZW5ndGguCiAgSWYgYSBmcmFtaW5nIGVycm9yIGlzIGZvdW5kICh0b28gbWFueSAxcyBhbmQgbm90IGEgZmxhZykgdGhlIGZ1bmN0aW9uCiAgcmV0dXJucyB0aGUgbGVuZ3RoIHdpdGggdGhlIGJpdCBIRExDX0ZSQU1JTkdfRVJST1Igc2V0LgogIElmIGEgQ1JDIGVycm9yIGlzIGZvdW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSBsZW5ndGggd2l0aCB0aGUKICBiaXQgSERMQ19DUkNfRVJST1Igc2V0LgogIElmIHRoZSBmcmFtZSBsZW5ndGggZXhjZWVkcyB0aGUgZGVzdGluYXRpb24gYnVmZmVyIHNpemUsIHRoZSBmdW5jdGlvbgogIHJldHVybnMgdGhlIGxlbmd0aCB3aXRoIHRoZSBiaXQgSERMQ19MRU5HVEhfRVJST1Igc2V0LgoKICBzcmMgLSBzb3VyY2UgYnVmZmVyCiAgc2xlbiAtIHNvdXJjZSBidWZmZXIgbGVuZ3RoCiAgY291bnQgLSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCAoZGVjb2RlZCkgZnJvbSB0aGUgc291cmNlIGJ1ZmZlcgogIGRzdCBfIGRlc3RpbmF0aW9uIGJ1ZmZlcgogIGRzaXplIC0gZGVzdGluYXRpb24gYnVmZmVyIHNpemUKICByZXR1cm5zIC0gbnVtYmVyIG9mIGRlY29kZWQgYnl0ZXMgaW4gdGhlIGRlc3RpbmF0aW9uIGJ1ZmZlciBhbmQgc3RhdHVzCiAgZmxhZy4KICovCmludCBpc2RuaGRsY19kZWNvZGUgKHN0cnVjdCBpc2RuaGRsY192YXJzICpoZGxjLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsCgkJICAgICBpbnQgc2xlbiwgaW50ICpjb3VudCwgdW5zaWduZWQgY2hhciAqZHN0LCBpbnQgZHNpemUpCnsKCWludCBzdGF0dXM9MDsKCglzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBmYXN0X2ZsYWdbXT17CgkJMHgwMCwweDAwLDB4MDAsMHgyMCwweDMwLDB4MzgsMHgzYywweDNlLDB4M2YKCX07CgoJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgZmFzdF9mbGFnX3ZhbHVlW109ewoJCTB4MDAsMHg3ZSwweGZjLDB4ZjksMHhmMywweGU3LDB4Y2YsMHg5ZiwweDNmCgl9OwoKCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZhc3RfYWJvcnRbXT17CgkJMHgwMCwweDAwLDB4ODAsMHhjMCwweGUwLDB4ZjAsMHhmOCwweGZjLDB4ZmUsMHhmZgoJfTsKCgkqY291bnQgPSBzbGVuOwoKCXdoaWxlKHNsZW4gPiAwKXsKCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTApewoJCQloZGxjLT5jYmluID0gKnNyYysrOwoJCQlzbGVuLS07CgkJCWhkbGMtPmJpdF9zaGlmdCA9IDg7CgkJCWlmKGhkbGMtPmRvX2FkYXB0NTYpewoJCQkJaGRsYy0+Yml0X3NoaWZ0IC0tOwoJCQl9CgkJfQoKCQlzd2l0Y2goaGRsYy0+c3RhdGUpewoJCWNhc2UgU1RPUFBFRDoKCQkJcmV0dXJuIDA7CgkJY2FzZSBIRExDX0ZBU1RfSURMRToKCQkJaWYoaGRsYy0+Y2JpbiA9PSAweGZmKXsKCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDA7CgkJCQlicmVhazsKCQkJfQoJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0ZMQUdfQjA7CgkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQloZGxjLT5iaXRfc2hpZnQgPSA4OwoJCQlicmVhazsKCQljYXNlIEhETENfR0VUX0ZMQUdfQjA6CgkJCWlmKCEoaGRsYy0+Y2JpbiAmIDB4ODApKSB7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VURkxBR19CMUE2OwoJCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCX0gZWxzZSB7CgkJCQlpZighaGRsYy0+ZG9fYWRhcHQ1Nil7CgkJCQkJaWYoKytoZGxjLT5oZGxjX2JpdHMxID49OCApIGlmKGhkbGMtPmJpdF9zaGlmdD09MSkKCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfSURMRTsKCQkJCX0KCQkJfQoJCQloZGxjLT5jYmluPDw9MTsKCQkJaGRsYy0+Yml0X3NoaWZ0IC0tOwoJCQlicmVhazsKCQljYXNlIEhETENfR0VURkxBR19CMUE2OgoJCQlpZihoZGxjLT5jYmluICYgMHg4MCl7CgkJCQloZGxjLT5oZGxjX2JpdHMxKys7CgkJCQlpZihoZGxjLT5oZGxjX2JpdHMxPT02KXsKCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VURkxBR19CNzsKCQkJCX0KCQkJfSBlbHNlIHsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQl9CgkJCWhkbGMtPmNiaW48PD0xOwoJCQloZGxjLT5iaXRfc2hpZnQgLS07CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19HRVRGTEFHX0I3OgoJCQlpZihoZGxjLT5jYmluICYgMHg4MCkgewoJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVF9GTEFHX0IwOwoJCQl9IGVsc2UgewoJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0dFVF9EQVRBOwoJCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwoJCQkJaGRsYy0+c2hpZnRfcmVnID0gMDsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJaGRsYy0+ZGF0YV9iaXRzID0gMDsKCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAwOwoJCQl9CgkJCWhkbGMtPmNiaW48PD0xOwoJCQloZGxjLT5iaXRfc2hpZnQgLS07CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19HRVRfREFUQToKCQkJaWYoaGRsYy0+Y2JpbiAmIDB4ODApewoJCQkJaGRsYy0+aGRsY19iaXRzMSsrOwoJCQkJc3dpdGNoKGhkbGMtPmhkbGNfYml0czEpewoJCQkJY2FzZSA2OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSA3OgoJCQkJCWlmKGhkbGMtPmRhdGFfcmVjZWl2ZWQpIHsKCQkJCQkJLy8gYmFkIGZyYW1lCgkJCQkJCXN0YXR1cyA9IC1IRExDX0ZSQU1JTkdfRVJST1I7CgkJCQkJfQoJCQkJCWlmKCFoZGxjLT5kb19hZGFwdDU2KXsKCQkJCQkJaWYoaGRsYy0+Y2Jpbj09ZmFzdF9hYm9ydFtoZGxjLT5iaXRfc2hpZnQrMV0pewoJCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX0ZBU1RfSURMRTsKCQkJCQkJCWhkbGMtPmJpdF9zaGlmdD0xOwoJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9IGVsc2UgewoJCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0ZMQUdfQjA7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQloZGxjLT5zaGlmdF9yZWc+Pj0xOwoJCQkJCWhkbGMtPnNoaWZ0X3JlZyB8PSAweDgwOwoJCQkJCWhkbGMtPmRhdGFfYml0cysrOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9IGVsc2UgewoJCQkJc3dpdGNoKGhkbGMtPmhkbGNfYml0czEpewoJCQkJY2FzZSA1OgoJCQkJCWJyZWFrOwoJCQkJY2FzZSA2OgoJCQkJCWlmKGhkbGMtPmRhdGFfcmVjZWl2ZWQpewoJCQkJCQlpZiAoaGRsYy0+ZHN0cG9zIDwgMikgewoJCQkJCQkJc3RhdHVzID0gLUhETENfRlJBTUlOR19FUlJPUjsKCQkJCQkJfSBlbHNlIGlmIChoZGxjLT5jcmMgIT0gMHhmMGI4KXsKCQkJCQkJCS8vIGNyYyBlcnJvcgoJCQkJCQkJc3RhdHVzID0gLUhETENfQ1JDX0VSUk9SOwoJCQkJCQl9IGVsc2UgewoJCQkJCQkJLy8gcmVtb3ZlIENSQwoJCQkJCQkJaGRsYy0+ZHN0cG9zIC09IDI7CgkJCQkJCQkvLyBnb29kIGZyYW1lCgkJCQkJCQlzdGF0dXMgPSBoZGxjLT5kc3Rwb3M7CgkJCQkJCX0KCQkJCQl9CgkJCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwoJCQkJCWhkbGMtPnNoaWZ0X3JlZyA9IDA7CgkJCQkJaGRsYy0+ZGF0YV9iaXRzID0gMDsKCQkJCQlpZighaGRsYy0+ZG9fYWRhcHQ1Nil7CgkJCQkJCWlmKGhkbGMtPmNiaW49PWZhc3RfZmxhZ1toZGxjLT5iaXRfc2hpZnRdKXsKCQkJCQkJCWhkbGMtPmZmdmFsdWUgPSBmYXN0X2ZsYWdfdmFsdWVbaGRsYy0+Yml0X3NoaWZ0XTsKCQkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19GQVNUX0ZMQUc7CgkJCQkJCQloZGxjLT5mZmJpdF9zaGlmdCA9IGhkbGMtPmJpdF9zaGlmdDsKCQkJCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDE7CgkJCQkJCX0gZWxzZSB7CgkJCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfR0VUX0RBVEE7CgkJCQkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKCQkJCQkJfQoJCQkJCX0gZWxzZSB7CgkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRfREFUQTsKCQkJCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7CgkJCQkJfQoJCQkJCWJyZWFrOwoJCQkJZGVmYXVsdDoKCQkJCQloZGxjLT5zaGlmdF9yZWc+Pj0xOwoJCQkJCWhkbGMtPmRhdGFfYml0cysrOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCX0KCQkJaWYgKHN0YXR1cykgewoJCQkJaGRsYy0+ZHN0cG9zID0gMDsKCQkJCSpjb3VudCAtPSBzbGVuOwoJCQkJaGRsYy0+Y2JpbiA8PD0gMTsKCQkJCWhkbGMtPmJpdF9zaGlmdC0tOwoJCQkJcmV0dXJuIHN0YXR1czsKCQkJfQoJCQlpZihoZGxjLT5kYXRhX2JpdHM9PTgpewoJCQkJaGRsYy0+ZGF0YV9iaXRzID0gMDsKCQkJCWhkbGMtPmRhdGFfcmVjZWl2ZWQgPSAxOwoJCQkJaGRsYy0+Y3JjID0gY3JjX2NjaXR0X2J5dGUoaGRsYy0+Y3JjLCBoZGxjLT5zaGlmdF9yZWcpOwoKCQkJCS8vIGdvb2QgYnl0ZSByZWNlaXZlZAoJCQkJaWYgKGhkbGMtPmRzdHBvcyA8IGRzaXplKSB7CgkJCQkJZHN0W2hkbGMtPmRzdHBvcysrXSA9IGhkbGMtPnNoaWZ0X3JlZzsKCQkJCX0gZWxzZSB7CgkJCQkJLy8gZnJhbWUgdG9vIGxvbmcKCQkJCQlzdGF0dXMgPSAtSERMQ19MRU5HVEhfRVJST1I7CgkJCQkJaGRsYy0+ZHN0cG9zID0gMDsKCQkJCX0KCQkJfQoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5iaXRfc2hpZnQtLTsKCQkJYnJlYWs7CgkJY2FzZSBIRExDX0ZBU1RfRkxBRzoKCQkJaWYoaGRsYy0+Y2Jpbj09aGRsYy0+ZmZ2YWx1ZSl7CgkJCQloZGxjLT5iaXRfc2hpZnQgPSAwOwoJCQkJYnJlYWs7CgkJCX0gZWxzZSB7CgkJCQlpZihoZGxjLT5jYmluID09IDB4ZmYpewoJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19GQVNUX0lETEU7CgkJCQkJaGRsYy0+Yml0X3NoaWZ0PTA7CgkJCQl9IGVsc2UgaWYoaGRsYy0+ZmZiaXRfc2hpZnQ9PTgpewoJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRGTEFHX0I3OwoJCQkJCWJyZWFrOwoJCQkJfSBlbHNlIHsKCQkJCQloZGxjLT5zaGlmdF9yZWcgPSBmYXN0X2Fib3J0W2hkbGMtPmZmYml0X3NoaWZ0LTFdOwoJCQkJCWhkbGMtPmhkbGNfYml0czEgPSBoZGxjLT5mZmJpdF9zaGlmdC0yOwoJCQkJCWlmKGhkbGMtPmhkbGNfYml0czE8MCloZGxjLT5oZGxjX2JpdHMxID0gMDsKCQkJCQloZGxjLT5kYXRhX2JpdHMgPSBoZGxjLT5mZmJpdF9zaGlmdC0xOwoJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19HRVRfREFUQTsKCQkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKCQkJCX0KCQkJfQoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlicmVhazsKCQl9Cgl9CgkqY291bnQgLT0gc2xlbjsKCXJldHVybiAwOwp9CgovKgogIGlzZG5oZGxjX2VuY29kZSAtIGVuY29kZXMgSERMQyBmcmFtZXMgdG8gYSB0cmFuc3BhcmVudCBiaXQgc3RyZWFtLgoKICBUaGUgYml0IHN0cmVhbSBzdGFydHMgd2l0aCBhIGJlZ2lubmluZyBmbGFnICgwMTExMTExMCkuIEFmdGVyCiAgdGhhdCBlYWNoIGJ5dGUgaXMgYWRkZWQgdG8gdGhlIGJpdCBzdHJlYW0gd2l0aCBiaXQgc3R1ZmZpbmcgYWRkZWQKICAoMCBhZnRlciA1IDEncykuCiAgV2hlbiB0aGUgbGFzdCBieXRlIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc291cmNlIGJ1ZmZlciwgdGhlCiAgQ1JDICgyIGJ5dGVzIGlzIGFkZGVkKSBhbmQgdGhlIGZyYW1lIHRlcm1pbmF0ZXMgd2l0aCB0aGUgZW5kaW5nIGZsYWcuCiAgRm9yIHRoZSBkY2hhbm5lbCwgdGhlIGlkbGUgY2hhcmFjdGVyIChhbGwgMSdzKSBpcyBhbHNvIGFkZGVkIGF0IHRoZSBlbmQuCiAgSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCBlbXB0eSBzb3VyY2UgYnVmZmVyIChzbGVuPTApLCBmbGFncyBvcgogIGlkbGUgY2hhcmFjdGVyIHdpbGwgYmUgZ2VuZXJhdGVkLgoKICBzcmMgLSBzb3VyY2UgYnVmZmVyCiAgc2xlbiAtIHNvdXJjZSBidWZmZXIgbGVuZ3RoCiAgY291bnQgLSBudW1iZXIgb2YgYnl0ZXMgcmVtb3ZlZCAoZW5jb2RlZCkgZnJvbSBzb3VyY2UgYnVmZmVyCiAgZHN0IF8gZGVzdGluYXRpb24gYnVmZmVyCiAgZHNpemUgLSBkZXN0aW5hdGlvbiBidWZmZXIgc2l6ZQogIHJldHVybnMgLSBudW1iZXIgb2YgZW5jb2RlZCBieXRlcyBpbiB0aGUgZGVzdGluYXRpb24gYnVmZmVyCiovCmludCBpc2RuaGRsY19lbmNvZGUoc3RydWN0IGlzZG5oZGxjX3ZhcnMgKmhkbGMsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywKCQl1bnNpZ25lZCBzaG9ydCBzbGVuLCBpbnQgKmNvdW50LAoJCXVuc2lnbmVkIGNoYXIgKmRzdCwgaW50IGRzaXplKQp7CglzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB4ZmFzdF9mbGFnX3ZhbHVlW10gPSB7CgkJMHg3ZSwweDNmLDB4OWYsMHhjZiwweGU3LDB4ZjMsMHhmOSwweGZjLDB4N2UKCX07CgoJaW50IGxlbiA9IDA7CgoJKmNvdW50ID0gc2xlbjsKCgl3aGlsZSAoZHNpemUgPiAwKSB7CgkJaWYoaGRsYy0+Yml0X3NoaWZ0PT0wKXsKCQkJaWYoc2xlbiAmJiAhaGRsYy0+ZG9fY2xvc2luZyl7CgkJCQloZGxjLT5zaGlmdF9yZWcgPSAqc3JjKys7CgkJCQlzbGVuLS07CgkJCQlpZiAoc2xlbiA9PSAwKQoJCQkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAxOyAgLyogY2xvc2luZyBzZXF1ZW5jZSwgQ1JDICsgZmxhZyhzKSAqLwoJCQkJaGRsYy0+Yml0X3NoaWZ0ID0gODsKCQkJfSBlbHNlIHsKCQkJCWlmKGhkbGMtPnN0YXRlID09IEhETENfU0VORF9EQVRBKXsKCQkJCQlpZihoZGxjLT5kYXRhX3JlY2VpdmVkKXsKCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfQ1JDMTsKCQkJCQkJaGRsYy0+Y3JjIF49IDB4ZmZmZjsKCQkJCQkJaGRsYy0+Yml0X3NoaWZ0ID0gODsKCQkJCQkJaGRsYy0+c2hpZnRfcmVnID0gaGRsYy0+Y3JjICYgMHhmZjsKCQkJCQl9IGVsc2UgaWYoIWhkbGMtPmRvX2FkYXB0NTYpewoJCQkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9GQVNUX0ZMQUc7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRGTEFHX0IwOwoJCQkJCX0KCQkJCX0KCgkJCX0KCQl9CgoJCXN3aXRjaChoZGxjLT5zdGF0ZSl7CgkJY2FzZSBTVE9QUEVEOgoJCQl3aGlsZSAoZHNpemUtLSkKCQkJCSpkc3QrKyA9IDB4ZmY7CgoJCQlyZXR1cm4gZHNpemU7CgkJY2FzZSBIRExDX1NFTkRfRkFTVF9GTEFHOgoJCQloZGxjLT5kb19jbG9zaW5nID0gMDsKCQkJaWYoc2xlbiA9PSAwKXsKCQkJCSpkc3QrKyA9IGhkbGMtPmZmdmFsdWU7CgkJCQlsZW4rKzsKCQkJCWRzaXplLS07CgkJCQlicmVhazsKCQkJfQoJCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTgpewoJCQkJaGRsYy0+Y2JpbiA9IGhkbGMtPmZmdmFsdWU+Pig4LWhkbGMtPmRhdGFfYml0cyk7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9EQVRBOwoJCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwoJCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMTsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhETENfU0VOREZMQUdfQjA6CgkJCWhkbGMtPmRvX2Nsb3NpbmcgPSAwOwoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5ERkxBR19CMUE2OwoJCQlicmVhazsKCQljYXNlIEhETENfU0VOREZMQUdfQjFBNjoKCQkJaGRsYy0+Y2JpbiA8PD0gMTsKCQkJaGRsYy0+ZGF0YV9iaXRzKys7CgkJCWhkbGMtPmNiaW4rKzsKCQkJaWYoKytoZGxjLT5oZGxjX2JpdHMxID09IDYpCgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VOREZMQUdfQjc7CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19TRU5ERkxBR19CNzoKCQkJaGRsYy0+Y2JpbiA8PD0gMTsKCQkJaGRsYy0+ZGF0YV9iaXRzKys7CgkJCWlmKHNsZW4gPT0gMCl7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VOREZMQUdfQjA7CgkJCQlicmVhazsKCQkJfQoJCQlpZihoZGxjLT5iaXRfc2hpZnQ9PTgpewoJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfREFUQTsKCQkJCWhkbGMtPmNyYyA9IDB4ZmZmZjsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDE7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSBIRExDX1NFTkRfRklSU1RfRkxBRzoKCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDE7CgkJCWlmKGhkbGMtPmRhdGFfYml0cz09OCl7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9EQVRBOwoJCQkJaGRsYy0+Y3JjID0gMHhmZmZmOwoJCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCQlicmVhazsKCQkJfQoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaWYoaGRsYy0+c2hpZnRfcmVnICYgMHgwMSkKCQkJCWhkbGMtPmNiaW4rKzsKCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwoJCQloZGxjLT5iaXRfc2hpZnQtLTsKCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT0wKXsKCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0RBVEE7CgkJCQloZGxjLT5jcmMgPSAweGZmZmY7CgkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhETENfU0VORF9EQVRBOgoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaWYoaGRsYy0+aGRsY19iaXRzMSA9PSA1KXsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT04KXsKCQkJCWhkbGMtPmNyYyA9IGNyY19jY2l0dF9ieXRlKGhkbGMtPmNyYywgaGRsYy0+c2hpZnRfcmVnKTsKCQkJfQoJCQlpZihoZGxjLT5zaGlmdF9yZWcgJiAweDAxKXsKCQkJCWhkbGMtPmhkbGNfYml0czErKzsKCQkJCWhkbGMtPmNiaW4rKzsKCQkJCWhkbGMtPnNoaWZ0X3JlZyA+Pj0gMTsKCQkJCWhkbGMtPmJpdF9zaGlmdC0tOwoJCQl9IGVsc2UgewoJCQkJaGRsYy0+aGRsY19iaXRzMSA9IDA7CgkJCQloZGxjLT5zaGlmdF9yZWcgPj49IDE7CgkJCQloZGxjLT5iaXRfc2hpZnQtLTsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhETENfU0VORF9DUkMxOgoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaWYoaGRsYy0+aGRsY19iaXRzMSA9PSA1KXsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoaGRsYy0+c2hpZnRfcmVnICYgMHgwMSl7CgkJCQloZGxjLT5oZGxjX2JpdHMxKys7CgkJCQloZGxjLT5jYmluKys7CgkJCQloZGxjLT5zaGlmdF9yZWcgPj49IDE7CgkJCQloZGxjLT5iaXRfc2hpZnQtLTsKCQkJfSBlbHNlIHsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwoJCQkJaGRsYy0+Yml0X3NoaWZ0LS07CgkJCX0KCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT0wKXsKCQkJCWhkbGMtPnNoaWZ0X3JlZyA9IChoZGxjLT5jcmMgPj4gOCk7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9DUkMyOwoJCQkJaGRsYy0+Yml0X3NoaWZ0ID0gODsKCQkJfQoJCQlicmVhazsKCQljYXNlIEhETENfU0VORF9DUkMyOgoJCQloZGxjLT5jYmluIDw8PSAxOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaWYoaGRsYy0+aGRsY19iaXRzMSA9PSA1KXsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJYnJlYWs7CgkJCX0KCQkJaWYoaGRsYy0+c2hpZnRfcmVnICYgMHgwMSl7CgkJCQloZGxjLT5oZGxjX2JpdHMxKys7CgkJCQloZGxjLT5jYmluKys7CgkJCQloZGxjLT5zaGlmdF9yZWcgPj49IDE7CgkJCQloZGxjLT5iaXRfc2hpZnQtLTsKCQkJfSBlbHNlIHsKCQkJCWhkbGMtPmhkbGNfYml0czEgPSAwOwoJCQkJaGRsYy0+c2hpZnRfcmVnID4+PSAxOwoJCQkJaGRsYy0+Yml0X3NoaWZ0LS07CgkJCX0KCQkJaWYoaGRsYy0+Yml0X3NoaWZ0PT0wKXsKCQkJCWhkbGMtPnNoaWZ0X3JlZyA9IDB4N2U7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9DTE9TSU5HX0ZMQUc7CgkJCQloZGxjLT5iaXRfc2hpZnQgPSA4OwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19TRU5EX0NMT1NJTkdfRkxBRzoKCQkJaGRsYy0+Y2JpbiA8PD0gMTsKCQkJaGRsYy0+ZGF0YV9iaXRzKys7CgkJCWlmKGhkbGMtPmhkbGNfYml0czEgPT0gNSl7CgkJCQloZGxjLT5oZGxjX2JpdHMxID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmKGhkbGMtPnNoaWZ0X3JlZyAmIDB4MDEpewoJCQkJaGRsYy0+Y2JpbisrOwoJCQl9CgkJCWhkbGMtPnNoaWZ0X3JlZyA+Pj0gMTsKCQkJaGRsYy0+Yml0X3NoaWZ0LS07CgkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCl7CgkJCQloZGxjLT5mZnZhbHVlID0geGZhc3RfZmxhZ192YWx1ZVtoZGxjLT5kYXRhX2JpdHNdOwoJCQkJaWYoaGRsYy0+ZGNoYW5uZWwpewoJCQkJCWhkbGMtPmZmdmFsdWUgPSAweDdlOwoJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0lETEUxOwoJCQkJCWhkbGMtPmJpdF9zaGlmdCA9IDgtaGRsYy0+ZGF0YV9iaXRzOwoJCQkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCkKCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRfRkFTVF9JRExFOwoJCQkJfSBlbHNlIHsKCQkJCQlpZighaGRsYy0+ZG9fYWRhcHQ1Nil7CgkJCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZBU1RfRkxBRzsKCQkJCQkJaGRsYy0+ZGF0YV9yZWNlaXZlZCA9IDA7CgkJCQkJfSBlbHNlIHsKCQkJCQkJaGRsYy0+c3RhdGUgPSBIRExDX1NFTkRGTEFHX0IwOwoJCQkJCQloZGxjLT5kYXRhX3JlY2VpdmVkID0gMDsKCQkJCQl9CgkJCQkJLy8gRmluaXNoZWQgd2l0aCB0aGlzIGZyYW1lLCBzZW5kIGZsYWdzCgkJCQkJaWYgKGRzaXplID4gMSkgZHNpemUgPSAxOwoJCQkJfQoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19TRU5EX0lETEUxOgoJCQloZGxjLT5kb19jbG9zaW5nID0gMDsKCQkJaGRsYy0+Y2JpbiA8PD0gMTsKCQkJaGRsYy0+Y2JpbisrOwoJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJaGRsYy0+Yml0X3NoaWZ0LS07CgkJCWlmKGhkbGMtPmJpdF9zaGlmdD09MCl7CgkJCQloZGxjLT5zdGF0ZSA9IEhETENfU0VORF9GQVNUX0lETEU7CgkJCQloZGxjLT5iaXRfc2hpZnQgPSAwOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgSERMQ19TRU5EX0ZBU1RfSURMRToKCQkJaGRsYy0+ZG9fY2xvc2luZyA9IDA7CgkJCWhkbGMtPmNiaW4gPSAweGZmOwoJCQloZGxjLT5kYXRhX2JpdHMgPSA4OwoJCQlpZihoZGxjLT5iaXRfc2hpZnQgPT0gOCl7CgkJCQloZGxjLT5jYmluID0gMHg3ZTsKCQkJCWhkbGMtPnN0YXRlID0gSERMQ19TRU5EX0ZJUlNUX0ZMQUc7CgkJCX0gZWxzZSB7CgkJCQkqZHN0KysgPSBoZGxjLT5jYmluOwoJCQkJaGRsYy0+Yml0X3NoaWZ0ID0gaGRsYy0+ZGF0YV9iaXRzID0gMDsKCQkJCWxlbisrOwoJCQkJZHNpemUgPSAwOwoJCQl9CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCQlpZihoZGxjLT5kb19hZGFwdDU2KXsKCQkJaWYoaGRsYy0+ZGF0YV9iaXRzPT03KXsKCQkJCWhkbGMtPmNiaW4gPDw9IDE7CgkJCQloZGxjLT5jYmluKys7CgkJCQloZGxjLT5kYXRhX2JpdHMrKzsKCQkJfQoJCX0KCQlpZihoZGxjLT5kYXRhX2JpdHM9PTgpewoJCQkqZHN0KysgPSBoZGxjLT5jYmluOwoJCQloZGxjLT5kYXRhX2JpdHMgPSAwOwoJCQlsZW4rKzsKCQkJZHNpemUtLTsKCQl9Cgl9CgkqY291bnQgLT0gc2xlbjsKCglyZXR1cm4gbGVuOwp9CgpFWFBPUlRfU1lNQk9MKGlzZG5oZGxjX2JpdF9yZXZfdGFiKTsKRVhQT1JUX1NZTUJPTChpc2RuaGRsY19yY3ZfaW5pdCk7CkVYUE9SVF9TWU1CT0woaXNkbmhkbGNfZGVjb2RlKTsKRVhQT1JUX1NZTUJPTChpc2RuaGRsY19vdXRfaW5pdCk7CkVYUE9SVF9TWU1CT0woaXNkbmhkbGNfZW5jb2RlKTsK