LyoKICogIEhvc3QgUmVzb3VyY2VzIE1JQiAtIERldmljZSBncm91cCBpbXBsZW1lbnRhdGlvbiAtIGhyX2RldmljZS5jCiAqCiAqLwovKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb3B5cmlnaHQocykuICBTZWUKICogdGhlIE5ldC1TTk1QJ3MgQ09QWUlORyBmaWxlIGZvciBtb3JlIGRldGFpbHMgYW5kIG90aGVyIGNvcHlyaWdodHMKICogdGhhdCBtYXkgYXBwbHk6CiAqLwovKgogKiBQb3J0aW9ucyBvZiB0aGlzIGZpbGUgYXJlIGNvcHlyaWdodGVkIGJ5OgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1jb25maWcuaD4KI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpbmNsdWRlICJob3N0X3Jlcy5oIgojaW5jbHVkZSAiaHJfZGV2aWNlLmgiCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgS2VybmVsICYgaW50ZXJmYWNlIGluZm9ybWF0aW9uLAoJICogICBhbmQgaW50ZXJuYWwgZm9yd2FyZCBkZWNsYXJhdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKaW50ICAgICAgICAgICAgIEdldF9OZXh0X0RldmljZSh2b2lkKTsKClBGViAgICAgICAgICAgICBpbml0X2RldmljZVtIUkRFVl9UWVBFX01BWF07ClBGSVYgICAgICAgICAgICBuZXh0X2RldmljZVtIUkRFVl9UWVBFX01BWF07ClBGViAgICAgICAgICAgICBzYXZlX2RldmljZVtIUkRFVl9UWVBFX01BWF07CmludCAgICAgICAgICAgICBkZXZfaWR4X2luY1tIUkRFVl9UWVBFX01BWF07CgpQRlMgICAgICAgICAgICAgZGV2aWNlX2Rlc2NyW0hSREVWX1RZUEVfTUFYXTsKUEZPICAgICAgICAgICAgIGRldmljZV9wcm9kaWRbSFJERVZfVFlQRV9NQVhdOwpQRkkgICAgICAgICAgICAgZGV2aWNlX3N0YXR1c1tIUkRFVl9UWVBFX01BWF07ClBGSSAgICAgICAgICAgICBkZXZpY2VfZXJyb3JzW0hSREVWX1RZUEVfTUFYXTsKCmludCAgICAgICAgICAgICBjdXJyZW50X3R5cGU7Cgp2b2lkICAgICAgICAgICAgSW5pdF9EZXZpY2Uodm9pZCk7CmludCAgICAgICAgICAgICBoZWFkZXJfaHJkZXZpY2Uoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKik7CgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEluaXRpYWxpc2F0aW9uICYgY29tbW9uIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lCUhSREVWX0lOREVYCQkxCiNkZWZpbmUJSFJERVZfVFlQRQkJMgojZGVmaW5lCUhSREVWX0RFU0NSCQkzCiNkZWZpbmUJSFJERVZfSUQJCTQKI2RlZmluZQlIUkRFVl9TVEFUVVMJCTUKI2RlZmluZQlIUkRFVl9FUlJPUlMJCTYKCnN0cnVjdCB2YXJpYWJsZTQgaHJkZXZpY2VfdmFyaWFibGVzW10gPSB7CiAgICB7SFJERVZfSU5ERVgsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJkZXZpY2UsIDIsIHsxLCAxfX0sCiAgICB7SFJERVZfVFlQRSwgQVNOX09CSkVDVF9JRCwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyZGV2aWNlLCAyLCB7MSwgMn19LAogICAge0hSREVWX0RFU0NSLCBBU05fT0NURVRfU1RSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJkZXZpY2UsIDIsIHsxLCAzfX0sCiAgICB7SFJERVZfSUQsIEFTTl9PQkpFQ1RfSUQsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9ocmRldmljZSwgMiwgezEsIDR9fSwKICAgIHtIUkRFVl9TVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaHJkZXZpY2UsIDIsIHsxLCA1fX0sCiAgICB7SFJERVZfRVJST1JTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2hyZGV2aWNlLCAyLCB7MSwgNn19Cn07Cm9pZCAgICAgICAgICAgICBocmRldmljZV92YXJpYWJsZXNfb2lkW10gPSB7IDEsIDMsIDYsIDEsIDIsIDEsIDI1LCAzLCAyIH07CgoKdm9pZAppbml0X2hyX2RldmljZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKCiAgICAvKgogICAgICogSW5pdGlhbGx5IGFzc3VtZSBubyBkZXZpY2VzCiAgICAgKiAgICBJbnNlcnQgcG9pbnRlcnMgdG8gaW5pdGlhbGlzYXRpb24vZ2V0X25leHQgcm91dGluZXMKICAgICAqICAgIGZvciBwYXJ0aWN1bGFyIGRldmljZSB0eXBlcyBhcyB0aGV5IGFyZSBpbXBsZW1lbnRlZAogICAgICogICAgICAoc2V0IHVwIGluIHRoZSBhcHByb3ByaWF0ZSAnaW5pdF8qKCknIHJvdXRpbmUgKQogICAgICovCgogICAgZm9yIChpID0gMDsgaSA8IEhSREVWX1RZUEVfTUFYOyArK2kpIHsKICAgICAgICBpbml0X2RldmljZVtpXSA9IE5VTEw7CiAgICAgICAgbmV4dF9kZXZpY2VbaV0gPSBOVUxMOwogICAgICAgIHNhdmVfZGV2aWNlW2ldID0gTlVMTDsKICAgICAgICBkZXZfaWR4X2luY1tpXSA9IDA7ICAgICAvKiBBc3N1bWUgcmFuZG9tIGluZGljZXMgKi8KCiAgICAgICAgZGV2aWNlX2Rlc2NyW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2VfcHJvZGlkW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2Vfc3RhdHVzW2ldID0gTlVMTDsKICAgICAgICBkZXZpY2VfZXJyb3JzW2ldID0gTlVMTDsKICAgIH0KCiAgICBSRUdJU1RFUl9NSUIoImhvc3QvaHJfZGV2aWNlIiwgaHJkZXZpY2VfdmFyaWFibGVzLCB2YXJpYWJsZTQsCiAgICAgICAgICAgICAgICAgaHJkZXZpY2VfdmFyaWFibGVzX29pZCk7Cn0KCgovKgogKiBoZWFkZXJfaHJkZXZpY2UoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwoKaW50CmhlYWRlcl9ocmRldmljZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiNkZWZpbmUgSFJERVZfRU5UUllfTkFNRV9MRU5HVEgJMTEKICAgIG9pZCAgICAgICAgICAgICBuZXduYW1lW01BWF9PSURfTEVOXTsKICAgIGludCAgICAgICAgICAgICBkZXZfaWR4LCBMb3dJbmRleCA9IC0xLCBMb3dUeXBlID0gLTE7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0OwoKICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX2RldmljZSIsICJ2YXJfaHJkZXZpY2U6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgiaG9zdC9ocl9kZXZpY2UiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoImhvc3QvaHJfZGV2aWNlIiwgIiAlZFxuIiwgZXhhY3QpKTsKCiAgICBtZW1jcHkoKGNoYXIgKikgbmV3bmFtZSwgKGNoYXIgKikgdnAtPm5hbWUsCiAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKiBzaXplb2Yob2lkKSk7CgoKICAgIC8qCiAgICAgKiAgRmluZCB0aGUgIm5leHQiIGRldmljZSBlbnRyeS4KICAgICAqICBJZiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSB0YWJsZSwgdGhlbiB0aGVyZSdzCiAgICAgKiAgICAgbm8gcG9pbnQgaW4gZXhhbWluaW5nIGVhcmxpZXIgdHlwZXMgb2YgZGV2aWNlcywKICAgICAqICAgICBzbyBzZXQgdGhlIHN0YXJ0aW5nIHR5cGUgdG8gdGhhdCBvZiB0aGUgdmFyaWFibGUKICAgICAqICAgICBiZWluZyBxdWVyaWVkLgogICAgICogIElmIHdlJ3ZlIG1vdmVkIGZyb20gb25lIGNvbHVtbiBvZiB0aGUgdGFibGUgdG8gYW5vdGhlciwKICAgICAqICAgICB0aGVuIHdlIG5lZWQgdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZyBhZ2Fpbi4KICAgICAqICAgICAoaS5lLiB0aGUgJ2NvbXBhcmUnIGZhaWxzIHRvIG1hdGNoKQogICAgICogIFNpbWlsYXJseSBpZiB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlCiAgICAgKiAgICAgKGkuZS4gKmxlbmd0aCBpcyB0b28gc2hvcnQgdG8gYmUgYSBmdWxsIGluc3RhbmNlKQogICAgICovCgogICAgaWYgKChzbm1wX29pZF9jb21wYXJlKHZwLT5uYW1lLCB2cC0+bmFtZWxlbiwgbmFtZSwgdnAtPm5hbWVsZW4pID09IDApCiAgICAgICAgJiYgKCpsZW5ndGggPiBIUkRFVl9FTlRSWV9OQU1FX0xFTkdUSCkpCiAgICAgICAgY3VycmVudF90eXBlID0gKG5hbWVbSFJERVZfRU5UUllfTkFNRV9MRU5HVEhdID4+IEhSREVWX1RZUEVfU0hJRlQpOwogICAgZWxzZQogICAgICAgIGN1cnJlbnRfdHlwZSA9IDA7CgogICAgSW5pdF9EZXZpY2UoKTsKICAgIGZvciAoOzspIHsKICAgICAgICBkZXZfaWR4ID0gR2V0X05leHRfRGV2aWNlKCk7CiAgICAgICAgREVCVUdNU0coKCJob3N0L2hyX2RldmljZSIsICIoaW5kZXggJWQgLi4uLiIsIGRldl9pZHgpKTsKICAgICAgICBpZiAoZGV2X2lkeCA9PSAtMSkKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaWYgKExvd1R5cGUgIT0gLTEgJiYgTG93VHlwZSA8IChkZXZfaWR4ID4+IEhSREVWX1RZUEVfU0hJRlQpKQogICAgICAgICAgICBicmVhazsKICAgICAgICBuZXduYW1lW0hSREVWX0VOVFJZX05BTUVfTEVOR1RIXSA9IGRldl9pZHg7CiAgICAgICAgREVCVUdNU0dPSUQoKCJob3N0L2hyX2RldmljZSIsIG5ld25hbWUsICpsZW5ndGgpKTsKICAgICAgICBERUJVR01TRygoImhvc3QvaHJfZGV2aWNlIiwgIlxuIikpOwogICAgICAgIHJlc3VsdCA9IHNubXBfb2lkX2NvbXBhcmUobmFtZSwgKmxlbmd0aCwgbmV3bmFtZSwgdnAtPm5hbWVsZW4gKyAxKTsKICAgICAgICBpZiAoZXhhY3QgJiYgKHJlc3VsdCA9PSAwKSkgewogICAgICAgICAgICBpZiAoc2F2ZV9kZXZpY2VbY3VycmVudF90eXBlXSAhPSBOVUxMKQogICAgICAgICAgICAgICAgKCpzYXZlX2RldmljZVtjdXJyZW50X3R5cGVdKSAoKTsKICAgICAgICAgICAgTG93SW5kZXggPSBkZXZfaWR4OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSAmJgogICAgICAgICAgICAoTG93SW5kZXggPT0gLTEgfHwgZGV2X2lkeCA8IExvd0luZGV4KSkgewogICAgICAgICAgICBpZiAoc2F2ZV9kZXZpY2VbY3VycmVudF90eXBlXSAhPSBOVUxMKQogICAgICAgICAgICAgICAgKCpzYXZlX2RldmljZVtjdXJyZW50X3R5cGVdKSAoKTsKICAgICAgICAgICAgTG93SW5kZXggPSBkZXZfaWR4OwogICAgICAgICAgICBMb3dUeXBlID0gKGRldl9pZHggPj4gSFJERVZfVFlQRV9TSElGVCk7CiAgICAgICAgICAgIGlmIChkZXZfaWR4X2luY1tMb3dUeXBlXSkgICAvKiBJbmNyZWFzaW5nIGluZGljZXMgPT4gbm93IGRvbmUgKi8KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICB9CgogICAgaWYgKExvd0luZGV4ID09IC0xKSB7CiAgICAgICAgREVCVUdNU0dUTCgoImhvc3QvaHJfZGV2aWNlIiwgIi4uLiBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpKTsKICAgICAgICByZXR1cm4gKE1BVENIX0ZBSUxFRCk7CiAgICB9CgogICAgbmV3bmFtZVtIUkRFVl9FTlRSWV9OQU1FX0xFTkdUSF0gPSBMb3dJbmRleDsKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAoV3JpdGVNZXRob2QqKTA7CiAgICAqdmFyX2xlbiA9IHNpemVvZihsb25nKTsgICAgLyogZGVmYXVsdCB0byAnbG9uZycgcmVzdWx0cyAqLwoKICAgIERFQlVHTVNHVEwoKCJob3N0L2hyX2RldmljZSIsICIuLi4gZ2V0IGRldmljZSBzdGF0cyAiKSk7CiAgICBERUJVR01TR09JRCgoImhvc3QvaHJfZGV2aWNlIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJob3N0L2hyX2RldmljZSIsICJcbiIpKTsKCiAgICByZXR1cm4gTG93SW5kZXg7Cn0KCgpvaWQgICAgICAgICAgICAgZGV2aWNlX3R5cGVfaWRbXSA9IHsgMSwgMywgNiwgMSwgMiwgMSwgMjUsIDMsIDEsIDk5IH07ICAvKiBockRldmljZVR5cGU5OSAqLwppbnQgICAgICAgICAgICAgZGV2aWNlX3R5cGVfbGVuID0KICAgIHNpemVvZihkZXZpY2VfdHlwZV9pZCkgLyBzaXplb2YoZGV2aWNlX3R5cGVfaWRbMF0pOwoKCiAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKgoJICoKCSAqICBTeXN0ZW0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgp1X2NoYXIgICAgICAgICAqCnZhcl9ocmRldmljZShzdHJ1Y3QgdmFyaWFibGUgKnZwLAogICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgZGV2X2lkeCwgdHlwZTsKICAgIG9pZCAgICAgICAgICAgICpvaWRfcDsKICAgIGNvbnN0IGNoYXIgICAgICp0bXBfc3RyOwogICAgc3RhdGljIGNoYXIgICAgIHN0cmluZ1sxMDI0XTsKCnJlYWxseV90cnlfbmV4dDoKICAgIGRldl9pZHggPQogICAgICAgIGhlYWRlcl9ocmRldmljZSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChkZXZfaWR4ID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICB0eXBlID0gKGRldl9pZHggPj4gSFJERVZfVFlQRV9TSElGVCk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgSFJERVZfSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBkZXZfaWR4OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIEhSREVWX1RZUEU6CiAgICAgICAgZGV2aWNlX3R5cGVfaWRbZGV2aWNlX3R5cGVfbGVuIC0gMV0gPSB0eXBlOwogICAgICAgICp2YXJfbGVuID0gc2l6ZW9mKGRldmljZV90eXBlX2lkKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBkZXZpY2VfdHlwZV9pZDsKICAgIGNhc2UgSFJERVZfREVTQ1I6CiAgICAgICAgaWYgKChkZXZpY2VfZGVzY3JbdHlwZV0gIT0gTlVMTCkgJiYKICAgICAgICAgICAgKE5VTEwhPSh0bXBfc3RyPSgoKmRldmljZV9kZXNjclt0eXBlXSkoZGV2X2lkeCkpKSkpIHsKICAgICAgICAgICAgc3RybGNweShzdHJpbmcsIHRtcF9zdHIsIHNpemVvZihzdHJpbmcpKTsKICAgICAgICB9IGVsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgICAgIGdvdG8gdHJ5X25leHQ7CiNlbHNlCiAgICAgICAgICAgIHNwcmludGYoc3RyaW5nLCAiYSBibGFjayBib3ggb2Ygc29tZSBzb3J0Iik7CiNlbmRpZgogICAgICAgICp2YXJfbGVuID0gc3RybGVuKHN0cmluZyk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgc3RyaW5nOwogICAgY2FzZSBIUkRFVl9JRDoKICAgICAgICBpZiAoZGV2aWNlX3Byb2RpZFt0eXBlXSAhPSBOVUxMKQogICAgICAgICAgICBvaWRfcCA9ICgoKmRldmljZV9wcm9kaWRbdHlwZV0pIChkZXZfaWR4LCB2YXJfbGVuKSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG9pZF9wID0gbnVsbE9pZDsKICAgICAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBvaWRfcDsKICAgIGNhc2UgSFJERVZfU1RBVFVTOgogICAgICAgIGlmIChkZXZpY2Vfc3RhdHVzW3R5cGVdICE9IE5VTEwpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKCgqZGV2aWNlX3N0YXR1c1t0eXBlXSkgKGRldl9pZHgpKTsKICAgICAgICBlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgICAgICBnb3RvIHRyeV9uZXh0OwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDI7ICAgIC8qIEFzc3VtZSBydW5uaW5nICovCiNlbmRpZgogICAgICAgIGlmICggIWxvbmdfcmV0dXJuICkKICAgICAgICAgICAgZ290byB0cnlfbmV4dDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBIUkRFVl9FUlJPUlM6CiAgICAgICAgaWYgKGRldmljZV9lcnJvcnNbdHlwZV0gIT0gTlVMTCkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAoKmRldmljZV9lcnJvcnNbdHlwZV0pIChkZXZfaWR4KTsKICAgICAgICBlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgICAgICBnb3RvIHRyeV9uZXh0OwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7ICAgIC8qIEFzc3VtZSBPSyAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2hyZGV2aWNlXG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQoKICB0cnlfbmV4dDoKICAgIGlmICghZXhhY3QpCiAgICAgICAgZ290byByZWFsbHlfdHJ5X25leHQ7CgogICAgcmV0dXJuIE5VTEw7Cn0KCgogICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioKCSAqCgkgKiAgSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZnVuY3Rpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCgp2b2lkCkluaXRfRGV2aWNlKHZvaWQpCnsKICAgIC8qCiAgICAgKiAgRmluZCB0aGUgZmlyc3Qgbm9uLU5VTEwgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24KICAgICAqICAgIGFuZCBjYWxsIGl0CiAgICAgKi8KICAgIHdoaWxlIChjdXJyZW50X3R5cGUgPCBIUkRFVl9UWVBFX01BWCAmJgogICAgICAgICAgIGluaXRfZGV2aWNlW2N1cnJlbnRfdHlwZV0gPT0gTlVMTCkKICAgICAgICBpZiAoKytjdXJyZW50X3R5cGUgPj0gSFJERVZfVFlQRV9NQVgpCiAgICAgICAgICAgIHJldHVybjsKICAgIC8qIENoZWNrIGN1cnJlbnRfdHlwZSwgaWYgPj0gTUFYIGZpcnN0IHRpbWUgaW50byBsb29wLCB3b3VsZCBmYWlsIGJlbG93ICovCiAgICBpZiAoY3VycmVudF90eXBlIDwgSFJERVZfVFlQRV9NQVgpCiAgICAgICAgKCppbml0X2RldmljZVtjdXJyZW50X3R5cGVdKSAoKTsKfQoKaW50CkdldF9OZXh0X0RldmljZSh2b2lkKQp7CiAgICBpbnQgICAgICAgICAgICAgcmVzdWx0ID0gLTE7CgogICAgLyoKICAgICAqICBDYWxsIHRoZSAnbmV4dCBkZXZpY2UnIGZ1bmN0aW9uIGZvciB0aGUgY3VycmVudAogICAgICogICAgdHlwZSBvZiBkZXZpY2UKICAgICAqCiAgICAgKiAgVE9ETzogIHNhdmUgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBhYm91dCB0aGF0IGRldmljZQogICAgICovCiAgICBpZiAoY3VycmVudF90eXBlIDwgSFJERVZfVFlQRV9NQVggJiYgbmV4dF9kZXZpY2VbY3VycmVudF90eXBlXSAhPSBOVUxMKQogICAgICAgIHJlc3VsdCA9ICgqbmV4dF9kZXZpY2VbY3VycmVudF90eXBlXSkgKCk7CgogICAgLyoKICAgICAqICBObyBtb3JlIGRldmljZXMgb2YgdGhlIGN1cnJlbnQgdHlwZS4KICAgICAqICBUcnkgdGhlIG5leHQgdHlwZSAoaWYgYW55KQogICAgICovCiAgICBpZiAocmVzdWx0ID09IC0xKSB7CiAgICAgICAgaWYgKCsrY3VycmVudF90eXBlID49IEhSREVWX1RZUEVfTUFYKSB7CiAgICAgICAgICAgIGN1cnJlbnRfdHlwZSA9IDA7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgSW5pdF9EZXZpY2UoKTsKICAgICAgICByZXR1cm4gR2V0X05leHRfRGV2aWNlKCk7CiAgICB9CiAgICByZXR1cm4gcmVzdWx0Owp9Cg==