LyoKICogRE9TIGRldmljZXMKICoKICogQ29weXJpZ2h0IDE5OTkgT3ZlIEvldmVuCiAqLwoKI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlICJ3aW5lL3dpbmJhc2UxNi5oIgojaW5jbHVkZSAibXNkb3MuaCIKI2luY2x1ZGUgIm1pc2NlbXUuaCIKI2luY2x1ZGUgImRvc2V4ZS5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgoKI2luY2x1ZGUgInBzaHBhY2sxLmgiCgp0eXBlZGVmIHN0cnVjdCB7CiAgQllURSBsam1wMTsKICBSTUNCUFJPQyBzdHJhdGVneTsKICBCWVRFIGxqbXAyOwogIFJNQ0JQUk9DIGludGVycnVwdDsKfSBXSU5FREVWX1RIVU5LOwoKdHlwZWRlZiBzdHJ1Y3QgewogIEJZVEUgc2l6ZTsgLyogbGVuZ3RoIG9mIGhlYWRlciArIGRhdGEgKi8KICBCWVRFIHVuaXQ7IC8qIHVuaXQgKGJsb2NrIGRldmljZXMgb25seSkgKi8KICBCWVRFIGNvbW1hbmQ7CiAgV09SRCBzdGF0dXM7CiAgQllURSByZXNlcnZlZFs4XTsKfSBSRVFVRVNUX0hFQURFUjsKCnR5cGVkZWYgc3RydWN0IHsKICBSRVFVRVNUX0hFQURFUiBoZHI7CiAgQllURSBtZWRpYTsgLyogbWVkaWEgZGVzY3JpcHRvciBmcm9tIEJQQiAqLwogIFNFR1BUUiBidWZmZXI7CiAgV09SRCBjb3VudDsgLyogYnl0ZS9zZWN0b3IgY291bnQgKi8KICBXT1JEIHNlY3RvcjsgLyogc3RhcnRpbmcgc2VjdG9yIChibG9jayBkZXZpY2VzKSAqLwogIERXT1JEIHZvbHVtZTsgLyogdm9sdW1lIElEIChibG9jayBkZXZpY2VzKSAqLwp9IFJFUV9JTzsKCnR5cGVkZWYgc3RydWN0IHsKICBSRVFVRVNUX0hFQURFUiBoZHI7CiAgQllURSBkYXRhOwp9IFJFUV9TQUZFSU5QVVQ7CgojaW5jbHVkZSAicG9wcGFjay5oIgoKI2RlZmluZSBDT05fQlVGRkVSIDEyOAoKI2RlZmluZSBTWVNURU1fU1RSQVRFR1lfTlVMIDB4MDEwMAojZGVmaW5lIFNZU1RFTV9TVFJBVEVHWV9DT04gMHgwMTAxCgojZGVmaW5lIE5PTkVYVCAoKERXT1JEKS0xKQoKI2RlZmluZSBBVFRSX1NURElOICAgICAweDAwMDEKI2RlZmluZSBBVFRSX1NURE9VVCAgICAweDAwMDIKI2RlZmluZSBBVFRSX05VTCAgICAgICAweDAwMDQKI2RlZmluZSBBVFRSX0NMT0NLICAgICAweDAwMDgKI2RlZmluZSBBVFRSX0ZBU1RDT04gICAweDAwMTAKI2RlZmluZSBBVFRSX1JBVyAgICAgICAweDAwMjAKI2RlZmluZSBBVFRSX05PVEVPRiAgICAweDAwNDAKI2RlZmluZSBBVFRSX0RFVklDRSAgICAweDAwODAKI2RlZmluZSBBVFRSX1JFTU9WQUJMRSAweDA4MDAKI2RlZmluZSBBVFRSX05PTklCTSAgICAweDIwMDAgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIEFUVFJfVU5USUxCVVNZIDB4MjAwMCAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBBVFRSX0lPQ1RMICAgICAweDQwMDAKI2RlZmluZSBBVFRSX0NIQVIgICAgICAweDgwMDAKCiNkZWZpbmUgQ01EX0lOSVQgICAgICAgMAojZGVmaW5lIENNRF9NRURJQUNIRUNLIDEgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9CVUlMREJQQiAgIDIgLyogYmxvY2sgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9JTklPQ1RMICAgIDMKI2RlZmluZSBDTURfSU5QVVQgICAgICA0IC8qIHJlYWQgZGF0YSAqLwojZGVmaW5lIENNRF9TQUZFSU5QVVQgIDUgLyogIm5vbi1kZXN0cnVjdGl2ZSBpbnB1dCBubyB3YWl0IiwgY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX0lOU1RBVFVTICAgNiAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfSU5GTFVTSCAgICA3IC8qIGNoYXIgZGV2aWNlcyAqLwojZGVmaW5lIENNRF9PVVRQVVQgICAgIDggLyogd3JpdGUgZGF0YSAqLwojZGVmaW5lIENNRF9TQUZFT1VUUFVUIDkgLyogd3JpdGUgZGF0YSB3aXRoIHZlcmlmeSAqLwojZGVmaW5lIENNRF9PVVRTVEFUVVMgMTAgLyogY2hhciBkZXZpY2VzICovCiNkZWZpbmUgQ01EX09VVEZMVVNIICAxMSAvKiBjaGFyIGRldmljZXMgKi8KI2RlZmluZSBDTURfT1VUSU9DVEwgIDEyCiNkZWZpbmUgQ01EX0RFVk9QRU4gICAxMwojZGVmaW5lIENNRF9ERVZDTE9TRSAgMTQKI2RlZmluZSBDTURfUkVNT1ZBQkxFIDE1IC8qIGJsb2NrIGRldmljZXMgKi8KI2RlZmluZSBDTURfVU5USUxCVVNZIDE2IC8qIG91dHB1dCB1bnRpbCBidXN5ICovCgojZGVmaW5lIFNUQVRfTUFTSyAgMHgwMEZGCiNkZWZpbmUgU1RBVF9ET05FICAweDAxMDAKI2RlZmluZSBTVEFUX0JVU1kgIDB4MDIwMAojZGVmaW5lIFNUQVRfRVJST1IgMHg4MDAwCgojZGVmaW5lIExKTVAgMHhlYQoKCi8qIHByb3RvdHlwZXMgKi8Kc3RhdGljIHZvaWQgV0lOQVBJIG51bF9zdHJhdGVneShDT05URVhUODYqY3R4KTsKc3RhdGljIHZvaWQgV0lOQVBJIG51bF9pbnRlcnJ1cHQoQ09OVEVYVDg2KmN0eCk7CnN0YXRpYyB2b2lkIFdJTkFQSSBjb25fc3RyYXRlZ3koQ09OVEVYVDg2KmN0eCk7CnN0YXRpYyB2b2lkIFdJTkFQSSBjb25faW50ZXJydXB0KENPTlRFWFQ4NipjdHgpOwoKLyogZGV2aWNlcyAqLwp0eXBlZGVmIHN0cnVjdCAKewogICAgY2hhciBuYW1lWzhdOwogICAgV09SRCBhdHRyOwogICAgUk1DQlBST0Mgc3RyYXRlZ3k7CiAgICBSTUNCUFJPQyBpbnRlcnJ1cHQ7CiAgICAKfSBXSU5FREVWOwoKc3RhdGljIFdJTkVERVYgZGV2c1tdID0gCnsKICB7ICJOVUwgICAgICIsCiAgICBBVFRSX0NIQVJ8QVRUUl9OVUx8QVRUUl9ERVZJQ0UsCiAgICBudWxfc3RyYXRlZ3ksIG51bF9pbnRlcnJ1cHQgfSwKCiAgeyAiQ09OICAgICAiLAogICAgQVRUUl9DSEFSfEFUVFJfU1RESU58QVRUUl9TVERPVVR8QVRUUl9GQVNUQ09OfEFUVFJfTk9URU9GfEFUVFJfREVWSUNFLAogICAgY29uX3N0cmF0ZWd5LCBjb25faW50ZXJydXB0IH0KfTsKCiNkZWZpbmUgTlJfREVWUyAoc2l6ZW9mKGRldnMpL3NpemVvZihXSU5FREVWKSkKCi8qIERPUyBkYXRhIHNlZ21lbnQgKi8KdHlwZWRlZiBzdHJ1Y3QKewogICAgRE9TX0xJU1RPRkxJU1RTICAgIGxvbDsKICAgIERPU19ERVZJQ0VfSEVBREVSICBkZXZbTlJfREVWUy0xXTsKICAgIFdJTkVERVZfVEhVTksgICAgICB0aHVua1tOUl9ERVZTXTsKICAgIFJFUV9JTyAgICAgICAgICAgICByZXE7CiAgICBCWVRFICAgICAgICAgICAgICAgYnVmZmVyW0NPTl9CVUZGRVJdOwoKfSBET1NfREFUQVNFRzsKCiNkZWZpbmUgRE9TX0RBVEFTRUdfT0ZGKHh4eCkgRklFTERfT0ZGU0VUKERPU19EQVRBU0VHLCB4eHgpCgpEV09SRCBET1NfTE9MU2VnOwoKCi8qIHRoZSBkZXZpY2UgaW1wbGVtZW50YXRpb25zICovCnN0YXRpYyB2b2lkIGRvX2xyZXQoQ09OVEVYVDg2KmN0eCkKewogIFdPUkQgKnN0YWNrID0gQ1RYX1NFR19PRkZfVE9fTElOKGN0eCwgU1NfcmVnKGN0eCksIEVTUF9yZWcoY3R4KSk7CgogIEVJUF9yZWcoY3R4KSA9ICooc3RhY2srKyk7CiAgQ1NfcmVnKGN0eCkgID0gKihzdGFjaysrKTsKICBFU1BfcmVnKGN0eCkgKz0gMipzaXplb2YoV09SRCk7Cn0KCnN0YXRpYyB2b2lkIGRvX3N0cmF0ZWd5KENPTlRFWFQ4NipjdHgsIGludCBpZCwgaW50IGV4dHJhKQp7CiAgUkVRVUVTVF9IRUFERVIgKmhkciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjdHgsIEVTX3JlZyhjdHgpLCBFQlhfcmVnKGN0eCkpOwogIHZvaWQgKipoZHJfcHRyID0gRE9TVk1fR2V0U3lzdGVtRGF0YShpZCk7CgogIGlmICghaGRyX3B0cikgewogICAgaGRyX3B0ciA9IGNhbGxvYygxLHNpemVvZih2b2lkICopK2V4dHJhKTsKICAgIERPU1ZNX1NldFN5c3RlbURhdGEoaWQsIGhkcl9wdHIpOwogIH0KCiAgKmhkcl9wdHIgPSBoZHI7CiAgZG9fbHJldChjdHgpOwp9CgpzdGF0aWMgUkVRVUVTVF9IRUFERVIgKiBnZXRfaGRyKGludCBpZCwgdm9pZCoqZXh0cmEpCnsKICB2b2lkICoqaGRyX3B0ciA9IERPU1ZNX0dldFN5c3RlbURhdGEoaWQpOwogIGlmIChleHRyYSkKICAgICpleHRyYSA9IGhkcl9wdHIgPyAodm9pZCopKGhkcl9wdHIrMSkgOiAodm9pZCAqKU5VTEw7CiAgcmV0dXJuIGhkcl9wdHIgPyAqaGRyX3B0ciA6ICh2b2lkICopTlVMTDsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIG51bF9zdHJhdGVneShDT05URVhUODYqY3R4KQp7CiAgZG9fc3RyYXRlZ3koY3R4LCBTWVNURU1fU1RSQVRFR1lfTlVMLCAwKTsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIG51bF9pbnRlcnJ1cHQoQ09OVEVYVDg2KmN0eCkKewogIFJFUVVFU1RfSEVBREVSICpoZHIgPSBnZXRfaGRyKFNZU1RFTV9TVFJBVEVHWV9OVUwsIE5VTEwpOwogIC8qIGVhdCBldmVyeXRoaW5nIGFuZCByZWN5Y2xlIG5vdGhpbmcgKi8KICBzd2l0Y2ggKGhkci0+Y29tbWFuZCkgewogIGNhc2UgQ01EX0lOUFVUOgogICAgKChSRVFfSU8qKWhkciktPmNvdW50ID0gMDsKICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogICAgYnJlYWs7CiAgY2FzZSBDTURfU0FGRUlOUFVUOgogICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkV8U1RBVF9CVVNZOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogIH0KICBkb19scmV0KGN0eCk7Cn0KCnN0YXRpYyB2b2lkIFdJTkFQSSBjb25fc3RyYXRlZ3koQ09OVEVYVDg2KmN0eCkKewogIGRvX3N0cmF0ZWd5KGN0eCwgU1lTVEVNX1NUUkFURUdZX0NPTiwgc2l6ZW9mKGludCkpOwp9CgpzdGF0aWMgdm9pZCBXSU5BUEkgY29uX2ludGVycnVwdChDT05URVhUODYqY3R4KQp7CiAgaW50ICpzY2FuOwogIFJFUVVFU1RfSEVBREVSICpoZHIgPSBnZXRfaGRyKFNZU1RFTV9TVFJBVEVHWV9DT04sKHZvaWQgKiopJnNjYW4pOwogIEJJT1NEQVRBICpiaW9zID0gRE9TTUVNX0Jpb3NEYXRhKCk7CiAgV09SRCBDdXJPZnMgPSBiaW9zLT5OZXh0S2JkQ2hhclB0cjsKICBET1NfTElTVE9GTElTVFMgKmxvbCA9IERPU01FTV9MT0woKTsKICBET1NfREFUQVNFRyAqZGF0YXNlZyA9IChET1NfREFUQVNFRyAqKWxvbDsKICBCWVRFICpsaW5lYnVmZmVyID0gZGF0YXNlZy0+YnVmZmVyOwogIEJZVEUgKmN1cmJ1ZmZlciA9IChsb2wtPm9mZnNfdW5yZWFkX0NPTikgPwogICAgKCgoQllURSopZGF0YXNlZykgKyBsb2wtPm9mZnNfdW5yZWFkX0NPTikgOiAoQllURSopTlVMTDsKICBET1NfREVWSUNFX0hFQURFUiAqY29uID0gZGF0YXNlZy0+ZGV2OwogIExQRE9TVEFTSyBscERvc1Rhc2sgPSBNWl9DdXJyZW50KCk7CgogIHN3aXRjaCAoaGRyLT5jb21tYW5kKSB7CiAgY2FzZSBDTURfSU5QVVQ6CiAgICB7CiAgICAgIFJFUV9JTyAqaW8gPSAoUkVRX0lPICopaGRyOwogICAgICBXT1JEIGNvdW50ID0gaW8tPmNvdW50LCBsZW4gPSAwOwogICAgICBCWVRFICpidWZmZXIgPSBDVFhfU0VHX09GRl9UT19MSU4oY3R4LAoJCQkJCVNFTEVDVE9ST0YoaW8tPmJ1ZmZlciksCgkJCQkJKERXT1JEKU9GRlNFVE9GKGlvLT5idWZmZXIpKTsKCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9CVVNZOwogICAgICAvKiBmaXJzdCwgY2hlY2sgd2hldGhlciB3ZSBhbHJlYWR5IGhhdmUgZGF0YSBpbiBsaW5lIGJ1ZmZlciAqLwogICAgICBpZiAoY3VyYnVmZmVyKSB7CgkvKiB5ZXAsIGNvcHkgYXMgbXVjaCBhcyB3ZSBjYW4gKi8KCUJZVEUgZGF0YSA9IDA7Cgl3aGlsZSAoKGxlbjxjb3VudCkgJiYgKGRhdGEgIT0gJ1xyJykpIHsKCSAgZGF0YSA9ICpjdXJidWZmZXIrKzsKCSAgYnVmZmVyW2xlbisrXSA9IGRhdGE7Cgl9CglpZiAoZGF0YSA9PSAnXHInKSB7CgkgIC8qIGxpbmUgYnVmZmVyIGVtcHRpZWQgKi8KCSAgbG9sLT5vZmZzX3VucmVhZF9DT04gPSAwOwoJICBjdXJidWZmZXIgPSBOVUxMOwoJICAvKiBpZiB3ZSdyZSBub3QgaW4gcmF3IG1vZGUsIGNhbGwgaXQgYSBkYXkqLwoJICBpZiAoIShjb24tPmF0dHIgJiBBVFRSX1JBVykpIHsKCSAgICBoZHItPnN0YXR1cyA9IFNUQVRfRE9ORTsKCSAgICBpby0+Y291bnQgPSBsZW47CgkgICAgYnJlYWs7CgkgIH0KCX0gZWxzZSB7CgkgIC8qIHN0aWxsIHNvbWUgZGF0YSBsZWZ0ICovCgkgIGxvbC0+b2Zmc191bnJlYWRfQ09OID0gY3VyYnVmZmVyIC0gKEJZVEUqKWxvbDsKCSAgLyogYnV0IGJ1ZmZlciB3YXMgZmlsbGVkLCB3ZSdyZSBkb25lICovCgkgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwoJICBpby0+Y291bnQgPSBsZW47CgkgIGJyZWFrOwoJfQogICAgICB9CgogICAgICAvKiBpZiB3ZSdyZSBpbiByYXcgbW9kZSwgd2UganVzdCBuZWVkIHRvIGZpbGwgdGhlIGJ1ZmZlciAqLwogICAgICBpZiAoY29uLT5hdHRyICYgQVRUUl9SQVcpIHsKCXdoaWxlIChsZW48Y291bnQpIHsKCSAgV09SRCBkYXRhOwoKCSAgLyogZG8gd2UgaGF2ZSBhIHdhaXRpbmcgc2NhbmNvZGU/ICovCgkgIGlmICgqc2NhbikgewoJICAgIC8qIHllcywgc3RvcmUgc2NhbmNvZGUgaW4gYnVmZmVyICovCgkgICAgYnVmZmVyW2xlbisrXSA9ICpzY2FuOwoJICAgICpzY2FuID0gMDsKCSAgICBpZiAobGVuPT1jb3VudCkgYnJlYWs7CgkgIH0KCgkgIC8qIGNoZWNrIGZvciBuZXcga2V5Ym9hcmQgaW5wdXQgKi8KCSAgd2hpbGUgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCSAgICAvKiBubyBpbnB1dCBhdmFpbGFibGUgeWV0LCBzbyB3YWl0Li4uICovCgkgICAgRE9TVk1fV2FpdCggLTEsIDAgKTsKCSAgfQoJICAvKiByZWFkIGZyb20ga2V5Ym9hcmQgcXVldWUgKGNhbGwgaW50MTY/KSAqLwoJICBkYXRhID0gKChXT1JEKiliaW9zKVtDdXJPZnNdOwoJICBDdXJPZnMgKz0gMjsKCSAgaWYgKEN1ck9mcyA+PSBiaW9zLT5LYmRCdWZmZXJFbmQpIEN1ck9mcyA9IGJpb3MtPktiZEJ1ZmZlclN0YXJ0OwoJICBiaW9zLT5OZXh0S2JkQ2hhclB0ciA9IEN1ck9mczsKCSAgLyogaWYgaXQncyBhbiBleHRlbmRlZCBrZXksIHNhdmUgc2NhbmNvZGUgKi8KCSAgaWYgKExPQllURShkYXRhKSA9PSAwKSAqc2NhbiA9IEhJQllURShkYXRhKTsKCSAgLyogc3RvcmUgQVNDSUkgY2hhciBpbiBidWZmZXIgKi8KCSAgYnVmZmVyW2xlbisrXSA9IExPQllURShkYXRhKTsKCX0KICAgICAgfSBlbHNlIHsKCS8qIHdlJ3JlIG5vdCBpbiByYXcgbW9kZSwgc28gd2UgbmVlZCB0byBkbyBsaW5lIGlucHV0Li4uICovCgl3aGlsZSAoVFJVRSkgewoJICBXT1JEIGRhdGE7CgkgIC8qIGNoZWNrIGZvciBuZXcga2V5Ym9hcmQgaW5wdXQgKi8KCSAgd2hpbGUgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCSAgICAvKiBubyBpbnB1dCBhdmFpbGFibGUgeWV0LCBzbyB3YWl0Li4uICovCgkgICAgRE9TVk1fV2FpdCggLTEsIDAgKTsKCSAgfQoJICAvKiByZWFkIGZyb20ga2V5Ym9hcmQgcXVldWUgKGNhbGwgaW50MTY/KSAqLwoJICBkYXRhID0gKChXT1JEKiliaW9zKVtDdXJPZnNdOwoJICBDdXJPZnMgKz0gMjsKCSAgaWYgKEN1ck9mcyA+PSBiaW9zLT5LYmRCdWZmZXJFbmQpIEN1ck9mcyA9IGJpb3MtPktiZEJ1ZmZlclN0YXJ0OwoJICBiaW9zLT5OZXh0S2JkQ2hhclB0ciA9IEN1ck9mczsKCgkgIGlmIChMT0JZVEUoZGF0YSkgPT0gJ1xyJykgewoJICAgIC8qIGl0J3MgdGhlIHJldHVybiBrZXksIHdlJ3JlIGRvbmUgKi8KCSAgICBsaW5lYnVmZmVyW2xlbisrXSA9IExPQllURShkYXRhKTsKCSAgICBicmVhazsKCSAgfQoJICBlbHNlIGlmIChMT0JZVEUoZGF0YSkgPj0gJyAnKSB7CgkgICAgLyogYSBjaGFyYWN0ZXIgKi8KCSAgICBpZiAoKGxlbisxKTxDT05fQlVGRkVSKSB7CgkgICAgICBsaW5lYnVmZmVyW2xlbl0gPSBMT0JZVEUoZGF0YSk7CgkgICAgICBXcml0ZUZpbGUobHBEb3NUYXNrLT5oQ29uT3V0cHV0LCAmbGluZWJ1ZmZlcltsZW4rK10sIDEsIE5VTEwsIE5VTEwpOwoJICAgIH0KCSAgICAvKiBlbHNlIGJlZXAsIGJ1dCBJIGRvbid0IGxpa2Ugbm9pc2UgKi8KCSAgfQoJICBlbHNlIHN3aXRjaCAoTE9CWVRFKGRhdGEpKSB7CgkgIGNhc2UgJ1xiJzoKCSAgICBpZiAobGVuPjApIHsKCSAgICAgIGxlbi0tOwoJICAgICAgV3JpdGVGaWxlKGxwRG9zVGFzay0+aENvbk91dHB1dCwgIlxiIFxiIiwgMywgTlVMTCwgTlVMTCk7CgkgICAgfQoJICAgIGJyZWFrOwoJICB9Cgl9CglpZiAobGVuID4gY291bnQpIHsKCSAgLyogc2F2ZSByZXN0IG9mIGxpbmUgZm9yIGxhdGVyICovCgkgIGxvbC0+b2Zmc191bnJlYWRfQ09OID0gbGluZWJ1ZmZlciAtIChCWVRFKilsb2wgKyBjb3VudDsKCSAgbGVuID0gY291bnQ7Cgl9CgltZW1jcHkoYnVmZmVyLCBsaW5lYnVmZmVyLCBsZW4pOwogICAgICB9CiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogICAgICBpby0+Y291bnQgPSBsZW47CiAgICB9CiAgICBicmVhazsKICBjYXNlIENNRF9TQUZFSU5QVVQ6CiAgICBpZiAoY3VyYnVmZmVyKSB7CiAgICAgIC8qIHNvbWUgbGluZSBpbnB1dCB3YWl0aW5nICovCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FOwogICAgICAoKFJFUV9TQUZFSU5QVVQqKWhkciktPmRhdGEgPSAqY3VyYnVmZmVyOwogICAgfQogICAgZWxzZSBpZiAoY29uLT5hdHRyICYgQVRUUl9SQVcpIHsKICAgICAgaWYgKEN1ck9mcyA9PSBiaW9zLT5GaXJzdEtiZENoYXJQdHIpIHsKCS8qIG5vIGlucHV0ICovCgloZHItPnN0YXR1cyA9IFNUQVRfRE9ORXxTVEFUX0JVU1k7CiAgICAgIH0gZWxzZSB7CgkvKiBzb21lIGtleWJvYXJkIGlucHV0IHdhaXRpbmcgKi8KCWhkci0+c3RhdHVzID0gU1RBVF9ET05FOwoJKChSRVFfU0FGRUlOUFVUKiloZHIpLT5kYXRhID0gKChCWVRFKiliaW9zKVtDdXJPZnNdOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvKiBubyBsaW5lIGlucHV0ICovCiAgICAgIGhkci0+c3RhdHVzID0gU1RBVF9ET05FfFNUQVRfQlVTWTsKICAgIH0KICAgIGJyZWFrOwogIGNhc2UgQ01EX0lOU1RBVFVTOgogICAgaWYgKGN1cmJ1ZmZlcikgewogICAgICAvKiB3ZSBoYXZlIGRhdGEgKi8KICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICB9CiAgICBlbHNlIGlmIChjb24tPmF0dHIgJiBBVFRSX1JBVykgewogICAgICBpZiAoQ3VyT2ZzID09IGJpb3MtPkZpcnN0S2JkQ2hhclB0cikgewoJLyogbm8gaW5wdXQgKi8KCWhkci0+c3RhdHVzID0gU1RBVF9ET05FfFNUQVRfQlVTWTsKICAgICAgfSBlbHNlIHsKCS8qIHNvbWUga2V5Ym9hcmQgaW5wdXQgd2FpdGluZyAqLwoJaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIC8qIG5vIGxpbmUgaW5wdXQgKi8KICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkV8U1RBVF9CVVNZOwogICAgfQoKICAgIGJyZWFrOwogIGNhc2UgQ01EX0lORkxVU0g6CiAgICAvKiBmbHVzaCBsaW5lIGFuZCBrZXlib2FyZCBxdWV1ZSAqLwogICAgbG9sLT5vZmZzX3VucmVhZF9DT04gPSAwOwogICAgYmlvcy0+TmV4dEtiZENoYXJQdHIgPSBiaW9zLT5GaXJzdEtiZENoYXJQdHI7CiAgICBicmVhazsKICBjYXNlIENNRF9PVVRQVVQ6CiAgY2FzZSBDTURfU0FGRU9VVFBVVDoKICAgIHsKICAgICAgUkVRX0lPICppbyA9IChSRVFfSU8gKiloZHI7CiAgICAgIEJZVEUgKmJ1ZmZlciA9IENUWF9TRUdfT0ZGX1RPX0xJTihjdHgsCgkJCQkJU0VMRUNUT1JPRihpby0+YnVmZmVyKSwKCQkJCQkoRFdPUkQpT0ZGU0VUT0YoaW8tPmJ1ZmZlcikpOwogICAgICBEV09SRCByZXN1bHQgPSAwOwogICAgICBXcml0ZUZpbGUobHBEb3NUYXNrLT5oQ29uT3V0cHV0LCBidWZmZXIsIGlvLT5jb3VudCwgJnJlc3VsdCwgTlVMTCk7CiAgICAgIGlvLT5jb3VudCA9IHJlc3VsdDsKICAgICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgICB9CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgaGRyLT5zdGF0dXMgPSBTVEFUX0RPTkU7CiAgfQogIGRvX2xyZXQoY3R4KTsKfQoKc3RhdGljIHZvaWQgSW5pdExpc3RPZkxpc3RzKERPU19MSVNUT0ZMSVNUUyAqRE9TX0xPTCkKewovKgpPdXRwdXQgb2YgRE9TIDYuMjI6CgowMTMzOjAwMjAgICAgICAgICAgICAgICAgICAgIDZBIDEzLTMzIDAxIENDIDAwIDMzIDAxIDU5IDAwICAgICAgICAgai4zLi4uMy5ZLgowMTMzOjAwMzAgIDcwIDAwIDAwIDAwIDcyIDAyIDAwIDAyLTZEIDAwIDMzIDAxIDAwIDAwIDJFIDA1ICAgcC4uLnIuLi5tLjMuLi4uLgowMTMzOjAwNDAgIDAwIDAwIEZDIDA0IDAwIDAwIDAzIDA4LTkyIDIxIDExIEUwIDA0IDgwIEM2IDBEICAgLi4uLi4uLi4uIS4uLi4uLgowMTMzOjAwNTAgIENDIDBEIDRFIDU1IDRDIDIwIDIwIDIwLTIwIDIwIDAwIDAwIDAwIDAwIDAwIDAwICAgLi5OVUwgICAgIC4uLi4uLgowMTMzOjAwNjAgIDAwIDRCIEJBIEMxIDA2IDE0IDAwIDAwLTAwIDAzIDAxIDAwIDA0IDcwIENFIEZGICAgLksuLi4uLi4uLi4uLnAuLgowMTMzOjAwNzAgIEZGIDAwIDAwIDAwIDAwIDAwIDAwIDAwLTAwIDAxIDAwIDAwIDBEIDA1IDAwIDAwICAgLi4uLi4uLi4uLi4uLi4uLgowMTMzOjAwODAgIDAwIEZGIEZGIDAwIDAwIDAwIDAwIEZFLTAwIDAwIEY4IDAzIEZGIDlGIDcwIDAyICAgLi4uLi4uLi4uLi4uLi5wLgowMTMzOjAwOTAgIEQwIDQ0IEM4IEZEIEQ0IDQ0IEM4IEZELUQ0IDQ0IEM4IEZEIEQwIDQ0IEM4IEZEICAgLkQuLi5ELi4uRC4uLkQuLgowMTMzOjAwQTAgIEQwIDQ0IEM4IEZEIEQwIDQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkQuLi5ECiovCiAgRE9TX0xPTC0+Q1hfSW50MjFfNWUwMQkJPSAweDA7CiAgRE9TX0xPTC0+TFJVX2NvdW50X0ZDQl9jYWNoZQk9IDB4MDsKICBET1NfTE9MLT5MUlVfY291bnRfRkNCX29wZW4JCT0gMHgwOwogIERPU19MT0wtPk9FTV9mdW5jX2hhbmRsZXIJCT0gLTE7IC8qIG5vdCBhdmFpbGFibGUgKi8KICBET1NfTE9MLT5JTlQyMV9vZmZzZXQJCT0gMHgwOwogIERPU19MT0wtPnNoYXJpbmdfcmV0cnlfY291bnQJPSAzOwogIERPU19MT0wtPnNoYXJpbmdfcmV0cnlfZGVsYXkJPSAxOwogIERPU19MT0wtPnB0cl9kaXNrX2J1ZgkJPSAweDA7CiAgRE9TX0xPTC0+b2Zmc191bnJlYWRfQ09OCQk9IDB4MDsKICBET1NfTE9MLT5zZWdfZmlyc3RfTUNCCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfZmlyc3RfRFBCCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfZmlyc3RfU3lzRmlsZVRhYmxlCT0gMHgwOwogIERPU19MT0wtPnB0cl9jbG9ja19kZXZfaGRyCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfQ09OX2Rldl9oZHIJCT0gMHgwOwogIERPU19MT0wtPm1heF9ieXRlX3Blcl9zZWMJCT0gNTEyOwogIERPU19MT0wtPnB0cl9kaXNrX2J1Zl9pbmZvCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfYXJyYXlfQ0RTCQk9IDB4MDsKICBET1NfTE9MLT5wdHJfc3lzX0ZDQgkJPSAweDA7CiAgRE9TX0xPTC0+bnJfcHJvdGVjdF9GQ0IJCT0gMHgwOwogIERPU19MT0wtPm5yX2Jsb2NrX2RldgkJPSAweDA7CiAgRE9TX0xPTC0+bnJfYXZhaWxfZHJpdmVfbGV0dGVycwk9IDI2OyAvKiBBIC0gWiAqLwogIERPU19MT0wtPm5yX2RyaXZlc19KT0lOZWQJCT0gMHgwOwogIERPU19MT0wtPnB0cl9zcGVjX3ByZ19uYW1lcwkJPSAweDA7CiAgRE9TX0xPTC0+cHRyX1NFVFZFUl9wcmdfbGlzdAk9IDB4MDsgLyogbm8gU0VUVkVSIGxpc3QgKi8KICBET1NfTE9MLT5ET1NfSElHSF9BMjBfZnVuY19vZmZzCT0gMHgwOwogIERPU19MT0wtPlBTUF9sYXN0X2V4ZWMJCT0gMHgwOwogIERPU19MT0wtPkJVRkZFUlNfdmFsCQk9IDk5OyAvKiBtYXhpbXVtOiA5OSAqLwogIERPU19MT0wtPkJVRkZFUlNfbnJfbG9va2FoZWFkCT0gODsgLyogbWF4aW11bTogOCAqLwogIERPU19MT0wtPmJvb3RfZHJpdmUJCQk9IDM7IC8qIEM6ICovCiAgRE9TX0xPTC0+ZmxhZ19EV09SRF9tb3ZlcwkJPSAweDAxOyAvKiBpMzg2KyAqLwogIERPU19MT0wtPnNpemVfZXh0ZW5kZWRfbWVtCQk9IDB4ZjAwMDsgLyogdmVyeSBoaWdoIHZhbHVlICovCn0KCnZvaWQgRE9TREVWX0luc3RhbGxET1NEZXZpY2VzKHZvaWQpCnsKICBET1NfREFUQVNFRyAqZGF0YXNlZzsKICBVSU5UMTYgc2VnOwogIGludCBuOwoKICAvKiBhbGxvY2F0ZSBET1MgZGF0YSBzZWdtZW50IG9yIHNvbWV0aGluZyAqLwogIERPU19MT0xTZWcgPSBHbG9iYWxET1NBbGxvYzE2KHNpemVvZihET1NfREFUQVNFRykpOwogIHNlZyA9IEhJV09SRChET1NfTE9MU2VnKTsKICBkYXRhc2VnID0gUFRSX1NFR19PRkZfVE9fTElOKExPV09SRChET1NfTE9MU2VnKSwgMCk7CgogIC8qIGluaXRpYWxpemUgdGhlIG1hZ25pZmljZW50IExpc3QgT2YgTGlzdHMgKi8KICBJbml0TGlzdE9mTGlzdHMoJmRhdGFzZWctPmxvbCk7CgogIC8qIFNldCB1cCBmaXJzdCBkZXZpY2UgKE5VTCkgKi8KICBkYXRhc2VnLT5sb2wuTlVMX2Rldi5uZXh0X2RldiAgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoc2VnLCBET1NfREFUQVNFR19PRkYoZGV2WzBdKSk7CiAgZGF0YXNlZy0+bG9sLk5VTF9kZXYuYXR0ciAgICAgID0gZGV2c1swXS5hdHRyOwogIGRhdGFzZWctPmxvbC5OVUxfZGV2LnN0cmF0ZWd5ICA9IERPU19EQVRBU0VHX09GRih0aHVua1swXS5sam1wMSk7CiAgZGF0YXNlZy0+bG9sLk5VTF9kZXYuaW50ZXJydXB0ID0gRE9TX0RBVEFTRUdfT0ZGKHRodW5rWzBdLmxqbXAyKTsKICBtZW1jcHkoZGF0YXNlZy0+bG9sLk5VTF9kZXYubmFtZSwgZGV2c1swXS5uYW1lLCA4KTsKCiAgLyogU2V0IHVwIHRoZSByZW1haW5pbmcgZGV2aWNlcyAqLwogIGZvciAobiA9IDE7IG4gPCBOUl9ERVZTOyBuKyspCiAgewogICAgZGF0YXNlZy0+ZGV2W24tMV0ubmV4dF9kZXYgID0gKG4rMSkgPT0gTlJfREVWUyA/IE5PTkVYVCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoc2VnLCBET1NfREFUQVNFR19PRkYoZGV2W25dKSk7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5hdHRyICAgICAgPSBkZXZzW25dLmF0dHI7CiAgICBkYXRhc2VnLT5kZXZbbi0xXS5zdHJhdGVneSAgPSBET1NfREFUQVNFR19PRkYodGh1bmtbbl0ubGptcDEpOwogICAgZGF0YXNlZy0+ZGV2W24tMV0uaW50ZXJydXB0ID0gRE9TX0RBVEFTRUdfT0ZGKHRodW5rW25dLmxqbXAyKTsKICAgIG1lbWNweShkYXRhc2VnLT5kZXZbbi0xXS5uYW1lLCBkZXZzW25dLm5hbWUsIDgpOwogIH0KCiAgLyogU2V0IHVwIHRodW5rcyAqLwogIGZvciAobiA9IDA7IG4gPCBOUl9ERVZTOyBuKyspCiAgewogICAgZGF0YXNlZy0+dGh1bmtbbl0ubGptcDEgICAgID0gTEpNUDsKICAgIGRhdGFzZWctPnRodW5rW25dLnN0cmF0ZWd5ICA9IChSTUNCUFJPQylEUE1JX0FsbG9jSW50ZXJuYWxSTUNCKGRldnNbbl0uc3RyYXRlZ3kpOwogICAgZGF0YXNlZy0+dGh1bmtbbl0ubGptcDIgICAgID0gTEpNUDsKICAgIGRhdGFzZWctPnRodW5rW25dLmludGVycnVwdCA9IChSTUNCUFJPQylEUE1JX0FsbG9jSW50ZXJuYWxSTUNCKGRldnNbbl0uaW50ZXJydXB0KTsKICB9CgogIC8qIENPTiBpcyBkZXZpY2UgMSAqLwogIGRhdGFzZWctPmxvbC5wdHJfQ09OX2Rldl9oZHIgPSBQVFJfU0VHX09GRl9UT19TRUdQVFIoc2VnLCBET1NfREFUQVNFR19PRkYoZGV2WzBdKSk7Cn0KCkRXT1JEIERPU0RFVl9Db25zb2xlKHZvaWQpCnsKICByZXR1cm4gRE9TTUVNX0xPTCgpLT5wdHJfQ09OX2Rldl9oZHI7Cn0KCkRXT1JEIERPU0RFVl9GaW5kQ2hhckRldmljZShjaGFyKm5hbWUpCnsKICBTRUdQVFIgY3VyX3B0ciA9IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihISVdPUkQoRE9TX0xPTFNlZyksCgkJCQkJIEZJRUxEX09GRlNFVChET1NfTElTVE9GTElTVFMsTlVMX2RldikpOwogIERPU19ERVZJQ0VfSEVBREVSICpjdXIgPSBET1NNRU1fTWFwUmVhbFRvTGluZWFyKGN1cl9wdHIpOwogIGNoYXIgZG5hbWVbOF07CiAgaW50IGNudDsKCiAgLyogZ2V0IGZpcnN0IDggY2hhcmFjdGVycyAqLwogIHN0cm5jcHkoZG5hbWUsbmFtZSw4KTsKICAvKiBpZiBsZXNzIHRoYW4gOCBjaGFyYWN0ZXJzLCBwYWQgd2l0aCBzcGFjZXMgKi8KICBmb3IgKGNudD0wOyBjbnQ8ODsgY250KyspCiAgICBpZiAoIWRuYW1lW2NudF0pIGRuYW1lW2NudF09JyAnOwoKICAvKiBzZWFyY2ggZm9yIGNoYXIgZGV2aWNlcyB3aXRoIHRoZSByaWdodCBuYW1lICovCiAgd2hpbGUgKGN1ciAmJgoJICgoIShjdXItPmF0dHIgJiBBVFRSX0NIQVIpKSB8fAoJICBtZW1jbXAoY3VyLT5uYW1lLGRuYW1lLDgpKSkgewogICAgY3VyX3B0ciA9IGN1ci0+bmV4dF9kZXY7CiAgICBpZiAoY3VyX3B0ciA9PSBOT05FWFQpIGN1cj1OVUxMOwogICAgZWxzZSBjdXIgPSBET1NNRU1fTWFwUmVhbFRvTGluZWFyKGN1cl9wdHIpOwogIH0KICByZXR1cm4gY3VyX3B0cjsKfQoKc3RhdGljIHZvaWQgRE9TREVWX0RvUmVxKHZvaWQqcmVxLCBEV09SRCBkZXYpCnsKICBSRVFVRVNUX0hFQURFUiAqaGRyID0gKFJFUVVFU1RfSEVBREVSICopcmVxOwogIERPU19ERVZJQ0VfSEVBREVSICpkaGRyOwogIENPTlRFWFQ4NiBjdHg7CiAgY2hhciAqcGhkcjsKCiAgZGhkciA9IERPU01FTV9NYXBSZWFsVG9MaW5lYXIoZGV2KTsKICBwaGRyID0gKChjaGFyKilET1NNRU1fTE9MKCkpICsgRE9TX0RBVEFTRUdfT0ZGKHJlcSk7CgogIC8qIGNvcHkgcmVxdWVzdCB0byByZXF1ZXN0IHNjcmF0Y2ggYXJlYSAqLwogIG1lbWNweShwaGRyLCByZXEsIGhkci0+c2l6ZSk7CgogIC8qIHByZXBhcmUgdG8gY2FsbCBkZXZpY2UgZHJpdmVyICovCiAgbWVtc2V0KCZjdHgsIDAsIHNpemVvZihjdHgpKTsKCiAgLyogRVM6QlggcG9pbnRzIHRvIHJlcXVlc3QgZm9yIHN0cmF0ZWd5IHJvdXRpbmUgKi8KICBFU19yZWcoJmN0eCkgID0gSElXT1JEKERPU19MT0xTZWcpOwogIEVCWF9yZWcoJmN0eCkgPSBET1NfREFUQVNFR19PRkYocmVxKTsKCiAgLyogY2FsbCBzdHJhdGVneSByb3V0aW5lICovCiAgQ1NfcmVnKCZjdHgpID0gU0VMRUNUT1JPRihkZXYpOwogIEVJUF9yZWcoJmN0eCkgPSBkaGRyLT5zdHJhdGVneTsKICBEUE1JX0NhbGxSTVByb2MoJmN0eCwgMCwgMCwgMCk7CgogIC8qIGNhbGwgaW50ZXJydXB0IHJvdXRpbmUgKi8KICBDU19yZWcoJmN0eCkgPSBTRUxFQ1RPUk9GKGRldik7CiAgRUlQX3JlZygmY3R4KSA9IGRoZHItPmludGVycnVwdDsKICBEUE1JX0NhbGxSTVByb2MoJmN0eCwgMCwgMCwgMCk7CgogIC8qIGNvbXBsZXRlZCwgY29weSByZXF1ZXN0IGJhY2sgKi8KICBtZW1jcHkocmVxLCBwaGRyLCBoZHItPnNpemUpOwoKICBpZiAoaGRyLT5zdGF0dXMgJiBTVEFUX0VSUk9SKSB7CiAgICBzd2l0Y2ggKGhkci0+c3RhdHVzICYgU1RBVF9NQVNLKSB7CiAgICBjYXNlIDB4MEY6IC8qIGludmFsaWQgZGlzayBjaGFuZ2UgKi8KICAgICAgLyogdGhpcyBlcnJvciBzZWVtcyB0byBmaXQgdGhlIGJpbGwgKi8KICAgICAgU2V0TGFzdEVycm9yKEVSX05vdFNhbWVEZXZpY2UpOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIFNldExhc3RFcnJvcigoaGRyLT5zdGF0dXMgJiBTVEFUX01BU0spICsgMHgxMyk7CiAgICAgIGJyZWFrOwogICAgfQogIH0KfQoKc3RhdGljIGludCBET1NERVZfSU8odW5zaWduZWQgY21kLCBEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1ZmxlbikKewogIFJFUV9JTyByZXE7CgogIHJlcS5oZHIuc2l6ZT1zaXplb2YocmVxKTsKICByZXEuaGRyLnVuaXQ9MDsgLyogbm90IGRlYWxpbmcgd2l0aCBibG9jayBkZXZpY2VzIHlldCAqLwogIHJlcS5oZHIuY29tbWFuZD1jbWQ7CiAgcmVxLmhkci5zdGF0dXM9U1RBVF9CVVNZOwogIHJlcS5tZWRpYT0wOyAvKiBub3QgZGVhbGluZyB3aXRoIGJsb2NrIGRldmljZXMgeWV0ICovCiAgcmVxLmJ1ZmZlcj1idWY7CiAgcmVxLmNvdW50PWJ1ZmxlbjsKICByZXEuc2VjdG9yPTA7IC8qIGJsb2NrIGRldmljZXMgKi8KICByZXEudm9sdW1lPTA7IC8qIGJsb2NrIGRldmljZXMgKi8KCiAgRE9TREVWX0RvUmVxKCZyZXEsIGRldik7CgogIHJldHVybiByZXEuY291bnQ7Cn0KCmludCBET1NERVZfUGVlayhEV09SRCBkZXYsIEJZVEUqZGF0YSkKewogIFJFUV9TQUZFSU5QVVQgcmVxOwoKICByZXEuaGRyLnNpemU9c2l6ZW9mKHJlcSk7CiAgcmVxLmhkci51bml0PTA7IC8qIG5vdCBkZWFsaW5nIHdpdGggYmxvY2sgZGV2aWNlcyB5ZXQgKi8KICByZXEuaGRyLmNvbW1hbmQ9Q01EX1NBRkVJTlBVVDsKICByZXEuaGRyLnN0YXR1cz1TVEFUX0JVU1k7CiAgcmVxLmRhdGE9MDsKCiAgRE9TREVWX0RvUmVxKCZyZXEsIGRldik7CgogIGlmIChyZXEuaGRyLnN0YXR1cyAmIFNUQVRfQlVTWSkgcmV0dXJuIDA7CgogICpkYXRhID0gcmVxLmRhdGE7CiAgcmV0dXJuIDE7Cn0KCmludCBET1NERVZfUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1ZmxlbikKewogIHJldHVybiBET1NERVZfSU8oQ01EX0lOUFVULCBkZXYsIGJ1ZiwgYnVmbGVuKTsKfQoKaW50IERPU0RFVl9Xcml0ZShEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1ZmxlbiwgaW50IHZlcmlmeSkKewogIHJldHVybiBET1NERVZfSU8odmVyaWZ5P0NNRF9TQUZFT1VUUFVUOkNNRF9PVVRQVVQsIGRldiwgYnVmLCBidWZsZW4pOwp9CgppbnQgRE9TREVWX0lvY3RsUmVhZChEV09SRCBkZXYsIERXT1JEIGJ1ZiwgaW50IGJ1ZmxlbikKewogIHJldHVybiBET1NERVZfSU8oQ01EX0lOSU9DVEwsIGRldiwgYnVmLCBidWZsZW4pOwp9CgppbnQgRE9TREVWX0lvY3RsV3JpdGUoRFdPUkQgZGV2LCBEV09SRCBidWYsIGludCBidWZsZW4pCnsKICByZXR1cm4gRE9TREVWX0lPKENNRF9PVVRJT0NUTCwgZGV2LCBidWYsIGJ1Zmxlbik7Cn0K