ZGlmZiAtLWdpdCBhL2RsbHMvZDNkOS90ZXN0cy9kZXZpY2UuYyBiL2RsbHMvZDNkOS90ZXN0cy9kZXZpY2UuYwppbmRleCAzMTY0YjgxLi40MWRjYWZiIDEwMDY0NAotLS0gYS9kbGxzL2QzZDkvdGVzdHMvZGV2aWNlLmMKKysrIGIvZGxscy9kM2Q5L3Rlc3RzL2RldmljZS5jCkBAIC0zLDYgKzMsNyBAQAogICogQ29weXJpZ2h0IChDKSAyMDA2IENocmlzIFJvYmluc29uCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAwNyBTdGVmYW4gRPZzaW5nZXIoRm9yIENvZGVXZWF2ZXJzKQogICogQ29weXJpZ2h0IDIwMDcgSGVucmkgVmVyYmVldAorICogQ29weXJpZ2h0IChDKSAyMDA4IFJpY28gU2No/GxsZXIKICAqCiAgKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCkBAIC0yMDE2LDYgKzIwMTcsMTAwIEBACiAgICAgaWYoZDNkOSkgSURpcmVjdDNEOV9SZWxlYXNlKGQzZDkpOwogfQogCitzdGF0aWMgdm9pZCB0ZXN0X3NjaXNzb3Jfc2l6ZSh2b2lkKQoreworICAgIElEaXJlY3QzRDkgKmQzZDlfcHRyID0gMDsKKyAgICBpbnQgaTsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgaW50IHdpbng7IGludCB3aW55OyBpbnQgYmFja3g7IGludCBiYWNreTsgQk9PTCB3aW5kb3c7CisgICAgfSBzY3RzW10gPSB7IC8qIHNjaXNzb3IgdGVzdHMgKi8KKyAgICAgICAgezgwMCwgNjAwLCA2NDAsIDQ4MCwgVFJVRX0sCisgICAgICAgIHs4MDAsIDYwMCwgNjQwLCA0ODAsIEZBTFNFfSwKKyAgICAgICAgezY0MCwgNDgwLCA4MDAsIDYwMCwgVFJVRX0sCisgICAgICAgIHs2NDAsIDQ4MCwgODAwLCA2MDAsIEZBTFNFfSwKKyAgICB9OworCisgICAgZDNkOV9wdHIgPSBwRGlyZWN0M0RDcmVhdGU5KEQzRF9TREtfVkVSU0lPTik7CisgICAgb2soZDNkOV9wdHIgIT0gTlVMTCwgIkZhaWxlZCB0byBjcmVhdGUgSURpcmVjdDNEOSBvYmplY3RcbiIpOworICAgIGlmICghZDNkOV9wdHIpeworICAgICAgICBza2lwKCJGYWlsZWQgdG8gY3JlYXRlIElEaXJlY3QzRDkgb2JqZWN0XG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvcihpPTA7IGk8c2l6ZW9mKHNjdHMpL3NpemVvZihzY3RzWzBdKTsgaSsrKSB7CisgICAgICAgIElEaXJlY3QzRERldmljZTkgKmRldmljZV9wdHIgPSAwOworICAgICAgICBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudF9wYXJhbWV0ZXJzOworICAgICAgICBIUkVTVUxUIGhyOworICAgICAgICBXTkRDTEFTUyB3YyA9IHswfTsKKyAgICAgICAgSFdORCBod25kID0gMDsKKyAgICAgICAgUkVDVCBzY2lzc29ycmVjdDsKKworICAgICAgICB3Yy5scGZuV25kUHJvYyA9IERlZldpbmRvd1Byb2M7CisgICAgICAgIHdjLmxwc3pDbGFzc05hbWUgPSAiZDNkOV90ZXN0X3djIjsKKyAgICAgICAgUmVnaXN0ZXJDbGFzcygmd2MpOworCisgICAgICAgIGh3bmQgPSBDcmVhdGVXaW5kb3coImQzZDlfdGVzdF93YyIsICJkM2Q5X3Rlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgV1NfTUFYSU1JWkUgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiAsIDAsIDAsIHNjdHNbaV0ud2lueCwgc2N0c1tpXS53aW55LCAwLCAwLCAwLCAwKTsKKworICAgICAgICBaZXJvTWVtb3J5KCZwcmVzZW50X3BhcmFtZXRlcnMsIHNpemVvZihwcmVzZW50X3BhcmFtZXRlcnMpKTsKKyAgICAgICAgcHJlc2VudF9wYXJhbWV0ZXJzLldpbmRvd2VkID0gc2N0c1tpXS53aW5kb3c7CisgICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93ID0gaHduZDsKKyAgICAgICAgcHJlc2VudF9wYXJhbWV0ZXJzLlN3YXBFZmZlY3QgPSBEM0RTV0FQRUZGRUNUX0RJU0NBUkQ7CisgICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5CYWNrQnVmZmVyV2lkdGggPSBzY3RzW2ldLmJhY2t4OworICAgICAgICBwcmVzZW50X3BhcmFtZXRlcnMuQmFja0J1ZmZlckhlaWdodCA9IHNjdHNbaV0uYmFja3k7CisgICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5CYWNrQnVmZmVyRm9ybWF0ID0gRDNERk1UX0E4UjhHOEI4OworICAgICAgICBwcmVzZW50X3BhcmFtZXRlcnMuRW5hYmxlQXV0b0RlcHRoU3RlbmNpbCA9IFRSVUU7CisgICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5BdXRvRGVwdGhTdGVuY2lsRm9ybWF0ID0gRDNERk1UX0QyNFM4OworCisgICAgICAgIGhyID0gSURpcmVjdDNEOV9DcmVhdGVEZXZpY2UoZDNkOV9wdHIsIEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIHByZXNlbnRfcGFyYW1ldGVycy5oRGV2aWNlV2luZG93LCBEM0RDUkVBVEVfSEFSRFdBUkVfVkVSVEVYUFJPQ0VTU0lORywgJnByZXNlbnRfcGFyYW1ldGVycywgJmRldmljZV9wdHIpOworICAgICAgICBpZihGQUlMRUQoaHIpKSB7CisgICAgICAgICAgICBwcmVzZW50X3BhcmFtZXRlcnMuQXV0b0RlcHRoU3RlbmNpbEZvcm1hdCA9IEQzREZNVF9EMTY7CisgICAgICAgICAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKGQzZDlfcHRyLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdywgRDNEQ1JFQVRFX0hBUkRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2VfcHRyKTsKKyAgICAgICAgICAgIGlmKEZBSUxFRChocikpIHsKKyAgICAgICAgICAgICAgICBociA9IElEaXJlY3QzRDlfQ3JlYXRlRGV2aWNlKGQzZDlfcHRyLCBEM0RBREFQVEVSX0RFRkFVTFQsIEQzRERFVlRZUEVfSEFMLCBwcmVzZW50X3BhcmFtZXRlcnMuaERldmljZVdpbmRvdywgRDNEQ1JFQVRFX1NPRlRXQVJFX1ZFUlRFWFBST0NFU1NJTkcsICZwcmVzZW50X3BhcmFtZXRlcnMsICZkZXZpY2VfcHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBvayhociA9PSBEM0RfT0sgfHwgaHIgPT0gRDNERVJSX05PVEFWQUlMQUJMRSwgIklEaXJlY3QzRF9DcmVhdGVEZXZpY2UgcmV0dXJuZWQ6ICUwOHhcbiIsIGhyKTsKKworICAgICAgICBpZiAoIWRldmljZV9wdHIpCisgICAgICAgIHsKKyAgICAgICAgICAgIERlc3Ryb3lXaW5kb3coaHduZCk7CisgICAgICAgICAgICBza2lwKCJDcmVhdGluZyB0aGUgZGV2aWNlIGZhaWxlZFxuIik7CisgICAgICAgICAgICBnb3RvIGVycl9vdXQ7CisgICAgICAgIH0KKworICAgICAgICAvKiBDaGVjayBmb3IgdGhlIGRlZmF1bHQgc2Npc3NvciByZWN0IHNpemUgKi8KKyAgICAgICAgaHIgPSBJRGlyZWN0M0REZXZpY2U5X0dldFNjaXNzb3JSZWN0KGRldmljZV9wdHIsICZzY2lzc29ycmVjdCk7CisgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfR2V0U2Npc3NvclJlY3QgZmFpbGVkIHdpdGg6ICUwOHhcbiIsIGhyKTsKKyAgICAgICAgb2soc2Npc3NvcnJlY3QucmlnaHQgPT0gc2N0c1tpXS5iYWNreCAmJiBzY2lzc29ycmVjdC5ib3R0b20gPT0gc2N0c1tpXS5iYWNreSAmJiBzY2lzc29ycmVjdC50b3AgPT0gMCAmJiBzY2lzc29ycmVjdC5sZWZ0ID09IDAsICJTY2lzc29ycmVjdCBtaXNzbWF0Y2ggKCVkLCAlZCkgc2hvdWxkIGJlICglZCwgJWQpXG4iLCBzY2lzc29ycmVjdC5yaWdodCwgc2Npc3NvcnJlY3QuYm90dG9tLCBzY3RzW2ldLmJhY2t4LCBzY3RzW2ldLmJhY2t5KTsKKworICAgICAgICAvKiBjaGVjayB0aGUgc2Npc3NvcnJlY3QgdmFsdWVzIGFmdGVyIGEgcmVzZXQgKi8KKyAgICAgICAgcHJlc2VudF9wYXJhbWV0ZXJzLkJhY2tCdWZmZXJXaWR0aCA9IDEwMjQ7CisgICAgICAgIHByZXNlbnRfcGFyYW1ldGVycy5CYWNrQnVmZmVySGVpZ2h0ID0gNzY4OworICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfUmVzZXQoZGV2aWNlX3B0ciwgJnByZXNlbnRfcGFyYW1ldGVycyk7CisgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfUmVzZXQgZmFpbGVkIHdpdGggJTA4eFxuIiwgaHIpOworICAgICAgICBociA9IElEaXJlY3QzRERldmljZTlfVGVzdENvb3BlcmF0aXZlTGV2ZWwoZGV2aWNlX3B0cik7CisgICAgICAgIG9rKGhyID09IEQzRF9PSywgIklEaXJlY3QzRERldmljZTlfVGVzdENvb3BlcmF0aXZlTGV2ZWwgYWZ0ZXIgYSBzdWNjZXNzZnVsIHJlc2V0IHJldHVybmVkICUjeFxuIiwgaHIpOworCisgICAgICAgIGhyID0gSURpcmVjdDNERGV2aWNlOV9HZXRTY2lzc29yUmVjdChkZXZpY2VfcHRyLCAmc2Npc3NvcnJlY3QpOworICAgICAgICBvayhociA9PSBEM0RfT0ssICJJRGlyZWN0M0REZXZpY2U5X0dldFNjaXNzb3JSZWN0IGZhaWxlZCB3aXRoOiAlMDh4XG4iLCBocik7CisgICAgICAgIG9rKHNjaXNzb3JyZWN0LnJpZ2h0ID09IDEwMjQgJiYgc2Npc3NvcnJlY3QuYm90dG9tID09IDc2OCAmJiBzY2lzc29ycmVjdC50b3AgPT0gMCAmJiBzY2lzc29ycmVjdC5sZWZ0ID09IDAsICJTY2lzc29ycmVjdCBtaXNzbWF0Y2ggKCVkLCAlZCkgc2hvdWxkIGJlICglZCwgJWQpXG4iLCBzY2lzc29ycmVjdC5yaWdodCwgc2Npc3NvcnJlY3QuYm90dG9tLCAxMDI0LCA3NjgpOworCisgICAgICAgIGlmKGRldmljZV9wdHIpIHsKKyAgICAgICAgICAgIFVMT05HIHJlZjsKKworICAgICAgICAgICAgcmVmID0gSURpcmVjdDNERGV2aWNlOV9SZWxlYXNlKGRldmljZV9wdHIpOworICAgICAgICAgICAgRGVzdHJveVdpbmRvdyhod25kKTsKKyAgICAgICAgICAgIG9rKHJlZiA9PSAwLCAiVGhlIGRldmljZSB3YXMgbm90IHByb3Blcmx5IGZyZWVkOiByZWZjb3VudCAldVxuIiwgcmVmKTsKKyAgICAgICAgfQorICAgIH0KKworZXJyX291dDoKKyAgICBpZihkM2Q5X3B0cikgSURpcmVjdDNEOV9SZWxlYXNlKGQzZDlfcHRyKTsKKyAgICByZXR1cm47Cit9CisKKwogU1RBUlRfVEVTVChkZXZpY2UpCiB7CiAgICAgSE1PRFVMRSBkM2Q5X2hhbmRsZSA9IExvYWRMaWJyYXJ5QSggImQzZDkuZGxsIiApOwpAQCAtMjA0NSw1ICsyMTQwLDYgQEAKICAgICAgICAgdGVzdF92ZXJ0ZXhfYnVmZmVyX2FsaWdubWVudCgpOwogICAgICAgICB0ZXN0X2xpZ2h0cygpOwogICAgICAgICB0ZXN0X3NldF9zdHJlYW1fc291cmNlKCk7CisgICAgICAgIHRlc3Rfc2Npc3Nvcl9zaXplKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZGxscy93aW5lZDNkL3N0YXRlYmxvY2suYyBiL2RsbHMvd2luZWQzZC9zdGF0ZWJsb2NrLmMKaW5kZXggZThmZjZjMS4uNzgyNjhkOCAxMDA2NDQKLS0tIGEvZGxscy93aW5lZDNkL3N0YXRlYmxvY2suYworKysgYi9kbGxzL3dpbmVkM2Qvc3RhdGVibG9jay5jCkBAIC0xMDM3LDYgKzEwMzcsMTIgQEAKICAgICAgICAgRFdPUkQgZDsKICAgICB9IHRtcGZsb2F0OwogICAgIHVuc2lnbmVkIGludCBpOworICAgIElXaW5lRDNEU3dhcENoYWluICpzd2FwY2hhaW47CisgICAgSVdpbmVEM0RTdXJmYWNlICpiYWNrYnVmZmVyOworICAgIFdJTkVEM0RTVVJGQUNFX0RFU0MgZGVzYyA9IHswfTsKKyAgICBVSU5UIHdpZHRoLCBoZWlnaHQ7CisgICAgUkVDVCBzY2lzc29ycmVjdDsKKyAgICBIUkVTVUxUIGhyOwogCiAgICAgLyogTm90ZSB0aGlzIG1heSBoYXZlIGEgbGFyZ2Ugb3ZlcmhlYWQgYnV0IGl0IHNob3VsZCBvbmx5IGJlIGV4ZWN1dGVkCiAgICAgICAgb25jZSwgaW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB0aGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIGRldmljZSBhbmQKQEAgLTEyMzksNiArMTI0NSwzMCBAQAogICAgICAgICBUaGlzLT50ZXh0dXJlc1tpXSAgICAgICAgID0gTlVMTDsKICAgICB9CiAKKyAgICAvKiBTZXQgdGhlIGRlZmF1bHQgc2Npc3NvciByZWN0IHZhbHVlcyAqLworICAgIGRlc2MuV2lkdGggPSAmd2lkdGg7CisgICAgZGVzYy5IZWlnaHQgPSAmaGVpZ2h0OworCisgICAgLyogY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMsIGJlY2F1c2UgdGhlIEdldEJhY2tCdWZmZXIgY2FsbCBpc24ndCB2YWxpZCBmb3IgZGRyYXcgKi8KKyAgICBociA9IElXaW5lRDNERGV2aWNlX0dldFN3YXBDaGFpbihkZXZpY2UsIDAsICZzd2FwY2hhaW4pOworICAgIGlmKCBociA9PSBXSU5FRDNEX09LICYmIHN3YXBjaGFpbiAhPSBOVUxMKSB7CisgICAgICAgIGhyID0gSVdpbmVEM0RTd2FwQ2hhaW5fR2V0QmFja0J1ZmZlcihzd2FwY2hhaW4sIDAsIFdJTkVEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTywgJmJhY2tidWZmZXIpOworICAgICAgICBpZiggaHIgPT0gV0lORUQzRF9PSyAmJiBiYWNrYnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9HZXREZXNjKGJhY2tidWZmZXIsICZkZXNjKTsKKyAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9SZWxlYXNlKGJhY2tidWZmZXIpOworCisgICAgICAgICAgICBzY2lzc29ycmVjdC5sZWZ0ID0gMDsKKyAgICAgICAgICAgIHNjaXNzb3JyZWN0LnJpZ2h0ID0gd2lkdGg7CisgICAgICAgICAgICBzY2lzc29ycmVjdC50b3AgPSAwOworICAgICAgICAgICAgc2Npc3NvcnJlY3QuYm90dG9tID0gaGVpZ2h0OworICAgICAgICAgICAgaHIgPSBJV2luZUQzRERldmljZV9TZXRTY2lzc29yUmVjdChkZXZpY2UsICZzY2lzc29ycmVjdCk7CisgICAgICAgICAgICBpZiggaHIgIT0gV0lORUQzRF9PSyApIHsKKyAgICAgICAgICAgICAgICBFUlIoIlRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiwgZXhwZWN0IHJlbmRlcmluZyBpc3N1ZXMhXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBJV2luZUQzRFN3YXBDaGFpbl9SZWxlYXNlKHN3YXBjaGFpbik7CisgICAgfQorCiAgICAgVFJBQ0UoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBEZXZpY2UgZGVmYXVsdHMgbm93IHNldCB1cC4uLlxuIik7CiAgICAgcmV0dXJuIFdJTkVEM0RfT0s7CiB9CmRpZmYgLS1naXQgYS9kbGxzL3dpbmVkM2Qvc3dhcGNoYWluX2Jhc2UuYyBiL2RsbHMvd2luZWQzZC9zd2FwY2hhaW5fYmFzZS5jCmluZGV4IDZiOTEyMzQuLjc1YWRmNzcgMTAwNjQ0Ci0tLSBhL2RsbHMvd2luZWQzZC9zd2FwY2hhaW5fYmFzZS5jCisrKyBiL2RsbHMvd2luZWQzZC9zd2FwY2hhaW5fYmFzZS5jCkBAIC0xMDIsNiArMTAyLDE1IEBACiAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgIH0KIAorICAgIC8qIFJldHVybiBpbnZhbGlkIGlmIHRoZXJlIGlzIG5vIGJhY2tidWZmZXJhcnJheSwgb3RoZXJ3aXNlIGl0IHdpbGwgY3Jhc2ggd2hlbiBkZHJhdyBpcworICAgICAqIHVzZWQgKHRoZXJlIFRoaXMtPmJhY2tCdWZmZXIgaXMgYWxsd2F5cyBOVUxMKS4gV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBoYXZlCisgICAgICogdG8gYmUgY2FsbGVkIGZyb20gSVdpbmVEM0RTdGF0ZUJsb2NrSW1wbF9Jbml0U3RhcnR1cFN0YXRlQmxvY2sgdG8gZ2V0IHRoZSBkZWZhdWx0CisgICAgICogc2Npc3NvcnJlY3QgZGltZW5zaW9ucy4gKi8KKyAgICBpZiggIVRoaXMtPmJhY2tCdWZmZXIgKSB7CisgICAgICAgICpwcEJhY2tCdWZmZXIgPSBOVUxMOworICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKKyAgICB9CisKICAgICAqcHBCYWNrQnVmZmVyID0gVGhpcy0+YmFja0J1ZmZlcltpQmFja0J1ZmZlcl07CiAgICAgVFJBQ0UoIiglcCkgOiBCYWNrQnVmICVkIFR5cGUgJWQgIHJldHVybmluZyAlcFxuIiwgVGhpcywgaUJhY2tCdWZmZXIsIFR5cGUsICpwcEJhY2tCdWZmZXIpOwogCg==