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+IGVudHJ5U2ltcGxlRW50cnlJdGVyYXRvciA9Ci0gICAgICAgICAgICB6aXBFbnRyeVNpbXBsZUVudHJ5cy5pdGVyYXRvcigpOwotICAgICAgICB3aGlsZSAoZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBlbnRyeVNpbXBsZUVudHJ5ID0gZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICAgIEFQS0VudHJ5IGRldmljZUFQS0VudHJ5ID0gZW50cnlTaW1wbGVFbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgICAgIEFQS0VudHJ5IGhvc3RBUEtFbnRyeSA9IGVudHJ5U2ltcGxlRW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICAgICAgbG9uZyBuZXdEYXRhTGVuID0gaG9zdEFQS0VudHJ5LmdldERhdGFPZmZzZXQoKSAtIHRvdGFsQnl0ZXNXcml0dGVuOwotICAgICAgICAgICAgbG9uZyBvbGREYXRhT2Zmc2V0ID0gZGV2aWNlQVBLRW50cnkuZ2V0RGF0YU9mZnNldCgpOwotICAgICAgICAgICAgbG9uZyBvbGREYXRhTGVuID0gZGV2aWNlQVBLRW50cnkuZ2V0Q29tcHJlc3NlZFNpemUoKTsKLQotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcobmV3RGF0YUxlbiwgcGF0Y2hTdHJlYW0pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy5waXBlKGhvc3RGaWxlSW5wdXRTdHJlYW0sIHBhdGNoU3RyZWFtLCBidWZmZXIsIG5ld0RhdGFMZW4pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcob2xkRGF0YU9mZnNldCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcob2xkRGF0YUxlbiwgcGF0Y2hTdHJlYW0pOwotCi0gICAgICAgICAgICBsb25nIHNraXAgPSBob3N0RmlsZUlucHV0U3RyZWFtLnNraXAob2xkRGF0YUxlbik7Ci0gICAgICAgICAgICBpZiAoc2tpcCAhPSBvbGREYXRhTGVuKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhdGNoRm9ybWF0RXhjZXB0aW9uKCJza2lwIGVycm9yOiBhdHRlbXB0ZWQgdG8gc2tpcCAiICsgb2xkRGF0YUxlbgotICAgICAgICAgICAgICAgICAgICArICIgYnl0ZXMgYnV0IHJldHVybiBjb2RlIHdhcyAiICsgc2tpcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBvbGREYXRhTGVuICsgbmV3RGF0YUxlbjsKLSAgICAgICAgfQotICAgICAgICBsb25nIHJlbWFpbmRlckxlbiA9IGhvc3RGaWxlLmxlbmd0aCgpIC0gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKHJlbWFpbmRlckxlbiwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBQYXRjaFV0aWxzLnBpcGUoaG9zdEZpbGVJbnB1dFN0cmVhbSwgcGF0Y2hTdHJlYW0sIGJ1ZmZlciwgcmVtYWluZGVyTGVuKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoMCwgcGF0Y2hTdHJlYW0pOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZygwLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIHBhdGNoU3RyZWFtLmZsdXNoKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjcxYmYzCi0tLSAvZGV2L251bGwKKysrIGIvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1tZXRhZGF0YS1yZWxlYXNlLmRhdGEKQEAgLTAsMCArMSw2IEBACisKKyMIx4LPqwwSFE1FVEEtSU5GL01BTklGRVNULk1GGMcGIFEoVworIwiDjZWOBxITQW5kcm9pZE1hbmlmZXN0LnhtbBgxIOQFKOgPCis2CKa1gD4SI2xpYi9hcm1lYWJpLXY3YS9saWJ2dWxrYW5fc2FtcGxlLnNvGIEOIMDSUSiMsuwBCisgCJfjl5EOEg5yZXNvdXJjZXMuYXJzYxj04FEgtAQotAQKKxwIi5zCyQISC2NsYXNzZXMuZGV4GMEHIP8FKPQKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0N2UwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbS5jcHAgYi9mc19tZ3IvbGliZG0vZG0uY3BwCmluZGV4IDBhZDhkOWQuLmE0ZTBkNzYgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbS5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtLmNwcApAQCAtMTUwLDYgKzE1MCwxNSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGQ6Om9wdGlvbmFsPERldmljZU1hcHBlcjo6SW5mbz4gRGV2aWNlTWFwcGVyOjpHZXREZXRhaWxlZEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CisgICAgSW5pdElvKCZpbywgbmFtZSk7CisgICAgaWYgKGlvY3RsKGZkXywgRE1fREVWX1NUQVRVUywgJmlvKSA8IDApIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgcmV0dXJuIEluZm8oaW8uZmxhZ3MpOworfQorCiBEbURldmljZVN0YXRlIERldmljZU1hcHBlcjo6R2V0U3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CiAgICAgSW5pdElvKCZpbywgbmFtZSk7CkBAIC0xNjIsNiArMTcxLDI0IEBACiAgICAgcmV0dXJuIERtRGV2aWNlU3RhdGU6OlNVU1BFTkRFRDsKIH0KIAorYm9vbCBEZXZpY2VNYXBwZXI6OkNoYW5nZVN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBEbURldmljZVN0YXRlIHN0YXRlKSB7CisgICAgaWYgKHN0YXRlICE9IERtRGV2aWNlU3RhdGU6OlNVU1BFTkRFRCAmJiBzdGF0ZSAhPSBEbURldmljZVN0YXRlOjpBQ1RJVkUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCBkbV9pb2N0bCBpbzsKKyAgICBJbml0SW8oJmlvLCBuYW1lKTsKKworICAgIGlmIChzdGF0ZSA9PSBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpIGlvLmZsYWdzID0gRE1fU1VTUEVORF9GTEFHOworCisgICAgaWYgKGlvY3RsKGZkXywgRE1fREVWX1NVU1BFTkQsICZpbykgPCAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJETV9ERVZfU1VTUEVORCAiCisgICAgICAgICAgICAgICAgICAgIDw8IChzdGF0ZSA9PSBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQgPyAic3VzcGVuZCIgOiAicmVzdW1lIikgPDwgIiBmYWlsZWQiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBib29sIERldmljZU1hcHBlcjo6Q3JlYXRlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBEbVRhYmxlJiB0YWJsZSkgewogICAgIHN0ZDo6c3RyaW5nIGlnbm9yZV9wYXRoOwogICAgIGlmICghQ3JlYXRlRGV2aWNlKG5hbWUsIHRhYmxlLCAmaWdub3JlX3BhdGgsIDBtcykpIHsKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcCBiL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcAppbmRleCBiMjhhOGYyLi5kYTFjNGE5IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKKysrIGIvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCkBAIC0xNjYsNiArMTY2LDM0IEBACiAgICAgQVNTRVJUX1RSVUUoZGV2LkRlc3Ryb3koKSk7CiB9CiAKK1RFU1QobGliZG0sIERtU3VzcGVuZFJlc3VtZSkgeworICAgIHVuaXF1ZV9mZCB0bXAxKENyZWF0ZVRlbXBGaWxlKCJmaWxlX3N1c3BlbmRfcmVzdW1lIiwgNTEyKSk7CisgICAgQVNTRVJUX0dFKHRtcDEsIDApOworCisgICAgTG9vcERldmljZSBsb29wX2EodG1wMSwgMTBzKTsKKyAgICBBU1NFUlRfVFJVRShsb29wX2EudmFsaWQoKSk7CisKKyAgICBEbVRhYmxlIHRhYmxlOworICAgIEFTU0VSVF9UUlVFKHRhYmxlLkVtcGxhY2U8RG1UYXJnZXRMaW5lYXI+KDAsIDEsIGxvb3BfYS5kZXZpY2UoKSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHRhYmxlLnZhbGlkKCkpOworCisgICAgVGVtcERldmljZSBkZXYoImxpYmRtLXRlc3QtZG0tc3VzcGVuZC1yZXN1bWUiLCB0YWJsZSk7CisgICAgQVNTRVJUX1RSVUUoZGV2LnZhbGlkKCkpOworICAgIEFTU0VSVF9GQUxTRShkZXYucGF0aCgpLmVtcHR5KCkpOworCisgICAgYXV0byYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisKKyAgICAvLyBUZXN0IFNldCBhbmQgR2V0IHN0YXR1cyBvZiBkZXZpY2UuCisgICAgdmVjdG9yPERldmljZU1hcHBlcjo6VGFyZ2V0SW5mbz4gdGFyZ2V0czsKKyAgICBBU1NFUlRfRVEoZG0uR2V0U3RhdGUoZGV2Lm5hbWUoKSksIERtRGV2aWNlU3RhdGU6OkFDVElWRSk7CisKKyAgICBBU1NFUlRfVFJVRShkbS5DaGFuZ2VTdGF0ZShkZXYubmFtZSgpLCBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpKTsKKyAgICBBU1NFUlRfRVEoZG0uR2V0U3RhdGUoZGV2Lm5hbWUoKSksIERtRGV2aWNlU3RhdGU6OlNVU1BFTkRFRCk7CisKKyAgICBBU1NFUlRfVFJVRShkbS5DaGFuZ2VTdGF0ZShkZXYubmFtZSgpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpKTsKKyAgICBBU1NFUlRfRVEoZG0uR2V0U3RhdGUoZGV2Lm5hbWUoKSksIERtRGV2aWNlU3RhdGU6OkFDVElWRSk7Cit9CisKIFRFU1QobGliZG0sIERtVmVyaXR5QXJnc0F2YjIpIHsKICAgICBzdGQ6OnN0cmluZyBkZXZpY2UgPSAiL2Rldi9ibG9jay9wbGF0Zm9ybS9zb2MvMWRhNDAwMC51ZnNoYy9ieS1uYW1lL3ZlbmRvcl9hIjsKICAgICBzdGQ6OnN0cmluZyBhbGdvcml0aG0gPSAic2hhMSI7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oIGIvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAppbmRleCA5YzBjMmYzLi5jNmIzN2NmIDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCisrKyBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKQEAgLTI3LDYgKzI3LDcgQEAKIAogI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8b3B0aW9uYWw+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgpAQCAtNzAsMTUgKzcxLDM3IEBACiAgICAgICAgIHVpbnQ2NF90IGRldl87CiAgICAgfTsKIAorICAgIGNsYXNzIEluZm8geworICAgICAgICB1aW50MzJfdCBmbGFnc187CisKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5mbyh1aW50MzJfdCBmbGFncykgOiBmbGFnc18oZmxhZ3MpIHt9CisKKyAgICAgICAgYm9vbCBJc0FjdGl2ZVRhYmxlUHJlc2VudCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX0FDVElWRV9QUkVTRU5UX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc0J1ZmZlckZ1bGwoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9CVUZGRVJfRlVMTF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNJbmFjdGl2ZVRhYmxlUHJlc2VudCgpIGNvbnN0IHsgcmV0dXJuIGZsYWdzXyAmIERNX0lOQUNUSVZFX1BSRVNFTlRfRkxBRzsgfQorICAgICAgICBib29sIElzUmVhZE9ubHkoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9SRUFET05MWV9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNTdXNwZW5kZWQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9TVVNQRU5EX0ZMQUc7IH0KKyAgICB9OworCiAgICAgLy8gUmVtb3ZlcyBhIGRldmljZSBtYXBwZXIgZGV2aWNlIHdpdGggdGhlIGdpdmVuIG5hbWUuCiAgICAgLy8gUmV0dXJucyAndHJ1ZScgb24gc3VjY2VzcywgZmFsc2Ugb3RoZXJ3aXNlLgogICAgIGJvb2wgRGVsZXRlRGV2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKIAorICAgIC8vIEZldGNoZXMgYW5kIHJldHVybnMgdGhlIGNvbXBsZXRlIHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBtYXBwZXIKKyAgICAvLyBkZXZpY2Ugd2l0aCBnaXZlbiBuYW1lLgorICAgIHN0ZDo6b3B0aW9uYWw8SW5mbz4gR2V0RGV0YWlsZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdDsKKwogICAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgZGV2aWNlIG1hcHBlciBkZXZpY2UKICAgICAvLyB3aXRoIGdpdmVuIG5hbWUuCiAgICAgLy8gT25lIG9mIElOVkFMSUQsIFNVU1BFTkRFRCBvciBBQ1RJVkUuCiAgICAgRG1EZXZpY2VTdGF0ZSBHZXRTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Q7CiAKKyAgICAvLyBQdXRzIHRoZSBnaXZlbiBkZXZpY2UgdG8gdGhlIHNwZWNpZmllZCBzdGF0dXMsIHdoaWNoIG11c3QgYmUgZWl0aGVyOgorICAgIC8vIC0gU1VTUEVOREVEOiBzdXNwZW5kIHRoZSBkZXZpY2UsIG9yCisgICAgLy8gLSBBQ1RJVkU6IHJlc3VtZXMgdGhlIGRldmljZS4KKyAgICBib29sIENoYW5nZVN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBEbURldmljZVN0YXRlIHN0YXRlKTsKKwogICAgIC8vIENyZWF0ZXMgYSBkZXZpY2UsIGxvYWRzIHRoZSBnaXZlbiB0YWJsZSwgYW5kIGFjdGl2YXRlcyBpdC4gSWYgdGhlIGRldmljZQogICAgIC8vIGlzIG5vdCBhYmxlIHRvIGJlIGFjdGl2YXRlZCwgaXQgaXMgZGVzdHJveWVkLCBhbmQgZmFsc2UgaXMgcmV0dXJuZWQuCiAgICAgLy8gQWZ0ZXIgY3JlYXRpb24sIHxwYXRofCBjb250YWlucyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcKZGlmZiAtLWdpdCBhL2ZzX21nci9saWJscC9idWlsZGVyLmNwcCBiL2ZzX21nci9saWJscC9idWlsZGVyLmNwcAppbmRleCBjMTJlM2IyLi44Nzk3ZWE5IDEwMDY0NAotLS0gYS9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKKysrIGIvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgIGlmIChzUmV0cm9maXREYXAuaGFzX3ZhbHVlKCkpIHsKICAgICAgICAgcmV0dXJuICpzUmV0cm9maXREYXA7CiAgICAgfQotICAgIHJldHVybiAhYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby5ib290LmR5bmFtaWNfcGFydGl0aW9uc19yZXRyb2ZpdCIsIGZhbHNlKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJyby5ib290LmR5bmFtaWNfcGFydGl0aW9uc19yZXRyb2ZpdCIsIGZhbHNlKTsKIH0KIAogYm9vbCBNZXRhZGF0YUJ1aWxkZXI6OklzUmV0cm9maXRNZXRhZGF0YSgpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKaW5kZXggYzJhMGYzMy4uNjQyZjJjMSAxMDA3NTUKLS0tIGEvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKKysrIGIvZnNfbWdyL3Rlc3RzL2FkYi1yZW1vdW50LXRlc3Quc2gKQEAgLTE1LDEwICsxNSwxMyBAQAogCiBhZGIgcmVtb3VudCB0ZXN0cwogCi0tLWhlbHAgICAgICAgIFRoaXMgaGVscAotLS1zZXJpYWwgICAgICBTcGVjaWZ5IGRldmljZSAobXVzdCBpZiBtdWx0aXBsZSBhcmUgcHJlc2VudCkKLS0tY29sb3IgICAgICAgRHJlc3Mgb3V0cHV0IHdpdGggaGlnaGxpZ2h0aW5nIGNvbG9ycwotLS1wcmludC10aW1lICBSZXBvcnQgdGhlIHRlc3QgZHVyYXRpb24KKy0tY29sb3IgICAgICAgICAgICAgICAgICAgICBEcmVzcyBvdXRwdXQgd2l0aCBoaWdobGlnaHRpbmcgY29sb3JzCistLWhlbHAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBoZWxwCistLW5vLXdhaXQtc2NyZWVuICAgICAgICAgICAgRG8gbm90IHdhaXQgZm9yIGRpc3BsYXkgc2NyZWVuIHRvIHNldHRsZQorLS1wcmludC10aW1lICAgICAgICAgICAgICAgIFJlcG9ydCB0aGUgdGVzdCBkdXJhdGlvbgorLS1zZXJpYWwgICAgICAgICAgICAgICAgICAgIFNwZWNpZnkgZGV2aWNlIChtdXN0IGlmIG11bHRpcGxlIGFyZSBwcmVzZW50KQorLS13YWl0LWFkYiA8ZHVyYXRpb24+ICAgICAgIGFkYiB3YWl0IHRpbWVvdXQKKy0td2FpdC1mYXN0Ym9vdCA8ZHVyYXRpb24+ICBmYXN0Ym9vdCB3YWl0IHRpbWVvdXQKIAogQ29uZGl0aW9uczoKICAtIE11c3QgYmUgYSB1c2VyZGVidWcgYnVpbGQuCkBAIC01Myw2ICs1Niw3IEBACiAKIEFEQl9XQUlUPTRtCiBGQVNUQk9PVF9XQUlUPTJtCitzY3JlZW5fd2FpdD10cnVlCiAKICMjCiAjIyAgSGVscGVyIEZ1bmN0aW9ucwpAQCAtMTg1LDcgKzE4OSw3IEBACiBbICJVU0FHRTogYWRiX2NhdCA8ZmlsZT4gPnN0ZG91dAogCiBSZXR1cm5zOiBjb250ZW50IG9mIGZpbGUgdG8gc3Rkb3V0IHdpdGggY2FycmlhZ2UgcmV0dXJucyBza2lwcGVkLAotICAgICAgICAgdHJ1ZSBvZiB0aGUgZmlsZSBleGlzdHMiIF0KKyAgICAgICAgIHRydWUgaWYgdGhlIGZpbGUgZXhpc3RzIiBdCiBhZGJfY2F0KCkgewogICAgIGxvY2FsIE9VVFBVVD0iYGFkYl9zaCBjYXQgJHsxfSA8L2Rldi9udWxsIDI+JjFgIgogICAgIGxvY2FsIHJldD0kez99CkBAIC0xOTMsNiArMTk3LDE3IEBACiAgICAgcmV0dXJuICR7cmV0fQogfQogCitbICJVU0FHRTogYWRiX2xzIDxkaXJmaWxlPiA+c3Rkb3V0CisKK1JldHVybnM6IGZpbGVuYW1lIG9yIGRpcmVjdG9ydSBjb250ZW50IHRvIHN0ZG91dCB3aXRoIGNhcnJpYWdlIHJldHVybnMgc2tpcHBlZCwKKyAgICAgICAgIHRydWUgaWYgdGhlIGxzIGhhZCBubyBlcnJvcnMiIF0KK2FkYl9scygpIHsKKyAgICBsb2NhbCBPVVRQVVQ9ImBhZGJfc2ggbHMgJHsxfSA8L2Rldi9udWxsIDI+L2Rldi9udWxsYCIKKyAgICBsb2NhbCByZXQ9JHs/fQorICAgIGVjaG8gIiR7T1VUUFVUfSIgfCB0ciAtZCAnXHInCisgICAgcmV0dXJuICR7cmV0fQorfQorCiBbICJVU0FHRTogYWRiX3JlYm9vdAogCiBSZXR1cm5zOiB0cnVlIGlmIHRoZSByZWJvb3QgY29tbWFuZCBzdWNjZWVkZWQiIF0KQEAgLTQzNiw2ICs0NTEsMTAgQEAKIC1uIC0gZWNobyBuZXdsaW5lIGF0IGV4aXQKIFRJTUVPVVQgLSBkZWZhdWx0IGBmb3JtYXRfZHVyYXRpb24gJHt3YWl0X2Zvcl9zY3JlZW5fdGltZW91dH1gIiBdCiB3YWl0X2Zvcl9zY3JlZW4oKSB7CisgIGlmICEgJHtzY3JlZW5fd2FpdH07IHRoZW4KKyAgICBhZGJfd2FpdAorICAgIHJldHVybgorICBmaQogICBleGl0X2Z1bmN0aW9uPXRydWUKICAgaWYgWyBYIi1uIiA9IFgiJHsxfSIgXTsgdGhlbgogICAgIGV4aXRfZnVuY3Rpb249ZWNobwpAQCAtNzQzLDYgKzc2Miw5IEBACiAKIE9QVElPTlM9YGdldG9wdCAtLWFsdGVybmF0aXZlIC0tdW5xdW90ZWQgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgaGVscCxzZXJpYWw6LGNvbG91cixjb2xvcixuby1jb2xvdXIsbm8tY29sb3IgXAorICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgd2FpdC1hZGI6LHdhaXQtZmFzdGJvb3Q6IFwKKyAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIHdhaXQtc2NyZWVuLHdhaXQtZGlzcGxheSBcCisgICAgICAgICAgICAgICAgLS1sb25nb3B0aW9ucyBuby13YWl0LXNjcmVlbixuby13YWl0LWRpc3BsYXkgXAogICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgZ3Rlc3RfcHJpbnRfdGltZSxwcmludC10aW1lIFwKICAgICAgICAgICAgICAgICAtLSAiP2hzOiIgJHsqfWAgfHwKICAgKCBlY2hvICIke1VTQUdFfSIgPiYyIDsgZmFsc2UgKSB8fApAQCAtNzY2LDkgKzc4OCwyMyBAQAogICAgIC0tbm8tY29sb3IgfCAtLW5vLWNvbG91cikKICAgICAgIGNvbG9yPWZhbHNlCiAgICAgICA7OworICAgIC0tbm8td2FpdC1kaXNwbGF5IHwgLS1uby13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PWZhbHNlCisgICAgICA7OworICAgIC0td2FpdC1kaXNwbGF5IHwgLS13YWl0LXNjcmVlbikKKyAgICAgIHNjcmVlbl93YWl0PXRydWUKKyAgICAgIDs7CiAgICAgLS1wcmludC10aW1lIHwgLS1ndGVzdF9wcmludF90aW1lKQogICAgICAgcHJpbnRfdGltZT10cnVlCiAgICAgICA7OworICAgIC0td2FpdC1hZGIpCisgICAgICBBREJfV0FJVD0kezJ9CisgICAgICBzaGlmdAorICAgICAgOzsKKyAgICAtLXdhaXQtZmFzdGJvb3QpCisgICAgICBGQVNUQk9PVF9XQUlUPSR7Mn0KKyAgICAgIHNoaWZ0CisgICAgICA7OwogICAgIC0tKQogICAgICAgc2hpZnQKICAgICAgIGJyZWFrCkBAIC0xMTQ1LDEwICsxMTgxLDE0IEBACiAKIEE9IkhlbGxvIFdvcmxkISAkKGRhdGUpIgogZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vc3lzdGVtL2hlbGxvIgorZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vc3lzdGVtL3ByaXYtYXBwL2hlbGxvIgogZWNobyAiJHtBfSIgfCBhZGJfc2ggY2F0IC0gIj4vdmVuZG9yL2hlbGxvIgogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiIHx8Ci0gIGRpZSAic3l0ZW0gaGVsbG8iCisgIGRpZSAic3lzdGVtIGhlbGxvIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvc3lzdGVtIGJlZm9yZSByZWJvb3QKK0I9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIiB8fAorICBkaWUgInN5c3RlbSBwcml2LWFwcCBoZWxsbyIKK2NoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbS9wcml2LWFwcCBiZWZvcmUgcmVib290CiBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIgfHwKICAgZGllICJ2ZW5kb3IgaGVsbG8iCiBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC92ZW5kb3IgYmVmb3JlIHJlYm9vdApAQCAtMTIzMCw2ICsxMjcwLDEzIEBACiBmaQogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0gYWZ0ZXIgcmVib290CisjIElmIG92ZXJsYXlmcyBoYXMgYSBuZXN0ZWQgc2VjdXJpdHkgcHJvYmxlbSwgdGhpcyB3aWxsIGZhaWwuCitCPSJgYWRiX2xzIC9zeXN0ZW0vYCIgfHwKKyAgZGlyICJhZGIgbHMgL3N5c3RlbSIKK1sgWCIke0J9IiAhPSBYIiR7QiMqcHJpdi1hcHB9IiBdIHx8CisgIGRpciAiYWRiIGxzIC9zeXN0ZW0vcHJpdi1hcHAiCitCPSJgYWRiX2NhdCAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvYCIKK2NoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbS9wcml2LWFwcCBhZnRlciByZWJvb3QKIGVjaG8gIiR7R1JFRU59WyAgICAgICBPSyBdJHtOT1JNQUx9IC9zeXN0ZW0gY29udGVudCByZW1haW5zIGFmdGVyIHJlYm9vdCIgPiYyCiAjIE9ubHkgcm9vdCBjYW4gcmVhZCB2ZW5kb3IgaWYgc2Vwb2xpY3kgcGVybWlzc2lvbnMgYXJlIGFzIGV4cGVjdGVkLgogYWRiX3Jvb3QgfHwKQEAgLTEzNTEsNiArMTM5OCwxMiBAQAogICBmaQogICBCPSJgYWRiX2NhdCAvc3lzdGVtL2hlbGxvYCIKICAgY2hlY2tfZXEgIiR7QX0iICIke0J9IiBzeXN0ZW0gYWZ0ZXIgZmxhc2ggdmVuZG9yCisgIEI9ImBhZGJfbHMgL3N5c3RlbS9gIiB8fAorICAgIGRpciAiYWRiIGxzIC9zeXN0ZW0iCisgIFsgWCIke0J9IiAhPSBYIiR7QiMqcHJpdi1hcHB9IiBdIHx8CisgICAgZGlyICJhZGIgbHMgL3N5c3RlbS9wcml2LWFwcCIKKyAgQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCisgIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgc3lzdGVtL3ByaXYtYXBwIGFmdGVyIGZsYXNoIHZlbmRvcgogICBhZGJfcm9vdCB8fAogICAgIGRpZSAiYWRiIHJvb3QiCiAgIEI9ImBhZGJfY2F0IC92ZW5kb3IvaGVsbG9gIgpAQCAtMTM5MiwxNSArMTQ0NSwxNyBAQAogZWNobyAiJHtIfSIKIFsgJHtlcnJ9ID0gMCBdICYmCiAgICggYWRiX3NoIHJtIC92ZW5kb3IvaGVsbG8gPC9kZXYvbnVsbCAyPi9kZXYvbnVsbCB8fCB0cnVlICkgJiYKLSAgYWRiX3NoIHJtIC9zeXN0ZW0vaGVsbG8gPC9kZXYvbnVsbCB8fAorICBhZGJfc2ggcm0gL3N5c3RlbS9oZWxsbyAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvIDwvZGV2L251bGwgfHwKICAgKCBbIC1uICIke0x9IiBdICYmIGVjaG8gIiR7TH0iICYmIGZhbHNlICkgfHwKICAgZGllIC10ICR7VH0gImNsZWFudXAgaGVsbG8iCiBCPSJgYWRiX2NhdCAvc3lzdGVtL2hlbGxvYCIKIGNoZWNrX2VxICJjYXQ6IC9zeXN0ZW0vaGVsbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiICIke0J9IiBhZnRlciBybQorQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCitjaGVja19lcSAiY2F0OiAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAiJHtCfSIgYWZ0ZXIgcm0KIEI9ImBhZGJfY2F0IC92ZW5kb3IvaGVsbG9gIgogY2hlY2tfZXEgImNhdDogL3ZlbmRvci9oZWxsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgIiR7Qn0iIGFmdGVyIHJtCiAKLWlmIFsgLW4gIiR7c2NyYXRjaF9wYXJ0aXRpb259IiBdOyB0aGVuCitpZiAke2lzX2Jvb3Rsb2FkZXJfZmFzdGJvb3R9ICYmIFsgLW4gIiR7c2NyYXRjaF9wYXJ0aXRpb259IiBdOyB0aGVuCiAKICAgZWNobyAiJHtHUkVFTn1bIFJVTiAgICAgIF0ke05PUk1BTH0gdGVzdCBmYXN0Ym9vdCBmbGFzaCB0byAke3NjcmF0Y2hfcGFydGl0aW9ufSByZWNvdmVyeSIgPiYyCiAKQEAgLTE1NDIsNyArMTU5Nyw5IEBACiAgICAgYWRiX3dhaXQgJHtBREJfV0FJVH0gfHwKICAgICBkaWUgImFkYiByZW1vdW50IC1SIgogICBpZiBbICJvcmFuZ2UiICE9ICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCi0gICAgICAgIjIiID0gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KKyAgICAgICAiMiIgPSAiYGdldF9wcm9wZXJ0eSBwYXJ0aXRpb24uc3lzdGVtLnZlcmlmaWVkYCIgXSAmJgorICAgICBbIC1uICJgZ2V0X3Byb3BlcnR5IHJvLmJvb3QudmVyaWZpZWRib290c3RhdGVgIiAtbyBcCisgICAgICAgLW4gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF07IHRoZW4KICAgICBkaWUgInJlbW91bnQgLVIgY29tbWFuZCBmYWlsZWQgdG8gZGlzYWJsZSB2ZXJpdHkiCiAgIGZpCiAKZGlmZiAtLWdpdCBhL2ZzX21nci90b29scy9kbWN0bC5jcHAgYi9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwCmluZGV4IDdlNmFkNWIuLmQ2ZmIwMDYgMTAwNjQ0Ci0tLSBhL2ZzX21nci90b29scy9kbWN0bC5jcHAKKysrIGIvZnNfbWdyL3Rvb2xzL2RtY3RsLmNwcApAQCAtNTAsNiArNTAsOCBAQAogICAgIHN0ZDo6Y2VyciA8PCAiICBsaXN0IDxkZXZpY2VzIHwgdGFyZ2V0cz4gWy12XSIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBnZXRwYXRoIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBzdGF0dXMgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIHJlc3VtZSA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgc3VzcGVuZCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgdGFibGUgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgIGhlbHAiIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgc3RkOjplbmRsOwpAQCAtMzk5LDYgKzQwMSwzNCBAQAogICAgIHJldHVybiBEdW1wVGFibGUoInN0YXR1cyIsIGFyZ2MsIGFyZ3YpOwogfQogCitzdGF0aWMgaW50IFJlc3VtZUNtZEhhbmRsZXIoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgaWYgKGFyZ2MgIT0gMSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgRGV2aWNlTWFwcGVyJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoIWRtLkNoYW5nZVN0YXRlKGFyZ3ZbMF0sIERtRGV2aWNlU3RhdGU6OkFDVElWRSkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJDb3VsZCBub3QgcmVzdW1lIGRldmljZSBcIiIgPDwgYXJndlswXSA8PCAiXCIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBTdXNwZW5kQ21kSGFuZGxlcihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBhcmd1bWVudHMsIHNlZSBcJ2RtY3RsIGhlbHBcJyIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGlmICghZG0uQ2hhbmdlU3RhdGUoYXJndlswXSwgRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNvdWxkIG5vdCBzdXNwZW5kIGRldmljZSBcIiIgPDwgYXJndlswXSA8PCAiXCIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwogc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OmZ1bmN0aW9uPGludChpbnQsIGNoYXIqKik+PiBjbWRtYXAgPSB7CiAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAgICAgeyJjcmVhdGUiLCBEbUNyZWF0ZUNtZEhhbmRsZXJ9LApAQCAtNDA4LDYgKzQzOCw4IEBACiAgICAgICAgIHsiZ2V0cGF0aCIsIEdldFBhdGhDbWRIYW5kbGVyfSwKICAgICAgICAgeyJ0YWJsZSIsIFRhYmxlQ21kSGFuZGxlcn0sCiAgICAgICAgIHsic3RhdHVzIiwgU3RhdHVzQ21kSGFuZGxlcn0sCisgICAgICAgIHsicmVzdW1lIiwgUmVzdW1lQ21kSGFuZGxlcn0sCisgICAgICAgIHsic3VzcGVuZCIsIFN1c3BlbmRDbWRIYW5kbGVyfSwKICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiB9OwogCmRpZmYgLS1naXQgYS9saWJpb24vT1dORVJTIGIvbGliaW9uL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNhZDJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW9uL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3NzcGF0aWxAZ29vZ2xlLmNvbQoraHJpZHlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuY3BwIGIvbGlibmF0aXZlbG9hZGVyL2xpYnJhcnlfbmFtZXNwYWNlcy5jcHAKaW5kZXggYzIyY2U4YS4uYTllZWE4YyAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL2xpYnJhcnlfbmFtZXNwYWNlcy5jcHAKKysrIGIvbGlibmF0aXZlbG9hZGVyL2xpYnJhcnlfbmFtZXNwYWNlcy5jcHAKQEAgLTMzLDYgKzMzLDggQEAKICNpbmNsdWRlICJwdWJsaWNfbGlicmFyaWVzLmgiCiAjaW5jbHVkZSAidXRpbHMuaCIKIAordXNpbmcgYW5kcm9pZDo6YmFzZTo6RXJyb3I7CisKIG5hbWVzcGFjZSBhbmRyb2lkOjpuYXRpdmVsb2FkZXIgewogCiBuYW1lc3BhY2UgewpAQCAtMTI4LDExICsxMzAsMTEgQEAKICAgfQogfQogCi1OYXRpdmVMb2FkZXJOYW1lc3BhY2UqIExpYnJhcnlOYW1lc3BhY2VzOjpDcmVhdGUoSk5JRW52KiBlbnYsIHVpbnQzMl90IHRhcmdldF9zZGtfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGNsYXNzX2xvYWRlciwgYm9vbCBpc19zaGFyZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBkZXhfcGF0aCwganN0cmluZyBqYXZhX2xpYnJhcnlfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGphdmFfcGVybWl0dGVkX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgeworUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZSo+IExpYnJhcnlOYW1lc3BhY2VzOjpDcmVhdGUoSk5JRW52KiBlbnYsIHVpbnQzMl90IHRhcmdldF9zZGtfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpvYmplY3QgY2xhc3NfbG9hZGVyLCBib29sIGlzX3NoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgZGV4X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3RyaW5nIGphdmFfbGlicmFyeV9wYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBqYXZhX3Blcm1pdHRlZF9wYXRoKSB7CiAgIHN0ZDo6c3RyaW5nIGxpYnJhcnlfcGF0aDsgIC8vIGVtcHR5IHN0cmluZyBieSBkZWZhdWx0LgogCiAgIGlmIChqYXZhX2xpYnJhcnlfcGF0aCAhPSBudWxscHRyKSB7CkBAIC0xNTgsMTQgKzE2MCwxNCBAQAogICB9CiAKICAgLy8gSW5pdGlhbGl6ZSB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZSB3aXRoIHRoZSBmaXJzdCBub24tZW1wdHkgbGlicmFyeSBwYXRoLgorICBSZXN1bHQ8dm9pZD4gcmV0OwogICBpZiAoIWxpYnJhcnlfcGF0aC5lbXB0eSgpICYmICFpbml0aWFsaXplZF8gJiYKLSAgICAgICFJbml0UHVibGljTmFtZXNwYWNlKGxpYnJhcnlfcGF0aC5jX3N0cigpLCBlcnJvcl9tc2cpKSB7Ci0gICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAhKHJldCA9IEluaXRQdWJsaWNOYW1lc3BhY2UobGlicmFyeV9wYXRoLmNfc3RyKCkpKSkgeworICAgIHJldHVybiByZXQuZXJyb3IoKTsKICAgfQogCi0gIGJvb2wgZm91bmQgPSBGaW5kTmFtZXNwYWNlQnlDbGFzc0xvYWRlcihlbnYsIGNsYXNzX2xvYWRlcik7Ci0KLSAgTE9HX0FMV0FZU19GQVRBTF9JRihmb3VuZCwgIlRoZXJlIGlzIGFscmVhZHkgYSBuYW1lc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3Nsb2FkZXIiKTsKKyAgTE9HX0FMV0FZU19GQVRBTF9JRihGaW5kTmFtZXNwYWNlQnlDbGFzc0xvYWRlcihlbnYsIGNsYXNzX2xvYWRlcikgIT0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAiVGhlcmUgaXMgYWxyZWFkeSBhIG5hbWVzcGFjZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjbGFzc2xvYWRlciIpOwogCiAgIHN0ZDo6c3RyaW5nIHN5c3RlbV9leHBvc2VkX2xpYnJhcmllcyA9IGRlZmF1bHRfcHVibGljX2xpYnJhcmllcygpOwogICBjb25zdCBjaGFyKiBuYW1lc3BhY2VfbmFtZSA9IGtDbGFzc2xvYWRlck5hbWVzcGFjZU5hbWU7CkBAIC0yMTYsNTggKzIxOCw2NiBAQAogICBhdXRvIGFwcF9ucyA9CiAgICAgICBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkNyZWF0ZShuYW1lc3BhY2VfbmFtZSwgbGlicmFyeV9wYXRoLCBwZXJtaXR0ZWRfcGF0aCwgcGFyZW50X25zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfc2hhcmVkLCB0YXJnZXRfc2RrX3ZlcnNpb24gPCAyNCAvKiBpc19ncmV5bGlzdF9lbmFibGVkICovKTsKLSAgaWYgKGFwcF9ucy5Jc05pbCgpKSB7Ci0gICAgKmVycm9yX21zZyA9IGFwcF9ucy5HZXRFcnJvcigpOwotICAgIHJldHVybiBudWxscHRyOworICBpZiAoIWFwcF9ucykgeworICAgIHJldHVybiBhcHBfbnMuZXJyb3IoKTsKICAgfQogCiAgIC8vIC4uLiBhbmQgbGluayB0byBvdGhlciBuYW1lc3BhY2VzIHRvIGFsbG93IGFjY2VzcyB0byBzb21lIHB1YmxpYyBsaWJyYXJpZXMKLSAgYm9vbCBpc19icmlkZ2VkID0gYXBwX25zLklzQnJpZGdlZCgpOworICBib29sIGlzX2JyaWRnZWQgPSBhcHBfbnMtPklzQnJpZGdlZCgpOwogCiAgIGF1dG8gcGxhdGZvcm1fbnMgPSBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldFBsYXRmb3JtTmFtZXNwYWNlKGlzX2JyaWRnZWQpOwotICBpZiAoIWFwcF9ucy5MaW5rKHBsYXRmb3JtX25zLCBzeXN0ZW1fZXhwb3NlZF9saWJyYXJpZXMpKSB7Ci0gICAgKmVycm9yX21zZyA9IGFwcF9ucy5HZXRFcnJvcigpOwotICAgIHJldHVybiBudWxscHRyOworICBpZiAoIXBsYXRmb3JtX25zKSB7CisgICAgcmV0dXJuIHBsYXRmb3JtX25zLmVycm9yKCk7CisgIH0KKworICBhdXRvIGxpbmtlZCA9IGFwcF9ucy0+TGluaygqcGxhdGZvcm1fbnMsIHN5c3RlbV9leHBvc2VkX2xpYnJhcmllcyk7CisgIGlmICghbGlua2VkKSB7CisgICAgcmV0dXJuIGxpbmtlZC5lcnJvcigpOwogICB9CiAKICAgYXV0byBydW50aW1lX25zID0gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRFeHBvcnRlZE5hbWVzcGFjZShrUnVudGltZU5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwogICAvLyBSdW50aW1lIGFwZXggZG9lcyBub3QgZXhpc3QgaW4gaG9zdCwgYW5kIHVuZGVyIGNlcnRhaW4gYnVpbGQgY29uZGl0aW9ucy4KLSAgaWYgKCFydW50aW1lX25zLklzTmlsKCkpIHsKLSAgICBpZiAoIWFwcF9ucy5MaW5rKHJ1bnRpbWVfbnMsIHJ1bnRpbWVfcHVibGljX2xpYnJhcmllcygpKSkgewotICAgICAgKmVycm9yX21zZyA9IGFwcF9ucy5HZXRFcnJvcigpOwotICAgICAgcmV0dXJuIG51bGxwdHI7CisgIGlmIChydW50aW1lX25zKSB7CisgICAgbGlua2VkID0gYXBwX25zLT5MaW5rKCpydW50aW1lX25zLCBydW50aW1lX3B1YmxpY19saWJyYXJpZXMoKSk7CisgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgIHJldHVybiBsaW5rZWQuZXJyb3IoKTsKICAgICB9CiAgIH0KIAogICAvLyBHaXZlIGFjY2VzcyB0byBOTkFQSSBsaWJyYXJpZXMgKGFwZXgtdXBkYXRlZCBMTE5ESyBsaWJyYXJ5KS4KICAgYXV0byBubmFwaV9ucyA9CiAgICAgICBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldEV4cG9ydGVkTmFtZXNwYWNlKGtOZXVyYWxOZXR3b3Jrc05hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwotICBpZiAoIWFwcF9ucy5MaW5rKG5uYXBpX25zLCBuZXVyYWxuZXR3b3Jrc19wdWJsaWNfbGlicmFyaWVzKCkpKSB7Ci0gICAgKmVycm9yX21zZyA9IGFwcF9ucy5HZXRFcnJvcigpOwotICAgIHJldHVybiBudWxscHRyOworICBpZiAobm5hcGlfbnMpIHsKKyAgICBsaW5rZWQgPSBhcHBfbnMtPkxpbmsoKm5uYXBpX25zLCBuZXVyYWxuZXR3b3Jrc19wdWJsaWNfbGlicmFyaWVzKCkpOworICAgIGlmICghbGlua2VkKSB7CisgICAgICByZXR1cm4gbGlua2VkLmVycm9yKCk7CisgICAgfQogICB9CiAKICAgLy8gR2l2ZSBhY2Nlc3MgdG8gVk5ESy1TUCBsaWJyYXJpZXMgZnJvbSB0aGUgJ3ZuZGsnIG5hbWVzcGFjZS4KICAgaWYgKHVuYnVuZGxlZF92ZW5kb3Jfb3JfcHJvZHVjdF9hcHAgJiYgIXZuZGtzcF9saWJyYXJpZXMoKS5lbXB0eSgpKSB7CiAgICAgYXV0byB2bmRrX25zID0gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRFeHBvcnRlZE5hbWVzcGFjZShrVm5ka05hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwotICAgIGlmICghdm5ka19ucy5Jc05pbCgpICYmICFhcHBfbnMuTGluayh2bmRrX25zLCB2bmRrc3BfbGlicmFyaWVzKCkpKSB7Ci0gICAgICAqZXJyb3JfbXNnID0gYXBwX25zLkdldEVycm9yKCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBpZiAodm5ka19ucykgeworICAgICAgbGlua2VkID0gYXBwX25zLT5MaW5rKCp2bmRrX25zLCB2bmRrc3BfbGlicmFyaWVzKCkpOworICAgICAgaWYgKCFsaW5rZWQpIHsKKyAgICAgICAgcmV0dXJuIGxpbmtlZC5lcnJvcigpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIC8vIE5vdGUgdGhhdCB3aGVuIHZlbmRvcl9ucyBpcyBub3QgY29uZmlndXJlZCwgdmVuZG9yX25zLklzTmlsKCkgd2lsbCBiZSB0cnVlCi0gIC8vIGFuZCBpdCB3aWxsIHJlc3VsdCBpbiBsaW5raW5nIHRvIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB3aGljaCBpcyBleHBlY3RlZAotICAvLyBiZWhhdmlvciBpbiB0aGlzIGNhc2UuCiAgIGlmICghdmVuZG9yX3B1YmxpY19saWJyYXJpZXMoKS5lbXB0eSgpKSB7CiAgICAgYXV0byB2ZW5kb3JfbnMgPSBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldEV4cG9ydGVkTmFtZXNwYWNlKGtWZW5kb3JOYW1lc3BhY2VOYW1lLCBpc19icmlkZ2VkKTsKLSAgICBpZiAoIWFwcF9ucy5MaW5rKHZlbmRvcl9ucywgdmVuZG9yX3B1YmxpY19saWJyYXJpZXMoKSkpIHsKLSAgICAgICplcnJvcl9tc2cgPSBkbGVycm9yKCk7Ci0gICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAvLyB3aGVuIHZlbmRvcl9ucyBpcyBub3QgY29uZmlndXJlZCwgbGluayB0byB0aGUgcGxhdGZvcm0gbmFtZXNwYWNlCisgICAgYXV0byB0YXJnZXRfbnMgPSB2ZW5kb3JfbnMgPyB2ZW5kb3JfbnMgOiBwbGF0Zm9ybV9uczsKKyAgICBpZiAodGFyZ2V0X25zKSB7CisgICAgICBsaW5rZWQgPSBhcHBfbnMtPkxpbmsoKnRhcmdldF9ucywgdmVuZG9yX3B1YmxpY19saWJyYXJpZXMoKSk7CisgICAgICBpZiAoIWxpbmtlZCkgeworICAgICAgICByZXR1cm4gbGlua2VkLmVycm9yKCk7CisgICAgICB9CiAgICAgfQogICB9CiAKLSAgbmFtZXNwYWNlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGVudi0+TmV3V2Vha0dsb2JhbFJlZihjbGFzc19sb2FkZXIpLCBhcHBfbnMpKTsKKyAgbmFtZXNwYWNlc18ucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGVudi0+TmV3V2Vha0dsb2JhbFJlZihjbGFzc19sb2FkZXIpLCAqYXBwX25zKSk7CiAKICAgcmV0dXJuICYobmFtZXNwYWNlc18uYmFjaygpLnNlY29uZCk7CiB9CkBAIC0yODUsNyArMjk1LDcgQEAKICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLWJvb2wgTGlicmFyeU5hbWVzcGFjZXM6OkluaXRQdWJsaWNOYW1lc3BhY2UoY29uc3QgY2hhciogbGlicmFyeV9wYXRoLCBzdGQ6OnN0cmluZyogZXJyb3JfbXNnKSB7CitSZXN1bHQ8dm9pZD4gTGlicmFyeU5hbWVzcGFjZXM6OkluaXRQdWJsaWNOYW1lc3BhY2UoY29uc3QgY2hhciogbGlicmFyeV9wYXRoKSB7CiAgIC8vIEFzayBuYXRpdmUgYnJpZGUgaWYgdGhpcyBhcHBzIGxpYnJhcnkgcGF0aCBzaG91bGQgYmUgaGFuZGxlZCBieSBpdAogICBib29sIGlzX25hdGl2ZV9icmlkZ2UgPSBOYXRpdmVCcmlkZ2VJc1BhdGhTdXBwb3J0ZWQobGlicmFyeV9wYXRoKTsKIApAQCAtMjk2LDggKzMwNiw3IEBACiAgIGluaXRpYWxpemVkXyA9IGFuZHJvaWRfaW5pdF9hbm9ueW1vdXNfbmFtZXNwYWNlKGRlZmF1bHRfcHVibGljX2xpYnJhcmllcygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX25hdGl2ZV9icmlkZ2UgPyBudWxscHRyIDogbGlicmFyeV9wYXRoKTsKICAgaWYgKCFpbml0aWFsaXplZF8pIHsKLSAgICAqZXJyb3JfbXNnID0gZGxlcnJvcigpOwotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRXJyb3IoKSA8PCBkbGVycm9yKCk7CiAgIH0KIAogICAvLyBhbmQgbm93IGluaXRpYWxpemUgbmF0aXZlIGJyaWRnZSBuYW1lc3BhY2VzIGlmIG5lY2Vzc2FyeS4KQEAgLTMwNSwxMSArMzE0LDExIEBACiAgICAgaW5pdGlhbGl6ZWRfID0gTmF0aXZlQnJpZGdlSW5pdEFub255bW91c05hbWVzcGFjZShkZWZhdWx0X3B1YmxpY19saWJyYXJpZXMoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfbmF0aXZlX2JyaWRnZSA/IGxpYnJhcnlfcGF0aCA6IG51bGxwdHIpOwogICAgIGlmICghaW5pdGlhbGl6ZWRfKSB7Ci0gICAgICAqZXJyb3JfbXNnID0gTmF0aXZlQnJpZGdlR2V0RXJyb3IoKTsKKyAgICAgIHJldHVybiBFcnJvcigpIDw8IE5hdGl2ZUJyaWRnZUdldEVycm9yKCk7CiAgICAgfQogICB9CiAKLSAgcmV0dXJuIGluaXRpYWxpemVkXzsKKyAgcmV0dXJuIHt9OwogfQogCiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIExpYnJhcnlOYW1lc3BhY2VzOjpGaW5kUGFyZW50TmFtZXNwYWNlQnlDbGFzc0xvYWRlcihKTklFbnYqIGVudiwKZGlmZiAtLWdpdCBhL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuaCBiL2xpYm5hdGl2ZWxvYWRlci9saWJyYXJ5X25hbWVzcGFjZXMuaAppbmRleCA2ZTlhMTkwLi5lNTRiYzBhIDEwMDY0NAotLS0gYS9saWJuYXRpdmVsb2FkZXIvbGlicmFyeV9uYW1lc3BhY2VzLmgKKysrIGIvbGlibmF0aXZlbG9hZGVyL2xpYnJhcnlfbmFtZXNwYWNlcy5oCkBAIC0yNSwxMCArMjUsMTMgQEAKICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxqbmkuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQ6Om5hdGl2ZWxvYWRlciB7CiAKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKKwogLy8gTGlicmFyeU5hbWVzcGFjZXMgaXMgYSBzaW5nbGV0b24gb2JqZWN0IHRoYXQgbWFuYWdlcyBOYXRpdmVMb2FkZXJOYW1lc3BhY2UKIC8vIG9iamVjdHMgZm9yIGFuIGFwcCBwcm9jZXNzLiBJdHMgbWFpbiBqb2IgaXMgdG8gY3JlYXRlIChhbmQgY29uZmlndXJlKSBhIG5ldwogLy8gTmF0aXZlTG9hZGVyTmFtZXNwYWNlIG9iamVjdCBmb3IgYSBKYXZhIENsYXNzTG9hZGVyLCBhbmQgdG8gZmluZCBhbiBleGlzdGluZwpAQCAtNDYsMTMgKzQ5LDEzIEBACiAgICAgbmFtZXNwYWNlc18uY2xlYXIoKTsKICAgICBpbml0aWFsaXplZF8gPSBmYWxzZTsKICAgfQotICBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIENyZWF0ZShKTklFbnYqIGVudiwgdWludDMyX3QgdGFyZ2V0X3Nka192ZXJzaW9uLCBqb2JqZWN0IGNsYXNzX2xvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19zaGFyZWQsIGpzdHJpbmcgZGV4X3BhdGgsIGpzdHJpbmcgamF2YV9saWJyYXJ5X3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzdHJpbmcgamF2YV9wZXJtaXR0ZWRfcGF0aCwgc3RkOjpzdHJpbmcqIGVycm9yX21zZyk7CisgIFJlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2UqPiBDcmVhdGUoSk5JRW52KiBlbnYsIHVpbnQzMl90IHRhcmdldF9zZGtfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqb2JqZWN0IGNsYXNzX2xvYWRlciwgYm9vbCBpc19zaGFyZWQsIGpzdHJpbmcgZGV4X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBqYXZhX2xpYnJhcnlfcGF0aCwganN0cmluZyBqYXZhX3Blcm1pdHRlZF9wYXRoKTsKICAgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBGaW5kTmFtZXNwYWNlQnlDbGFzc0xvYWRlcihKTklFbnYqIGVudiwgam9iamVjdCBjbGFzc19sb2FkZXIpOwogCiAgcHJpdmF0ZToKLSAgYm9vbCBJbml0UHVibGljTmFtZXNwYWNlKGNvbnN0IGNoYXIqIGxpYnJhcnlfcGF0aCwgc3RkOjpzdHJpbmcqIGVycm9yX21zZyk7CisgIFJlc3VsdDx2b2lkPiBJbml0UHVibGljTmFtZXNwYWNlKGNvbnN0IGNoYXIqIGxpYnJhcnlfcGF0aCk7CiAgIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSogRmluZFBhcmVudE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoSk5JRW52KiBlbnYsIGpvYmplY3QgY2xhc3NfbG9hZGVyKTsKIAogICBib29sIGluaXRpYWxpemVkXzsKZGlmZiAtLWdpdCBhL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyLmNwcCBiL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyLmNwcAppbmRleCAwYzI5MzI0Li42ZDNjMDU3IDEwMDY0NAotLS0gYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlci5jcHAKKysrIGIvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXIuY3BwCkBAIC05MiwxMiArOTIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganN0cmluZyBwZXJtaXR0ZWRfcGF0aCkgewogI2lmIGRlZmluZWQoX19BTkRST0lEX18pCiAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChnX25hbWVzcGFjZXNfbXV0ZXgpOwotCi0gIHN0ZDo6c3RyaW5nIGVycm9yX21zZzsKLSAgYm9vbCBzdWNjZXNzID0gZ19uYW1lc3BhY2VzLT5DcmVhdGUoZW52LCB0YXJnZXRfc2RrX3ZlcnNpb24sIGNsYXNzX2xvYWRlciwgaXNfc2hhcmVkLCBkZXhfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeV9wYXRoLCBwZXJtaXR0ZWRfcGF0aCwgJmVycm9yX21zZykgIT0gbnVsbHB0cjsKLSAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgcmV0dXJuIGVudi0+TmV3U3RyaW5nVVRGKGVycm9yX21zZy5jX3N0cigpKTsKKyAgYXV0byBucyA9IGdfbmFtZXNwYWNlcy0+Q3JlYXRlKGVudiwgdGFyZ2V0X3Nka192ZXJzaW9uLCBjbGFzc19sb2FkZXIsIGlzX3NoYXJlZCwgZGV4X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5X3BhdGgsIHBlcm1pdHRlZF9wYXRoKTsKKyAgaWYgKCFucykgeworICAgIHJldHVybiBlbnYtPk5ld1N0cmluZ1VURihucy5lcnJvcigpLm1lc3NhZ2UoKS5jX3N0cigpKTsKICAgfQogI2Vsc2UKICAgVU5VU0VEKGVudiwgdGFyZ2V0X3Nka192ZXJzaW9uLCBjbGFzc19sb2FkZXIsIGlzX3NoYXJlZCwgZGV4X3BhdGgsIGxpYnJhcnlfcGF0aCwgcGVybWl0dGVkX3BhdGgpOwpAQCAtMTM5LDExICsxMzcsMTQgQEAKICAgaWYgKChucyA9IGdfbmFtZXNwYWNlcy0+RmluZE5hbWVzcGFjZUJ5Q2xhc3NMb2FkZXIoZW52LCBjbGFzc19sb2FkZXIpKSA9PSBudWxscHRyKSB7CiAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB0aGUgY2xhc3Nsb2FkZXIgd2FzIG5vdCBjcmVhdGVkIGJ5IEFwcGxpY2F0aW9uTG9hZGVycwogICAgIC8vIEluIHRoaXMgY2FzZSB3ZSBjcmVhdGUgYW4gaXNvbGF0ZWQgbm90LXNoYXJlZCBuYW1lc3BhY2UgZm9yIGl0LgotICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZV9lcnJvcl9tc2c7Ci0gICAgaWYgKChucyA9IGdfbmFtZXNwYWNlcy0+Q3JlYXRlKGVudiwgdGFyZ2V0X3Nka192ZXJzaW9uLCBjbGFzc19sb2FkZXIsIGZhbHNlIC8qIGlzX3NoYXJlZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbGlicmFyeV9wYXRoLCBudWxscHRyLCAmY3JlYXRlX2Vycm9yX21zZykpID09IG51bGxwdHIpIHsKLSAgICAgICplcnJvcl9tc2cgPSBzdHJkdXAoY3JlYXRlX2Vycm9yX21zZy5jX3N0cigpKTsKKyAgICBSZXN1bHQ8TmF0aXZlTG9hZGVyTmFtZXNwYWNlKj4gaXNvbGF0ZWRfbnMgPQorICAgICAgICBnX25hbWVzcGFjZXMtPkNyZWF0ZShlbnYsIHRhcmdldF9zZGtfdmVyc2lvbiwgY2xhc3NfbG9hZGVyLCBmYWxzZSAvKiBpc19zaGFyZWQgKi8sIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcnlfcGF0aCwgbnVsbHB0cik7CisgICAgaWYgKCFpc29sYXRlZF9ucykgeworICAgICAgKmVycm9yX21zZyA9IHN0cmR1cChpc29sYXRlZF9ucy5lcnJvcigpLm1lc3NhZ2UoKS5jX3N0cigpKTsKICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0gZWxzZSB7CisgICAgICBucyA9ICppc29sYXRlZF9uczsKICAgICB9CiAgIH0KIApAQCAtMjIyLDEyICsyMjMsMTQgQEAKICNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQogdm9pZCogT3Blbk5hdGl2ZUxpYnJhcnlJbk5hbWVzcGFjZShOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIG5zLCBjb25zdCBjaGFyKiBwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBuZWVkc19uYXRpdmVfYnJpZGdlLCBjaGFyKiogZXJyb3JfbXNnKSB7Ci0gIHZvaWQqIGhhbmRsZSA9IG5zLT5Mb2FkKHBhdGgpOwotICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKLSAgICAqZXJyb3JfbXNnID0gbnMtPkdldEVycm9yKCk7CisgIGF1dG8gaGFuZGxlID0gbnMtPkxvYWQocGF0aCk7CisgIGlmICghaGFuZGxlICYmIGVycm9yX21zZyAhPSBudWxscHRyKSB7CisgICAgKmVycm9yX21zZyA9IHN0cmR1cChoYW5kbGUuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CiAgIH0KLSAgKm5lZWRzX25hdGl2ZV9icmlkZ2UgPSBucy0+SXNCcmlkZ2VkKCk7Ci0gIHJldHVybiBoYW5kbGU7CisgIGlmIChuZWVkc19uYXRpdmVfYnJpZGdlICE9IG51bGxwdHIpIHsKKyAgICAqbmVlZHNfbmF0aXZlX2JyaWRnZSA9IG5zLT5Jc0JyaWRnZWQoKTsKKyAgfQorICByZXR1cm4gaGFuZGxlID8gKmhhbmRsZSA6IG51bGxwdHI7CiB9CiAKIC8vIG5hdGl2ZV9icmlkZ2VfbmFtZXNwYWNlcyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgY2FsbGVycyBvZiB0aGlzIGZ1bmN0aW9uLgpkaWZmIC0tZ2l0IGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcCBiL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5jcHAKaW5kZXggNThhYzY4Ni4uNGIwMjExNiAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcAorKysgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuY3BwCkBAIC0yOCw2ICsyOCw5IEBACiAKICNpbmNsdWRlICJuYXRpdmVsb2FkZXIvZGxleHRfbmFtZXNwYWNlcy5oIgogCit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJvcjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm9yZjsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgewpAQCAtMzUsNDEgKzM4LDQ2IEBACiBjb25zdGV4cHIgY29uc3QgY2hhcioga0RlZmF1bHROYW1lc3BhY2VOYW1lID0gImRlZmF1bHQiOwogY29uc3RleHByIGNvbnN0IGNoYXIqIGtQbGF0Zm9ybU5hbWVzcGFjZU5hbWUgPSAicGxhdGZvcm0iOwogCi19ICAvLyBuYW1lc3BhY2UKLQotTmF0aXZlTG9hZGVyTmFtZXNwYWNlIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0RXhwb3J0ZWROYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2JyaWRnZWQpIHsKLSAgaWYgKCFpc19icmlkZ2VkKSB7Ci0gICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UobmFtZS5jX3N0cigpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCBOYXRpdmVCcmlkZ2VHZXRFeHBvcnRlZE5hbWVzcGFjZShuYW1lLmNfc3RyKCkpKTsKK3N0ZDo6c3RyaW5nIEdldExpbmtlckVycm9yKGJvb2wgaXNfYnJpZGdlZCkgeworICBjb25zdCBjaGFyKiBtc2cgPSBpc19icmlkZ2VkID8gTmF0aXZlQnJpZGdlR2V0RXJyb3IoKSA6IGRsZXJyb3IoKTsKKyAgaWYgKG1zZyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuICJubyBlcnJvciI7CiAgIH0KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKG1zZyk7CiB9CiAKLWNoYXIqIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0RXJyb3IoKSBjb25zdCB7Ci0gIGlmICghSXNCcmlkZ2VkKCkpIHsKLSAgICByZXR1cm4gc3RyZHVwKGRsZXJyb3IoKSk7Cit9ICAvLyBuYW1lc3BhY2UKKworUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRFeHBvcnRlZE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19icmlkZ2VkKSB7CisgIGlmICghaXNfYnJpZGdlZCkgeworICAgIGF1dG8gcmF3ID0gYW5kcm9pZF9nZXRfZXhwb3J0ZWRfbmFtZXNwYWNlKG5hbWUuY19zdHIoKSk7CisgICAgaWYgKHJhdyAhPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlKG5hbWUsIHJhdyk7CisgICAgfQogICB9IGVsc2UgewotICAgIHJldHVybiBzdHJkdXAoTmF0aXZlQnJpZGdlR2V0RXJyb3IoKSk7CisgICAgYXV0byByYXcgPSBOYXRpdmVCcmlkZ2VHZXRFeHBvcnRlZE5hbWVzcGFjZShuYW1lLmNfc3RyKCkpOworICAgIGlmIChyYXcgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIH0KICAgfQorICByZXR1cm4gRXJyb3JmKCJuYW1lc3BhY2Uge30gZG9lcyBub3QgZXhpc3Qgb3IgZXhwb3J0ZWQiLCBuYW1lKTsKIH0KIAogLy8gVGhlIHBsYXRmb3JtIG5hbWVzcGFjZSBpcyBjYWxsZWQgImRlZmF1bHQiIGZvciBiaW5hcmllcyBpbiAvc3lzdGVtIGFuZAogLy8gInBsYXRmb3JtIiBmb3IgdGhvc2UgaW4gdGhlIFJ1bnRpbWUgQVBFWC4gVHJ5ICJwbGF0Zm9ybSIgZmlyc3Qgc2luY2UKIC8vICJkZWZhdWx0IiBhbHdheXMgZXhpc3RzLgotTmF0aXZlTG9hZGVyTmFtZXNwYWNlIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6R2V0UGxhdGZvcm1OYW1lc3BhY2UoYm9vbCBpc19icmlkZ2VkKSB7Ci0gIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBucyA9IEdldEV4cG9ydGVkTmFtZXNwYWNlKGtQbGF0Zm9ybU5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwotICBpZiAobnMuSXNOaWwoKSkgeworUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpHZXRQbGF0Zm9ybU5hbWVzcGFjZShib29sIGlzX2JyaWRnZWQpIHsKKyAgYXV0byBucyA9IEdldEV4cG9ydGVkTmFtZXNwYWNlKGtQbGF0Zm9ybU5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOworICBpZiAoIW5zKSB7CiAgICAgbnMgPSBHZXRFeHBvcnRlZE5hbWVzcGFjZShrRGVmYXVsdE5hbWVzcGFjZU5hbWUsIGlzX2JyaWRnZWQpOwogICB9CiAgIHJldHVybiBuczsKIH0KIAotTmF0aXZlTG9hZGVyTmFtZXNwYWNlIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6Q3JlYXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWFyY2hfcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBlcm1pdHRlZF9wYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3NoYXJlZCwgYm9vbCBpc19ncmV5bGlzdF9lbmFibGVkKSB7CitSZXN1bHQ8TmF0aXZlTG9hZGVyTmFtZXNwYWNlPiBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkNyZWF0ZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlYXJjaF9wYXRocywgY29uc3Qgc3RkOjpzdHJpbmcmIHBlcm1pdHRlZF9wYXRocywKKyAgICBjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UqIHBhcmVudCwgYm9vbCBpc19zaGFyZWQsIGJvb2wgaXNfZ3JleWxpc3RfZW5hYmxlZCkgewogICBib29sIGlzX2JyaWRnZWQgPSBmYWxzZTsKICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CiAgICAgaXNfYnJpZGdlZCA9IHBhcmVudC0+SXNCcmlkZ2VkKCk7CkBAIC03OCw4ICs4NiwxMSBAQAogICB9CiAKICAgLy8gRmFsbCBiYWNrIHRvIHRoZSBwbGF0Zm9ybSBuYW1lc3BhY2UgaWYgbm8gcGFyZW50IGlzIHNldC4KLSAgY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlJiBlZmZlY3RpdmVfcGFyZW50ID0KLSAgICAgIHBhcmVudCAhPSBudWxscHRyID8gKnBhcmVudCA6IEdldFBsYXRmb3JtTmFtZXNwYWNlKGlzX2JyaWRnZWQpOworICBhdXRvIHBsYXRmb3JtX25zID0gR2V0UGxhdGZvcm1OYW1lc3BhY2UoaXNfYnJpZGdlZCk7CisgIGlmICghcGxhdGZvcm1fbnMpIHsKKyAgICByZXR1cm4gcGxhdGZvcm1fbnMuZXJyb3IoKTsKKyAgfQorICBjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UmIGVmZmVjdGl2ZV9wYXJlbnQgPSBwYXJlbnQgIT0gbnVsbHB0ciA/ICpwYXJlbnQgOiAqcGxhdGZvcm1fbnM7CiAKICAgdWludDY0X3QgdHlwZSA9IEFORFJPSURfTkFNRVNQQUNFX1RZUEVfSVNPTEFURUQ7CiAgIGlmIChpc19zaGFyZWQpIHsKQEAgLTkzLDM3ICsxMDQsNTYgQEAKICAgICBhbmRyb2lkX25hbWVzcGFjZV90KiByYXcgPQogICAgICAgICBhbmRyb2lkX2NyZWF0ZV9uYW1lc3BhY2UobmFtZS5jX3N0cigpLCBudWxscHRyLCBzZWFyY2hfcGF0aHMuY19zdHIoKSwgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pdHRlZF9wYXRocy5jX3N0cigpLCBlZmZlY3RpdmVfcGFyZW50LlRvUmF3QW5kcm9pZE5hbWVzcGFjZSgpKTsKLSAgICByZXR1cm4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlKG5hbWUsIHJhdyk7CisgICAgaWYgKHJhdyAhPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlKG5hbWUsIHJhdyk7CisgICAgfQogICB9IGVsc2UgewogICAgIG5hdGl2ZV9icmlkZ2VfbmFtZXNwYWNlX3QqIHJhdyA9IE5hdGl2ZUJyaWRnZUNyZWF0ZU5hbWVzcGFjZSgKICAgICAgICAgbmFtZS5jX3N0cigpLCBudWxscHRyLCBzZWFyY2hfcGF0aHMuY19zdHIoKSwgdHlwZSwgcGVybWl0dGVkX3BhdGhzLmNfc3RyKCksCiAgICAgICAgIGVmZmVjdGl2ZV9wYXJlbnQuVG9SYXdOYXRpdmVCcmlkZ2VOYW1lc3BhY2UoKSk7Ci0gICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIGlmIChyYXcgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShuYW1lLCByYXcpOworICAgIH0KICAgfQorICByZXR1cm4gRXJyb3JmKCJmYWlsZWQgdG8gY3JlYXRlIHt9IG5hbWVzcGFjZSBuYW1lOnt9LCBzZWFyY2hfcGF0aHM6e30sIHBlcm1pdHRlZF9wYXRoczp7fSIsCisgICAgICAgICAgICAgICAgaXNfYnJpZGdlZCA/ICJicmlkZ2VkIiA6ICJuYXRpdmUiLCBuYW1lLCBzZWFyY2hfcGF0aHMsIHBlcm1pdHRlZF9wYXRocyk7CiB9CiAKLWJvb2wgTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpMaW5rKGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNoYXJlZF9saWJzKSBjb25zdCB7CitSZXN1bHQ8dm9pZD4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpMaW5rKGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmVkX2xpYnMpIGNvbnN0IHsKICAgTE9HX0FMV0FZU19GQVRBTF9JRihzaGFyZWRfbGlicy5lbXB0eSgpLCAiZW1wdHkgc2hhcmUgbGliIHdoZW4gbGlua2luZyAlcyB0byAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmNfc3RyKCksIHRhcmdldC5uYW1lKCkuY19zdHIoKSk7CiAgIGlmICghSXNCcmlkZ2VkKCkpIHsKLSAgICByZXR1cm4gYW5kcm9pZF9saW5rX25hbWVzcGFjZXModGhpcy0+VG9SYXdBbmRyb2lkTmFtZXNwYWNlKCksIHRhcmdldC5Ub1Jhd0FuZHJvaWROYW1lc3BhY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnMuY19zdHIoKSk7CisgICAgaWYgKGFuZHJvaWRfbGlua19uYW1lc3BhY2VzKHRoaXMtPlRvUmF3QW5kcm9pZE5hbWVzcGFjZSgpLCB0YXJnZXQuVG9SYXdBbmRyb2lkTmFtZXNwYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9saWJzLmNfc3RyKCkpKSB7CisgICAgICByZXR1cm4ge307CisgICAgfQogICB9IGVsc2UgewotICAgIHJldHVybiBOYXRpdmVCcmlkZ2VMaW5rTmFtZXNwYWNlcyh0aGlzLT5Ub1Jhd05hdGl2ZUJyaWRnZU5hbWVzcGFjZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQuVG9SYXdOYXRpdmVCcmlkZ2VOYW1lc3BhY2UoKSwgc2hhcmVkX2xpYnMuY19zdHIoKSk7CisgICAgaWYgKE5hdGl2ZUJyaWRnZUxpbmtOYW1lc3BhY2VzKHRoaXMtPlRvUmF3TmF0aXZlQnJpZGdlTmFtZXNwYWNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5Ub1Jhd05hdGl2ZUJyaWRnZU5hbWVzcGFjZSgpLCBzaGFyZWRfbGlicy5jX3N0cigpKSkgeworICAgICAgcmV0dXJuIHt9OworICAgIH0KICAgfQorICByZXR1cm4gRXJyb3IoKSA8PCBHZXRMaW5rZXJFcnJvcihJc0JyaWRnZWQoKSk7CiB9CiAKLXZvaWQqIE5hdGl2ZUxvYWRlck5hbWVzcGFjZTo6TG9hZChjb25zdCBjaGFyKiBsaWJfbmFtZSkgY29uc3QgeworUmVzdWx0PHZvaWQqPiBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkxvYWQoY29uc3QgY2hhciogbGliX25hbWUpIGNvbnN0IHsKICAgaWYgKCFJc0JyaWRnZWQoKSkgewogICAgIGFuZHJvaWRfZGxleHRpbmZvIGV4dGluZm87CiAgICAgZXh0aW5mby5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRTsKICAgICBleHRpbmZvLmxpYnJhcnlfbmFtZXNwYWNlID0gdGhpcy0+VG9SYXdBbmRyb2lkTmFtZXNwYWNlKCk7Ci0gICAgcmV0dXJuIGFuZHJvaWRfZGxvcGVuX2V4dChsaWJfbmFtZSwgUlRMRF9OT1csICZleHRpbmZvKTsKKyAgICB2b2lkKiBoYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQobGliX25hbWUsIFJUTERfTk9XLCAmZXh0aW5mbyk7CisgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICByZXR1cm4gaGFuZGxlOworICAgIH0KICAgfSBlbHNlIHsKLSAgICByZXR1cm4gTmF0aXZlQnJpZGdlTG9hZExpYnJhcnlFeHQobGliX25hbWUsIFJUTERfTk9XLCB0aGlzLT5Ub1Jhd05hdGl2ZUJyaWRnZU5hbWVzcGFjZSgpKTsKKyAgICB2b2lkKiBoYW5kbGUgPQorICAgICAgICBOYXRpdmVCcmlkZ2VMb2FkTGlicmFyeUV4dChsaWJfbmFtZSwgUlRMRF9OT1csIHRoaXMtPlRvUmF3TmF0aXZlQnJpZGdlTmFtZXNwYWNlKCkpOworICAgIGlmIChoYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICB9CiAgIH0KKyAgcmV0dXJuIEVycm9yKCkgPDwgR2V0TGlua2VyRXJyb3IoSXNCcmlkZ2VkKCkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmggYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuaAppbmRleCA3MWU0MjQ3Li4yOWI3NTljIDEwMDY0NAotLS0gYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuaAorKysgYi9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuaApAQCAtMjEsMjIgKzIxLDI1IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcmVzdWx0Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9kbGV4dC5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KICNpbmNsdWRlIDxuYXRpdmVicmlkZ2UvbmF0aXZlX2JyaWRnZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlc3VsdDsKKwogLy8gTmF0aXZlTG9hZGVyTmFtZXNwYWNlIGFic3RyYWN0cyBhIGxpbmtlciBuYW1lc3BhY2UgZm9yIHRoZSBuYXRpdmUKIC8vIGFyY2hpdGVjdHVyZSAoZXg6IGFybSBvbiBhcm0pIG9yIHRoZSB0cmFuc2xhdGVkIGFyY2hpdGVjdHVyZSAoZXg6IGFybSBvbgogLy8geDg2KS4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIG1hbmFnZWQgYnkgTGlicmFyeU5hbWVzcGFjZXMgb2JqZWN0Lgogc3RydWN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSB7CiAgcHVibGljOgotICAvLyBUT0RPKHJldHVybiB3aXRoIGVycm9ycykKLSAgc3RhdGljIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBDcmVhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWFyY2hfcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXR0ZWRfcGF0aHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSogcGFyZW50LCBib29sIGlzX3NoYXJlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19ncmV5bGlzdF9lbmFibGVkKTsKKyAgc3RhdGljIFJlc3VsdDxOYXRpdmVMb2FkZXJOYW1lc3BhY2U+IENyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VhcmNoX3BhdGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwZXJtaXR0ZWRfcGF0aHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKiBwYXJlbnQsIGJvb2wgaXNfc2hhcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZ3JleWxpc3RfZW5hYmxlZCk7CiAKICAgTmF0aXZlTG9hZGVyTmFtZXNwYWNlKE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYmKSA9IGRlZmF1bHQ7CiAgIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShjb25zdCBOYXRpdmVMb2FkZXJOYW1lc3BhY2UmKSA9IGRlZmF1bHQ7CkBAIC00NywxNiArNTAsMTMgQEAKIAogICBzdGQ6OnN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gbmFtZV87IH0KICAgYm9vbCBJc0JyaWRnZWQoKSBjb25zdCB7IHJldHVybiByYXdfLmluZGV4KCkgPT0gMTsgfQotICBib29sIElzTmlsKCkgY29uc3QgewotICAgIHJldHVybiBJc0JyaWRnZWQoKSA/IHN0ZDo6Z2V0PDE+KHJhd18pID09IG51bGxwdHIgOiBzdGQ6OmdldDwwPihyYXdfKSA9PSBudWxscHRyOwotICB9CiAKLSAgYm9vbCBMaW5rKGNvbnN0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZSYgdGFyZ2V0LCBjb25zdCBzdGQ6OnN0cmluZyYgc2hhcmVkX2xpYnMpIGNvbnN0OwotICB2b2lkKiBMb2FkKGNvbnN0IGNoYXIqIGxpYl9uYW1lKSBjb25zdDsKLSAgY2hhciogR2V0RXJyb3IoKSBjb25zdDsKKyAgUmVzdWx0PHZvaWQ+IExpbmsoY29uc3QgTmF0aXZlTG9hZGVyTmFtZXNwYWNlJiB0YXJnZXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzaGFyZWRfbGlicykgY29uc3Q7CisgIFJlc3VsdDx2b2lkKj4gTG9hZChjb25zdCBjaGFyKiBsaWJfbmFtZSkgY29uc3Q7CiAKLSAgc3RhdGljIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBHZXRFeHBvcnRlZE5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYm9vbCBpc19icmlkZ2VkKTsKLSAgc3RhdGljIE5hdGl2ZUxvYWRlck5hbWVzcGFjZSBHZXRQbGF0Zm9ybU5hbWVzcGFjZShib29sIGlzX2JyaWRnZWQpOworICBzdGF0aWMgUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gR2V0RXhwb3J0ZWROYW1lc3BhY2UoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2JyaWRnZWQpOworICBzdGF0aWMgUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gR2V0UGxhdGZvcm1OYW1lc3BhY2UoYm9vbCBpc19icmlkZ2VkKTsKIAogIHByaXZhdGU6CiAgIGV4cGxpY2l0IE5hdGl2ZUxvYWRlck5hbWVzcGFjZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYW5kcm9pZF9uYW1lc3BhY2VfdCogbnMpCmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvcHVibGljX2xpYnJhcmllcy5jcHAgYi9saWJuYXRpdmVsb2FkZXIvcHVibGljX2xpYnJhcmllcy5jcHAKaW5kZXggMTBlMjNmZC4uNmNlZTY2OCAxMDA2NDQKLS0tIGEvbGlibmF0aXZlbG9hZGVyL3B1YmxpY19saWJyYXJpZXMuY3BwCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9wdWJsaWNfbGlicmFyaWVzLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9yZXN1bHQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIApAQCAtMzQsNiArMzUsOSBAQAogbmFtZXNwYWNlIGFuZHJvaWQ6Om5hdGl2ZWxvYWRlciB7CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OkVycm5vRXJyb3I7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpFcnJvcmY7Cit1c2luZyBhbmRyb2lkOjpiYXNlOjpSZXN1bHQ7CiAKIG5hbWVzcGFjZSB7CiAKQEAgLTkxLDIyICs5NSwyMSBAQAogICBmaWxlX25hbWUtPmluc2VydChpbnNlcnRfcG9zLCB2bmRrX3ZlcnNpb25fc3RyKCkpOwogfQogCi1jb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmLCBzdGQ6OnN0cmluZyopPiBhbHdheXNfdHJ1ZSA9Ci0gICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmLCBzdGQ6OnN0cmluZyopIHsgcmV0dXJuIHRydWU7IH07Citjb25zdCBzdGQ6OmZ1bmN0aW9uPFJlc3VsdDx2b2lkPihjb25zdCBzdGQ6OnN0cmluZyYpPiBhbHdheXNfdHJ1ZSA9CisgICAgW10oY29uc3Qgc3RkOjpzdHJpbmcmKSAtPiBSZXN1bHQ8dm9pZD4geyByZXR1cm4ge307IH07CiAKLWJvb2wgUmVhZENvbmZpZyhjb25zdCBzdGQ6OnN0cmluZyYgY29uZmlnRmlsZSwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBzb25hbWVzLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzdGQ6OnN0cmluZyYgLyogc29uYW1lICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogLyogZXJyb3JfbXNnICovKT4mIGNoZWNrX3NvbmFtZSwKLSAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZXJyb3JfbXNnID0gbnVsbHB0cikgeworUmVzdWx0PHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gUmVhZENvbmZpZygKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29uZmlnRmlsZSwKKyAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPFJlc3VsdDx2b2lkPihjb25zdCBzdGQ6OnN0cmluZyYgLyogc29uYW1lICovKT4mIGNoZWNrX3NvbmFtZSkgewogICAvLyBSZWFkIGxpc3Qgb2YgcHVibGljIG5hdGl2ZSBsaWJyYXJpZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUuCiAgIHN0ZDo6c3RyaW5nIGZpbGVfY29udGVudDsKICAgaWYgKCFiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGNvbmZpZ0ZpbGUsICZmaWxlX2NvbnRlbnQpKSB7Ci0gICAgaWYgKGVycm9yX21zZykgKmVycm9yX21zZyA9IHN0cmVycm9yKGVycm5vKTsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIEVycm5vRXJyb3IoKTsKICAgfQogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaW5lcyA9IGJhc2U6OlNwbGl0KGZpbGVfY29udGVudCwgIlxuIik7CiAKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvbmFtZXM7CiAgIGZvciAoYXV0byYgbGluZSA6IGxpbmVzKSB7CiAgICAgYXV0byB0cmltbWVkX2xpbmUgPSBiYXNlOjpUcmltKGxpbmUpOwogICAgIGlmICh0cmltbWVkX2xpbmVbMF0gPT0gJyMnIHx8IHRyaW1tZWRfbGluZS5lbXB0eSgpKSB7CkBAIC0xMTYsOCArMTE5LDcgQEAKICAgICBpZiAoc3BhY2VfcG9zICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CiAgICAgICBzdGQ6OnN0cmluZyB0eXBlID0gdHJpbW1lZF9saW5lLnN1YnN0cihzcGFjZV9wb3MgKyAxKTsKICAgICAgIGlmICh0eXBlICE9ICIzMiIgJiYgdHlwZSAhPSAiNjQiKSB7Ci0gICAgICAgIGlmIChlcnJvcl9tc2cpICplcnJvcl9tc2cgPSAiTWFsZm9ybWVkIGxpbmU6ICIgKyBsaW5lOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBFcnJvcmYoIk1hbGZvcm1lZCBsaW5lOiB7fSIsIGxpbmUpOwogICAgICAgfQogI2lmIGRlZmluZWQoX19MUDY0X18pCiAgICAgICAvLyBTa2lwIDMyIGJpdCBwdWJsaWMgbGlicmFyeS4KQEAgLTEzMywxMyArMTM1LDEzIEBACiAgICAgICB0cmltbWVkX2xpbmUucmVzaXplKHNwYWNlX3Bvcyk7CiAgICAgfQogCi0gICAgaWYgKGNoZWNrX3NvbmFtZSh0cmltbWVkX2xpbmUsIGVycm9yX21zZykpIHsKLSAgICAgIHNvbmFtZXMtPnB1c2hfYmFjayh0cmltbWVkX2xpbmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgYXV0byByZXQgPSBjaGVja19zb25hbWUodHJpbW1lZF9saW5lKTsKKyAgICBpZiAoIXJldCkgeworICAgICAgcmV0dXJuIHJldC5lcnJvcigpOwogICAgIH0KKyAgICBzb25hbWVzLnB1c2hfYmFjayh0cmltbWVkX2xpbmUpOwogICB9Ci0gIHJldHVybiB0cnVlOworICByZXR1cm4gc29uYW1lczsKIH0KIAogdm9pZCBSZWFkRXh0ZW5zaW9uTGlicmFyaWVzKGNvbnN0IGNoYXIqIGRpcm5hbWUsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogc29uYW1lcykgewpAQCAtMTYyLDI0ICsxNjQsMjIgQEAKICAgICAgICAgICAgICJFcnJvciBleHRyYWN0aW5nIGNvbXBhbnkgbmFtZSBmcm9tIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZpbGUgcGF0aCBcIiVzXCIiLAogICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aC5jX3N0cigpKTsKIAotICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcl9tc2c7Ci0KLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigKLSAgICAgICAgICAgICFSZWFkQ29uZmlnKGNvbmZpZ19maWxlX3BhdGgsIHNvbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBbJmNvbXBhbnlfbmFtZV0oY29uc3Qgc3RkOjpzdHJpbmcmIHNvbmFtZSwgc3RkOjpzdHJpbmcqIGVycm9yX21zZykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChzb25hbWUsICJsaWIiKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6RW5kc1dpdGgoc29uYW1lLCAiLiIgKyBjb21wYW55X25hbWUgKyAiLnNvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JfbXNnID0gIkxpYnJhcnkgbmFtZSBcIiIgKyBzb25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgZG9lcyBub3QgZW5kIHdpdGggdGhlIGNvbXBhbnkgbmFtZTogIiArIGNvbXBhbnlfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIuIjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3JfbXNnKSwKLSAgICAgICAgICAgICJFcnJvciByZWFkaW5nIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZyb20gXCIlc1wiOiAlcyIsIGNvbmZpZ19maWxlX3BhdGguY19zdHIoKSwKLSAgICAgICAgICAgIGVycm9yX21zZy5jX3N0cigpKTsKKyAgICAgICAgYXV0byByZXQgPSBSZWFkQ29uZmlnKAorICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aCwgWyZjb21wYW55X25hbWVdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb25hbWUpIC0+IFJlc3VsdDx2b2lkPiB7CisgICAgICAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHNvbmFtZSwgImxpYiIpICYmCisgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpFbmRzV2l0aChzb25hbWUsICIuIiArIGNvbXBhbnlfbmFtZSArICIuc28iKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB7fTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3JmKCJMaWJyYXJ5IG5hbWUgXCJ7fVwiIGRvZXMgbm90IGVuZCB3aXRoIHRoZSBjb21wYW55IG5hbWUge30uIiwgc29uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFueV9uYW1lKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICBzb25hbWVzLT5pbnNlcnQoc29uYW1lcy0+ZW5kKCksIHJldC0+YmVnaW4oKSwgcmV0LT5lbmQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiRXJyb3IgcmVhZGluZyBwdWJsaWMgbmF0aXZlIGxpYnJhcnkgbGlzdCBmcm9tIFwiJXNcIjogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGVfcGF0aC5jX3N0cigpLCByZXQuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE4NywxNiArMTg3LDE3IEBACiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBJbml0RGVmYXVsdFB1YmxpY0xpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSByb290X2RpcigpICsga0RlZmF1bHRQdWJsaWNMaWJyYXJpZXNGaWxlOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc29uYW1lczsKLSAgc3RkOjpzdHJpbmcgZXJyb3JfbXNnOwotICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCAmc29uYW1lcywgYWx3YXlzX3RydWUsICZlcnJvcl9tc2cpLAotICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByZWFkaW5nIHB1YmxpYyBuYXRpdmUgbGlicmFyeSBsaXN0IGZyb20gXCIlc1wiOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgY29uZmlnX2ZpbGUuY19zdHIoKSwgZXJyb3JfbXNnLmNfc3RyKCkpOworICBhdXRvIHNvbmFtZXMgPSBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCBhbHdheXNfdHJ1ZSk7CisgIGlmICghc29uYW1lcykgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkVycm9yIHJlYWRpbmcgcHVibGljIG5hdGl2ZSBsaWJyYXJ5IGxpc3QgZnJvbSBcIiVzXCI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ19maWxlLmNfc3RyKCksIHNvbmFtZXMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgcmV0dXJuICIiOworICB9CiAKICAgc3RkOjpzdHJpbmcgYWRkaXRpb25hbF9saWJzID0gYWRkaXRpb25hbF9wdWJsaWNfbGlicmFyaWVzKCk7CiAgIGlmICghYWRkaXRpb25hbF9saWJzLmVtcHR5KCkpIHsKICAgICBhdXRvIHZlYyA9IGJhc2U6OlNwbGl0KGFkZGl0aW9uYWxfbGlicywgIjoiKTsKLSAgICBzdGQ6OmNvcHkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKHNvbmFtZXMpKTsKKyAgICBzdGQ6OmNvcHkodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKCpzb25hbWVzKSk7CiAgIH0KIAogICAvLyBSZW1vdmUgdGhlIHB1YmxpYyBsaWJzIGluIHRoZSBydW50aW1lIG5hbWVzcGFjZS4KQEAgLTIxNiwxOCArMjE3LDE4IEBACiAgICAgICBjb250aW51ZTsKICAgICB9CiAKLSAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMuYmVnaW4oKSwgc29uYW1lcy5lbmQoKSwgbGliX25hbWUpOwotICAgIGlmIChpdCAhPSBzb25hbWVzLmVuZCgpKSB7Ci0gICAgICBzb25hbWVzLmVyYXNlKGl0KTsKKyAgICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMtPmJlZ2luKCksIHNvbmFtZXMtPmVuZCgpLCBsaWJfbmFtZSk7CisgICAgaWYgKGl0ICE9IHNvbmFtZXMtPmVuZCgpKSB7CisgICAgICBzb25hbWVzLT5lcmFzZShpdCk7CiAgICAgfQogICB9CiAKICAgLy8gUmVtb3ZlIHRoZSBwdWJsaWMgbGlicyBpbiB0aGUgbm5hcGkgbmFtZXNwYWNlLgotICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMuYmVnaW4oKSwgc29uYW1lcy5lbmQoKSwga05ldXJhbE5ldHdvcmtzQXBleFB1YmxpY0xpYnJhcnkpOwotICBpZiAoaXQgIT0gc29uYW1lcy5lbmQoKSkgewotICAgIHNvbmFtZXMuZXJhc2UoaXQpOworICBhdXRvIGl0ID0gc3RkOjpmaW5kKHNvbmFtZXMtPmJlZ2luKCksIHNvbmFtZXMtPmVuZCgpLCBrTmV1cmFsTmV0d29ya3NBcGV4UHVibGljTGlicmFyeSk7CisgIGlmIChpdCAhPSBzb25hbWVzLT5lbmQoKSkgeworICAgIHNvbmFtZXMtPmVyYXNlKGl0KTsKICAgfQotICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbihzb25hbWVzLCAnOicpOworICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbigqc29uYW1lcywgJzonKTsKIH0KIAogc3RhdGljIHN0ZDo6c3RyaW5nIEluaXRSdW50aW1lUHVibGljTGlicmFyaWVzKCkgewpAQCAtMjQzLDkgKzI0NCwxMSBAQAogCiBzdGF0aWMgc3RkOjpzdHJpbmcgSW5pdFZlbmRvclB1YmxpY0xpYnJhcmllcygpIHsKICAgLy8gVGhpcyBmaWxlIGlzIG9wdGlvbmFsLCBxdWlldGx5IGlnbm9yZSBpZiB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdC4KLSAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHNvbmFtZXM7Ci0gIFJlYWRDb25maWcoa1ZlbmRvclB1YmxpY0xpYnJhcmllc0ZpbGUsICZzb25hbWVzLCBhbHdheXNfdHJ1ZSwgbnVsbHB0cik7Ci0gIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKHNvbmFtZXMsICc6Jyk7CisgIGF1dG8gc29uYW1lcyA9IFJlYWRDb25maWcoa1ZlbmRvclB1YmxpY0xpYnJhcmllc0ZpbGUsIGFsd2F5c190cnVlKTsKKyAgaWYgKCFzb25hbWVzKSB7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKCpzb25hbWVzLCAnOicpOwogfQogCiAvLyByZWFkIC9zeXN0ZW0vZXRjL3B1YmxpYy5saWJyYXJpZXMtPGNvbXBhbnluYW1lPi50eHQgYW5kCkBAIC0yNjIsMTcgKzI2NSwyMyBAQAogc3RhdGljIHN0ZDo6c3RyaW5nIEluaXRMbG5ka0xpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSBrTGxuZGtMaWJyYXJpZXNGaWxlOwogICBJbnNlcnRWbmRrVmVyc2lvblN0cigmY29uZmlnX2ZpbGUpOwotICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc29uYW1lczsKLSAgUmVhZENvbmZpZyhjb25maWdfZmlsZSwgJnNvbmFtZXMsIGFsd2F5c190cnVlLCBudWxscHRyKTsKLSAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oc29uYW1lcywgJzonKTsKKyAgYXV0byBzb25hbWVzID0gUmVhZENvbmZpZyhjb25maWdfZmlsZSwgYWx3YXlzX3RydWUpOworICBpZiAoIXNvbmFtZXMpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIHNvbmFtZXMuZXJyb3IoKS5tZXNzYWdlKCkuY19zdHIoKSk7CisgICAgcmV0dXJuICIiOworICB9CisgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpKb2luKCpzb25hbWVzLCAnOicpOwogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgSW5pdFZuZGtzcExpYnJhcmllcygpIHsKICAgc3RkOjpzdHJpbmcgY29uZmlnX2ZpbGUgPSBrVm5ka0xpYnJhcmllc0ZpbGU7CiAgIEluc2VydFZuZGtWZXJzaW9uU3RyKCZjb25maWdfZmlsZSk7Ci0gIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzb25hbWVzOwotICBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCAmc29uYW1lcywgYWx3YXlzX3RydWUsIG51bGxwdHIpOwotICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6Sm9pbihzb25hbWVzLCAnOicpOworICBhdXRvIHNvbmFtZXMgPSBSZWFkQ29uZmlnKGNvbmZpZ19maWxlLCBhbHdheXNfdHJ1ZSk7CisgIGlmICghc29uYW1lcykgeworICAgIExPR19BTFdBWVNfRkFUQUwoIiVzIiwgc29uYW1lcy5lcnJvcigpLm1lc3NhZ2UoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKyAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkpvaW4oKnNvbmFtZXMsICc6Jyk7CiB9CiAKIHN0YXRpYyBzdGQ6OnN0cmluZyBJbml0TmV1cmFsTmV0d29ya3NQdWJsaWNMaWJyYXJpZXMoKSB7Cg==