ZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvY29tbWFuZGxpbmUuY3BwIGIvYWRiL2NsaWVudC9jb21tYW5kbGluZS5jcHAKaW5kZXggMTFhM2RmZC4uZWE4YzczYiAxMDA2NDQKLS0tIGEvYWRiL2NsaWVudC9jb21tYW5kbGluZS5jcHAKKysrIGIvYWRiL2NsaWVudC9jb21tYW5kbGluZS5jcHAKQEAgLTEzMCw3ICsxMzAsNyBAQAogICAgICAgICAiICAgICAtYTogcHJlc2VydmUgZmlsZSB0aW1lc3RhbXAgYW5kIG1vZGVcbiIKICAgICAgICAgIiBzeW5jIFthbGx8ZGF0YXxvZG18b2VtfHByb2R1Y3R8c3lzdGVtfHN5c3RlbV9leHR8dmVuZG9yXVxuIgogICAgICAgICAiICAgICBzeW5jIGEgbG9jYWwgYnVpbGQgZnJvbSAkQU5EUk9JRF9QUk9EVUNUX09VVCB0byB0aGUgZGV2aWNlIChkZWZhdWx0IGFsbClcbiIKLSAgICAgICAgIiAgICAgLWw6IGxpc3QgYnV0IGRvbid0IGNvcHlcbiIKKyAgICAgICAgIiAgICAgLWw6IGxpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjb3BpZWQsIGJ1dCBkb24ndCBjb3B5IHRoZW1cbiIKICAgICAgICAgIlxuIgogICAgICAgICAic2hlbGw6XG4iCiAgICAgICAgICIgc2hlbGwgWy1lIEVTQ0FQRV0gWy1uXSBbLVR0XSBbLXhdIFtDT01NQU5ELi4uXVxuIgpkaWZmIC0tZ2l0IGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcCBiL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKaW5kZXggZjRlODY2NC4uZmJhZTIxOSAxMDA2NDQKLS0tIGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcAorKysgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAiYW5kcm9pZGZ3L1ppcEZpbGVSTy5oIgogI2luY2x1ZGUgImNsaWVudC9maWxlX3N5bmNfY2xpZW50LmgiCiAjaW5jbHVkZSAiY29tbWFuZGxpbmUuaCIKKyNpbmNsdWRlICJkZXBsb3lhZ2VudC5pbmMiICAgICAgICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJkZXBsb3lhZ2VudHNjcmlwdC5pbmMiICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKICNpbmNsdWRlICJmYXN0ZGVwbG95Y2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAic3lzZGVwcy5oIgogCkBAIC0zNSw2ICszOCw4IEBACiBzdGF0aWMgY29uc3RleHByIGxvbmcga1JlcXVpcmVkQWdlbnRWZXJzaW9uID0gMHgwMDAwMDAwMjsKIAogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC8iOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRGaWxlID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudC5qYXIiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRTY3JpcHQgPSAiL2RhdGEvbG9jYWwvdG1wL2RlcGxveWFnZW50IjsKIAogc3RhdGljIGJvb2wgZ191c2VfbG9jYWxhZ2VudCA9IGZhbHNlOwogCkBAIC03MSw0NiArNzYsMzIgQEAKICAgICBnX3VzZV9sb2NhbGFnZW50ID0gdXNlX2xvY2FsYWdlbnQ7CiB9CiAKLS8vIGxvY2FsX3BhdGggLSBtdXN0IHN0YXJ0IHdpdGggYSAnLycgYW5kIGJlIHJlbGF0aXZlIHRvICRBTkRST0lEX1BST0RVQ1RfT1VUCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X2FnZW50X2NvbXBvbmVudF9ob3N0X3BhdGgoY29uc3QgY2hhciogbG9jYWxfcGF0aCwgY29uc3QgY2hhciogc2RrX3BhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGRldGVybWluZSBsb2NhdGlvbiBvZiBhZGIhIik7Ci0gICAgfQotCi0gICAgaWYgKGdfdXNlX2xvY2FsYWdlbnQpIHsKLSAgICAgICAgY29uc3QgY2hhciogcHJvZHVjdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKLSAgICAgICAgaWYgKHByb2R1Y3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBsb2NhdGUgJXMgYmVjYXVzZSAkQU5EUk9JRF9QUk9EVUNUX09VVCBpcyBub3QgZGVmaW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMiLCBwcm9kdWN0X291dCwgbG9jYWxfcGF0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFkYl9kaXIgKyBzZGtfcGF0aDsKLSAgICB9Ci19Ci0KIHN0YXRpYyBib29sIGRlcGxveV9hZ2VudChib29sIGNoZWNrVGltZVN0YW1wcykgewogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBzcmNzOwotICAgIHN0ZDo6c3RyaW5nIGphcl9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2ZyYW1ld29yay9kZXBsb3lhZ2VudC5qYXIiLCAiL2RlcGxveWFnZW50LmphciIpOwotICAgIHN0ZDo6c3RyaW5nIHNjcmlwdF9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2Jpbi9kZXBsb3lhZ2VudCIsICIvZGVwbG95YWdlbnQiKTsKLSAgICBzcmNzLnB1c2hfYmFjayhqYXJfcGF0aC5jX3N0cigpKTsKLSAgICBzcmNzLnB1c2hfYmFjayhzY3JpcHRfcGF0aC5jX3N0cigpKTsKLQotICAgIGlmIChkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50UGF0aCwgY2hlY2tUaW1lU3RhbXBzKSkgewotICAgICAgICAvLyBvbiB3aW5kb3dzIHRoZSBzaGVsbCBzY3JpcHQgbWlnaHQgaGF2ZSBsb3N0IGV4ZWN1dGUgcGVybWlzc2lvbgotICAgICAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKLSAgICAgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzZGVwbG95YWdlbnQiOwotICAgICAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihrQ2htb2RDb21tYW5kUGF0dGVybiwga0RldmljZUFnZW50UGF0aCk7Ci0gICAgICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkVycm9yIHB1c2hpbmcgYWdlbnQgZmlsZXMgdG8gZGV2aWNlIik7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnQuZmQsIGtEZXBsb3lBZ2VudCwgc2l6ZW9mKGtEZXBsb3lBZ2VudCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRGaWxlLCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnRTY3JpcHQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnRTY3JpcHQuZmQsIGtEZXBsb3lBZ2VudFNjcmlwdCwgc2l6ZW9mKGtEZXBsb3lBZ2VudFNjcmlwdCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudFNjcmlwdC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRTY3JpcHQsIGNoZWNrVGltZVN0YW1wcykpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIHB1c2ggZmFzdGRlcGxveSBhZ2VudCBzY3JpcHQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KKyAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKKyAgICBjb25zdCBjaGFyKiBrQ2htb2RDb21tYW5kUGF0dGVybiA9ICJjaG1vZCA3NzcgJXMiOworICAgIHN0ZDo6c3RyaW5nIGNobW9kQ29tbWFuZCA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFNjcmlwdCk7CisgICAgaW50IHJldCA9IHNlbmRfc2hlbGxfY29tbWFuZChjaG1vZENvbW1hbmQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIzOCwzNCArMjI5LDE1IEBACiAgICAgfQogfQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkgewotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbiBhIFdpbmRvd3MgbWFjaGluZQotICAgICAgICBjb25zdCBjaGFyKiBob3N0X291dCA9IGdldGVudigiQU5EUk9JRF9IT1NUX09VVCIpOwotICAgICAgICBpZiAoaG9zdF9vdXQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIGJlY2F1c2UgJEFORFJPSURfSE9TVF9PVVQgIgotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGRlZmluZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJqYXZhIC1qYXIgJXMvZnJhbWV3b3JrL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9vdXQpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFkYl9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgaWYgKGFkYl9kaXIuZW1wdHkoKSkgewotICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKFIiKGphdmEgLWphciAiJXMvZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiX2Rpci5jX3N0cigpKTsKLX0KLQogdm9pZCBjcmVhdGVfcGF0Y2goY29uc3QgY2hhciogYXBrUGF0aCwgY29uc3QgY2hhciogbWV0YWRhdGFQYXRoLCBjb25zdCBjaGFyKiBwYXRjaFBhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVBhdGNoQ29tbWFuZCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgIFIiKCVzICIlcyIgIiVzIiA+ICIlcyIpIiwgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkuY19zdHIoKSwgYXBrUGF0aCwgbWV0YWRhdGFQYXRoLAotICAgICAgICAgICAgcGF0Y2hQYXRoKTsKLSAgICBpbnQgcmV0dXJuQ29kZSA9IHN5c3RlbShnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpKTsKLSAgICBpZiAocmV0dXJuQ29kZSAhPSAwKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkV4ZWN1dGluZyAlcyByZXR1cm5lZCAlZCIsIGdlbmVyYXRlUGF0Y2hDb21tYW5kLmNfc3RyKCksIHJldHVybkNvZGUpOworICAgIERlcGxveVBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcihmYWxzZSk7CisgICAgdW5pcXVlX2ZkIHBhdGNoRmQoYWRiX29wZW4ocGF0Y2hQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0NMT0VYRUMpKTsKKyAgICBpZiAocGF0Y2hGZCA8IDApIHsKKyAgICAgICAgcGVycm9yX2V4aXQoImFkYjogZmFpbGVkIHRvIGNyZWF0ZSAlcyIsIHBhdGNoUGF0aCk7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IGdlbmVyYXRvci5DcmVhdGVQYXRjaChhcGtQYXRoLCBtZXRhZGF0YVBhdGgsIHBhdGNoRmQpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gY3JlYXRlIHBhdGNoIGZvciAlcyIsIGFwa1BhdGgpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcCBiL2FkYi9kYWVtb24vc2hlbGxfc2VydmljZS5jcHAKaW5kZXggZGU5NzA2OC4uMGZiMTRjNCAxMDA2NDQKLS0tIGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcAorKysgYi9hZGIvZGFlbW9uL3NoZWxsX3NlcnZpY2UuY3BwCkBAIC0yMjIsNyArMjIyLDcgQEAKIGJvb2wgU3VicHJvY2Vzczo6Rm9ya0FuZEV4ZWMoc3RkOjpzdHJpbmcqIGVycm9yKSB7CiAgICAgdW5pcXVlX2ZkIGNoaWxkX3N0ZGlub3V0X3NmZCwgY2hpbGRfc3RkZXJyX3NmZDsKICAgICB1bmlxdWVfZmQgcGFyZW50X2Vycm9yX3NmZCwgY2hpbGRfZXJyb3Jfc2ZkOwotICAgIGNoYXIgcHRzX25hbWVbUEFUSF9NQVhdOworICAgIGNvbnN0IGNoYXIqIHB0c19uYW1lID0gbnVsbHB0cjsKIAogICAgIGlmIChjb21tYW5kXy5lbXB0eSgpKSB7CiAgICAgICAgIF9fYW5kcm9pZF9sb2dfc2VjdXJpdHlfYnN3cml0ZShTRUNfVEFHX0FEQl9TSEVMTF9JTlRFUkFDVElWRSwgIiIpOwpAQCAtMjgzLDEwICsyODMsMjIgQEAKICAgICBjZW52LnB1c2hfYmFjayhudWxscHRyKTsKIAogICAgIGlmICh0eXBlXyA9PSBTdWJwcm9jZXNzVHlwZTo6a1B0eSkgewotICAgICAgICBpbnQgZmQ7Ci0gICAgICAgIHBpZF8gPSBmb3JrcHR5KCZmZCwgcHRzX25hbWUsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICB1bmlxdWVfZmQgcHR5X21hc3Rlcihwb3NpeF9vcGVucHQoT19SRFdSIHwgT19OT0NUVFkgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKHB0eV9tYXN0ZXIgPT0gLTEpIHsKKyAgICAgICAgICAgICplcnJvciA9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIGNyZWF0ZSBwdHkgbWFzdGVyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVubG9ja3B0KHB0eV9tYXN0ZXIuZ2V0KCkpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIHVubG9ja3B0IHB0eSBtYXN0ZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcGlkXyA9IGZvcmsoKTsKKyAgICAgICAgcHRzX25hbWUgPSBwdHNuYW1lKHB0eV9tYXN0ZXIuZ2V0KCkpOwogICAgICAgICBpZiAocGlkXyA+IDApIHsKLSAgICAgICAgICBzdGRpbm91dF9zZmRfLnJlc2V0KGZkKTsKKyAgICAgICAgICAgIHN0ZGlub3V0X3NmZF8gPSBzdGQ6Om1vdmUocHR5X21hc3Rlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIUNyZWF0ZVNvY2tldHBhaXIoJnN0ZGlub3V0X3NmZF8sICZjaGlsZF9zdGRpbm91dF9zZmQpKSB7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwIGIvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icAppbmRleCAxYmEwZGUwLi45NWUxYTI4IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCisrKyBiL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKQEAgLTEzLDI3ICsxMywxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwotCiBqYXZhX2JpbmFyeSB7CiAgICAgbmFtZTogImRlcGxveWFnZW50IiwKICAgICBzZGtfdmVyc2lvbjogIjI0IiwKICAgICBzcmNzOiBbImRlcGxveWFnZW50L3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAogICAgIHN0YXRpY19saWJzOiBbImFwa3psaWJfemlwIl0sCi0gICAgd3JhcHBlcjogImRlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIiwKICAgICBwcm90bzogewogICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKICAgICBkZXhfcHJlb3B0OiB7CiAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgIH0KLX0KLQotamF2YV9iaW5hcnlfaG9zdCB7Ci0gICAgbmFtZTogImRlcGxveXBhdGNoZ2VuZXJhdG9yIiwKLSAgICBzcmNzOiBbImRlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAotICAgIHN0YXRpY19saWJzOiBbImFwa3psaWIiXSwKLSAgICBtYW5pZmVzdDogImRlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCIsCi0gICAgcHJvdG86IHsKLSAgICAgICAgdHlwZTogImZ1bGwiLAotICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQppbmRleCAyZDNiMTM1Li5hODEwM2M0IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdE1ldGFEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBhcGtGaWxlID0gZ2V0RmlsZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CiAgICAgICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhID0gUGF0Y2hVdGlscy5nZXRBUEtNZXRhRGF0YShhcGtGaWxlKTsKLSAgICAgICAgYXBrTWV0YURhdGEud3JpdGVEZWxpbWl0ZWRUbyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgYXBrTWV0YURhdGEud3JpdGVUbyhTeXN0ZW0ub3V0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY3JlYXRlSW5zdGFsbFNlc3Npb24oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIyMyw3ICsyMjMsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHdyaXRlRXhpdENvZGUgPSB3cml0ZVBhdGNoZWREYXRhVG9TZXNzaW9uKG5ldyBSYW5kb21BY2Nlc3NGaWxlKGRldmljZUZpbGUsICJyIiksIGRlbHRhU3RyZWFtLCBzZXNzaW9uSWQpOwotCiAgICAgICAgIGlmICh3cml0ZUV4aXRDb2RlID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBjb21taXRJbnN0YWxsU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjg1LDcgKzI4NCw2IEBACiAgICAgICAgICAgICBpZiAob2xkRGF0YUxlbiA+IDApIHsKICAgICAgICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUob2xkRGF0YSwgb3V0cHV0U3RyZWFtLCBidWZmZXIsIChpbnQpIG9sZERhdGFMZW4pOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBuZXdEYXRhQnl0ZXNXcml0dGVuICs9IGNvcHlMZW4gKyBvbGREYXRhTGVuOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCmluZGV4IGYwZjAwZTEuLmM2MGY5YTYgMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQpAQCAtMzksNyArMzksNyBAQAogY2xhc3MgUGF0Y2hVdGlscyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9NQVNLID0gMUwgPDwgNjM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9MT05HX1NJR05fTUFTSyA9IDFMIDw8IDYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRSA9ICJIQU1BREkvSUhEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkUgPSAiRkFTVERFUExPWSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE9mZnNldEZyb21FbnRyeShTdG9yZWRFbnRyeSBlbnRyeSkgewogICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q2VudHJhbERpcmVjdG9yeUhlYWRlcigpLmdldE9mZnNldCgpICsgZW50cnkuZ2V0TG9jYWxIZWFkZXJTaXplKCk7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzkyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9maWxlLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkxvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgIGlmICghaXNfdmVyYm9zZV8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZwcmludGYoZm10LCBhcCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkFQS0VudHJ5VG9Mb2coY29uc3QgQVBLRW50cnkmIGVudHJ5KSB7CisgICAgTG9nKCJGaWxlbmFtZTogJXMiLCBlbnRyeS5maWxlbmFtZSgpLmNfc3RyKCkpOworICAgIExvZygiQ1JDMzI6IDB4JTA4bGxYIiwgZW50cnkuY3JjMzIoKSk7CisgICAgTG9nKCJEYXRhIE9mZnNldDogJWxsZCIsIGVudHJ5LmRhdGFvZmZzZXQoKSk7CisgICAgTG9nKCJDb21wcmVzc2VkIFNpemU6ICVsbGQiLCBlbnRyeS5jb21wcmVzc2Vkc2l6ZSgpKTsKKyAgICBMb2coIlVuY29tcHJlc3NlZCBTaXplOiAlbGxkIiwgZW50cnkudW5jb21wcmVzc2Vkc2l6ZSgpKTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGEpIHsKKyAgICBpZiAoIWlzX3ZlcmJvc2VfKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTG9nKCJBUEsgTWV0YWRhdGE6ICVzIiwgZmlsZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFQS0VudHJ5JiBlbnRyeSA9IG1ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIEFQS0VudHJ5VG9Mb2coZW50cnkpOworICAgIH0KK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6UmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSkgeworICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKKyAgICBpbnQgdG90YWxFcXVhbEZpbGVzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkZW50aWNhbEVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkZW50aWNhbEVudHJpZXNbaV0uZGV2aWNlRW50cnkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGlkZW50aWNhbEVudHJpZXNbaV0ubG9jYWxFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgICAgIHRvdGFsRXF1YWxGaWxlcysrOworICAgICAgICB9CisgICAgfQorICAgIGZsb2F0IHNhdmluZ1BlcmNlbnQgPSAodG90YWxFcXVhbEJ5dGVzICogMTAwLjBmKSAvIHRvdGFsU2l6ZTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRldGVjdGVkICVkIGVxdWFsIEFQSyBlbnRyaWVzXG4iLCB0b3RhbEVxdWFsRmlsZXMpOworICAgIGZwcmludGYoc3RkZXJyLCAiJWxkIGJ5dGVzIGFyZSBlcXVhbCBvdXQgb2YgJSIgUFJJdTY0ICIgKCUuMmYlJSlcbiIsIHRvdGFsRXF1YWxCeXRlcywgdG90YWxTaXplLAorICAgICAgICAgICAgc2F2aW5nUGVyY2VudCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICB1bmlxdWVfZmQgaW5wdXQoYWRiX29wZW4obG9jYWxBcGtQYXRoLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgIHNpemVfdCBuZXdBcGtTaXplID0gYWRiX2xzZWVrKGlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIGFkYl9sc2VlayhpbnB1dCwgMEwsIFNFRUtfU0VUKTsKKworICAgIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKG91dHB1dCk7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKG5ld0Fwa1NpemUsIG91dHB1dCk7CisgICAgc2l6ZV90IGN1cnJlbnRTaXplT3V0ID0gMDsKKyAgICAvLyBXcml0ZSBkYXRhIGZyb20gdGhlIGhvc3QgdXB0byB0aGUgZmlyc3QgZW50cnkgd2UgaGF2ZSB0aGF0IG1hdGNoZXMgYSBkZXZpY2UgZW50cnkuIFRoZW4gd3JpdGUKKyAgICAvLyB0aGUgbWV0YWRhdGEgYWJvdXQgdGhlIGRldmljZSBlbnRyeSBhbmQgcmVwZWF0IGZvciBhbGwgZW50cmllcyB0aGF0IG1hdGNoIG9uIGRldmljZS4gRmluYWxseQorICAgIC8vIHdyaXRlIG91dCBhbnkgZGF0YSBsZWZ0LiBJZiB0aGUgZGV2aWNlIGFuZCBob3N0IEFQS3MgYXJlIGV4YWN0bHkgdGhlIHNhbWUgdGhpcyBlbmRzIHVwCisgICAgLy8gd3JpdGluZyBvdXQgemlwIG1ldGFkYXRhIGZyb20gdGhlIGxvY2FsIEFQSyBmb2xsb3dlZCBieSBvZmZzZXRzIHRvIHRoZSBkYXRhIHRvIHVzZSBmcm9tIHRoZQorICAgIC8vIGRldmljZSBBUEsuCisgICAgZm9yIChhdXRvJiYgZW50cnkgOiBlbnRyaWVzVG9Vc2VPbkRldmljZSkgeworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFPZmZzZXQgPSBlbnRyeS5kZXZpY2VFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGhvc3REYXRhT2Zmc2V0ID0gZW50cnkubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFMZW5ndGggPSBlbnRyeS5kZXZpY2VFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgaW50NjRfdCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgPSBob3N0RGF0YU9mZnNldCAtIGN1cnJlbnRTaXplT3V0OworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0LCBvdXRwdXQpOworICAgICAgICBpZiAoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ID4gMCkgeworICAgICAgICAgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dCwgb3V0cHV0LCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQpOworICAgICAgICB9CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZXZpY2VEYXRhT2Zmc2V0LCBvdXRwdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGV2aWNlRGF0YUxlbmd0aCwgb3V0cHV0KTsKKyAgICAgICAgYWRiX2xzZWVrKGlucHV0LCBkZXZpY2VEYXRhTGVuZ3RoLCBTRUVLX0NVUik7CisgICAgICAgIGN1cnJlbnRTaXplT3V0ICs9IGRlbHRhRnJvbURldmljZURhdGFTdGFydCArIGRldmljZURhdGFMZW5ndGg7CisgICAgfQorICAgIGlmIChjdXJyZW50U2l6ZU91dCAhPSBuZXdBcGtTaXplKSB7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhuZXdBcGtTaXplIC0gY3VycmVudFNpemVPdXQsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQsIG91dHB1dCwgbmV3QXBrU2l6ZSAtIGN1cnJlbnRTaXplT3V0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDAsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygwLCBvdXRwdXQpOworICAgIH0KK30KKworYm9vbCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6Q3JlYXRlUGF0Y2goY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBjb25zdCBjaGFyKiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIEFQS01ldGFEYXRhIGRldmljZUFwa01ldGFkYXRhOworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGRldmljZUFwa01ldGFkYXRhUGF0aCwgJmNvbnRlbnQpKSB7CisgICAgICAgIGRldmljZUFwa01ldGFkYXRhLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoY29udGVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogV2hhdCBkbyB3ZSB3YW50IHRvIGRvIGlmIHdlIGRvbid0IGZpbmQgYW55IG1ldGFkYXRhLgorICAgICAgICAvLyBUaGUgY3VycmVudCBmYWxsYmFjayBiZWhhdmlvciBpcyB0byBidWlsZCBhIHBhdGNoIHdpdGggdGhlIGNvbnRlbnRzIG9mIHxsb2NhbEFwa1BhdGh8LgorICAgIH0KKworICAgIEFQS01ldGFEYXRhIGxvY2FsQXBrTWV0YWRhdGEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShsb2NhbEFwa1BhdGgpOworICAgIC8vIExvZyBnYXRoZXJlZCBtZXRhZGF0YSBpbmZvLgorICAgIEFQS01ldGFEYXRhVG9Mb2coZGV2aWNlQXBrTWV0YWRhdGFQYXRoLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgQVBLTWV0YURhdGFUb0xvZyhsb2NhbEFwa1BhdGgsIGxvY2FsQXBrTWV0YWRhdGEpOworCisgICAgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+IGlkZW50aWNhbEVudHJpZXM7CisgICAgdWludDY0X3QgdG90YWxTaXplID0KKyAgICAgICAgICAgIEJ1aWxkSWRlbnRpY2FsRW50cmllcyhpZGVudGljYWxFbnRyaWVzLCBsb2NhbEFwa01ldGFkYXRhLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgUmVwb3J0U2F2aW5ncyhpZGVudGljYWxFbnRyaWVzLCB0b3RhbFNpemUpOworICAgIEdlbmVyYXRlUGF0Y2goaWRlbnRpY2FsRW50cmllcywgbG9jYWxBcGtQYXRoLCBvdXRwdXQpOworICAgIHJldHVybiB0cnVlOworfQorCit1aW50NjRfdCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QnVpbGRJZGVudGljYWxFbnRyaWVzKHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIGxvY2FsQXBrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQS01ldGFEYXRhJiBkZXZpY2VBcGtNZXRhZGF0YSkgeworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVBLRW50cnkmIGxvY2FsRW50cnkgPSBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIHRvdGFsU2l6ZSArPSBsb2NhbEVudHJ5LmNvbXByZXNzZWRzaXplKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllc19zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgQVBLRW50cnkmIGRldmljZUVudHJ5ID0gZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllcyhqKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VFbnRyeS5jcmMzMigpID09IGxvY2FsRW50cnkuY3JjMzIoKSAmJgorICAgICAgICAgICAgICAgIGRldmljZUVudHJ5LmZpbGVuYW1lKCkuY29tcGFyZShsb2NhbEVudHJ5LmZpbGVuYW1lKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBTaW1wbGVFbnRyeSBzaW1wbGVFbnRyeTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5sb2NhbEVudHJ5ID0gY29uc3RfY2FzdDxBUEtFbnRyeSo+KCZsb2NhbEVudHJ5KTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5kZXZpY2VFbnRyeSA9IGNvbnN0X2Nhc3Q8QVBLRW50cnkqPigmZGV2aWNlRW50cnkpOworICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9Mb2cobG9jYWxFbnRyeSk7CisgICAgICAgICAgICAgICAgb3V0SWRlbnRpY2FsRW50cmllcy5wdXNoX2JhY2soc2ltcGxlRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6c29ydChvdXRJZGVudGljYWxFbnRyaWVzLmJlZ2luKCksIG91dElkZW50aWNhbEVudHJpZXMuZW5kKCksCisgICAgICAgICAgICAgIFtdKGNvbnN0IFNpbXBsZUVudHJ5JiBsaHMsIGNvbnN0IFNpbXBsZUVudHJ5JiByaHMpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpIDwgcmhzLmxvY2FsRW50cnktPmRhdGFvZmZzZXQoKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNDFhNQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucGIuaCIKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIHBhdGNoIHRoYXQgY2FuIGJlIGFjY2VwdGVkIGJ5IHRoZSBkZXBsb3lhZ2VudC4gVGhlCisgKiBwYXRjaCBmb3JtYXQgaXMgZG9jdW1lbnRlZCBpbiBHZW5lcmF0ZVBhdGNoLgorICovCitjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgc3RydWN0IHRvIGhvbGQgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIG1ldGFkYXRhIGFuZCBkZXZpY2UgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RydWN0IFNpbXBsZUVudHJ5IHsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogbG9jYWxFbnRyeTsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogZGV2aWNlRW50cnk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIElmIHxpc192ZXJib3NlfCBpcyB0cnVlIEFwa0VudHJpZXMgdGhhdCBhcmUgc2ltaWxhciBiZXR3ZWVuIGRldmljZSBhbmQgaG9zdCBhcmUgd3JpdHRlbiB0bworICAgICAqIHRoZSBjb25zb2xlLgorICAgICAqLworICAgIGV4cGxpY2l0IERlcGxveVBhdGNoR2VuZXJhdG9yKGJvb2wgaXNfdmVyYm9zZSkgOiBpc192ZXJib3NlXyhpc192ZXJib3NlKSB7fQorICAgIC8qKgorICAgICAqIEdpdmVuIGEgfGxvY2FsQXBrUGF0aHwsIGFuZCB0aGUgfGRldmljZUFwa01ldGFkYXRhUGF0aHwgZnJvbSBhbiBpbnN0YWxsZWQgQVBLIHRoaXMgZnVuY3Rpb24KKyAgICAgKiB3cml0ZXMgYSBwYXRjaCB0byB0aGUgZ2l2ZW4gfG91dHB1dHwuCisgICAgICovCisgICAgYm9vbCBDcmVhdGVQYXRjaChjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGNvbnN0IGNoYXIqIGRldmljZUFwa01ldGFkYXRhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIGlzX3ZlcmJvc2VfOworCisgICAgLyoqCisgICAgICogTG9nIGZ1bmN0aW9uIG9ubHkgbG9ncyBkYXRhIHRvIHN0ZG91dCB3aGVuIHxpc192ZXJib3NlX3wgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIExvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAyLCAzKSkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyB0aGUgQVBLTWV0YURhdGEgc3RydWN0dXJlLiBJZiB8aXNfdmVyYm9zZV98IGlzIGZhbHNlIHRoaXMgZnVuY3Rpb24KKyAgICAgKiBlYXJseSBvdXRzLiB8ZmlsZXwgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgfG1ldGFkYXRhfC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgICAgICogZm9yIGRlYnVnZ2luZyAvIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZvaWQgQVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBtZXRhZGF0YSk7CisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyBBUEtFbnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIEFQS0VudHJ5VG9Mb2coY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSYgZW50cnkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlcG9ydCBzYXZpbmdzIGJ5IGZhc3RkZXBsb3kuIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBzYXZpbmdzIGV2ZW4gd2l0aAorICAgICAqIHxpc192ZXJib3NlX3wgc2V0IHRvIGZhbHNlLiB8dG90YWxTaXplfCBpcyB1c2VkIHRvIHNob3cgYSBwZXJjZW50YWdlIG9mIHNhdmluZ3MuIE5vdGU6CisgICAgICogfHRvdGFsU2l6ZXwgaXMgdGhlIHNpemUgb2YgdGhlIFppcEVudHJpZXMuIE5vdCB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIGZpbGUuIFRoZSBtZXRhZGF0YSBvZgorICAgICAqIHRoZSB6aXAgZGF0YSBuZWVkcyB0byBiZSBzZW50IGFjcm9zcyB3aXRoIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKiBbUGF0Y2ggZm9ybWF0XQorICAgICAqIHxGaXhlZCBTdHJpbmd8IFNpZ25hdHVyZQorICAgICAqIHxsb25nfCAgICAgICAgIE5ldyBTaXplIG9mIEFwaworICAgICAqIHxQYWNrZXRzW118ICAgIEFycmF5IG9mIFBhY2tldHMKKyAgICAgKgorICAgICAqIFtQYWNrZXQgRm9ybWF0XQorICAgICAqIHxsb25nfCAgICAgU2l6ZSBvZiBkYXRhIHRvIHVzZSBmcm9tIHBhdGNoCisgICAgICogfGJ5dGVbXXwgICBQYXRjaCBkYXRhCisgICAgICogfGxvbmd8ICAgICBPZmZzZXQgb2YgZGF0YSB0byB1c2UgYWxyZWFkeSBvbiBkZXZpY2UKKyAgICAgKiB8bG9uZ3wgICAgIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgZnJvbSBkZXZpY2UgQVBLCisgICAgICogVE9ETyhiLzEzODMwNjc4NCk6IE1vdmUgdGhlIHBhdGNoIGZvcm1hdCB0byBhIHByb3RvLgorICAgICAqLworICAgIHZvaWQgUmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsIHVpbnQ2NF90IHRvdGFsU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGVudW1lcmF0ZXMgZWFjaCBlbnRyeSBpbiB8ZW50cmllc1RvVXNlT25EZXZpY2V8IGFuZCBidWlsZHMgYSBwYXRjaCBmaWxlIGNvcHlpbmcgZGF0YQorICAgICAqIGZyb20gfGxvY2FsQXBrUGF0aHwgd2hlcmUgd2UgYXJlIHVuYWJsZSB0byB1c2UgZW50cmllcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UuIFRoZSBuZXcgcGF0Y2gKKyAgICAgKiBpcyB3cml0dGVuIHRvIHxvdXRwdXR8LiBUaGUgZW50cmllcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJ5IGRhdGEgb2Zmc2V0IGZyb20gbG93ZXN0IHRvCisgICAgICogaGlnaGVzdC4KKyAgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworCisgIHByb3RlY3RlZDoKKyAgICB1aW50NjRfdCBCdWlsZElkZW50aWNhbEVudHJpZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIG91dElkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBsb2NhbEFwa01ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSYgZGV2aWNlQXBrTWV0YWRhdGFQYXRoKTsKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRUZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiAiZmFzdGRlcGxveS90ZXN0ZGF0YS8iICsgbmFtZTsKK30KKworY2xhc3MgVGVzdFBhdGNoR2VuZXJhdG9yIDogRGVwbG95UGF0Y2hHZW5lcmF0b3IgeworICBwdWJsaWM6CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yKCkgOiBEZXBsb3lQYXRjaEdlbmVyYXRvcihmYWxzZSkge30KKyAgICB2b2lkIEdhdGhlcklkZW50aWNhbEVudHJpZXMoc3RkOjp2ZWN0b3I8RGVwbG95UGF0Y2hHZW5lcmF0b3I6OlNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQSwgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQikgeworICAgICAgICBCdWlsZElkZW50aWNhbEVudHJpZXMob3V0SWRlbnRpY2FsRW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUIpOworICAgIH0KK307CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBJZGVudGljYWxGaWxlRW50cmllcykgeworICAgIHN0ZDo6c3RyaW5nIGFwa1BhdGggPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhQSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGFwa1BhdGguY19zdHIoKSk7CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgICBzdGQ6OnZlY3RvcjxEZXBsb3lQYXRjaEdlbmVyYXRvcjo6U2ltcGxlRW50cnk+IGVudHJpZXM7CisgICAgZ2VuZXJhdG9yLkdhdGhlcklkZW50aWNhbEVudHJpZXMoZW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUEpOworICAgIC8vIEV4cGVjdCB0aGUgZW50cnkgY291bnQgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtZXRhZGF0YS4KKyAgICBjb25zdCB1aW50MzJfdCBpZGVudGljYWxDb3VudCA9IGVudHJpZXMuc2l6ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGVudHJpZXNDb3VudCA9IG1ldGFkYXRhQS5lbnRyaWVzX3NpemUoKTsKKyAgICBFWFBFQ1RfRVEoaWRlbnRpY2FsQ291bnQsIGVudHJpZXNDb3VudCk7Cit9CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBOb0RldmljZU1ldGFkYXRhKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrUGF0aCA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgLy8gR2V0IHNpemUgb2Ygb3VyIHRlc3QgYXBrLgorICAgIGxvbmcgYXBrU2l6ZSA9IDA7CisgICAgeworICAgICAgICB1bmlxdWVfZmQgYXBrRmlsZShhZGJfb3BlbihhcGtQYXRoLmNfc3RyKCksIE9fUkRXUikpOworICAgICAgICBhcGtTaXplID0gYWRiX2xzZWVrKGFwa0ZpbGUsIDBMLCBTRUVLX0VORCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcGF0Y2ggdGhhdCBpcyAxMDAlIGRpZmZlcmVudC4KKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IodHJ1ZSk7CisgICAgZ2VuZXJhdG9yLkNyZWF0ZVBhdGNoKGFwa1BhdGguY19zdHIoKSwgIiIsIG91dHB1dC5mZCk7CisKKyAgICAvLyBFeHBlY3QgYSBwYXRjaCBmaWxlIHRoYXQgaGFzIGEgc2l6ZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvdXIgaW5pdGlhbCBBUEsuCisgICAgbG9uZyBwYXRjaFNpemUgPSBhZGJfbHNlZWsob3V0cHV0LmZkLCAwTCwgU0VFS19FTkQpOworICAgIEVYUEVDVF9HVChwYXRjaFNpemUsIGFwa1NpemUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNS4uMDAwMDAwMAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWluLUNsYXNzOiBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkRlcGxveVBhdGNoR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZGRkMQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkZncvWmlwRmlsZVJPLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9lbmRpYW4uaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrU2lnbmF0dXJlW10gPSAiRkFTVERFUExPWSI7CisKK0FQS01ldGFEYXRhIFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGNvbnN0IGNoYXIqIGFwa1BhdGgpIHsKKyAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YTsKKyN1bmRlZiBvcGVuCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OlppcEZpbGVSTz4gemlwRmlsZShhbmRyb2lkOjpaaXBGaWxlUk86Om9wZW4oYXBrUGF0aCkpOworI2RlZmluZSBvcGVuIF9fX3h4eF91bml4X29wZW4KKyAgICBpZiAoemlwRmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiQ291bGQgbm90IG9wZW4gJXMiLCBhcGtQYXRoKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgdm9pZCogY29va2llOworICAgIGlmICh6aXBGaWxlLT5zdGFydEl0ZXJhdGlvbigmY29va2llKSkgeworICAgICAgICBhbmRyb2lkOjpaaXBFbnRyeVJPIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemlwRmlsZS0+bmV4dEVudHJ5KGNvb2tpZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgZmlsZU5hbWVbMjU2XTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZmlsZSBuYW1lLgorICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGZpbGVuYW1lcyBsb25nZXIgdGhhbiAyNTYuCisgICAgICAgICAgICBpZiAoemlwRmlsZS0+Z2V0RW50cnlGaWxlTmFtZShlbnRyeSwgZmlsZU5hbWUsIHNpemVvZihmaWxlTmFtZSkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHVuY29tcHJlc3NlZFNpemUsIGNvbXByZXNzZWRTaXplLCBjcmMzMjsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YU9mZnNldDsKKyAgICAgICAgICAgIHppcEZpbGUtPmdldEVudHJ5SW5mbyhlbnRyeSwgbnVsbHB0ciwgJnVuY29tcHJlc3NlZFNpemUsICZjb21wcmVzc2VkU2l6ZSwgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNyYzMyKTsKKyAgICAgICAgICAgIEFQS0VudHJ5KiBhcGtFbnRyeSA9IGFwa01ldGFEYXRhLmFkZF9lbnRyaWVzKCk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2NyYzMyKGNyYzMyKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfZmlsZW5hbWUoZmlsZU5hbWUpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9jb21wcmVzc2Vkc2l6ZShjb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X3VuY29tcHJlc3NlZHNpemUodW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2RhdGFvZmZzZXQoZGF0YU9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFwa01ldGFEYXRhOworfQorCit2b2lkIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwga1NpZ25hdHVyZSwgc2l6ZW9mKGtTaWduYXR1cmUpIC0gMSk7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGludDY0X3QgdmFsdWUsIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIGludDY0X3QgdG9MaXR0bGVFbmRpYW4gPSBodG9sZTY0KHZhbHVlKTsKKyAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsICZ0b0xpdHRsZUVuZGlhbiwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpQaXBlKGJvcnJvd2VkX2ZkIGlucHV0LCBib3Jyb3dlZF9mZCBvdXRwdXQsIHNpemVfdCBhbW91bnQpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQ7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIHNpemVfdCB0cmFuc2ZlckFtb3VudCA9IDA7CisgICAgd2hpbGUgKHRyYW5zZmVyQW1vdW50ICE9IGFtb3VudCkgeworICAgICAgICBsb25nIGNodW5rQW1vdW50ID0KKyAgICAgICAgICAgICAgICBhbW91bnQgLSB0cmFuc2ZlckFtb3VudCA+IEJVRkZFUl9TSVpFID8gQlVGRkVSX1NJWkUgOiBhbW91bnQgLSB0cmFuc2ZlckFtb3VudDsKKyAgICAgICAgbG9uZyByZWFkQW1vdW50ID0gYWRiX3JlYWQoaW5wdXQsIGJ1ZmZlciwgY2h1bmtBbW91bnQpOworICAgICAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsIGJ1ZmZlciwgcmVhZEFtb3VudCk7CisgICAgICAgIHRyYW5zZmVyQW1vdW50ICs9IHJlYWRBbW91bnQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFkYl91bmlxdWVfZmQuaCIKKyNpbmNsdWRlICJmYXN0ZGVwbG95L3Byb3RvL0Fwa0VudHJ5LnBiLmgiCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgbWlycm9ycyB0aGUgUGF0Y2hVdGlscyBmcm9tIGRlcGxveSBhZ2VudC4KKyAqLworY2xhc3MgUGF0Y2hVdGlscyB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbG9jYWwgQVBLIGZpbGUgYW5kIGJ1aWxkcyB0aGUgQVBLTWV0YURhdGEgcmVxdWlyZWQgYnkgdGhlIHBhdGNoaW5nCisgICAgICogYWxnb3JpdGhtLiBUaGUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW4gZXJyb3IgYSBzdHJpbmcgaXMgcHJpbnRlZCB0byB0aGUgdGVybWluYWwgYW5kIGV4aXQoMSkKKyAgICAgKiBpcyBjYWxsZWQuCisgICAgICovCisgICAgc3RhdGljIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEgR2V0QVBLTWV0YURhdGEoY29uc3QgY2hhciogZmlsZSk7CisgICAgLyoqCisgICAgICogV3JpdGVzIGEgZml4ZWQgc2lnbmF0dXJlIHN0cmluZyB0byB0aGUgaGVhZGVyIG9mIHRoZSBwYXRjaC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZVNpZ25hdHVyZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBpbnQ2NCB0byB0aGUgfG91dHB1dHwgcmV2ZXJzaW5nIHRoZSBieXRlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZUxvbmcoaW50NjRfdCB2YWx1ZSwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKyAgICAvKioKKyAgICAgKiBDb3B5IHxhbW91bnR8IG9mIGRhdGEgZnJvbSB8aW5wdXR8IHRvIHxvdXRwdXR8LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFBpcGUoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgaW5wdXQsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbW91bnQpOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuICJmYXN0ZGVwbG95L3Rlc3RkYXRhLyIgKyBuYW1lOworfQorCitib29sIEZpbGVNYXRjaGVzQ29udGVudChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBpbnB1dCwgY29uc3QgY2hhciogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGNvbnRlbnRzU2l6ZSkgeworICAgIGFkYl9sc2VlayhpbnB1dCwgMCwgU0VFS19TRVQpOworICAgIC8vIFVzZSBhIHRlbXAgYnVmZmVyIGxhcmdlciB0aGFuIGFueSB0ZXN0IGNvbnRlbnRzLgorICAgIGNvbnN0ZXhwciBpbnQgQlVGRkVSX1NJWkUgPSAyMDQ4OworICAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBib29sIHJlc3VsdCA9IHRydWU7CisgICAgLy8gVmFsaWRhdGUgc2l6ZSBvZiBmaWxlcyBpcyBlcXVhbC4KKyAgICBzc2l6ZV90IHJlYWRBbW91bnQgPSBhZGJfcmVhZChpbnB1dCwgYnVmZmVyLCBCVUZGRVJfU0laRSk7CisgICAgRVhQRUNUX0VRKHJlYWRBbW91bnQsIGNvbnRlbnRzU2l6ZSk7CisgICAgcmVzdWx0ID0gbWVtY21wKGJ1ZmZlciwgY29udGVudHMsIHJlYWRBbW91bnQpID09IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkQW1vdW50OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGJ1ZmZlcltpXSk7CisgICAgfQorICAgIHByaW50ZigiID09ICIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHNTaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGNvbnRlbnRzW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU3dhcExvbmdXcml0ZXMpIHsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMHgwMDExMjIzMzQ0NTU2Njc3LCBvdXRwdXQuZmQpOworICAgIGFkYl9sc2VlayhvdXRwdXQuZmQsIDAsIFNFRUtfU0VUKTsKKyAgICBjb25zdCBjaGFyIGV4cGVjdGVkW10gPSB7MHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHgwMH07CisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgZXhwZWN0ZWQsIDgpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgUGlwZVdyaXRlc0Ftb3VudFRvT3V0cHV0KSB7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIlNvbWUgRGF0YSIpOworICAgIFRlbXBvcmFyeUZpbGUgaW5wdXQ7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgLy8gUG9wdWxhdGUgaW5wdXQgZmlsZS4KKyAgICBXcml0ZUZkRXhhY3RseShpbnB1dC5mZCwgZXhwZWN0ZWQpOworICAgIGFkYl9sc2VlayhpbnB1dC5mZCwgMCwgU0VFS19TRVQpOworICAgIC8vIE9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZCwgYW5kIG91dHB1dCBmaWxlIGZvciB3cml0ZS4KKyAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LmZkLCBvdXRwdXQuZmQsIGV4cGVjdGVkLnNpemUoKSk7CisgICAgLy8gVmFsaWRhdGUgcGlwZSB3b3JrZWQKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBleHBlY3RlZC5jX3N0cigpLCBleHBlY3RlZC5zaXplKCkpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU2lnbmF0dXJlQ29uc3RNYXRjaGVzKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrRmlsZSA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUob3V0cHV0LmZkKTsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cygiRkFTVERFUExPWSIpOworICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGNvbnRlbnRzLmNfc3RyKCksIGNvbnRlbnRzLnNpemUoKSkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBHYXRoZXJNZXRhZGF0YSkgeworICAgIHN0ZDo6c3RyaW5nIGFwa0ZpbGUgPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoYXBrRmlsZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldGFkYXRhOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwZWN0ZWRNZXRhZGF0YSk7CisgICAgc3RkOjpzdHJpbmcgYWN0dWFsTWV0YWRhdGE7CisgICAgbWV0YWRhdGEuU2VyaWFsaXplVG9TdHJpbmcoJmFjdHVhbE1ldGFkYXRhKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRNZXRhZGF0YSwgYWN0dWFsTWV0YWRhdGEpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lQYXRjaEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyZWFiLi4wMDAwMDAwCi0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmFzdGRlcGxveTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkFQS01ldGFEYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuQVBLRW50cnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTI4ICogMTAyNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICBzaG93VXNhZ2UoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJib3NlRmxhZyA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VGbGFnLmNvbXBhcmVUbygiLS12ZXJib3NlIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGFwa1BhdGggPSBhcmdzWzBdOwotICAgICAgICAgICAgU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBGaWxlIGhvc3RGaWxlID0gbmV3IEZpbGUoYXBrUGF0aCk7Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMgPSBnZXRNZXRhZGF0YUZyb21GaWxlKGRldmljZU1ldGFkYXRhUGF0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRldmljZSBFbnRyaWVzICgiICsgZGV2aWNlWmlwRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGRldmljZVppcEVudHJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGhvc3RGaWxlRW50cmllcyA9IFBhdGNoVXRpbHMuZ2V0QVBLTWV0YURhdGEoaG9zdEZpbGUpLmdldEVudHJpZXNMaXN0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkhvc3QgRW50cmllcyAoIiArIGhvc3RGaWxlRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGhvc3RGaWxlRW50cmllcykgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0ID0KLSAgICAgICAgICAgICAgICBnZXRJZGVudGljYWxDb250ZW50cyhkZXZpY2VaaXBFbnRyaWVzLCBob3N0RmlsZUVudHJpZXMpOwotICAgICAgICAgICAgcmVwb3J0SWRlbnRpY2FsQ29udGVudHMoaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUpOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gaWRlbnRpY2FsRW50cnkgOiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5IGVudHJ5ID0gaWRlbnRpY2FsRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklkZW50aWNhbCBFbnRyaWVzICgiICsgaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldC5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3JlYXRlUGF0Y2goaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUsIFN5c3RlbS5vdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2hvd1VzYWdlKGludCBleGl0Q29kZSkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInVzYWdlOiBkZXBsb3lwYXRjaGdlbmVyYXRvciA8YXBrcGF0aD4gPGRldmljZWFwa21ldGFkYXRhPiBbLS12ZXJib3NlXSIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBUEtFbnRyeVRvU3RyaW5nKEFQS0VudHJ5IGVudHJ5LCBTdHJpbmdCdWlsZGVyIG91dHB1dFN0cmluZykgewotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkZpbGVuYW1lOiAlc1xuIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNSQzMyOiAweCUwOFhcbiIsIGVudHJ5LmdldENyYzMyKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJEYXRhIE9mZnNldDogJWRcbiIsIGVudHJ5LmdldERhdGFPZmZzZXQoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldENvbXByZXNzZWRTaXplKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJVbmNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldFVuY29tcHJlc3NlZFNpemUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QVBLRW50cnk+IGdldE1ldGFkYXRhRnJvbUZpbGUoU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRldmljZU1ldGFkYXRhUGF0aCkpOwotICAgICAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YSA9IEFQS01ldGFEYXRhLnBhcnNlRGVsaW1pdGVkRnJvbShpcyk7Ci0gICAgICAgIHJldHVybiBhcGtNZXRhRGF0YS5nZXRFbnRyaWVzTGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZ2V0SWRlbnRpY2FsQ29udGVudHMoCi0gICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMsIExpc3Q8QVBLRW50cnk+IGhvc3RaaXBFbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4oKTsKLQotICAgICAgICBmb3IgKEFQS0VudHJ5IGRldmljZVppcEVudHJ5IDogZGV2aWNlWmlwRW50cmllcykgewotICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBob3N0WmlwRW50cnkgOiBob3N0WmlwRW50cmllcykgewotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VaaXBFbnRyeS5nZXRDcmMzMigpID09IGhvc3RaaXBFbnRyeS5nZXRDcmMzMigpICYmCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVppcEVudHJ5LmdldEZpbGVOYW1lKCkuZXF1YWxzKGhvc3RaaXBFbnRyeS5nZXRGaWxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZGVudGljYWxDb250ZW50cy5hZGQobmV3IFNpbXBsZUVudHJ5KGRldmljZVppcEVudHJ5LCBob3N0WmlwRW50cnkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGlkZW50aWNhbENvbnRlbnRzLCBuZXcgQ29tcGFyYXRvcjxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKAotICAgICAgICAgICAgICAgIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDEsIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5jb21wYXJlKHAxLmdldFZhbHVlKCkuZ2V0RGF0YU9mZnNldCgpLCBwMi5nZXRWYWx1ZSgpLmdldERhdGFPZmZzZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBpZGVudGljYWxDb250ZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydElkZW50aWNhbENvbnRlbnRzKAotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQsIEZpbGUgaG9zdEZpbGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKLSAgICAgICAgaW50IHRvdGFsRXF1YWxGaWxlcyA9IDA7Ci0gICAgICAgIGZvciAoU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBlbnRyaWVzIDogaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCkgewotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cmllcy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGhvc3RBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEZpbGVzKys7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzYXZpbmdQZXJjZW50ID0gKGZsb2F0KSAodG90YWxFcXVhbEJ5dGVzICogMTAwKSAvIGhvc3RGaWxlLmxlbmd0aCgpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGV0ZWN0ZWQgIiArIHRvdGFsRXF1YWxGaWxlcyArICIgZXF1YWwgQVBLIGVudHJpZXMiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHRvdGFsRXF1YWxCeXRlcyArICIgYnl0ZXMgYXJlIGVxdWFsIG91dCBvZiAiICsgaG9zdEZpbGUubGVuZ3RoKCkgKyAiICgiCi0gICAgICAgICAgICArIHNhdmluZ1BlcmNlbnQgKyAiJSkiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjcmVhdGVQYXRjaChMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IHppcEVudHJ5U2ltcGxlRW50cnlzLAotICAgICAgICBGaWxlIGhvc3RGaWxlLCBPdXRwdXRTdHJlYW0gcGF0Y2hTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgUGF0Y2hGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaG9zdEZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaG9zdEZpbGUpOwotCi0gICAgICAgIHBhdGNoU3RyZWFtLndyaXRlKFBhdGNoVXRpbHMuU0lHTkFUVVJFLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoaG9zdEZpbGUubGVuZ3RoKCksIHBhdGNoU3RyZWFtKTsKLQotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICBsb25nIHRvdGFsQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgSXRlcmF0b3I8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yID0KLSAgICAgICAgICAgIHppcEVudHJ5U2ltcGxlRW50cnlzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGVudHJ5U2ltcGxlRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQVBLRW50cnkgZGV2aWNlQVBLRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cnlTaW1wbGVFbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBsb25nIG5ld0RhdGFMZW4gPSBob3N0QVBLRW50cnkuZ2V0RGF0YU9mZnNldCgpIC0gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFPZmZzZXQgPSBkZXZpY2VBUEtFbnRyeS5nZXREYXRhT2Zmc2V0KCk7Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFMZW4gPSBkZXZpY2VBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotCi0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhuZXdEYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUoaG9zdEZpbGVJbnB1dFN0cmVhbSwgcGF0Y2hTdHJlYW0sIGJ1ZmZlciwgbmV3RGF0YUxlbik7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhT2Zmc2V0LCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGxvbmcgc2tpcCA9IGhvc3RGaWxlSW5wdXRTdHJlYW0uc2tpcChvbGREYXRhTGVuKTsKLSAgICAgICAgICAgIGlmIChza2lwICE9IG9sZERhdGFMZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGF0Y2hGb3JtYXRFeGNlcHRpb24oInNraXAgZXJyb3I6IGF0dGVtcHRlZCB0byBza2lwICIgKyBvbGREYXRhTGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBieXRlcyBidXQgcmV0dXJuIGNvZGUgd2FzICIgKyBza2lwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IG9sZERhdGFMZW4gKyBuZXdEYXRhTGVuOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgcmVtYWluZGVyTGVuID0gaG9zdEZpbGUubGVuZ3RoKCkgLSB0b3RhbEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcocmVtYWluZGVyTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMucGlwZShob3N0RmlsZUlucHV0U3RyZWFtLCBwYXRjaFN0cmVhbSwgYnVmZmVyLCByZW1haW5kZXJMZW4pOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZygwLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKDAsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgcGF0Y2hTdHJlYW0uZmx1c2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YSBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YQpAQCAtMCwwICsxLDYgQEAKKworIwjHgs+rDBIUTUVUQS1JTkYvTUFOSUZFU1QuTUYYxwYgUShXCisjCIONlY4HEhNBbmRyb2lkTWFuaWZlc3QueG1sGDEg5AUo6A8KKzYIprWAPhIjbGliL2FybWVhYmktdjdhL2xpYnZ1bGthbl9zYW1wbGUuc28YgQ4gwNJRKIyy7AEKKyAIl+OXkQ4SDnJlc291cmNlcy5hcnNjGPTgUSC0BCi0BAorHAiLnMLJAhILY2xhc3Nlcy5kZXgYwQcg/wUo9ApkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3ZTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnMuY3BwIGIvZnNfbWdyL2ZzX21ncl9vdmVybGF5ZnMuY3BwCmluZGV4IDJmMGJmN2QuLmFjMTVjZTQgMTAwNjQ0Ci0tLSBhL2ZzX21nci9mc19tZ3Jfb3ZlcmxheWZzLmNwcAorKysgYi9mc19tZ3IvZnNfbWdyX292ZXJsYXlmcy5jcHAKQEAgLTEwMDksNyArMTAwOSw3IEBACiAgICAgRnN0YWIgY2FuZGlkYXRlczsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogZnN0YWIpIHsKICAgICAgICAgRnN0YWJFbnRyeSBuZXdfZW50cnkgPSBlbnRyeTsKLSAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChlbnRyeS5tb3VudF9wb2ludCkgfHwKKyAgICAgICAgaWYgKCFmc19tZ3Jfb3ZlcmxheWZzX2FscmVhZHlfbW91bnRlZChlbnRyeS5tb3VudF9wb2ludCkgJiYKICAgICAgICAgICAgICFmc19tZ3Jfd2FudHNfb3ZlcmxheWZzKCZuZXdfZW50cnkpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2RtLmNwcCBiL2ZzX21nci9saWJkbS9kbS5jcHAKaW5kZXggMWQyNjgzYS4uYTRlMGQ3NiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtLmNwcAorKysgYi9mc19tZ3IvbGliZG0vZG0uY3BwCkBAIC0xNTAsNiArMTUwLDE1IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK3N0ZDo6b3B0aW9uYWw8RGV2aWNlTWFwcGVyOjpJbmZvPiBEZXZpY2VNYXBwZXI6OkdldERldGFpbGVkSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgeworICAgIHN0cnVjdCBkbV9pb2N0bCBpbzsKKyAgICBJbml0SW8oJmlvLCBuYW1lKTsKKyAgICBpZiAoaW9jdGwoZmRfLCBETV9ERVZfU1RBVFVTLCAmaW8pIDwgMCkgeworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICByZXR1cm4gSW5mbyhpby5mbGFncyk7Cit9CisKIERtRGV2aWNlU3RhdGUgRGV2aWNlTWFwcGVyOjpHZXRTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3QgewogICAgIHN0cnVjdCBkbV9pb2N0bCBpbzsKICAgICBJbml0SW8oJmlvLCBuYW1lKTsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmggYi9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCmluZGV4IDc1M2I4YzkuLmM2YjM3Y2YgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKKysrIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaApAQCAtMjcsNiArMjcsNyBAQAogCiAjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CkBAIC03MCwxMCArNzEsMjcgQEAKICAgICAgICAgdWludDY0X3QgZGV2XzsKICAgICB9OwogCisgICAgY2xhc3MgSW5mbyB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzXzsKKworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBJbmZvKHVpbnQzMl90IGZsYWdzKSA6IGZsYWdzXyhmbGFncykge30KKworICAgICAgICBib29sIElzQWN0aXZlVGFibGVQcmVzZW50KCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fQUNUSVZFX1BSRVNFTlRfRkxBRzsgfQorICAgICAgICBib29sIElzQnVmZmVyRnVsbCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX0JVRkZFUl9GVUxMX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc0luYWN0aXZlVGFibGVQcmVzZW50KCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fSU5BQ1RJVkVfUFJFU0VOVF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNSZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX1JFQURPTkxZX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc1N1c3BlbmRlZCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX1NVU1BFTkRfRkxBRzsgfQorICAgIH07CisKICAgICAvLyBSZW1vdmVzIGEgZGV2aWNlIG1hcHBlciBkZXZpY2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KICAgICAvLyBSZXR1cm5zICd0cnVlJyBvbiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgYm9vbCBEZWxldGVEZXZpY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOwogCisgICAgLy8gRmV0Y2hlcyBhbmQgcmV0dXJucyB0aGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlIG1hcHBlcgorICAgIC8vIGRldmljZSB3aXRoIGdpdmVuIG5hbWUuCisgICAgc3RkOjpvcHRpb25hbDxJbmZvPiBHZXREZXRhaWxlZEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OworCiAgICAgLy8gUmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgbWFwcGVyIGRldmljZQogICAgIC8vIHdpdGggZ2l2ZW4gbmFtZS4KICAgICAvLyBPbmUgb2YgSU5WQUxJRCwgU1VTUEVOREVEIG9yIEFDVElWRS4KZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKaW5kZXggYzJhMGYzMy4uNjQyZjJjMSAxMDA3NTUKLS0tIGEvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKKysrIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKQEAgLTE1LDEwICsxNSwxMyBAQAogCiBhZGIgcmVtb3VudCB0ZXN0cwogCi0tLWhlbHAgICAgICAgIFRoaXMgaGVscAotLS1zZXJpYWwgICAgICBTcGVjaWZ5IGRldmljZSAobXVzdCBpZiBtdWx0aXBsZSBhcmUgcHJlc2VudCkKLS0tY29sb3IgICAgICAgRHJlc3Mgb3V0cHV0IHdpdGggaGlnaGxpZ2h0aW5nIGNvbG9ycwotLS1wcmludC10aW1lICBSZXBvcnQgdGhlIHRlc3QgZHVyYXRpb24KKy0tY29sb3IgICAgICAgICAgICAgICAgICAgICBEcmVzcyBvdXRwdXQgd2l0aCBoaWdobGlnaHRpbmcgY29sb3JzCistLWhlbHAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBoZWxwCistLW5vLXdhaXQtc2NyZWVuICAgICAgICAgICAgRG8gbm90IHdhaXQgZm9yIGRpc3BsYXkgc2NyZWVuIHRvIHNldHRsZQorLS1wcmludC10aW1lICAgICAgICAgICAgICAgIFJlcG9ydCB0aGUgdGVzdCBkdXJhdGlvbgorLS1zZXJpYWwgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgZGV2aWNlIChtdXN0IGlmIG11bHRpcGxlIGFyZSBwcmVzZW50KQorLS13YWl0LWFkYiA8ZHVyYXRpb24+ICAgICAgIGFkYiB3YWl0IHRpbWVvdXQKKy0td2FpdC1mYXN0Ym9vdCA8ZHVyYXRpb24+ICBmYXN0Ym9vdCB3YWl0IHRpbWVvdXQKIAogQ29uZGl0aW9uczoKICAtIE11c3QgYmUgYSB1c2VyZGVidWcgYnVpbGQuCkBAIC01Myw2ICs1Niw3IEBACiAKIEFEQl9XQUlUPTRtCiBGQVNUQk9PVF9XQUlUPTJtCitzY3JlZW5fd2FpdD10cnVlCiAKICMjCiAjIyAgSGVscGVyIEZ1bmN0aW9ucwpAQCAtMTg1LDcgKzE4OSw3IEBACiBbICJVU0FHRTogYWRiX2NhdCA8ZmlsZT4gPnN0ZG91dAogCiBSZXR1cm5zOiBjb250ZW50IG9mIGZpbGUgdG8gc3Rkb3V0IHdpdGggY2FycmlhZ2UgcmV0dXJucyBza2lwcGVkLAotICAgICAgICAgdHJ1ZSBvZiB0aGUgZmlsZSBleGlzdHMiIF0KKyAgICAgICAgIHRydWUgaWYgdGhlIGZpbGUgZXhpc3RzIiBdCiBhZGJfY2F0KCkgewogICAgIGxvY2FsIE9VVFBVVD0iYGFkYl9zaCBjYXQgJHsxfSA8L2Rldi9udWxsIDI+JjFgIgogICAgIGxvY2FsIHJldD0kez99CkBAIC0xOTMsNiArMTk3LDE3IEBACiAgICAgcmV0dXJuICR7cmV0fQogfQogCitbICJVU0FHRTogYWRiX2xzIDxkaXJmaWxlPiA+c3Rkb3V0CisKK1JldHVybnM6IGZpbGVuYW1lIG9yIGRpcmVjdG9ydSBjb250ZW50IHRvIHN0ZG91dCB3aXRoIGNhcnJpYWdlIHJldHVybnMgc2tpcHBlZCwKKyAgICAgICAgIHRydWUgaWYgdGhlIGxzIGhhZCBubyBlcnJvcnMiIF0KK2FkYl9scygpIHsKKyAgICBsb2NhbCBPVVRQVVQ9ImBhZGJfc2ggbHMgJHsxfSA8L2Rldi9udWxsIDI+L2Rldi9udWxsYCIKKyAgICBsb2NhbCByZXQ9JHs/fQorICAgIGVjaG8gIiR7T1VUUFVUfSIgfCB0ciAtZCAnXHInCisgICAgcmV0dXJuICR7cmV0fQorfQorCiBbICJVU0FHRTogYWRiX3JlYm9vdAogCiBSZXR1cm5zOiB0cnVlIGlmIHRoZSByZWJvb3QgY29tbWFuZCBzdWNjZWVkZWQiIF0KQEAgLTQzNiw2ICs0NTEsMTAgQEAKIC1uIC0gZWNobyBuZXdsaW5lIGF0IGV4aXQKIFRJTUVPVVQgLSBkZWZhdWx0IGBmb3JtYXRfZHVyYXRpb24gJHt3YWl0X2Zvcl9zY3JlZW5fdGltZW91dH1gIiBdCiB3YWl0X2Zvcl9zY3JlZW4oKSB7CisgIGlmICEgJHtzY3JlZW5fd2FpdH07IHRoZW4KKyAgICBhZGJfd2FpdAorICAgIHJldHVybgorICBmaQogICBleGl0X2Z1bmN0aW9uPXRydWUKICAgaWYgWyBYIi1uIiA9IFgiJHsxfSIgXTsgdGhlbgogICAgIGV4aXRfZnVuY3Rpb249ZWNobwpAQCAtNzQzLDYgKzc2Miw5IEBACiAKIE9QVElPTlM9YGdldG9wdCAtLWFsdGVybmF0aXZlIC0tdW5xdW90ZWQgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgaGVscCxzZXJpYWw6LGNvbG91cixjb2xvcixuby1jb2xvdXIsbm8tY29sb3IgXAorICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgd2FpdC1hZGI6LHdhaXQtZmFzdGJvb3Q6IFwKKyAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIHdhaXQtc2NyZWVuLHdhaXQtZGlzcGxheSBcCisgICAgICAgICAgICAgICAgLS1sb25nb3B0aW9ucyBuby13YWl0LXNjcmVlbixuby13YWl0LWRpc3BsYXkgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgZ3Rlc3RfcHJpbnRfdGltZSxwcmludC10aW1lIFwKICAgICAgICAgICAgICAgICAtLSAiP2hzOiIgJHsqfWAgfHwKICAgKCBlY2hvICIke1VTQUdFfSIgPiYyIDsgZmFsc2UgKSB8fApAQCAtNzY2LDkgKzc4OCwyMyBAQAogICAgIC0tbm8tY29sb3IgfCAtLW5vLWNvbG91cikKICAgICAgIGNvbG9yPWZhbHNlCiAgICAgICA7OworICAgIC0tbm8td2FpdC1kaXNwbGF5IHwgLS1uby13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PWZhbHNlCisgICAgICA7OworICAgIC0td2FpdC1kaXNwbGF5IHwgLS13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PXRydWUKKyAgICAgIDs7CiAgICAgLS1wcmludC10aW1lIHwgLS1ndGVzdF9wcmludF90aW1lKQogICAgICAgcHJpbnRfdGltZT10cnVlCiAgICAgICA7OworICAgIC0td2FpdC1hZGIpCisgICAgICBBREJfV0FJVD0kezJ9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLXdhaXQtZmFzdGJvb3QpCisgICAgICBGQVNUQk9PVF9XQUlUPSR7Mn0KKyAgICAgIHNoaWZ0CisgICAgICA7OwogICAgIC0tKQogICAgICAgc2hpZnQKICAgICAgIGJyZWFrCkBAIC0xMTQ1LDEwICsxMTgxLDE0IEBACiAKIEE9IkhlbGxvIFdvcmxkISAkKGRhdGUpIgogZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vc3lzdGVtL2hlbGxvIgorZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vc3lzdGVtL3ByaXYtYXBwL2hlbGxvIgogZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vdmVuZG9yL2hlbGxvIgogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiIHx8Ci0gIGRpZSAic3l0ZW0gaGVsbG8iCisgIGRpZSAic3lzdGVtIGhlbGxvIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvc3lzdGVtIGJlZm9yZSByZWJvb3QKK0I9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIiB8fAorICBkaWUgInN5c3RlbSBwcml2LWFwcCBoZWxsbyIKK2NoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbS9wcml2LWFwcCBiZWZvcmUgcmVib290CiBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIgfHwKICAgZGllICJ2ZW5kb3IgaGVsbG8iCiBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC92ZW5kb3IgYmVmb3JlIHJlYm9vdApAQCAtMTIzMCw2ICsxMjcwLDEzIEBACiBmaQogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0gYWZ0ZXIgcmVib290CisjIElmIG92ZXJsYXlmcyBoYXMgYSBuZXN0ZWQgc2VjdXJpdHkgcHJvYmxlbSwgdGhpcyB3aWxsIGZhaWwuCitCPSJgYWRiX2xzIC9zeXN0ZW0vYCIgfHwKKyAgZGlyICJhZGIgbHMgL3N5c3RlbSIKK1sgWCIke0J9IiAhPSBYIiR7QiMqcHJpdi1hcHB9IiBdIHx8CisgIGRpciAiYWRiIGxzIC9zeXN0ZW0vcHJpdi1hcHAiCitCPSJgYWRiX2NhdCAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvYCIKK2NoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbS9wcml2LWFwcCBhZnRlciByZWJvb3QKIGVjaG8gIiR7R1JFRU59WyAgICAgICBPSyBdJHtOT1JNQUx9IC9zeXN0ZW0gY29udGVudCByZW1haW5zIGFmdGVyIHJlYm9vdCIgPiYyCiAjIE9ubHkgcm9vdCBjYW4gcmVhZCB2ZW5kb3IgaWYgc2Vwb2xpY3kgcGVybWlzc2lvbnMgYXJlIGFzIGV4cGVjdGVkLgogYWRiX3Jvb3QgfHwKQEAgLTEzNTEsNiArMTM5OCwxMiBAQAogICBmaQogICBCPSJgYWRiX2NhdCAvc3lzdGVtL2hlbGxvYCIKICAgY2hlY2tfZXEgIiR7QX0iICIke0J9IiBzeXN0ZW0gYWZ0ZXIgZmxhc2ggdmVuZG9yCisgIEI9ImBhZGJfbHMgL3N5c3RlbS9gIiB8fAorICAgIGRpciAiYWRiIGxzIC9zeXN0ZW0iCisgIFsgWCIke0J9IiAhPSBYIiR7QiMqcHJpdi1hcHB9IiBdIHx8CisgICAgZGlyICJhZGIgbHMgL3N5c3RlbS9wcml2LWFwcCIKKyAgQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCisgIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgc3lzdGVtL3ByaXYtYXBwIGFmdGVyIGZsYXNoIHZlbmRvcgogICBhZGJfcm9vdCB8fAogICAgIGRpZSAiYWRiIHJvb3QiCiAgIEI9ImBhZGJfY2F0IC92ZW5kb3IvaGVsbG9gIgpAQCAtMTM5MiwxNSArMTQ0NSwxNyBAQAogZWNobyAiJHtIfSIKIFsgJHtlcnJ9ID0gMCBdICYmCiAgICggYWRiX3NoIHJtIC92ZW5kb3IvaGVsbG8gPC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0cnVlICkgJiYKLSAgYWRiX3NoIHJtIC9zeXN0ZW0vaGVsbG8gPC9kZXYvbnVsbCB8fAorICBhZGJfc2ggcm0gL3N5c3RlbS9oZWxsbyAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvIDwvZGV2L251bGwgfHwKICAgKCBbIC1uICIke0x9IiBdICYmIGVjaG8gIiR7TH0iICYmIGZhbHNlICkgfHwKICAgZGllIC10ICR7VH0gImNsZWFudXAgaGVsbG8iCiBCPSJgYWRiX2NhdCAvc3lzdGVtL2hlbGxvYCIKIGNoZWNrX2VxICJjYXQ6IC9zeXN0ZW0vaGVsbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiICIke0J9IiBhZnRlciBybQorQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCitjaGVja19lcSAiY2F0OiAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAiJHtCfSIgYWZ0ZXIgcm0KIEI9ImBhZGJfY2F0IC92ZW5kb3IvaGVsbG9gIgogY2hlY2tfZXEgImNhdDogL3ZlbmRvci9oZWxsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgIiR7Qn0iIGFmdGVyIHJtCiAKLWlmIFsgLW4gIiR7c2NyYXRjaF9wYXJ0aXRpb259IiBdOyB0aGVuCitpZiAke2lzX2Jvb3Rsb2FkZXJfZmFzdGJvb3R9ICYmIFsgLW4gIiR7c2NyYXRjaF9wYXJ0aXRpb259IiBdOyB0aGVuCiAKICAgZWNobyAiJHtHUkVFTn1bIFJVTiAgICAgIF0ke05PUk1BTH0gdGVzdCBmYXN0Ym9vdCBmbGFzaCB0byAke3NjcmF0Y2hfcGFydGl0aW9ufSByZWNvdmVyeSIgPiYyCiAKQEAgLTE1NDIsNyArMTU5Nyw5IEBACiAgICAgYWRiX3dhaXQgJHtBREJfV0FJVH0gfHwKICAgICBkaWUgImFkYiByZW1vdW50IC1SIgogICBpZiBbICJvcmFuZ2UiICE9ICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCi0gICAgICAgIjIiID0gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KKyAgICAgICAiMiIgPSAiYGdldF9wcm9wZXJ0eSBwYXJ0aXRpb24uc3lzdGVtLnZlcmlmaWVkYCIgXSAmJgorICAgICBbIC1uICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCisgICAgICAgLW4gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KICAgICBkaWUgInJlbW91bnQgLVIgY29tbWFuZCBmYWlsZWQgdG8gZGlzYWJsZSB2ZXJpdHkiCiAgIGZpCiAKZGlmZiAtLWdpdCBhL2xpYmlvbi9PV05FUlMgYi9saWJpb24vT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2FkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJpb24vT1dORVJTCkBAIC0wLDAgKzEsMiBAQAorc3NwYXRpbEBnb29nbGUuY29tCitocmlkeWFAZ29vZ2xlLmNvbQo=