ZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCmluZGV4IGY0ZTg2NjQuLmZiYWUyMTkgMTAwNjQ0Ci0tLSBhL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKKysrIGIvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcApAQCAtMjcsNiArMjcsOSBAQAogI2luY2x1ZGUgImFuZHJvaWRmdy9aaXBGaWxlUk8uaCIKICNpbmNsdWRlICJjbGllbnQvZmlsZV9zeW5jX2NsaWVudC5oIgogI2luY2x1ZGUgImNvbW1hbmRsaW5lLmgiCisjaW5jbHVkZSAiZGVwbG95YWdlbnQuaW5jIiAgICAgICAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZGVwbG95YWdlbnRzY3JpcHQuaW5jIiAgLy8gR2VuZXJhdGVkIGluY2x1ZGUgdmlhIGJ1aWxkIHJ1bGUuCisjaW5jbHVkZSAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCiAjaW5jbHVkZSAiZmFzdGRlcGxveWNhbGxiYWNrcy5oIgogI2luY2x1ZGUgInN5c2RlcHMuaCIKIApAQCAtMzUsNiArMzgsOCBAQAogc3RhdGljIGNvbnN0ZXhwciBsb25nIGtSZXF1aXJlZEFnZW50VmVyc2lvbiA9IDB4MDAwMDAwMDI7CiAKIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50UGF0aCA9ICIvZGF0YS9sb2NhbC90bXAvIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50RmlsZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVwbG95YWdlbnQuamFyIjsKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga0RldmljZUFnZW50U2NyaXB0ID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudCI7CiAKIHN0YXRpYyBib29sIGdfdXNlX2xvY2FsYWdlbnQgPSBmYWxzZTsKIApAQCAtNzEsNDYgKzc2LDMyIEBACiAgICAgZ191c2VfbG9jYWxhZ2VudCA9IHVzZV9sb2NhbGFnZW50OwogfQogCi0vLyBsb2NhbF9wYXRoIC0gbXVzdCBzdGFydCB3aXRoIGEgJy8nIGFuZCBiZSByZWxhdGl2ZSB0byAkQU5EUk9JRF9QUk9EVUNUX09VVAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKGNvbnN0IGNoYXIqIGxvY2FsX3BhdGgsIGNvbnN0IGNoYXIqIHNka19wYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgYWRiX2RpciA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKLSAgICBpZiAoYWRiX2Rpci5lbXB0eSgpKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBkZXRlcm1pbmUgbG9jYXRpb24gb2YgYWRiISIpOwotICAgIH0KLQotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIGNvbnN0IGNoYXIqIHByb2R1Y3Rfb3V0ID0gZ2V0ZW52KCJBTkRST0lEX1BST0RVQ1RfT1VUIik7Ci0gICAgICAgIGlmIChwcm9kdWN0X291dCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlICVzIGJlY2F1c2UgJEFORFJPSURfUFJPRFVDVF9PVVQgaXMgbm90IGRlZmluZWQiLAotICAgICAgICAgICAgICAgICAgICAgICBsb2NhbF9wYXRoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlcyVzIiwgcHJvZHVjdF9vdXQsIGxvY2FsX3BhdGgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBhZGJfZGlyICsgc2RrX3BhdGg7Ci0gICAgfQotfQotCiBzdGF0aWMgYm9vbCBkZXBsb3lfYWdlbnQoYm9vbCBjaGVja1RpbWVTdGFtcHMpIHsKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gc3JjczsKLSAgICBzdGQ6OnN0cmluZyBqYXJfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9mcmFtZXdvcmsvZGVwbG95YWdlbnQuamFyIiwgIi9kZXBsb3lhZ2VudC5qYXIiKTsKLSAgICBzdGQ6OnN0cmluZyBzY3JpcHRfcGF0aCA9Ci0gICAgICAgICAgICBnZXRfYWdlbnRfY29tcG9uZW50X2hvc3RfcGF0aCgiL3N5c3RlbS9iaW4vZGVwbG95YWdlbnQiLCAiL2RlcGxveWFnZW50Iik7Ci0gICAgc3Jjcy5wdXNoX2JhY2soamFyX3BhdGguY19zdHIoKSk7Ci0gICAgc3Jjcy5wdXNoX2JhY2soc2NyaXB0X3BhdGguY19zdHIoKSk7Ci0KLSAgICBpZiAoZG9fc3luY19wdXNoKHNyY3MsIGtEZXZpY2VBZ2VudFBhdGgsIGNoZWNrVGltZVN0YW1wcykpIHsKLSAgICAgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KLSAgICAgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5Ci0gICAgICAgIGNvbnN0IGNoYXIqIGtDaG1vZENvbW1hbmRQYXR0ZXJuID0gImNobW9kIDc3NyAlc2RlcGxveWFnZW50IjsKLSAgICAgICAgc3RkOjpzdHJpbmcgY2htb2RDb21tYW5kID0KLSAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFBhdGgpOwotICAgICAgICBpbnQgcmV0ID0gc2VuZF9zaGVsbF9jb21tYW5kKGNobW9kQ29tbWFuZCk7Ci0gICAgICAgIGlmIChyZXQgIT0gMCkgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBwdXNoaW5nIGFnZW50IGZpbGVzIHRvIGRldmljZSIpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50LmZkLCBrRGVwbG95QWdlbnQsIHNpemVvZihrRGVwbG95QWdlbnQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50RmlsZSwgY2hlY2tUaW1lU3RhbXBzKSkgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gcHVzaCBmYXN0ZGVwbG95IGFnZW50IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIFRPRE86IERlcGxveSBhZ2VudCBmcm9tIGJpbjJjIGRpcmVjdGx5IGluc3RlYWQgb2Ygd3JpdGluZyB0byBkaXNrIGZpcnN0LgorICAgIFRlbXBvcmFyeUZpbGUgdGVtcEFnZW50U2NyaXB0OworICAgIGFuZHJvaWQ6OmJhc2U6OldyaXRlRnVsbHkodGVtcEFnZW50U2NyaXB0LmZkLCBrRGVwbG95QWdlbnRTY3JpcHQsIHNpemVvZihrRGVwbG95QWdlbnRTY3JpcHQpKTsKKyAgICBzcmNzLnB1c2hfYmFjayh0ZW1wQWdlbnRTY3JpcHQucGF0aCk7CisgICAgaWYgKCFkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50U2NyaXB0LCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgc2NyaXB0IHRvIGRldmljZS4iKTsKKyAgICB9CisgICAgc3Jjcy5jbGVhcigpOworICAgIC8vIG9uIHdpbmRvd3MgdGhlIHNoZWxsIHNjcmlwdCBtaWdodCBoYXZlIGxvc3QgZXhlY3V0ZSBwZXJtaXNzaW9uCisgICAgLy8gc28gbmVlZCB0byBzZXQgdGhpcyBleHBsaWNpdGx5CisgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzIjsKKyAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQorICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKGtDaG1vZENvbW1hbmRQYXR0ZXJuLCBrRGV2aWNlQWdlbnRTY3JpcHQpOworICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKKyAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRXJyb3IgZXhlY3V0aW5nICVzIHJldHVybmNvZGU6ICVkIiwgY2htb2RDb21tYW5kLmNfc3RyKCksIHJldCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yMzgsMzQgKzIyOSwxNSBAQAogICAgIH0KIH0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpIHsKLSAgICBpZiAoZ191c2VfbG9jYWxhZ2VudCkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb24gYSBXaW5kb3dzIG1hY2hpbmUKLSAgICAgICAgY29uc3QgY2hhciogaG9zdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfSE9TVF9PVVQiKTsKLSAgICAgICAgaWYgKGhvc3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoCi0gICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciBiZWNhdXNlICRBTkRST0lEX0hPU1RfT1VUICIKLSAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBkZWZpbmVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiamF2YSAtamFyICVzL2ZyYW1ld29yay9kZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3Rfb3V0KTsKLSAgICB9Ci0KLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGxvY2F0ZSBkZXBsb3lwYXRjaGdlbmVyYXRvci5qYXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihSIihqYXZhIC1qYXIgIiVzL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkYl9kaXIuY19zdHIoKSk7Ci19Ci0KIHZvaWQgY3JlYXRlX3BhdGNoKGNvbnN0IGNoYXIqIGFwa1BhdGgsIGNvbnN0IGNoYXIqIG1ldGFkYXRhUGF0aCwgY29uc3QgY2hhciogcGF0Y2hQYXRoKSB7Ci0gICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVQYXRjaENvbW1hbmQgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICBSIiglcyAiJXMiICIlcyIgPiAiJXMiKSIsIGdldF9wYXRjaF9nZW5lcmF0b3JfY29tbWFuZCgpLmNfc3RyKCksIGFwa1BhdGgsIG1ldGFkYXRhUGF0aCwKLSAgICAgICAgICAgIHBhdGNoUGF0aCk7Ci0gICAgaW50IHJldHVybkNvZGUgPSBzeXN0ZW0oZ2VuZXJhdGVQYXRjaENvbW1hbmQuY19zdHIoKSk7Ci0gICAgaWYgKHJldHVybkNvZGUgIT0gMCkgewotICAgICAgICBlcnJvcl9leGl0KCJFeGVjdXRpbmcgJXMgcmV0dXJuZWQgJWQiLCBnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpLCByZXR1cm5Db2RlKTsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IoZmFsc2UpOworICAgIHVuaXF1ZV9mZCBwYXRjaEZkKGFkYl9vcGVuKHBhdGNoUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19DTE9FWEVDKSk7CisgICAgaWYgKHBhdGNoRmQgPCAwKSB7CisgICAgICAgIHBlcnJvcl9leGl0KCJhZGI6IGZhaWxlZCB0byBjcmVhdGUgJXMiLCBwYXRjaFBhdGgpOworICAgIH0KKyAgICBib29sIHN1Y2Nlc3MgPSBnZW5lcmF0b3IuQ3JlYXRlUGF0Y2goYXBrUGF0aCwgbWV0YWRhdGFQYXRoLCBwYXRjaEZkKTsKKyAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIGNyZWF0ZSBwYXRjaCBmb3IgJXMiLCBhcGtQYXRoKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL2FkYi9kYWVtb24vc2hlbGxfc2VydmljZS5jcHAgYi9hZGIvZGFlbW9uL3NoZWxsX3NlcnZpY2UuY3BwCmluZGV4IGRlOTcwNjguLjBmYjE0YzQgMTAwNjQ0Ci0tLSBhL2FkYi9kYWVtb24vc2hlbGxfc2VydmljZS5jcHAKKysrIGIvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcApAQCAtMjIyLDcgKzIyMiw3IEBACiBib29sIFN1YnByb2Nlc3M6OkZvcmtBbmRFeGVjKHN0ZDo6c3RyaW5nKiBlcnJvcikgewogICAgIHVuaXF1ZV9mZCBjaGlsZF9zdGRpbm91dF9zZmQsIGNoaWxkX3N0ZGVycl9zZmQ7CiAgICAgdW5pcXVlX2ZkIHBhcmVudF9lcnJvcl9zZmQsIGNoaWxkX2Vycm9yX3NmZDsKLSAgICBjaGFyIHB0c19uYW1lW1BBVEhfTUFYXTsKKyAgICBjb25zdCBjaGFyKiBwdHNfbmFtZSA9IG51bGxwdHI7CiAKICAgICBpZiAoY29tbWFuZF8uZW1wdHkoKSkgewogICAgICAgICBfX2FuZHJvaWRfbG9nX3NlY3VyaXR5X2Jzd3JpdGUoU0VDX1RBR19BREJfU0hFTExfSU5URVJBQ1RJVkUsICIiKTsKQEAgLTI4MywxMCArMjgzLDIyIEBACiAgICAgY2Vudi5wdXNoX2JhY2sobnVsbHB0cik7CiAKICAgICBpZiAodHlwZV8gPT0gU3VicHJvY2Vzc1R5cGU6OmtQdHkpIHsKLSAgICAgICAgaW50IGZkOwotICAgICAgICBwaWRfID0gZm9ya3B0eSgmZmQsIHB0c19uYW1lLCBudWxscHRyLCBudWxscHRyKTsKKyAgICAgICAgdW5pcXVlX2ZkIHB0eV9tYXN0ZXIocG9zaXhfb3BlbnB0KE9fUkRXUiB8IE9fTk9DVFRZIHwgT19DTE9FWEVDKSk7CisgICAgICAgIGlmIChwdHlfbWFzdGVyID09IC0xKSB7CisgICAgICAgICAgICAqZXJyb3IgPQorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoImZhaWxlZCB0byBjcmVhdGUgcHR5IG1hc3RlcjogJXMiLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh1bmxvY2twdChwdHlfbWFzdGVyLmdldCgpKSAhPSAwKSB7CisgICAgICAgICAgICAqZXJyb3IgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoImZhaWxlZCB0byB1bmxvY2twdCBwdHkgbWFzdGVyOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHBpZF8gPSBmb3JrKCk7CisgICAgICAgIHB0c19uYW1lID0gcHRzbmFtZShwdHlfbWFzdGVyLmdldCgpKTsKICAgICAgICAgaWYgKHBpZF8gPiAwKSB7Ci0gICAgICAgICAgc3RkaW5vdXRfc2ZkXy5yZXNldChmZCk7CisgICAgICAgICAgICBzdGRpbm91dF9zZmRfID0gc3RkOjptb3ZlKHB0eV9tYXN0ZXIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKCFDcmVhdGVTb2NrZXRwYWlyKCZzdGRpbm91dF9zZmRfLCAmY2hpbGRfc3RkaW5vdXRfc2ZkKSkgewpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icCBiL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKaW5kZXggMWJhMGRlMC4uOTVlMWEyOCAxMDA2NDQKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icAorKysgYi9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCkBAIC0xMywyNyArMTMsMTUgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLy8KLQogamF2YV9iaW5hcnkgewogICAgIG5hbWU6ICJkZXBsb3lhZ2VudCIsCiAgICAgc2RrX3ZlcnNpb246ICIyNCIsCiAgICAgc3JjczogWyJkZXBsb3lhZ2VudC9zcmMvKiovKi5qYXZhIiwgImRlcGxveWxpYi9zcmMvKiovKi5qYXZhIiwgInByb3RvLyoqLyoucHJvdG8iXSwKICAgICBzdGF0aWNfbGliczogWyJhcGt6bGliX3ppcCJdLAotICAgIHdyYXBwZXI6ICJkZXBsb3lhZ2VudC9kZXBsb3lhZ2VudC5zaCIsCiAgICAgcHJvdG86IHsKICAgICAgICAgdHlwZTogImxpdGUiLAogICAgIH0sCiAgICAgZGV4X3ByZW9wdDogewogICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICB9Ci19Ci0KLWphdmFfYmluYXJ5X2hvc3QgewotICAgIG5hbWU6ICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgc3JjczogWyJkZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvKiovKi5qYXZhIiwgImRlcGxveWxpYi9zcmMvKiovKi5qYXZhIiwgInByb3RvLyoqLyoucHJvdG8iXSwKLSAgICBzdGF0aWNfbGliczogWyJhcGt6bGliIl0sCi0gICAgbWFuaWZlc3Q6ICJkZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQiLAotICAgIHByb3RvOiB7Ci0gICAgICAgIHR5cGU6ICJmdWxsIiwKLSAgICB9Ci19Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YSBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKaW5kZXggMmQzYjEzNS4uYTgxMDNjNCAxMDA2NDQKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCkBAIC0xODEsNyArMTgxLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGV4dHJhY3RNZXRhRGF0YShTdHJpbmcgcGFja2FnZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIEZpbGUgYXBrRmlsZSA9IGdldEZpbGVGcm9tUGFja2FnZU5hbWUocGFja2FnZU5hbWUpOwogICAgICAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YSA9IFBhdGNoVXRpbHMuZ2V0QVBLTWV0YURhdGEoYXBrRmlsZSk7Ci0gICAgICAgIGFwa01ldGFEYXRhLndyaXRlRGVsaW1pdGVkVG8oU3lzdGVtLm91dCk7CisgICAgICAgIGFwa01ldGFEYXRhLndyaXRlVG8oU3lzdGVtLm91dCk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNyZWF0ZUluc3RhbGxTZXNzaW9uKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0yMjMsNyArMjIzLDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludCB3cml0ZUV4aXRDb2RlID0gd3JpdGVQYXRjaGVkRGF0YVRvU2Vzc2lvbihuZXcgUmFuZG9tQWNjZXNzRmlsZShkZXZpY2VGaWxlLCAiciIpLCBkZWx0YVN0cmVhbSwgc2Vzc2lvbklkKTsKLQogICAgICAgICBpZiAod3JpdGVFeGl0Q29kZSA9PSAwKSB7CiAgICAgICAgICAgICByZXR1cm4gY29tbWl0SW5zdGFsbFNlc3Npb24oc2Vzc2lvbklkKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTI4NSw3ICsyODQsNiBAQAogICAgICAgICAgICAgaWYgKG9sZERhdGFMZW4gPiAwKSB7CiAgICAgICAgICAgICAgICAgUGF0Y2hVdGlscy5waXBlKG9sZERhdGEsIG91dHB1dFN0cmVhbSwgYnVmZmVyLCAoaW50KSBvbGREYXRhTGVuKTsKICAgICAgICAgICAgIH0KLQogICAgICAgICAgICAgbmV3RGF0YUJ5dGVzV3JpdHRlbiArPSBjb3B5TGVuICsgb2xkRGF0YUxlbjsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQppbmRleCBmMGYwMGUxLi5jNjBmOWE2IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKQEAgLTM5LDcgKzM5LDcgQEAKIGNsYXNzIFBhdGNoVXRpbHMgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTkVHQVRJVkVfTUFTSyA9IDFMIDw8IDYzOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTkVHQVRJVkVfTE9OR19TSUdOX01BU0sgPSAxTCA8PCA2MzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkUgPSAiSEFNQURJL0lIRCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFID0gIkZBU1RERVBMT1kiOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBnZXRPZmZzZXRGcm9tRW50cnkoU3RvcmVkRW50cnkgZW50cnkpIHsKICAgICAgICAgcmV0dXJuIGVudHJ5LmdldENlbnRyYWxEaXJlY3RvcnlIZWFkZXIoKS5nZXRPZmZzZXQoKSArIGVudHJ5LmdldExvY2FsSGVhZGVyU2l6ZSgpOwpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmM5MjQzCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5jcHAKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFkYl91bmlxdWVfZmQuaCIKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvZmlsZS5oIgorI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OworCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpMb2coY29uc3QgY2hhciogZm10LCAuLi4pIHsKKyAgICBpZiAoIWlzX3ZlcmJvc2VfKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2cHJpbnRmKGZtdCwgYXApOworICAgIHByaW50ZigiXG4iKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpBUEtFbnRyeVRvTG9nKGNvbnN0IEFQS0VudHJ5JiBlbnRyeSkgeworICAgIExvZygiRmlsZW5hbWU6ICVzIiwgZW50cnkuZmlsZW5hbWUoKS5jX3N0cigpKTsKKyAgICBMb2coIkNSQzMyOiAweCUwOGxsWCIsIGVudHJ5LmNyYzMyKCkpOworICAgIExvZygiRGF0YSBPZmZzZXQ6ICVsbGQiLCBlbnRyeS5kYXRhb2Zmc2V0KCkpOworICAgIExvZygiQ29tcHJlc3NlZCBTaXplOiAlbGxkIiwgZW50cnkuY29tcHJlc3NlZHNpemUoKSk7CisgICAgTG9nKCJVbmNvbXByZXNzZWQgU2l6ZTogJWxsZCIsIGVudHJ5LnVuY29tcHJlc3NlZHNpemUoKSk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkFQS01ldGFEYXRhVG9Mb2coY29uc3QgY2hhciogZmlsZSwgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhKSB7CisgICAgaWYgKCFpc192ZXJib3NlXykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIExvZygiQVBLIE1ldGFkYXRhOiAlcyIsIGZpbGUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0YWRhdGEuZW50cmllc19zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBUEtFbnRyeSYgZW50cnkgPSBtZXRhZGF0YS5lbnRyaWVzKGkpOworICAgICAgICBBUEtFbnRyeVRvTG9nKGVudHJ5KTsKKyAgICB9Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OlJlcG9ydFNhdmluZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBpZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0b3RhbFNpemUpIHsKKyAgICBsb25nIHRvdGFsRXF1YWxCeXRlcyA9IDA7CisgICAgaW50IHRvdGFsRXF1YWxGaWxlcyA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpZGVudGljYWxFbnRyaWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpZGVudGljYWxFbnRyaWVzW2ldLmRldmljZUVudHJ5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHRvdGFsRXF1YWxCeXRlcyArPSBpZGVudGljYWxFbnRyaWVzW2ldLmxvY2FsRW50cnktPmNvbXByZXNzZWRzaXplKCk7CisgICAgICAgICAgICB0b3RhbEVxdWFsRmlsZXMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBmbG9hdCBzYXZpbmdQZXJjZW50ID0gKHRvdGFsRXF1YWxCeXRlcyAqIDEwMC4wZikgLyB0b3RhbFNpemU7CisgICAgZnByaW50ZihzdGRlcnIsICJEZXRlY3RlZCAlZCBlcXVhbCBBUEsgZW50cmllc1xuIiwgdG90YWxFcXVhbEZpbGVzKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiVsZCBieXRlcyBhcmUgZXF1YWwgb3V0IG9mICUiIFBSSXU2NCAiICglLjJmJSUpXG4iLCB0b3RhbEVxdWFsQnl0ZXMsIHRvdGFsU2l6ZSwKKyAgICAgICAgICAgIHNhdmluZ1BlcmNlbnQpOworfQorCit2b2lkIERlcGxveVBhdGNoR2VuZXJhdG9yOjpHZW5lcmF0ZVBhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgZW50cmllc1RvVXNlT25EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2FsQXBrUGF0aCwgYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgdW5pcXVlX2ZkIGlucHV0KGFkYl9vcGVuKGxvY2FsQXBrUGF0aCwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKTsKKyAgICBzaXplX3QgbmV3QXBrU2l6ZSA9IGFkYl9sc2VlayhpbnB1dCwgMEwsIFNFRUtfRU5EKTsKKyAgICBhZGJfbHNlZWsoaW5wdXQsIDBMLCBTRUVLX1NFVCk7CisKKyAgICBQYXRjaFV0aWxzOjpXcml0ZVNpZ25hdHVyZShvdXRwdXQpOworICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhuZXdBcGtTaXplLCBvdXRwdXQpOworICAgIHNpemVfdCBjdXJyZW50U2l6ZU91dCA9IDA7CisgICAgLy8gV3JpdGUgZGF0YSBmcm9tIHRoZSBob3N0IHVwdG8gdGhlIGZpcnN0IGVudHJ5IHdlIGhhdmUgdGhhdCBtYXRjaGVzIGEgZGV2aWNlIGVudHJ5LiBUaGVuIHdyaXRlCisgICAgLy8gdGhlIG1ldGFkYXRhIGFib3V0IHRoZSBkZXZpY2UgZW50cnkgYW5kIHJlcGVhdCBmb3IgYWxsIGVudHJpZXMgdGhhdCBtYXRjaCBvbiBkZXZpY2UuIEZpbmFsbHkKKyAgICAvLyB3cml0ZSBvdXQgYW55IGRhdGEgbGVmdC4gSWYgdGhlIGRldmljZSBhbmQgaG9zdCBBUEtzIGFyZSBleGFjdGx5IHRoZSBzYW1lIHRoaXMgZW5kcyB1cAorICAgIC8vIHdyaXRpbmcgb3V0IHppcCBtZXRhZGF0YSBmcm9tIHRoZSBsb2NhbCBBUEsgZm9sbG93ZWQgYnkgb2Zmc2V0cyB0byB0aGUgZGF0YSB0byB1c2UgZnJvbSB0aGUKKyAgICAvLyBkZXZpY2UgQVBLLgorICAgIGZvciAoYXV0byYmIGVudHJ5IDogZW50cmllc1RvVXNlT25EZXZpY2UpIHsKKyAgICAgICAgaW50NjRfdCBkZXZpY2VEYXRhT2Zmc2V0ID0gZW50cnkuZGV2aWNlRW50cnktPmRhdGFvZmZzZXQoKTsKKyAgICAgICAgaW50NjRfdCBob3N0RGF0YU9mZnNldCA9IGVudHJ5LmxvY2FsRW50cnktPmRhdGFvZmZzZXQoKTsKKyAgICAgICAgaW50NjRfdCBkZXZpY2VEYXRhTGVuZ3RoID0gZW50cnkuZGV2aWNlRW50cnktPmNvbXByZXNzZWRzaXplKCk7CisgICAgICAgIGludDY0X3QgZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ID0gaG9zdERhdGFPZmZzZXQgLSBjdXJyZW50U2l6ZU91dDsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGRlbHRhRnJvbURldmljZURhdGFTdGFydCwgb3V0cHV0KTsKKyAgICAgICAgaWYgKGRlbHRhRnJvbURldmljZURhdGFTdGFydCA+IDApIHsKKyAgICAgICAgICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQsIG91dHB1dCwgZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGV2aWNlRGF0YU9mZnNldCwgb3V0cHV0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGRldmljZURhdGFMZW5ndGgsIG91dHB1dCk7CisgICAgICAgIGFkYl9sc2VlayhpbnB1dCwgZGV2aWNlRGF0YUxlbmd0aCwgU0VFS19DVVIpOworICAgICAgICBjdXJyZW50U2l6ZU91dCArPSBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgKyBkZXZpY2VEYXRhTGVuZ3RoOworICAgIH0KKyAgICBpZiAoY3VycmVudFNpemVPdXQgIT0gbmV3QXBrU2l6ZSkgeworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcobmV3QXBrU2l6ZSAtIGN1cnJlbnRTaXplT3V0LCBvdXRwdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LCBvdXRwdXQsIG5ld0Fwa1NpemUgLSBjdXJyZW50U2l6ZU91dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygwLCBvdXRwdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMCwgb3V0cHV0KTsKKyAgICB9Cit9CisKK2Jvb2wgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkNyZWF0ZVBhdGNoKGNvbnN0IGNoYXIqIGxvY2FsQXBrUGF0aCwgY29uc3QgY2hhciogZGV2aWNlQXBrTWV0YWRhdGFQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9ycm93ZWRfZmQgb3V0cHV0KSB7CisgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICBBUEtNZXRhRGF0YSBkZXZpY2VBcGtNZXRhZGF0YTsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhkZXZpY2VBcGtNZXRhZGF0YVBhdGgsICZjb250ZW50KSkgeworICAgICAgICBkZXZpY2VBcGtNZXRhZGF0YS5QYXJzZVBhcnRpYWxGcm9tU3RyaW5nKGNvbnRlbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IFdoYXQgZG8gd2Ugd2FudCB0byBkbyBpZiB3ZSBkb24ndCBmaW5kIGFueSBtZXRhZGF0YS4KKyAgICAgICAgLy8gVGhlIGN1cnJlbnQgZmFsbGJhY2sgYmVoYXZpb3IgaXMgdG8gYnVpbGQgYSBwYXRjaCB3aXRoIHRoZSBjb250ZW50cyBvZiB8bG9jYWxBcGtQYXRofC4KKyAgICB9CisKKyAgICBBUEtNZXRhRGF0YSBsb2NhbEFwa01ldGFkYXRhID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEobG9jYWxBcGtQYXRoKTsKKyAgICAvLyBMb2cgZ2F0aGVyZWQgbWV0YWRhdGEgaW5mby4KKyAgICBBUEtNZXRhRGF0YVRvTG9nKGRldmljZUFwa01ldGFkYXRhUGF0aCwgZGV2aWNlQXBrTWV0YWRhdGEpOworICAgIEFQS01ldGFEYXRhVG9Mb2cobG9jYWxBcGtQYXRoLCBsb2NhbEFwa01ldGFkYXRhKTsKKworICAgIHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiBpZGVudGljYWxFbnRyaWVzOworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9CisgICAgICAgICAgICBCdWlsZElkZW50aWNhbEVudHJpZXMoaWRlbnRpY2FsRW50cmllcywgbG9jYWxBcGtNZXRhZGF0YSwgZGV2aWNlQXBrTWV0YWRhdGEpOworICAgIFJlcG9ydFNhdmluZ3MoaWRlbnRpY2FsRW50cmllcywgdG90YWxTaXplKTsKKyAgICBHZW5lcmF0ZVBhdGNoKGlkZW50aWNhbEVudHJpZXMsIGxvY2FsQXBrUGF0aCwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordWludDY0X3QgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkJ1aWxkSWRlbnRpY2FsRW50cmllcyhzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIG91dElkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQS01ldGFEYXRhJiBsb2NhbEFwa01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEtNZXRhRGF0YSYgZGV2aWNlQXBrTWV0YWRhdGEpIHsKKyAgICB1aW50NjRfdCB0b3RhbFNpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxBcGtNZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFQS0VudHJ5JiBsb2NhbEVudHJ5ID0gbG9jYWxBcGtNZXRhZGF0YS5lbnRyaWVzKGkpOworICAgICAgICB0b3RhbFNpemUgKz0gbG9jYWxFbnRyeS5jb21wcmVzc2Vkc2l6ZSgpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRldmljZUFwa01ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IEFQS0VudHJ5JiBkZXZpY2VFbnRyeSA9IGRldmljZUFwa01ldGFkYXRhLmVudHJpZXMoaik7CisgICAgICAgICAgICBpZiAoZGV2aWNlRW50cnkuY3JjMzIoKSA9PSBsb2NhbEVudHJ5LmNyYzMyKCkgJiYKKyAgICAgICAgICAgICAgICBkZXZpY2VFbnRyeS5maWxlbmFtZSgpLmNvbXBhcmUobG9jYWxFbnRyeS5maWxlbmFtZSgpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgU2ltcGxlRW50cnkgc2ltcGxlRW50cnk7CisgICAgICAgICAgICAgICAgc2ltcGxlRW50cnkubG9jYWxFbnRyeSA9IGNvbnN0X2Nhc3Q8QVBLRW50cnkqPigmbG9jYWxFbnRyeSk7CisgICAgICAgICAgICAgICAgc2ltcGxlRW50cnkuZGV2aWNlRW50cnkgPSBjb25zdF9jYXN0PEFQS0VudHJ5Kj4oJmRldmljZUVudHJ5KTsKKyAgICAgICAgICAgICAgICBBUEtFbnRyeVRvTG9nKGxvY2FsRW50cnkpOworICAgICAgICAgICAgICAgIG91dElkZW50aWNhbEVudHJpZXMucHVzaF9iYWNrKHNpbXBsZUVudHJ5KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnNvcnQob3V0SWRlbnRpY2FsRW50cmllcy5iZWdpbigpLCBvdXRJZGVudGljYWxFbnRyaWVzLmVuZCgpLAorICAgICAgICAgICAgICBbXShjb25zdCBTaW1wbGVFbnRyeSYgbGhzLCBjb25zdCBTaW1wbGVFbnRyeSYgcmhzKSB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gbGhzLmxvY2FsRW50cnktPmRhdGFvZmZzZXQoKSA8IHJocy5sb2NhbEVudHJ5LT5kYXRhb2Zmc2V0KCk7CisgICAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0b3RhbFNpemU7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTQxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImFkYl91bmlxdWVfZmQuaCIKKyNpbmNsdWRlICJmYXN0ZGVwbG95L3Byb3RvL0Fwa0VudHJ5LnBiLmgiCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBwYXRjaCB0aGF0IGNhbiBiZSBhY2NlcHRlZCBieSB0aGUgZGVwbG95YWdlbnQuIFRoZQorICogcGF0Y2ggZm9ybWF0IGlzIGRvY3VtZW50ZWQgaW4gR2VuZXJhdGVQYXRjaC4KKyAqLworY2xhc3MgRGVwbG95UGF0Y2hHZW5lcmF0b3IgeworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogU2ltcGxlIHN0cnVjdCB0byBob2xkIG1hcHBpbmcgYmV0d2VlbiBsb2NhbCBtZXRhZGF0YSBhbmQgZGV2aWNlIG1ldGFkYXRhLgorICAgICAqLworICAgIHN0cnVjdCBTaW1wbGVFbnRyeSB7CisgICAgICAgIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLRW50cnkqIGxvY2FsRW50cnk7CisgICAgICAgIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLRW50cnkqIGRldmljZUVudHJ5OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBJZiB8aXNfdmVyYm9zZXwgaXMgdHJ1ZSBBcGtFbnRyaWVzIHRoYXQgYXJlIHNpbWlsYXIgYmV0d2VlbiBkZXZpY2UgYW5kIGhvc3QgYXJlIHdyaXR0ZW4gdG8KKyAgICAgKiB0aGUgY29uc29sZS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBEZXBsb3lQYXRjaEdlbmVyYXRvcihib29sIGlzX3ZlcmJvc2UpIDogaXNfdmVyYm9zZV8oaXNfdmVyYm9zZSkge30KKyAgICAvKioKKyAgICAgKiBHaXZlbiBhIHxsb2NhbEFwa1BhdGh8LCBhbmQgdGhlIHxkZXZpY2VBcGtNZXRhZGF0YVBhdGh8IGZyb20gYW4gaW5zdGFsbGVkIEFQSyB0aGlzIGZ1bmN0aW9uCisgICAgICogd3JpdGVzIGEgcGF0Y2ggdG8gdGhlIGdpdmVuIHxvdXRwdXR8LgorICAgICAqLworICAgIGJvb2wgQ3JlYXRlUGF0Y2goY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBjb25zdCBjaGFyKiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgsCisgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworCisgIHByaXZhdGU6CisgICAgYm9vbCBpc192ZXJib3NlXzsKKworICAgIC8qKgorICAgICAqIExvZyBmdW5jdGlvbiBvbmx5IGxvZ3MgZGF0YSB0byBzdGRvdXQgd2hlbiB8aXNfdmVyYm9zZV98IGlzIHRydWUuCisgICAgICovCisgICAgdm9pZCBMb2coY29uc3QgY2hhciogZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywgMiwgMykpKTsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBsb2cgdGhlIEFQS01ldGFEYXRhIHN0cnVjdHVyZS4gSWYgfGlzX3ZlcmJvc2VffCBpcyBmYWxzZSB0aGlzIGZ1bmN0aW9uCisgICAgICogZWFybHkgb3V0cy4gfGZpbGV8IGlzIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHJlcHJlc2VudGVkIGJ5IHxtZXRhZGF0YXwuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZAorICAgICAqIGZvciBkZWJ1Z2dpbmcgLyBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIEFQS01ldGFEYXRhVG9Mb2coY29uc3QgY2hhciogZmlsZSwgY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSYgbWV0YWRhdGEpOworICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBsb2cgQVBLRW50cnkuCisgICAgICovCisgICAgdm9pZCBBUEtFbnRyeVRvTG9nKGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLRW50cnkmIGVudHJ5KTsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byByZXBvcnQgc2F2aW5ncyBieSBmYXN0ZGVwbG95LiBUaGlzIGZ1bmN0aW9uIHByaW50cyBvdXQgc2F2aW5ncyBldmVuIHdpdGgKKyAgICAgKiB8aXNfdmVyYm9zZV98IHNldCB0byBmYWxzZS4gfHRvdGFsU2l6ZXwgaXMgdXNlZCB0byBzaG93IGEgcGVyY2VudGFnZSBvZiBzYXZpbmdzLiBOb3RlOgorICAgICAqIHx0b3RhbFNpemV8IGlzIHRoZSBzaXplIG9mIHRoZSBaaXBFbnRyaWVzLiBOb3QgdGhlIHNpemUgb2YgdGhlIGVudGlyZSBmaWxlLiBUaGUgbWV0YWRhdGEgb2YKKyAgICAgKiB0aGUgemlwIGRhdGEgbmVlZHMgdG8gYmUgc2VudCBhY3Jvc3Mgd2l0aCBldmVyeSBpdGVyYXRpb24uCisgICAgICogW1BhdGNoIGZvcm1hdF0KKyAgICAgKiB8Rml4ZWQgU3RyaW5nfCBTaWduYXR1cmUKKyAgICAgKiB8bG9uZ3wgICAgICAgICBOZXcgU2l6ZSBvZiBBcGsKKyAgICAgKiB8UGFja2V0c1tdfCAgICBBcnJheSBvZiBQYWNrZXRzCisgICAgICoKKyAgICAgKiBbUGFja2V0IEZvcm1hdF0KKyAgICAgKiB8bG9uZ3wgICAgIFNpemUgb2YgZGF0YSB0byB1c2UgZnJvbSBwYXRjaAorICAgICAqIHxieXRlW118ICAgUGF0Y2ggZGF0YQorICAgICAqIHxsb25nfCAgICAgT2Zmc2V0IG9mIGRhdGEgdG8gdXNlIGFscmVhZHkgb24gZGV2aWNlCisgICAgICogfGxvbmd8ICAgICBMZW5ndGggb2YgZGF0YSB0byByZWFkIGZyb20gZGV2aWNlIEFQSworICAgICAqIFRPRE8oYi8xMzgzMDY3ODQpOiBNb3ZlIHRoZSBwYXRjaCBmb3JtYXQgdG8gYSBwcm90by4KKyAgICAgKi8KKyAgICB2b2lkIFJlcG9ydFNhdmluZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBpZGVudGljYWxFbnRyaWVzLCB1aW50NjRfdCB0b3RhbFNpemUpOworCisgICAgLyoqCisgICAgICogVGhpcyBlbnVtZXJhdGVzIGVhY2ggZW50cnkgaW4gfGVudHJpZXNUb1VzZU9uRGV2aWNlfCBhbmQgYnVpbGRzIGEgcGF0Y2ggZmlsZSBjb3B5aW5nIGRhdGEKKyAgICAgKiBmcm9tIHxsb2NhbEFwa1BhdGh8IHdoZXJlIHdlIGFyZSB1bmFibGUgdG8gdXNlIGVudHJpZXMgYWxyZWFkeSBvbiB0aGUgZGV2aWNlLiBUaGUgbmV3IHBhdGNoCisgICAgICogaXMgd3JpdHRlbiB0byB8b3V0cHV0fC4gVGhlIGVudHJpZXMgYXJlIGV4cGVjdGVkIHRvIGJlIHNvcnRlZCBieSBkYXRhIG9mZnNldCBmcm9tIGxvd2VzdCB0bworICAgICAqIGhpZ2hlc3QuCisgICAgICovCisgICAgdm9pZCBHZW5lcmF0ZVBhdGNoKGNvbnN0IHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgZW50cmllc1RvVXNlT25EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGxvY2FsQXBrUGF0aCwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKworICBwcm90ZWN0ZWQ6CisgICAgdWludDY0X3QgQnVpbGRJZGVudGljYWxFbnRyaWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBvdXRJZGVudGljYWxFbnRyaWVzLAorICAgICAgICAgICAgY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSYgbG9jYWxBcGtNZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEmIGRldmljZUFwa01ldGFkYXRhUGF0aCk7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZGM0NGUKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yX3Rlc3QuY3BwCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiZGVwbG95X3BhdGNoX2dlbmVyYXRvci5oIgorI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAic3lzZGVwcy5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OworCitzdGF0aWMgc3RkOjpzdHJpbmcgR2V0VGVzdEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIHsKKyAgICByZXR1cm4gImZhc3RkZXBsb3kvdGVzdGRhdGEvIiArIG5hbWU7Cit9CisKK2NsYXNzIFRlc3RQYXRjaEdlbmVyYXRvciA6IERlcGxveVBhdGNoR2VuZXJhdG9yIHsKKyAgcHVibGljOgorICAgIFRlc3RQYXRjaEdlbmVyYXRvcigpIDogRGVwbG95UGF0Y2hHZW5lcmF0b3IoZmFsc2UpIHt9CisgICAgdm9pZCBHYXRoZXJJZGVudGljYWxFbnRyaWVzKHN0ZDo6dmVjdG9yPERlcGxveVBhdGNoR2VuZXJhdG9yOjpTaW1wbGVFbnRyeT4mIG91dElkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQS01ldGFEYXRhJiBtZXRhZGF0YUEsIGNvbnN0IEFQS01ldGFEYXRhJiBtZXRhZGF0YUIpIHsKKyAgICAgICAgQnVpbGRJZGVudGljYWxFbnRyaWVzKG91dElkZW50aWNhbEVudHJpZXMsIG1ldGFkYXRhQSwgbWV0YWRhdGFCKTsKKyAgICB9Cit9OworCitURVNUKERlcGxveVBhdGNoR2VuZXJhdG9yVGVzdCwgSWRlbnRpY2FsRmlsZUVudHJpZXMpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtQYXRoID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICBBUEtNZXRhRGF0YSBtZXRhZGF0YUEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShhcGtQYXRoLmNfc3RyKCkpOworICAgIFRlc3RQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3I7CisgICAgc3RkOjp2ZWN0b3I8RGVwbG95UGF0Y2hHZW5lcmF0b3I6OlNpbXBsZUVudHJ5PiBlbnRyaWVzOworICAgIGdlbmVyYXRvci5HYXRoZXJJZGVudGljYWxFbnRyaWVzKGVudHJpZXMsIG1ldGFkYXRhQSwgbWV0YWRhdGFBKTsKKyAgICAvLyBFeHBlY3QgdGhlIGVudHJ5IGNvdW50IHRvIG1hdGNoIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgbWV0YWRhdGEuCisgICAgY29uc3QgdWludDMyX3QgaWRlbnRpY2FsQ291bnQgPSBlbnRyaWVzLnNpemUoKTsKKyAgICBjb25zdCB1aW50MzJfdCBlbnRyaWVzQ291bnQgPSBtZXRhZGF0YUEuZW50cmllc19zaXplKCk7CisgICAgRVhQRUNUX0VRKGlkZW50aWNhbENvdW50LCBlbnRyaWVzQ291bnQpOworfQorCitURVNUKERlcGxveVBhdGNoR2VuZXJhdG9yVGVzdCwgTm9EZXZpY2VNZXRhZGF0YSkgeworICAgIHN0ZDo6c3RyaW5nIGFwa1BhdGggPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIC8vIEdldCBzaXplIG9mIG91ciB0ZXN0IGFway4KKyAgICBsb25nIGFwa1NpemUgPSAwOworICAgIHsKKyAgICAgICAgdW5pcXVlX2ZkIGFwa0ZpbGUoYWRiX29wZW4oYXBrUGF0aC5jX3N0cigpLCBPX1JEV1IpKTsKKyAgICAgICAgYXBrU2l6ZSA9IGFkYl9sc2VlayhhcGtGaWxlLCAwTCwgU0VFS19FTkQpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHBhdGNoIHRoYXQgaXMgMTAwJSBkaWZmZXJlbnQuCisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgRGVwbG95UGF0Y2hHZW5lcmF0b3IgZ2VuZXJhdG9yKHRydWUpOworICAgIGdlbmVyYXRvci5DcmVhdGVQYXRjaChhcGtQYXRoLmNfc3RyKCksICIiLCBvdXRwdXQuZmQpOworCisgICAgLy8gRXhwZWN0IGEgcGF0Y2ggZmlsZSB0aGF0IGhhcyBhIHNpemUgYXQgbGVhc3QgdGhlIHNpemUgb2Ygb3VyIGluaXRpYWwgQVBLLgorICAgIGxvbmcgcGF0Y2hTaXplID0gYWRiX2xzZWVrKG91dHB1dC5mZCwgMEwsIFNFRUtfRU5EKTsKKyAgICBFWFBFQ1RfR1QocGF0Y2hTaXplLCBhcGtTaXplKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMDA1MDUuLjAwMDAwMDAKLS0tIGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvbWFuaWZlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotTWFpbi1DbGFzczogY29tLmFuZHJvaWQuZmFzdGRlcGxveS5EZXBsb3lQYXRjaEdlbmVyYXRvcgpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMWRkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZGZ3L1ppcEZpbGVSTy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhZGJfaW8uaCIKKyNpbmNsdWRlICJhbmRyb2lkLWJhc2UvZW5kaWFuLmgiCisjaW5jbHVkZSAic3lzZGVwcy5oIgorCit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpiYXNlOworCitzdGF0aWMgY29uc3RleHByIGNoYXIga1NpZ25hdHVyZVtdID0gIkZBU1RERVBMT1kiOworCitBUEtNZXRhRGF0YSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShjb25zdCBjaGFyKiBhcGtQYXRoKSB7CisgICAgQVBLTWV0YURhdGEgYXBrTWV0YURhdGE7CisjdW5kZWYgb3BlbgorICAgIHN0ZDo6dW5pcXVlX3B0cjxhbmRyb2lkOjpaaXBGaWxlUk8+IHppcEZpbGUoYW5kcm9pZDo6WmlwRmlsZVJPOjpvcGVuKGFwa1BhdGgpKTsKKyNkZWZpbmUgb3BlbiBfX194eHhfdW5peF9vcGVuCisgICAgaWYgKHppcEZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBwcmludGYoIkNvdWxkIG5vdCBvcGVuICVzIiwgYXBrUGF0aCk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICAgIHZvaWQqIGNvb2tpZTsKKyAgICBpZiAoemlwRmlsZS0+c3RhcnRJdGVyYXRpb24oJmNvb2tpZSkpIHsKKyAgICAgICAgYW5kcm9pZDo6WmlwRW50cnlSTyBlbnRyeTsKKyAgICAgICAgd2hpbGUgKChlbnRyeSA9IHppcEZpbGUtPm5leHRFbnRyeShjb29raWUpKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjaGFyIGZpbGVOYW1lWzI1Nl07CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgaGF2ZSBhIGZpbGUgbmFtZS4KKyAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBmaWxlbmFtZXMgbG9uZ2VyIHRoYW4gMjU2LgorICAgICAgICAgICAgaWYgKHppcEZpbGUtPmdldEVudHJ5RmlsZU5hbWUoZW50cnksIGZpbGVOYW1lLCBzaXplb2YoZmlsZU5hbWUpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB1aW50MzJfdCB1bmNvbXByZXNzZWRTaXplLCBjb21wcmVzc2VkU2l6ZSwgY3JjMzI7CisgICAgICAgICAgICBpbnQ2NF90IGRhdGFPZmZzZXQ7CisgICAgICAgICAgICB6aXBGaWxlLT5nZXRFbnRyeUluZm8oZW50cnksIG51bGxwdHIsICZ1bmNvbXByZXNzZWRTaXplLCAmY29tcHJlc3NlZFNpemUsICZkYXRhT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjcmMzMik7CisgICAgICAgICAgICBBUEtFbnRyeSogYXBrRW50cnkgPSBhcGtNZXRhRGF0YS5hZGRfZW50cmllcygpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9jcmMzMihjcmMzMik7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2ZpbGVuYW1lKGZpbGVOYW1lKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfY29tcHJlc3NlZHNpemUoY29tcHJlc3NlZFNpemUpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF91bmNvbXByZXNzZWRzaXplKHVuY29tcHJlc3NlZFNpemUpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9kYXRhb2Zmc2V0KGRhdGFPZmZzZXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhcGtNZXRhRGF0YTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpXcml0ZVNpZ25hdHVyZShib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsIGtTaWduYXR1cmUsIHNpemVvZihrU2lnbmF0dXJlKSAtIDEpOworfQorCit2b2lkIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhpbnQ2NF90IHZhbHVlLCBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICBpbnQ2NF90IHRvTGl0dGxlRW5kaWFuID0gaHRvbGU2NCh2YWx1ZSk7CisgICAgV3JpdGVGZEV4YWN0bHkob3V0cHV0LCAmdG9MaXR0bGVFbmRpYW4sIHNpemVvZihpbnQ2NF90KSk7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6UGlwZShib3Jyb3dlZF9mZCBpbnB1dCwgYm9ycm93ZWRfZmQgb3V0cHV0LCBzaXplX3QgYW1vdW50KSB7CisgICAgY29uc3RleHByIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkUgPSAxMjggKiAxMDI0OworICAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBzaXplX3QgdHJhbnNmZXJBbW91bnQgPSAwOworICAgIHdoaWxlICh0cmFuc2ZlckFtb3VudCAhPSBhbW91bnQpIHsKKyAgICAgICAgbG9uZyBjaHVua0Ftb3VudCA9CisgICAgICAgICAgICAgICAgYW1vdW50IC0gdHJhbnNmZXJBbW91bnQgPiBCVUZGRVJfU0laRSA/IEJVRkZFUl9TSVpFIDogYW1vdW50IC0gdHJhbnNmZXJBbW91bnQ7CisgICAgICAgIGxvbmcgcmVhZEFtb3VudCA9IGFkYl9yZWFkKGlucHV0LCBidWZmZXIsIGNodW5rQW1vdW50KTsKKyAgICAgICAgV3JpdGVGZEV4YWN0bHkob3V0cHV0LCBidWZmZXIsIHJlYWRBbW91bnQpOworICAgICAgICB0cmFuc2ZlckFtb3VudCArPSByZWFkQW1vdW50OworICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWJmZThmCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuaApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJhZGJfdW5pcXVlX2ZkLmgiCisjaW5jbHVkZSAiZmFzdGRlcGxveS9wcm90by9BcGtFbnRyeS5wYi5oIgorCisvKioKKyAqIEhlbHBlciBjbGFzcyB0aGF0IG1pcnJvcnMgdGhlIFBhdGNoVXRpbHMgZnJvbSBkZXBsb3kgYWdlbnQuCisgKi8KK2NsYXNzIFBhdGNoVXRpbHMgeworICBwdWJsaWM6CisgICAgLyoqCisgICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGxvY2FsIEFQSyBmaWxlIGFuZCBidWlsZHMgdGhlIEFQS01ldGFEYXRhIHJlcXVpcmVkIGJ5IHRoZSBwYXRjaGluZworICAgICAqIGFsZ29yaXRobS4gVGhlIGlmIHRoaXMgZnVuY3Rpb24gaGFzIGFuIGVycm9yIGEgc3RyaW5nIGlzIHByaW50ZWQgdG8gdGhlIHRlcm1pbmFsIGFuZCBleGl0KDEpCisgICAgICogaXMgY2FsbGVkLgorICAgICAqLworICAgIHN0YXRpYyBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhIEdldEFQS01ldGFEYXRhKGNvbnN0IGNoYXIqIGZpbGUpOworICAgIC8qKgorICAgICAqIFdyaXRlcyBhIGZpeGVkIHNpZ25hdHVyZSBzdHJpbmcgdG8gdGhlIGhlYWRlciBvZiB0aGUgcGF0Y2guCisgICAgICovCisgICAgc3RhdGljIHZvaWQgV3JpdGVTaWduYXR1cmUoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYW4gaW50NjQgdG8gdGhlIHxvdXRwdXR8IHJldmVyc2luZyB0aGUgYnl0ZXMuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgV3JpdGVMb25nKGludDY0X3QgdmFsdWUsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisgICAgLyoqCisgICAgICogQ29weSB8YW1vdW50fCBvZiBkYXRhIGZyb20gfGlucHV0fCB0byB8b3V0cHV0fC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBQaXBlKGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIGlucHV0LCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYW1vdW50KTsKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHNfdGVzdC5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2VlZWJmCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHNfdGVzdC5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJwYXRjaF91dGlscy5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJhZGJfaW8uaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRUZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiAiZmFzdGRlcGxveS90ZXN0ZGF0YS8iICsgbmFtZTsKK30KKworYm9vbCBGaWxlTWF0Y2hlc0NvbnRlbnQoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgaW5wdXQsIGNvbnN0IGNoYXIqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBjb250ZW50c1NpemUpIHsKKyAgICBhZGJfbHNlZWsoaW5wdXQsIDAsIFNFRUtfU0VUKTsKKyAgICAvLyBVc2UgYSB0ZW1wIGJ1ZmZlciBsYXJnZXIgdGhhbiBhbnkgdGVzdCBjb250ZW50cy4KKyAgICBjb25zdGV4cHIgaW50IEJVRkZFUl9TSVpFID0gMjA0ODsKKyAgICBjaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV07CisgICAgYm9vbCByZXN1bHQgPSB0cnVlOworICAgIC8vIFZhbGlkYXRlIHNpemUgb2YgZmlsZXMgaXMgZXF1YWwuCisgICAgc3NpemVfdCByZWFkQW1vdW50ID0gYWRiX3JlYWQoaW5wdXQsIGJ1ZmZlciwgQlVGRkVSX1NJWkUpOworICAgIEVYUEVDVF9FUShyZWFkQW1vdW50LCBjb250ZW50c1NpemUpOworICAgIHJlc3VsdCA9IG1lbWNtcChidWZmZXIsIGNvbnRlbnRzLCByZWFkQW1vdW50KSA9PSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVhZEFtb3VudDsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXgiLCBidWZmZXJbaV0pOworICAgIH0KKyAgICBwcmludGYoIiA9PSAiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzU2l6ZTsgaSsrKSB7CisgICAgICAgIHByaW50ZigiJXgiLCBjb250ZW50c1tpXSk7CisgICAgfQorICAgIHByaW50ZigiXG4iKTsKKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1RFU1QoUGF0Y2hVdGlsc1Rlc3QsIFN3YXBMb25nV3JpdGVzKSB7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDB4MDAxMTIyMzM0NDU1NjY3Nywgb3V0cHV0LmZkKTsKKyAgICBhZGJfbHNlZWsob3V0cHV0LmZkLCAwLCBTRUVLX1NFVCk7CisgICAgY29uc3QgY2hhciBleHBlY3RlZFtdID0gezB4NzcsIDB4NjYsIDB4NTUsIDB4NDQsIDB4MzMsIDB4MjIsIDB4MTEsIDB4MDB9OworICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGV4cGVjdGVkLCA4KSk7Cit9CisKK1RFU1QoUGF0Y2hVdGlsc1Rlc3QsIFBpcGVXcml0ZXNBbW91bnRUb091dHB1dCkgeworICAgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkKCJTb21lIERhdGEiKTsKKyAgICBUZW1wb3JhcnlGaWxlIGlucHV0OworICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIC8vIFBvcHVsYXRlIGlucHV0IGZpbGUuCisgICAgV3JpdGVGZEV4YWN0bHkoaW5wdXQuZmQsIGV4cGVjdGVkKTsKKyAgICBhZGJfbHNlZWsoaW5wdXQuZmQsIDAsIFNFRUtfU0VUKTsKKyAgICAvLyBPcGVuIGlucHV0IGZpbGUgZm9yIHJlYWQsIGFuZCBvdXRwdXQgZmlsZSBmb3Igd3JpdGUuCisgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dC5mZCwgb3V0cHV0LmZkLCBleHBlY3RlZC5zaXplKCkpOworICAgIC8vIFZhbGlkYXRlIHBpcGUgd29ya2VkCisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgZXhwZWN0ZWQuY19zdHIoKSwgZXhwZWN0ZWQuc2l6ZSgpKSk7Cit9CisKK1RFU1QoUGF0Y2hVdGlsc1Rlc3QsIFNpZ25hdHVyZUNvbnN0TWF0Y2hlcykgeworICAgIHN0ZDo6c3RyaW5nIGFwa0ZpbGUgPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIFRlbXBvcmFyeUZpbGUgb3V0cHV0OworICAgIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKG91dHB1dC5mZCk7CisgICAgc3RkOjpzdHJpbmcgY29udGVudHMoIkZBU1RERVBMT1kiKTsKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBjb250ZW50cy5jX3N0cigpLCBjb250ZW50cy5zaXplKCkpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgR2F0aGVyTWV0YWRhdGEpIHsKKyAgICBzdGQ6OnN0cmluZyBhcGtGaWxlID0gR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsiKTsKKyAgICBBUEtNZXRhRGF0YSBtZXRhZGF0YSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGFwa0ZpbGUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRNZXRhZGF0YTsKKyAgICBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4cGVjdGVkTWV0YWRhdGEpOworICAgIHN0ZDo6c3RyaW5nIGFjdHVhbE1ldGFkYXRhOworICAgIG1ldGFkYXRhLlNlcmlhbGl6ZVRvU3RyaW5nKCZhY3R1YWxNZXRhZGF0YSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkTWV0YWRhdGEsIGFjdHVhbE1ldGFkYXRhKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lQYXRjaEdlbmVyYXRvci5qYXZhIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3Ivc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95UGF0Y2hHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiMmVhYi4uMDAwMDAwMAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lQYXRjaEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLmZhc3RkZXBsb3k7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwotaW1wb3J0IHN0YXRpYyBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHMuVVRGXzg7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwLlNpbXBsZUVudHJ5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuZmFzdGRlcGxveS5BUEtNZXRhRGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkFQS0VudHJ5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVwbG95UGF0Y2hHZW5lcmF0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQ7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7Ci0gICAgICAgICAgICAgICAgc2hvd1VzYWdlKDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBib29sZWFuIHZlcmJvc2UgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA+IDIpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgdmVyYm9zZUZsYWcgPSBhcmdzWzJdOwotICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlRmxhZy5jb21wYXJlVG8oIi0tdmVyYm9zZSIpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbnVsbDsKLSAgICAgICAgICAgIFN0cmluZyBhcGtQYXRoID0gYXJnc1swXTsKLSAgICAgICAgICAgIFN0cmluZyBkZXZpY2VNZXRhZGF0YVBhdGggPSBhcmdzWzFdOwotICAgICAgICAgICAgRmlsZSBob3N0RmlsZSA9IG5ldyBGaWxlKGFwa1BhdGgpOwotCi0gICAgICAgICAgICBMaXN0PEFQS0VudHJ5PiBkZXZpY2VaaXBFbnRyaWVzID0gZ2V0TWV0YWRhdGFGcm9tRmlsZShkZXZpY2VNZXRhZGF0YVBhdGgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJEZXZpY2UgRW50cmllcyAoIiArIGRldmljZVppcEVudHJpZXMuc2l6ZSgpICsgIikiKTsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoQVBLRW50cnkgZW50cnkgOiBkZXZpY2VaaXBFbnRyaWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9TdHJpbmcoZW50cnksIHNiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBMaXN0PEFQS0VudHJ5PiBob3N0RmlsZUVudHJpZXMgPSBQYXRjaFV0aWxzLmdldEFQS01ldGFEYXRhKGhvc3RGaWxlKS5nZXRFbnRyaWVzTGlzdCgpOwotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJIb3N0IEVudHJpZXMgKCIgKyBob3N0RmlsZUVudHJpZXMuc2l6ZSgpICsgIikiKTsKLSAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7Ci0gICAgICAgICAgICAgICAgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGZvciAoQVBLRW50cnkgZW50cnkgOiBob3N0RmlsZUVudHJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCA9Ci0gICAgICAgICAgICAgICAgZ2V0SWRlbnRpY2FsQ29udGVudHMoZGV2aWNlWmlwRW50cmllcywgaG9zdEZpbGVFbnRyaWVzKTsKLSAgICAgICAgICAgIHJlcG9ydElkZW50aWNhbENvbnRlbnRzKGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQsIGhvc3RGaWxlKTsKLQotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGlkZW50aWNhbEVudHJ5IDogaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCkgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeSBlbnRyeSA9IGlkZW50aWNhbEVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9TdHJpbmcoZW50cnksIHNiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJJZGVudGljYWwgRW50cmllcyAoIiArIGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQuc2l6ZSgpICsgIikiKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNyZWF0ZVBhdGNoKGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQsIGhvc3RGaWxlLCBTeXN0ZW0ub3V0KTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgyKTsKLSAgICAgICAgfQotICAgICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNob3dVc2FnZShpbnQgZXhpdENvZGUpIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJ1c2FnZTogZGVwbG95cGF0Y2hnZW5lcmF0b3IgPGFwa3BhdGg+IDxkZXZpY2VhcGttZXRhZGF0YT4gWy0tdmVyYm9zZV0iKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoZXhpdENvZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQVBLRW50cnlUb1N0cmluZyhBUEtFbnRyeSBlbnRyeSwgU3RyaW5nQnVpbGRlciBvdXRwdXRTdHJpbmcpIHsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJGaWxlbmFtZTogJXNcbiIsIGVudHJ5LmdldEZpbGVOYW1lKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJDUkMzMjogMHglMDhYXG4iLCBlbnRyeS5nZXRDcmMzMigpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiRGF0YSBPZmZzZXQ6ICVkXG4iLCBlbnRyeS5nZXREYXRhT2Zmc2V0KCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJDb21wcmVzc2VkIFNpemU6ICVkXG4iLCBlbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpKSk7Ci0gICAgICAgIG91dHB1dFN0cmluZy5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiVW5jb21wcmVzc2VkIFNpemU6ICVkXG4iLCBlbnRyeS5nZXRVbmNvbXByZXNzZWRTaXplKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEFQS0VudHJ5PiBnZXRNZXRhZGF0YUZyb21GaWxlKFN0cmluZyBkZXZpY2VNZXRhZGF0YVBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIElucHV0U3RyZWFtIGlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShkZXZpY2VNZXRhZGF0YVBhdGgpKTsKLSAgICAgICAgQVBLTWV0YURhdGEgYXBrTWV0YURhdGEgPSBBUEtNZXRhRGF0YS5wYXJzZURlbGltaXRlZEZyb20oaXMpOwotICAgICAgICByZXR1cm4gYXBrTWV0YURhdGEuZ2V0RW50cmllc0xpc3QoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGdldElkZW50aWNhbENvbnRlbnRzKAotICAgICAgICBMaXN0PEFQS0VudHJ5PiBkZXZpY2VaaXBFbnRyaWVzLCBMaXN0PEFQS0VudHJ5PiBob3N0WmlwRW50cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBpZGVudGljYWxDb250ZW50cyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+KCk7Ci0KLSAgICAgICAgZm9yIChBUEtFbnRyeSBkZXZpY2VaaXBFbnRyeSA6IGRldmljZVppcEVudHJpZXMpIHsKLSAgICAgICAgICAgIGZvciAoQVBLRW50cnkgaG9zdFppcEVudHJ5IDogaG9zdFppcEVudHJpZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlWmlwRW50cnkuZ2V0Q3JjMzIoKSA9PSBob3N0WmlwRW50cnkuZ2V0Q3JjMzIoKSAmJgotICAgICAgICAgICAgICAgICAgICBkZXZpY2VaaXBFbnRyeS5nZXRGaWxlTmFtZSgpLmVxdWFscyhob3N0WmlwRW50cnkuZ2V0RmlsZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWRlbnRpY2FsQ29udGVudHMuYWRkKG5ldyBTaW1wbGVFbnRyeShkZXZpY2VaaXBFbnRyeSwgaG9zdFppcEVudHJ5KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChpZGVudGljYWxDb250ZW50cywgbmV3IENvbXBhcmF0b3I8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZSgKLSAgICAgICAgICAgICAgICBTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IHAxLCBTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IHAyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIExvbmcuY29tcGFyZShwMS5nZXRWYWx1ZSgpLmdldERhdGFPZmZzZXQoKSwgcDIuZ2V0VmFsdWUoKS5nZXREYXRhT2Zmc2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLQotICAgICAgICByZXR1cm4gaWRlbnRpY2FsQ29udGVudHM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZXBvcnRJZGVudGljYWxDb250ZW50cygKLSAgICAgICAgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0LCBGaWxlIGhvc3RGaWxlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBsb25nIHRvdGFsRXF1YWxCeXRlcyA9IDA7Ci0gICAgICAgIGludCB0b3RhbEVxdWFsRmlsZXMgPSAwOwotICAgICAgICBmb3IgKFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gZW50cmllcyA6IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQpIHsKLSAgICAgICAgICAgIEFQS0VudHJ5IGhvc3RBUEtFbnRyeSA9IGVudHJpZXMuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIHRvdGFsRXF1YWxCeXRlcyArPSBob3N0QVBLRW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKTsKLSAgICAgICAgICAgIHRvdGFsRXF1YWxGaWxlcysrOwotICAgICAgICB9Ci0KLSAgICAgICAgZmxvYXQgc2F2aW5nUGVyY2VudCA9IChmbG9hdCkgKHRvdGFsRXF1YWxCeXRlcyAqIDEwMCkgLyBob3N0RmlsZS5sZW5ndGgoKTsKLQotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRldGVjdGVkICIgKyB0b3RhbEVxdWFsRmlsZXMgKyAiIGVxdWFsIEFQSyBlbnRyaWVzIik7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbih0b3RhbEVxdWFsQnl0ZXMgKyAiIGJ5dGVzIGFyZSBlcXVhbCBvdXQgb2YgIiArIGhvc3RGaWxlLmxlbmd0aCgpICsgIiAoIgotICAgICAgICAgICAgKyBzYXZpbmdQZXJjZW50ICsgIiUpIik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgY3JlYXRlUGF0Y2goTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiB6aXBFbnRyeVNpbXBsZUVudHJ5cywKLSAgICAgICAgRmlsZSBob3N0RmlsZSwgT3V0cHV0U3RyZWFtIHBhdGNoU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhdGNoRm9ybWF0RXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGhvc3RGaWxlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGhvc3RGaWxlKTsKLQotICAgICAgICBwYXRjaFN0cmVhbS53cml0ZShQYXRjaFV0aWxzLlNJR05BVFVSRS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVTX0FTQ0lJKSk7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKGhvc3RGaWxlLmxlbmd0aCgpLCBwYXRjaFN0cmVhbSk7Ci0KLSAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKLSAgICAgICAgbG9uZyB0b3RhbEJ5dGVzV3JpdHRlbiA9IDA7Ci0gICAgICAgIEl0ZXJhdG9yPFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvciA9Ci0gICAgICAgICAgICB6aXBFbnRyeVNpbXBsZUVudHJ5cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBlbnRyeVNpbXBsZUVudHJ5ID0gZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEFQS0VudHJ5IGRldmljZUFQS0VudHJ5ID0gZW50cnlTaW1wbGVFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIEFQS0VudHJ5IGhvc3RBUEtFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgbG9uZyBuZXdEYXRhTGVuID0gaG9zdEFQS0VudHJ5LmdldERhdGFPZmZzZXQoKSAtIHRvdGFsQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgbG9uZyBvbGREYXRhT2Zmc2V0ID0gZGV2aWNlQVBLRW50cnkuZ2V0RGF0YU9mZnNldCgpOwotICAgICAgICAgICAgbG9uZyBvbGREYXRhTGVuID0gZGV2aWNlQVBLRW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKTsKLQotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcobmV3RGF0YUxlbiwgcGF0Y2hTdHJlYW0pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy5waXBlKGhvc3RGaWxlSW5wdXRTdHJlYW0sIHBhdGNoU3RyZWFtLCBidWZmZXIsIG5ld0RhdGFMZW4pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcob2xkRGF0YU9mZnNldCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcob2xkRGF0YUxlbiwgcGF0Y2hTdHJlYW0pOwotCi0gICAgICAgICAgICBsb25nIHNraXAgPSBob3N0RmlsZUlucHV0U3RyZWFtLnNraXAob2xkRGF0YUxlbik7Ci0gICAgICAgICAgICBpZiAoc2tpcCAhPSBvbGREYXRhTGVuKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhdGNoRm9ybWF0RXhjZXB0aW9uKCJza2lwIGVycm9yOiBhdHRlbXB0ZWQgdG8gc2tpcCAiICsgb2xkRGF0YUxlbgotICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMgYnV0IHJldHVybiBjb2RlIHdhcyAiICsgc2tpcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBvbGREYXRhTGVuICsgbmV3RGF0YUxlbjsKLSAgICAgICAgfQotICAgICAgICBsb25nIHJlbWFpbmRlckxlbiA9IGhvc3RGaWxlLmxlbmd0aCgpIC0gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKHJlbWFpbmRlckxlbiwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBQYXRjaFV0aWxzLnBpcGUoaG9zdEZpbGVJbnB1dFN0cmVhbSwgcGF0Y2hTdHJlYW0sIGJ1ZmZlciwgcmVtYWluZGVyTGVuKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoMCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZygwLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIHBhdGNoU3RyZWFtLmZsdXNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjcxYmYzCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEKQEAgLTAsMCArMSw2IEBACisKKyMIx4LPqwwSFE1FVEEtSU5GL01BTklGRVNULk1GGMcGIFEoVworIwiDjZWOBxITQW5kcm9pZE1hbmlmZXN0LnhtbBgxIOQFKOgPCis2CKa1gD4SI2xpYi9hcm1lYWJpLXY3YS9saWJ2dWxrYW5fc2FtcGxlLnNvGIEOIMDSUSiMsuwBCisgCJfjl5EOEg5yZXNvdXJjZXMuYXJzYxj04FEgtAQotAQKKxwIi5zCyQISC2NsYXNzZXMuZGV4GMEHIP8FKPQKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2UwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbS5jcHAgYi9mc19tZ3IvbGliZG0vZG0uY3BwCmluZGV4IDFkMjY4M2EuLmE0ZTBkNzYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbS5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtLmNwcApAQCAtMTUwLDYgKzE1MCwxNSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGQ6Om9wdGlvbmFsPERldmljZU1hcHBlcjo6SW5mbz4gRGV2aWNlTWFwcGVyOjpHZXREZXRhaWxlZEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CisgICAgSW5pdElvKCZpbywgbmFtZSk7CisgICAgaWYgKGlvY3RsKGZkXywgRE1fREVWX1NUQVRVUywgJmlvKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgcmV0dXJuIEluZm8oaW8uZmxhZ3MpOworfQorCiBEbURldmljZVN0YXRlIERldmljZU1hcHBlcjo6R2V0U3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CiAgICAgSW5pdElvKCZpbywgbmFtZSk7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAppbmRleCA3NTNiOGM5Li5jNmIzN2NmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCisrKyBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNzAsMTAgKzcxLDI3IEBACiAgICAgICAgIHVpbnQ2NF90IGRldl87CiAgICAgfTsKIAorICAgIGNsYXNzIEluZm8geworICAgICAgICB1aW50MzJfdCBmbGFnc187CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5mbyh1aW50MzJfdCBmbGFncykgOiBmbGFnc18oZmxhZ3MpIHt9CisKKyAgICAgICAgYm9vbCBJc0FjdGl2ZVRhYmxlUHJlc2VudCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX0FDVElWRV9QUkVTRU5UX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc0J1ZmZlckZ1bGwoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9CVUZGRVJfRlVMTF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNJbmFjdGl2ZVRhYmxlUHJlc2VudCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsgfQorICAgICAgICBib29sIElzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9SRUFET05MWV9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNTdXNwZW5kZWQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9TVVNQRU5EX0ZMQUc7IH0KKyAgICB9OworCiAgICAgLy8gUmVtb3ZlcyBhIGRldmljZSBtYXBwZXIgZGV2aWNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgICAgLy8gUmV0dXJucyAndHJ1ZScgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgIGJvb2wgRGVsZXRlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKIAorICAgIC8vIEZldGNoZXMgYW5kIHJldHVybnMgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBtYXBwZXIKKyAgICAvLyBkZXZpY2Ugd2l0aCBnaXZlbiBuYW1lLgorICAgIHN0ZDo6b3B0aW9uYWw8SW5mbz4gR2V0RGV0YWlsZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdDsKKwogICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlIG1hcHBlciBkZXZpY2UKICAgICAvLyB3aXRoIGdpdmVuIG5hbWUuCiAgICAgLy8gT25lIG9mIElOVkFMSUQsIFNVU1BFTkRFRCBvciBBQ1RJVkUuCmRpZmYgLS1naXQgYS9saWJpb24vT1dORVJTIGIvbGliaW9uL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNhZDJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW9uL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3NzcGF0aWxAZ29vZ2xlLmNvbQoraHJpZHlhQGdvb2dsZS5jb20K