ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmluZGV4IDU1Njc4NGYuLjZlNTI4MzYgMTAwNjQ0Ci0tLSBhL0FuZHJvaWQuYnAKKysrIGIvQW5kcm9pZC5icApAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICAibGliYm9vdGxvYWRlcl9tZXNzYWdlIiwKICAgICAgICAgImxpYmZlYyIsCiAgICAgICAgICJsaWJmZWNfcnMiLAorICAgICAgICAibGliZnNfYXZiIiwKICAgICAgICAgImxpYmZzX21nciIsCiAgICAgICAgICJsaWJzY3J5cHRfc3RhdGljIiwKICAgICAgICAgImxpYnNxdWFzaGZzX3V0aWxzIiwKQEAgLTM5LDYgKzQwLDcgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5rZXltYXN0ZXJAMy4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUua2V5bWFzdGVyQDQuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJvb3RAMS4wIiwKICAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCkBAIC00Nyw2ICs0OSw3IEBACiAgICAgICAgICJsaWJkaXNrY29uZmlnIiwKICAgICAgICAgImxpYmV4dDRfdXRpbHMiLAogICAgICAgICAibGliZjJmc19zcGFyc2VibG9jayIsCisgICAgICAgICJsaWJmc2NyeXB0IiwKICAgICAgICAgImxpYmhhcmR3YXJlIiwKICAgICAgICAgImxpYmhhcmR3YXJlX2xlZ2FjeSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC05MywxMiArOTYsMTQgQEAKICAgICBdLAogCiAgICAgc3JjczogWworICAgICAgICAiQXBwRnVzZVV0aWwuY3BwIiwKICAgICAgICAgIkJlbmNobWFyay5jcHAiLAogICAgICAgICAiQ2hlY2tFbmNyeXB0aW9uLmNwcCIsCisgICAgICAgICJDaGVja3BvaW50LmNwcCIsCiAgICAgICAgICJEZXZtYXBwZXIuY3BwIiwKICAgICAgICAgIkVuY3J5cHRJbnBsYWNlLmNwcCIsCi0gICAgICAgICJFeHQ0Q3J5cHQuY3BwIiwKICAgICAgICAgIkZpbGVEZXZpY2VVdGlscy5jcHAiLAorICAgICAgICAiRnNDcnlwdC5jcHAiLAogICAgICAgICAiSWRsZU1haW50LmNwcCIsCiAgICAgICAgICJLZXlCdWZmZXIuY3BwIiwKICAgICAgICAgIktleVN0b3JhZ2UuY3BwIiwKQEAgLTEyNiwxOSArMTMxLDI4IEBACiAgICAgICAgICJtb2RlbC9Qcml2YXRlVm9sdW1lLmNwcCIsCiAgICAgICAgICJtb2RlbC9QdWJsaWNWb2x1bWUuY3BwIiwKICAgICAgICAgIm1vZGVsL1ZvbHVtZUJhc2UuY3BwIiwKKyAgICAgICAgIm1vZGVsL1N0dWJWb2x1bWUuY3BwIiwKICAgICAgICAgInNlY29udGV4dC5jcHAiLAogICAgIF0sCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKICAgICAgICAgYXJjOiB7CiAgICAgICAgICAgICBleGNsdWRlX3NyY3M6IFsKKyAgICAgICAgICAgICAgICAiQXBwRnVzZVV0aWwuY3BwIiwKICAgICAgICAgICAgICAgICAibW9kZWwvT2JiVm9sdW1lLmNwcCIsCiAgICAgICAgICAgICBdLAogICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgICAgICAgICAiYXJjX3NlcnZpY2VzX2FpZGwiLAorICAgICAgICAgICAgICAgICJsaWJhcmNhcHBmdXNlIiwKICAgICAgICAgICAgICAgICAibGliYXJjb2Jidm9sdW1lIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCisgICAgICAgIGRlYnVnZ2FibGU6IHsKKyAgICAgICAgICAgIGNwcGZsYWdzOiBbIi1EX19BTkRST0lEX0RFQlVHR0FCTEVfXyJdLAorICAgICAgICB9LAogICAgIH0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoLnN0b3JhZ2VAMS4wIiwKKyAgICBdLAogfQogCiBjY19iaW5hcnkgewpAQCAtMTU0LDYgKzE2OCw3IEBACiAgICAgICAgIGFyYzogewogICAgICAgICAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgICAgICAgICAiYXJjX3NlcnZpY2VzX2FpZGwiLAorICAgICAgICAgICAgICAgICJsaWJhcmNhcHBmdXNlIiwKICAgICAgICAgICAgICAgICAibGliYXJjb2Jidm9sdW1lIiwKICAgICAgICAgICAgIF0sCiAgICAgICAgIH0sCkBAIC0xNjgsNiArMTgzLDExIEBACiAgICAgICAgICJ2b2xkX3ByZXBhcmVfc3ViZGlycyIsCiAgICAgICAgICJ3YWl0X2Zvcl9rZXltYXN0ZXIiLAogICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5oZWFsdGguc3RvcmFnZUAxLjAiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgXSwKIH0KIAogY2NfYmluYXJ5IHsKZGlmZiAtLWdpdCBhL0FwcEZ1c2VVdGlsLmNwcCBiL0FwcEZ1c2VVdGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTgyYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvQXBwRnVzZVV0aWwuY3BwCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFwcEZ1c2VVdGlsLmgiCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCisjaW5jbHVkZSAiVXRpbHMuaCIKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKK25hbWVzcGFjZSB7CisKK3N0YXRpYyBzaXplX3Qga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSA9IDMyOworCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgR2V0TW91bnRQYXRoKHVpZF90IHVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIHN0ZDo6c3RyaW5nKiBwYXRoKSB7CisgICAgaWYgKG5hbWUuc2l6ZSgpID4ga0FwcEZ1c2VNYXhNb3VudFBvaW50TmFtZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJBcHBGdXNlIG1vdW50IG5hbWUgaXMgdG9vIGxvbmcuIjsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWlzYWxudW0obmFtZVtpXSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkFwcEZ1c2UgbW91bnQgbmFtZSBjb250YWlucyBpbnZhbGlkIGNoYXJhY3Rlci4iOworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBhdGggPSBTdHJpbmdQcmludGYoIi9tbnQvYXBwZnVzZS8lZF8lcyIsIHVpZCwgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7Cit9CisKK3N0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBNb3VudChpbnQgZGV2aWNlX2ZkLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIC8vIFJlbW92ZSBleGlzdGluZyBtb3VudC4KKyAgICBhbmRyb2lkOjp2b2xkOjpGb3JjZVVubW91bnQocGF0aCk7CisKKyAgICBjb25zdCBhdXRvIG9wdHMgPSBTdHJpbmdQcmludGYoCisgICAgICAgICJmZD0laSwiCisgICAgICAgICJyb290bW9kZT00MDAwMCwiCisgICAgICAgICJkZWZhdWx0X3Blcm1pc3Npb25zLCIKKyAgICAgICAgImFsbG93X290aGVyLCIKKyAgICAgICAgInVzZXJfaWQ9MCxncm91cF9pZD0wLCIKKyAgICAgICAgImNvbnRleHQ9XCJ1Om9iamVjdF9yOmFwcF9mdXNlX2ZpbGU6czBcIiwiCisgICAgICAgICJmc2NvbnRleHQ9dTpvYmplY3RfcjphcHBfZnVzZWZzOnMwIiwKKyAgICAgICAgZGV2aWNlX2ZkKTsKKworICAgIGNvbnN0IGludCByZXN1bHQgPQorICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkobW91bnQoIi9kZXYvZnVzZSIsIHBhdGguY19zdHIoKSwgImZ1c2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNfTk9TVUlEIHwgTVNfTk9ERVYgfCBNU19OT0VYRUMgfCBNU19OT0FUSU1FLCBvcHRzLmNfc3RyKCkpKTsKKyAgICBpZiAocmVzdWx0ICE9IDApIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHBhdGg7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCitzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgUnVuQ29tbWFuZChjb25zdCBzdGQ6OnN0cmluZyYgY29tbWFuZCwgdWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfZmQpIHsKKyAgICBpZiAoREVCVUdfQVBQRlVTRSkgeworICAgICAgICBMT0coREVCVUcpIDw8ICJSdW4gYXBwIGZ1c2UgY29tbWFuZCAiIDw8IGNvbW1hbmQgPDwgIiBmb3IgdGhlIHBhdGggIiA8PCBwYXRoIDw8ICIgYW5kIHVpZCAiCisgICAgICAgICAgICAgICAgICAgPDwgdWlkOworICAgIH0KKworICAgIGlmIChjb21tYW5kID09ICJtb3VudCIpIHsKKyAgICAgICAgcmV0dXJuIE1vdW50KGRldmljZV9mZCwgcGF0aCk7CisgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJ1bm1vdW50IikgeworICAgICAgICAvLyBJZiBpdCdzIGp1c3QgYWZ0ZXIgYWxsIEZEIG9wZW5lZCBvbiBtb3VudCBwb2ludCBhcmUgY2xvc2VkLCB1bW91bnQyIGNhbiBmYWlsIHdpdGgKKyAgICAgICAgLy8gRUJVU1kuIFRvIGF2b2lkIHRoZSBjYXNlLCBzcGVjaWZ5IE1OVF9ERVRBQ0guCisgICAgICAgIGlmICh1bW91bnQyKHBhdGguY19zdHIoKSwgVU1PVU5UX05PRk9MTE9XIHwgTU5UX0RFVEFDSCkgIT0gMCAmJiBlcnJubyAhPSBFSU5WQUwgJiYKKyAgICAgICAgICAgIGVycm5vICE9IEVOT0VOVCkgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50IGRpcmVjdG9yeS4iOworICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgfQorICAgICAgICBpZiAocm1kaXIocGF0aC5jX3N0cigpKSAhPSAwKSB7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlbW92ZSB0aGUgbW91bnQgZGlyZWN0b3J5LiI7CisgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmRyb2lkOjpPSzsKKyAgICB9IGVsc2UgeworICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGFwcGZ1c2UgY29tbWFuZCAiIDw8IGNvbW1hbmQ7CisgICAgICAgIHJldHVybiAtRVBFUk07CisgICAgfQorCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworaW50IE1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCkgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKKworICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCisgICAgc3RkOjpzdHJpbmcgcGF0aDsKKyAgICBpZiAoR2V0TW91bnRQYXRoKHVpZCwgbmFtZSwgJnBhdGgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbW91bnQgcG9pbnQgbmFtZSI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgZGlyZWN0b3JpZXMuCisgICAgY29uc3QgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gYW5kcm9pZDo6dm9sZDo6UHJlcGFyZURpcihwYXRoLCAwNzAwLCAwLCAwKTsKKyAgICBpZiAocmVzdWx0ICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSBkaXJlY3RvcnkgIiA8PCBwYXRoOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gT3BlbiBkZXZpY2UgRkQuCisgICAgZGV2aWNlX2ZkLT5yZXNldChvcGVuKCIvZGV2L2Z1c2UiLCBPX1JEV1IpKTsgIC8vIG5vdCBPX0NMT0VYRUMKKyAgICBpZiAoZGV2aWNlX2ZkLT5nZXQoKSA9PSAtMSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gL2Rldi9mdXNlIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIE1vdW50LgorICAgIHJldHVybiBSdW5Db21tYW5kKCJtb3VudCIsIHVpZCwgcGF0aCwgZGV2aWNlX2ZkLT5nZXQoKSk7Cit9CisKK2ludCBVbm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpOworCisgICAgLy8gQ2hlY2sgbW91bnQgcG9pbnQgbmFtZS4KKyAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgIGlmIChHZXRNb3VudFBhdGgodWlkLCBuYW1lLCAmcGF0aCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBtb3VudCBwb2ludCBuYW1lIjsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHJldHVybiBSdW5Db21tYW5kKCJ1bm1vdW50IiwgdWlkLCBwYXRoLCAtMSAvKiBkZXZpY2VfZmQgKi8pOworfQorCitpbnQgT3BlbkFwcEZ1c2VGaWxlKHVpZF90IHVpZCwgaW50IG1vdW50SWQsIGludCBmaWxlSWQsIGludCBmbGFncykgeworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBzdGQ6OnRvX3N0cmluZyhtb3VudElkKTsKKworICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCisgICAgc3RkOjpzdHJpbmcgbW91bnRQb2ludDsKKyAgICBpZiAoR2V0TW91bnRQYXRoKHVpZCwgbmFtZSwgJm1vdW50UG9pbnQpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbW91bnQgcG9pbnQgbmFtZSI7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBwYXRoID0gU3RyaW5nUHJpbnRmKCIlcy8lZCIsIG1vdW50UG9pbnQuY19zdHIoKSwgZmlsZUlkKTsKKyAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aC5jX3N0cigpLCBmbGFncykpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0FwcEZ1c2VVdGlsLmggYi9BcHBGdXNlVXRpbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2M2M2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9BcHBGdXNlVXRpbC5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfVk9MRF9BUFBfRlVTRV9VVElMX0hfCisjZGVmaW5lIEFORFJPSURfVk9MRF9BUFBfRlVTRV9VVElMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisKKyNkZWZpbmUgREVCVUdfQVBQRlVTRSAwCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSB2b2xkIHsKKworaW50IE1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCk7CisKK2ludCBVbm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIGludCBtb3VudElkKTsKKworaW50IE9wZW5BcHBGdXNlRmlsZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBpbnQgZmlsZUlkLCBpbnQgZmxhZ3MpOworCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1ZPTERfQVBQX0ZVU0VfVVRJTF9IXwpkaWZmIC0tZ2l0IGEvQmVuY2htYXJrLmNwcCBiL0JlbmNobWFyay5jcHAKaW5kZXggZGZlMzM2Ni4uYjBhM2I4NSAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmNwcAorKysgYi9CZW5jaG1hcmsuY3BwCkBAIC0yOCw4ICsyOCw4IEBACiAKICNpbmNsdWRlIDx0aHJlYWQ+CiAKLSNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmc7CkBAIC01MCwxMiArNTAsMTIgQEAKIAogLy8gUkFJSSBjbGFzcyBmb3IgYm9vc3RpbmcgZGV2aWNlIHBlcmZvcm1hbmNlIGR1cmluZyBiZW5jaG1hcmtzLgogY2xhc3MgUGVyZm9ybWFuY2VCb29zdCB7Ci1wcml2YXRlOgorICBwcml2YXRlOgogICAgIGludCBvcmlnX3ByaW87CiAgICAgaW50IG9yaWdfaW9wcmlvOwogICAgIElvU2NoZWRDbGFzcyBvcmlnX2NsYXp6OwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBQZXJmb3JtYW5jZUJvb3N0KCkgewogICAgICAgICBlcnJubyA9IDA7CiAgICAgICAgIG9yaWdfcHJpbyA9IGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCk7CkBAIC04Nyw4ICs4Nyw4IEBACiB9OwogCiBzdGF0aWMgc3RhdHVzX3QgYmVuY2htYXJrSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIHJvb3RQYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKLSAgICAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlKiBleHRyYXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGUqIGV4dHJhcykgewogICAgIHN0YXR1c190IHJlcyA9IDA7CiAKICAgICBhdXRvIHBhdGggPSByb290UGF0aDsKQEAgLTEzNywxMiArMTM3LDEyIEBACiAgICAgLy8gT25seSBkcm9wIHdoZW4gd2UgaGF2ZW4ndCBhYm9ydGVkCiAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICBhbmRyb2lkOjpiYXNlOjpUaW1lciB0aW1lcjsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJCZWZvcmUgZHJvcF9jYWNoZXMiOwogICAgICAgICBpZiAoIVdyaXRlU3RyaW5nVG9GaWxlKCIzIiwgIi9wcm9jL3N5cy92bS9kcm9wX2NhY2hlcyIpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGRyb3BfY2FjaGVzIjsKICAgICAgICAgICAgIHJlcyA9IC0xOwogICAgICAgICB9Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiQWZ0ZXIgZHJvcF9jYWNoZXMiOworICAgICAgICBMT0coREVCVUcpIDw8ICJBZnRlciBkcm9wX2NhY2hlcyI7CiAgICAgICAgIHN5bmMoKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgZXh0cmFzLT5wdXRMb25nKFN0cmluZzE2KCJkcm9wIiksIHRpbWVyLmR1cmF0aW9uKCkuY291bnQoKSk7CiAgICAgfQpAQCAtMTc5LDcgKzE3OSw3IEBACiB9CiAKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhrQmVuY2htYXJrTG9jayk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGtXYWtlTG9jayk7CiAKZGlmZiAtLWdpdCBhL0JlbmNobWFyay5oIGIvQmVuY2htYXJrLmgKaW5kZXggNGYxOWIwMS4uZDU4ODJjZCAxMDA2NDQKLS0tIGEvQmVuY2htYXJrLmgKKysrIGIvQmVuY2htYXJrLmgKQEAgLTI0LDggKzI0LDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKKy8vIGNsYW5nLWZvcm1hdCBvZmYKIHZvaWQgQmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisvLyBjbGFuZy1mb3JtYXQgb24KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9DaGVja3BvaW50LmNwcCBiL0NoZWNrcG9pbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ODU1ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9DaGVja3BvaW50LmNwcApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2hlY2twb2ludCIKKyNpbmNsdWRlICJDaGVja3BvaW50LmgiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ib290LzEuMC9JQm9vdENvbnRyb2wuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYW5kcm9pZF9yZWJvb3QuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGZzX21nci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U2V0UHJvcGVydHk7Cit1c2luZyBhbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpib290OjpWMV8wOjpCb29sUmVzdWx0OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmJvb3Q6OlYxXzA6OklCb290Q29udHJvbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpib290OjpWMV8wOjpTbG90OworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKK25hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrTWV0YWRhdGFDUEZpbGUgPSAiL21ldGFkYXRhL3ZvbGQvY2hlY2twb2ludCI7CisKK2Jvb2wgc2V0Qm93U3RhdGUoc3RkOjpzdHJpbmcgY29uc3QmIGJsb2NrX2RldmljZSwgc3RkOjpzdHJpbmcgY29uc3QmIHN0YXRlKSB7CisgICAgaWYgKGJsb2NrX2RldmljZS5zdWJzdHIoMCwgNSkgIT0gIi9kZXYvIikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJFeHBlY3RlZCBibG9jayBkZXZpY2UsIGdvdCAiIDw8IGJsb2NrX2RldmljZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHN0YXRlX2ZpbGVuYW1lID0gc3RkOjpzdHJpbmcoIi9zeXMvIikgKyBibG9ja19kZXZpY2Uuc3Vic3RyKDUpICsgIi9ib3cvc3RhdGUiOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUoc3RhdGUsIHN0YXRlX2ZpbGVuYW1lKSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHdyaXRlIHRvIGZpbGUgIiA8PCBzdGF0ZV9maWxlbmFtZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworU3RhdHVzIGNwX3N0YXJ0Q2hlY2twb2ludChpbnQgcmV0cnkpIHsKKyAgICBpZiAocmV0cnkgPCAtMSkgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiUmV0cnkgY291bnQgbXVzdCBiZSBtb3JlIHRoYW4gLTEiKTsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50ID0gc3RkOjp0b19zdHJpbmcocmV0cnkgKyAxKTsKKyAgICBpZiAocmV0cnkgPT0gLTEpIHsKKyAgICAgICAgc3A8SUJvb3RDb250cm9sPiBtb2R1bGUgPSBJQm9vdENvbnRyb2w6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKG1vZHVsZSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgYXV0byBjYiA9IFsmc3VmZml4XShoaWRsX3N0cmluZyBzKSB7IHN1ZmZpeCA9IHM7IH07CisgICAgICAgICAgICBpZiAobW9kdWxlLT5nZXRTdWZmaXgobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpLCBjYikuaXNPaygpKSBjb250ZW50ICs9ICIgIiArIHN1ZmZpeDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKGNvbnRlbnQsIGtNZXRhZGF0YUNQRmlsZSkpCisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKGVycm5vLCAiRmFpbGVkIHRvIHdyaXRlIGNoZWNrcG9pbnQgZmlsZSIpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgaXNDaGVja3BvaW50aW5nID0gZmFsc2U7Cit9CisKK1N0YXR1cyBjcF9jb21taXRDaGFuZ2VzKCkgeworICAgIGlmICghaXNDaGVja3BvaW50aW5nKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgfQorICAgIC8vIE11c3QgdGFrZSBhY3Rpb24gZm9yIGxpc3Qgb2YgbW91bnRlZCBjaGVja3BvaW50ZWQgdGhpbmdzIGhlcmUKKyAgICAvLyBUbyBkbyB0aGlzLCB3ZSB3YWxrIHRoZSBsaXN0IG9mIG1vdW50ZWQgZmlsZSBzeXN0ZW1zLgorICAgIC8vIEJ1dCB3ZSBhbHNvIG5lZWQgdG8gZ2V0IHRoZSBtYXRjaGluZyBmc3RhYiBlbnRyaWVzIHRvIHNlZQorICAgIC8vIHRoZSBvcmlnaW5hbCBmbGFncworICAgIHN0ZDo6c3RyaW5nIGVycl9zdHI7CisgICAgYXV0byBmc3RhYl9kZWZhdWx0ID0gc3RkOjp1bmlxdWVfcHRyPGZzdGFiLCBkZWNsdHlwZSgmZnNfbWdyX2ZyZWVfZnN0YWIpPnsKKyAgICAgICAgZnNfbWdyX3JlYWRfZnN0YWJfZGVmYXVsdCgpLCBmc19tZ3JfZnJlZV9mc3RhYn07CisgICAgaWYgKCFmc3RhYl9kZWZhdWx0KSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IGZzdGFiIik7CisKKyAgICBhdXRvIG1vdW50cyA9IHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT57CisgICAgICAgIGZzX21ncl9yZWFkX2ZzdGFiKCIvcHJvYy9tb3VudHMiKSwgZnNfbWdyX2ZyZWVfZnN0YWJ9OworICAgIGlmICghbW91bnRzKSByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJGYWlsZWQgdG8gZ2V0IC9wcm9jL21vdW50cyIpOworCisgICAgLy8gV2FsayBtb3VudGVkIGZpbGUgc3lzdGVtcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW91bnRzLT5udW1fZW50cmllczsgKytpKSB7CisgICAgICAgIGNvbnN0IGZzdGFiX3JlYyogbW91bnRfcmVjID0gJm1vdW50cy0+cmVjc1tpXTsKKyAgICAgICAgY29uc3QgZnN0YWJfcmVjKiBmc3RhYl9yZWMgPQorICAgICAgICAgICAgZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdC5nZXQoKSwgbW91bnRfcmVjLT5tb3VudF9wb2ludCk7CisgICAgICAgIGlmICghZnN0YWJfcmVjKSBjb250aW51ZTsKKworICAgICAgICBpZiAoZnNfbWdyX2lzX2NoZWNrcG9pbnRfZnMoZnN0YWJfcmVjKSkgeworICAgICAgICAgICAgaWYgKCFzdHJjbXAoZnN0YWJfcmVjLT5mc190eXBlLCAiZjJmcyIpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vdW50KG1vdW50X3JlYy0+YmxrX2RldmljZSwgbW91bnRfcmVjLT5tb3VudF9wb2ludCwgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNU19SRU1PVU5UIHwgZnN0YWJfcmVjLT5mbGFncywgImNoZWNrcG9pbnQ9ZW5hYmxlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiRmFpbGVkIHRvIHJlbW91bnQiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZnNfbWdyX2lzX2NoZWNrcG9pbnRfYmxrKGZzdGFiX3JlYykpIHsKKyAgICAgICAgICAgIGlmICghc2V0Qm93U3RhdGUobW91bnRfcmVjLT5ibGtfZGV2aWNlLCAiMiIpKQorICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIkZhaWxlZCB0byBzZXQgYm93IHN0YXRlIik7CisgICAgICAgIH0KKyAgICB9CisgICAgU2V0UHJvcGVydHkoInZvbGQuY2hlY2twb2ludF9jb21taXR0ZWQiLCAiMSIpOworICAgIGlzQ2hlY2twb2ludGluZyA9IGZhbHNlOworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVtb3ZlRmlsZUlmRXhpc3RzKGtNZXRhZGF0YUNQRmlsZSwgJmVycl9zdHIpKQorICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgZXJyX3N0ci5jX3N0cigpKTsKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCitTdGF0dXMgY3BfYWJvcnRDaGFuZ2VzKCkgeworICAgIGFuZHJvaWRfcmVib290KEFORFJPSURfUkJfUkVTVEFSVDIsIDAsIG51bGxwdHIpOworICAgIHJldHVybiBTdGF0dXM6Om9rKCk7Cit9CisKK2Jvb2wgY3BfbmVlZHNSb2xsYmFjaygpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIGJvb2wgcmV0OworCisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIGlmIChjb250ZW50ID09ICIwIikgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChjb250ZW50LnN1YnN0cigwLCAzKSA9PSAiLTEgIikgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgb2xkU3VmZml4ID0gY29udGVudC5zdWJzdHIoMyk7CisgICAgICAgICAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmV3U3VmZml4OworCisgICAgICAgICAgICBpZiAobW9kdWxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBjYiA9IFsmbmV3U3VmZml4XShoaWRsX3N0cmluZyBzKSB7IG5ld1N1ZmZpeCA9IHM7IH07CisgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXRTdWZmaXgobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpLCBjYik7CisgICAgICAgICAgICAgICAgaWYgKG9sZFN1ZmZpeCA9PSBuZXdTdWZmaXgpIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBjcF9uZWVkc0NoZWNrcG9pbnQoKSB7CisgICAgYm9vbCByZXQ7CisgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICBzcDxJQm9vdENvbnRyb2w+IG1vZHVsZSA9IElCb290Q29udHJvbDo6Z2V0U2VydmljZSgpOworCisgICAgaWYgKG1vZHVsZSAmJiBtb2R1bGUtPmlzU2xvdE1hcmtlZFN1Y2Nlc3NmdWwobW9kdWxlLT5nZXRDdXJyZW50U2xvdCgpKSA9PSBCb29sUmVzdWx0OjpGQUxTRSkgeworICAgICAgICBpc0NoZWNrcG9pbnRpbmcgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0ID0gYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrTWV0YWRhdGFDUEZpbGUsICZjb250ZW50KTsKKyAgICBpZiAocmV0KSB7CisgICAgICAgIHJldCA9IGNvbnRlbnQgIT0gIjAiOworICAgICAgICBpc0NoZWNrcG9pbnRpbmcgPSByZXQ7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworU3RhdHVzIGNwX3ByZXBhcmVDaGVja3BvaW50KCkgeworICAgIGF1dG8gZnN0YWJfZGVmYXVsdCA9IHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT57CisgICAgICAgIGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwgZnNfbWdyX2ZyZWVfZnN0YWJ9OworICAgIGlmICghZnN0YWJfZGVmYXVsdCkgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiRmFpbGVkIHRvIGdldCBmc3RhYiIpOworCisgICAgYXV0byBtb3VudHMgPSBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+eworICAgICAgICBmc19tZ3JfcmVhZF9mc3RhYigiL3Byb2MvbW91bnRzIiksIGZzX21ncl9mcmVlX2ZzdGFifTsKKyAgICBpZiAoIW1vdW50cykgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiRmFpbGVkIHRvIGdldCAvcHJvYy9tb3VudHMiKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW91bnRzLT5udW1fZW50cmllczsgKytpKSB7CisgICAgICAgIGNvbnN0IGZzdGFiX3JlYyogbW91bnRfcmVjID0gJm1vdW50cy0+cmVjc1tpXTsKKyAgICAgICAgY29uc3QgZnN0YWJfcmVjKiBmc3RhYl9yZWMgPQorICAgICAgICAgICAgZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdC5nZXQoKSwgbW91bnRfcmVjLT5tb3VudF9wb2ludCk7CisgICAgICAgIGlmICghZnN0YWJfcmVjKSBjb250aW51ZTsKKworICAgICAgICBpZiAoZnNfbWdyX2lzX2NoZWNrcG9pbnRfYmxrKGZzdGFiX3JlYykpIHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZCgKKyAgICAgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkob3Blbihtb3VudF9yZWMtPm1vdW50X3BvaW50LCBPX1JET05MWSB8IE9fQ0xPRVhFQykpKTsKKyAgICAgICAgICAgIGlmICghZmQpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gbW91bnQgcG9pbnQiIDw8IG1vdW50X3JlYy0+bW91bnRfcG9pbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0cnVjdCBmc3RyaW1fcmFuZ2UgcmFuZ2UgPSB7fTsKKyAgICAgICAgICAgIHJhbmdlLmxlbiA9IFVMTE9OR19NQVg7CisgICAgICAgICAgICBpZiAoaW9jdGwoZmQsIEZJVFJJTSwgJnJhbmdlKSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdHJpbSAiIDw8IG1vdW50X3JlYy0+bW91bnRfcG9pbnQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNldEJvd1N0YXRlKG1vdW50X3JlYy0+YmxrX2RldmljZSwgIjEiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCituYW1lc3BhY2UgeworY29uc3QgaW50IGtCbG9ja1NpemUgPSA0MDk2OworY29uc3QgaW50IGtTZWN0b3JTaXplID0gNTEyOworCit0eXBlZGVmIHVpbnQ2NF90IHNlY3Rvcl90OworCitzdHJ1Y3QgbG9nX2VudHJ5IHsKKyAgICBzZWN0b3JfdCBzb3VyY2U7CisgICAgc2VjdG9yX3QgZGVzdDsKKyAgICB1aW50MzJfdCBzaXplOworICAgIHVpbnQzMl90IGNoZWNrc3VtOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGxvZ19zZWN0b3IgeworICAgIHVpbnQzMl90IG1hZ2ljOworICAgIHVpbnQzMl90IGNvdW50OworICAgIHVpbnQzMl90IHNlcXVlbmNlOworICAgIHN0cnVjdCBsb2dfZW50cnkgZW50cmllc1tdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gTUFHSUMgaXMgQk9XIGluIGFzY2lpCitjb25zdCBpbnQga01hZ2ljID0gMHgwMDU3NGY0MjsKKwordm9pZCBjcmMzMihjb25zdCB2b2lkKiBkYXRhLCBzaXplX3Qgbl9ieXRlcywgdWludDMyX3QqIGNyYykgeworICAgIHN0YXRpYyB1aW50MzJfdCB0YWJsZVsweDEwMF0gPSB7CisgICAgICAgIDB4MDAwMDAwMDAsIDB4NzcwNzMwOTYsIDB4RUUwRTYxMkMsIDB4OTkwOTUxQkEsIDB4MDc2REM0MTksIDB4NzA2QUY0OEYsIDB4RTk2M0E1MzUsCisgICAgICAgIDB4OUU2NDk1QTMsIDB4MEVEQjg4MzIsIDB4NzlEQ0I4QTQsIDB4RTBENUU5MUUsIDB4OTdEMkQ5ODgsIDB4MDlCNjRDMkIsIDB4N0VCMTdDQkQsCisgICAgICAgIDB4RTdCODJEMDcsIDB4OTBCRjFEOTEsIDB4MURCNzEwNjQsIDB4NkFCMDIwRjIsIDB4RjNCOTcxNDgsIDB4ODRCRTQxREUsIDB4MUFEQUQ0N0QsCisgICAgICAgIDB4NkREREU0RUIsIDB4RjRENEI1NTEsIDB4ODNEMzg1QzcsIDB4MTM2Qzk4NTYsIDB4NjQ2QkE4QzAsIDB4RkQ2MkY5N0EsIDB4OEE2NUM5RUMsCisgICAgICAgIDB4MTQwMTVDNEYsIDB4NjMwNjZDRDksIDB4RkEwRjNENjMsIDB4OEQwODBERjUsIDB4M0I2RTIwQzgsIDB4NEM2OTEwNUUsIDB4RDU2MDQxRTQsCisgICAgICAgIDB4QTI2NzcxNzIsIDB4M0MwM0U0RDEsIDB4NEIwNEQ0NDcsIDB4RDIwRDg1RkQsIDB4QTUwQUI1NkIsIDB4MzVCNUE4RkEsIDB4NDJCMjk4NkMsCisgICAgICAgIDB4REJCQkM5RDYsIDB4QUNCQ0Y5NDAsIDB4MzJEODZDRTMsIDB4NDVERjVDNzUsIDB4RENENjBEQ0YsIDB4QUJEMTNENTksIDB4MjZEOTMwQUMsCisgICAgICAgIDB4NTFERTAwM0EsIDB4QzhENzUxODAsIDB4QkZEMDYxMTYsIDB4MjFCNEY0QjUsIDB4NTZCM0M0MjMsIDB4Q0ZCQTk1OTksIDB4QjhCREE1MEYsCisgICAgICAgIDB4MjgwMkI4OUUsIDB4NUYwNTg4MDgsIDB4QzYwQ0Q5QjIsIDB4QjEwQkU5MjQsIDB4MkY2RjdDODcsIDB4NTg2ODRDMTEsIDB4QzE2MTFEQUIsCisgICAgICAgIDB4QjY2NjJEM0QsCisKKyAgICAgICAgMHg3NkRDNDE5MCwgMHgwMURCNzEwNiwgMHg5OEQyMjBCQywgMHhFRkQ1MTAyQSwgMHg3MUIxODU4OSwgMHgwNkI2QjUxRiwgMHg5RkJGRTRBNSwKKyAgICAgICAgMHhFOEI4RDQzMywgMHg3ODA3QzlBMiwgMHgwRjAwRjkzNCwgMHg5NjA5QTg4RSwgMHhFMTBFOTgxOCwgMHg3RjZBMERCQiwgMHgwODZEM0QyRCwKKyAgICAgICAgMHg5MTY0NkM5NywgMHhFNjYzNUMwMSwgMHg2QjZCNTFGNCwgMHgxQzZDNjE2MiwgMHg4NTY1MzBEOCwgMHhGMjYyMDA0RSwgMHg2QzA2OTVFRCwKKyAgICAgICAgMHgxQjAxQTU3QiwgMHg4MjA4RjRDMSwgMHhGNTBGQzQ1NywgMHg2NUIwRDlDNiwgMHgxMkI3RTk1MCwgMHg4QkJFQjhFQSwgMHhGQ0I5ODg3QywKKyAgICAgICAgMHg2MkREMURERiwgMHgxNURBMkQ0OSwgMHg4Q0QzN0NGMywgMHhGQkQ0NEM2NSwgMHg0REIyNjE1OCwgMHgzQUI1NTFDRSwgMHhBM0JDMDA3NCwKKyAgICAgICAgMHhENEJCMzBFMiwgMHg0QURGQTU0MSwgMHgzREQ4OTVENywgMHhBNEQxQzQ2RCwgMHhEM0Q2RjRGQiwgMHg0MzY5RTk2QSwgMHgzNDZFRDlGQywKKyAgICAgICAgMHhBRDY3ODg0NiwgMHhEQTYwQjhEMCwgMHg0NDA0MkQ3MywgMHgzMzAzMURFNSwgMHhBQTBBNEM1RiwgMHhERDBEN0NDOSwgMHg1MDA1NzEzQywKKyAgICAgICAgMHgyNzAyNDFBQSwgMHhCRTBCMTAxMCwgMHhDOTBDMjA4NiwgMHg1NzY4QjUyNSwgMHgyMDZGODVCMywgMHhCOTY2RDQwOSwgMHhDRTYxRTQ5RiwKKyAgICAgICAgMHg1RURFRjkwRSwgMHgyOUQ5Qzk5OCwgMHhCMEQwOTgyMiwgMHhDN0Q3QThCNCwgMHg1OUIzM0QxNywgMHgyRUI0MEQ4MSwgMHhCN0JENUMzQiwKKyAgICAgICAgMHhDMEJBNkNBRCwKKworICAgICAgICAweEVEQjg4MzIwLCAweDlBQkZCM0I2LCAweDAzQjZFMjBDLCAweDc0QjFEMjlBLCAweEVBRDU0NzM5LCAweDlERDI3N0FGLCAweDA0REIyNjE1LAorICAgICAgICAweDczREMxNjgzLCAweEUzNjMwQjEyLCAweDk0NjQzQjg0LCAweDBENkQ2QTNFLCAweDdBNkE1QUE4LCAweEU0MEVDRjBCLCAweDkzMDlGRjlELAorICAgICAgICAweDBBMDBBRTI3LCAweDdEMDc5RUIxLCAweEYwMEY5MzQ0LCAweDg3MDhBM0QyLCAweDFFMDFGMjY4LCAweDY5MDZDMkZFLCAweEY3NjI1NzVELAorICAgICAgICAweDgwNjU2N0NCLCAweDE5NkMzNjcxLCAweDZFNkIwNkU3LCAweEZFRDQxQjc2LCAweDg5RDMyQkUwLCAweDEwREE3QTVBLCAweDY3REQ0QUNDLAorICAgICAgICAweEY5QjlERjZGLCAweDhFQkVFRkY5LCAweDE3QjdCRTQzLCAweDYwQjA4RUQ1LCAweEQ2RDZBM0U4LCAweEExRDE5MzdFLCAweDM4RDhDMkM0LAorICAgICAgICAweDRGREZGMjUyLCAweEQxQkI2N0YxLCAweEE2QkM1NzY3LCAweDNGQjUwNkRELCAweDQ4QjIzNjRCLCAweEQ4MEQyQkRBLCAweEFGMEExQjRDLAorICAgICAgICAweDM2MDM0QUY2LCAweDQxMDQ3QTYwLCAweERGNjBFRkMzLCAweEE4NjdERjU1LCAweDMxNkU4RUVGLCAweDQ2NjlCRTc5LCAweENCNjFCMzhDLAorICAgICAgICAweEJDNjY4MzFBLCAweDI1NkZEMkEwLCAweDUyNjhFMjM2LCAweENDMEM3Nzk1LCAweEJCMEI0NzAzLCAweDIyMDIxNkI5LCAweDU1MDUyNjJGLAorICAgICAgICAweEM1QkEzQkJFLCAweEIyQkQwQjI4LCAweDJCQjQ1QTkyLCAweDVDQjM2QTA0LCAweEMyRDdGRkE3LCAweEI1RDBDRjMxLCAweDJDRDk5RThCLAorICAgICAgICAweDVCREVBRTFELAorCisgICAgICAgIDB4OUI2NEMyQjAsIDB4RUM2M0YyMjYsIDB4NzU2QUEzOUMsIDB4MDI2RDkzMEEsIDB4OUMwOTA2QTksIDB4RUIwRTM2M0YsIDB4NzIwNzY3ODUsCisgICAgICAgIDB4MDUwMDU3MTMsIDB4OTVCRjRBODIsIDB4RTJCODdBMTQsIDB4N0JCMTJCQUUsIDB4MENCNjFCMzgsIDB4OTJEMjhFOUIsIDB4RTVENUJFMEQsCisgICAgICAgIDB4N0NEQ0VGQjcsIDB4MEJEQkRGMjEsIDB4ODZEM0QyRDQsIDB4RjFENEUyNDIsIDB4NjhEREIzRjgsIDB4MUZEQTgzNkUsIDB4ODFCRTE2Q0QsCisgICAgICAgIDB4RjZCOTI2NUIsIDB4NkZCMDc3RTEsIDB4MThCNzQ3NzcsIDB4ODgwODVBRTYsIDB4RkYwRjZBNzAsIDB4NjYwNjNCQ0EsIDB4MTEwMTBCNUMsCisgICAgICAgIDB4OEY2NTlFRkYsIDB4Rjg2MkFFNjksIDB4NjE2QkZGRDMsIDB4MTY2Q0NGNDUsIDB4QTAwQUUyNzgsIDB4RDcwREQyRUUsIDB4NEUwNDgzNTQsCisgICAgICAgIDB4MzkwM0IzQzIsIDB4QTc2NzI2NjEsIDB4RDA2MDE2RjcsIDB4NDk2OTQ3NEQsIDB4M0U2RTc3REIsIDB4QUVEMTZBNEEsIDB4RDlENjVBREMsCisgICAgICAgIDB4NDBERjBCNjYsIDB4MzdEODNCRjAsIDB4QTlCQ0FFNTMsIDB4REVCQjlFQzUsIDB4NDdCMkNGN0YsIDB4MzBCNUZGRTksIDB4QkRCREYyMUMsCisgICAgICAgIDB4Q0FCQUMyOEEsIDB4NTNCMzkzMzAsIDB4MjRCNEEzQTYsIDB4QkFEMDM2MDUsIDB4Q0RENzA2OTMsIDB4NTRERTU3MjksIDB4MjNEOTY3QkYsCisgICAgICAgIDB4QjM2NjdBMkUsIDB4QzQ2MTRBQjgsIDB4NUQ2ODFCMDIsIDB4MkE2RjJCOTQsIDB4QjQwQkJFMzcsIDB4QzMwQzhFQTEsIDB4NUEwNURGMUIsCisgICAgICAgIDB4MkQwMkVGOER9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuX2J5dGVzOyArK2kpIHsKKyAgICAgICAgKmNyYyBePSAoKHVpbnQ4X3QqKWRhdGEpW2ldOworICAgICAgICAqY3JjID0gdGFibGVbKHVpbnQ4X3QpKmNyY10gXiAqY3JjID4+IDg7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworU3RhdHVzIGNwX3Jlc3RvcmVDaGVja3BvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBibG9ja0RldmljZSkgeworICAgIExPRyhJTkZPKSA8PCAiUmVzdG9yaW5nIGNoZWNrcG9pbnQgb24gIiA8PCBibG9ja0RldmljZTsKKyAgICBzdGQ6OmZzdHJlYW0gZGV2aWNlKGJsb2NrRGV2aWNlLCBzdGQ6Omlvczo6YmluYXJ5IHwgc3RkOjppb3M6OmluIHwgc3RkOjppb3M6Om91dCk7CisgICAgaWYgKCFkZXZpY2UpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBvcGVuICIgPDwgYmxvY2tEZXZpY2U7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKGVycm5vLCAoIkNhbm5vdCBvcGVuICIgKyBibG9ja0RldmljZSkuY19zdHIoKSk7CisgICAgfQorICAgIGFsaWduYXMoYWxpZ25vZihsb2dfc2VjdG9yKSkgY2hhciBsc19idWZmZXJba0Jsb2NrU2l6ZV07CisgICAgZGV2aWNlLnJlYWQobHNfYnVmZmVyLCBrQmxvY2tTaXplKTsKKyAgICBsb2dfc2VjdG9yJiBscyA9ICpyZWludGVycHJldF9jYXN0PGxvZ19zZWN0b3IqPihsc19idWZmZXIpOworICAgIGlmIChscy5tYWdpYyAhPSBrTWFnaWMpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWFnaWMiOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJObyBtYWdpYyIpOworICAgIH0KKworICAgIExPRyhJTkZPKSA8PCAiUmVzdG9yaW5nICIgPDwgbHMuc2VxdWVuY2UgPDwgIiBsb2cgc2VjdG9ycyI7CisKKyAgICBmb3IgKGludCBzZXF1ZW5jZSA9IGxzLnNlcXVlbmNlOyBzZXF1ZW5jZSA+PSAwOyBzZXF1ZW5jZS0tKSB7CisgICAgICAgIGRldmljZS5zZWVrZygwKTsKKyAgICAgICAgZGV2aWNlLnJlYWQobHNfYnVmZmVyLCBrQmxvY2tTaXplKTsKKyAgICAgICAgbHMgPSAqcmVpbnRlcnByZXRfY2FzdDxsb2dfc2VjdG9yKj4obHNfYnVmZmVyKTsKKyAgICAgICAgaWYgKGxzLm1hZ2ljICE9IGtNYWdpYykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWFnaWMhIjsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKEVJTlZBTCwgIk5vIG1hZ2ljIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGludClscy5zZXF1ZW5jZSAhPSBzZXF1ZW5jZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXhwZWN0aW5nIGxvZyBzZWN0b3IgIiA8PCBzZXF1ZW5jZSA8PCAiIGJ1dCBnb3QgIiA8PCBscy5zZXF1ZW5jZTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKAorICAgICAgICAgICAgICAgIEVJTlZBTCwgKCJFeHBlY3RpbmcgbG9nIHNlY3RvciAiICsgc3RkOjp0b19zdHJpbmcoc2VxdWVuY2UpICsgIiBidXQgZ290ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGxzLnNlcXVlbmNlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICBMT0coSU5GTykgPDwgIlJlc3RvcmluZyBmcm9tIGxvZyBzZWN0b3IgIiA8PCBscy5zZXF1ZW5jZTsKKworICAgICAgICBmb3IgKGxvZ19lbnRyeSogbGUgPSAmbHMuZW50cmllc1tscy5jb3VudCAtIDFdOyBsZSA+PSBscy5lbnRyaWVzOyAtLWxlKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIlJlc3RvcmluZyAiIDw8IGxlLT5zaXplIDw8ICIgYnl0ZXMgZnJvbSBzZWN0b3IgIiA8PCBsZS0+ZGVzdCA8PCAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBsZS0+c291cmNlIDw8ICIgd2l0aCBjaGVja3N1bSAiIDw8IHN0ZDo6aGV4IDw8IGxlLT5jaGVja3N1bTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZmZlcihsZS0+c2l6ZSk7CisgICAgICAgICAgICBkZXZpY2Uuc2Vla2cobGUtPmRlc3QgKiBrU2VjdG9yU2l6ZSk7CisgICAgICAgICAgICBkZXZpY2UucmVhZCgmYnVmZmVyWzBdLCBsZS0+c2l6ZSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGNoZWNrc3VtID0gbGUtPnNvdXJjZSAvIChrQmxvY2tTaXplIC8ga1NlY3RvclNpemUpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsZS0+c2l6ZTsgaSArPSBrQmxvY2tTaXplKSB7CisgICAgICAgICAgICAgICAgY3JjMzIoJmJ1ZmZlcltpXSwga0Jsb2NrU2l6ZSwgJmNoZWNrc3VtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxlLT5jaGVja3N1bSAmJiBjaGVja3N1bSAhPSBsZS0+Y2hlY2tzdW0pIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDaGVja3N1bXMgZG9uJ3QgbWF0Y2ggIiA8PCBzdGQ6OmhleCA8PCBjaGVja3N1bTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShFSU5WQUwsICJDaGVja3N1bXMgZG9uJ3QgbWF0Y2giKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGV2aWNlLnNlZWtnKGxlLT5zb3VyY2UgKiBrU2VjdG9yU2l6ZSk7CisgICAgICAgICAgICBkZXZpY2Uud3JpdGUoJmJ1ZmZlclswXSwgbGUtPnNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKworU3RhdHVzIGNwX21hcmtCb290QXR0ZW1wdCgpIHsKKyAgICBzdGQ6OnN0cmluZyBvbGRDb250ZW50LCBuZXdDb250ZW50OworICAgIGludCByZXRyeSA9IDA7CisgICAgc3RydWN0IHN0YXQgc3Q7CisgICAgaW50IHJlc3VsdCA9IHN0YXQoa01ldGFkYXRhQ1BGaWxlLmNfc3RyKCksICZzdCk7CisKKyAgICAvLyBJZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LCB3ZSBhcmVuJ3QgbWFuYWdpbmcgYSBjaGVja3BvaW50IHJldHJ5IGNvdW50ZXIKKyAgICBpZiAocmVzdWx0ICE9IDApIHJldHVybiBTdGF0dXM6Om9rKCk7CisgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGtNZXRhZGF0YUNQRmlsZSwgJm9sZENvbnRlbnQpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBjaGVja3BvaW50IGZpbGUiOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tRXhjZXB0aW9uQ29kZShlcnJubywgIkZhaWxlZCB0byByZWFkIGNoZWNrcG9pbnQgZmlsZSIpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZXRyeUNvbnRlbnQgPSBvbGRDb250ZW50LnN1YnN0cigwLCBvbGRDb250ZW50LmZpbmRfZmlyc3Rfb2YoIiAiKSk7CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlSW50KHJldHJ5Q29udGVudCwgJnJldHJ5KSkKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoRUlOVkFMLCAiQ291bGQgbm90IHBhcnNlIHJldHJ5IGNvdW50Iik7CisgICAgaWYgKHJldHJ5ID4gMCkgeworICAgICAgICByZXRyeS0tOworCisgICAgICAgIG5ld0NvbnRlbnQgPSBzdGQ6OnRvX3N0cmluZyhyZXRyeSk7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGUobmV3Q29udGVudCwga01ldGFkYXRhQ1BGaWxlKSkKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKGVycm5vLCAiQ291bGQgbm90IHdyaXRlIGNoZWNrcG9pbnQgZmlsZSIpOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL0NoZWNrcG9pbnQuaCBiL0NoZWNrcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWMyZjk0Ci0tLSAvZGV2L251bGwKKysrIGIvQ2hlY2twb2ludC5oCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9DSEVDS1BPSU5UX0gKKyNkZWZpbmUgX0NIRUNLUE9JTlRfSAorCisjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHZvbGQgeworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9zdGFydENoZWNrcG9pbnQoaW50IHJldHJ5KTsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3BfY29tbWl0Q2hhbmdlcygpOworCithbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBjcF9hYm9ydENoYW5nZXMoKTsKKworYm9vbCBjcF9uZWVkc1JvbGxiYWNrKCk7CisKK2Jvb2wgY3BfbmVlZHNDaGVja3BvaW50KCk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX3ByZXBhcmVDaGVja3BvaW50KCk7CisKK2FuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIGNwX3Jlc3RvcmVDaGVja3BvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBvaW50KTsKKworYW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgY3BfbWFya0Jvb3RBdHRlbXB0KCk7CisKK30gIC8vIG5hbWVzcGFjZSB2b2xkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL0Rldm1hcHBlci5jcHAgYi9EZXZtYXBwZXIuY3BwCmluZGV4IDI1MTA3NzEuLmI0MjQ2N2MgMTAwNjQ0Ci0tLSBhL0Rldm1hcHBlci5jcHAKKysrIGIvRGV2bWFwcGVyLmNwcApAQCAtMTYsMjMgKzE2LDIyIEBACiAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1BBQ0tBR0VfTUFOQUdFUgogCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKQEAgLTQzLDggKzQyLDcgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtWb2xkUHJlZml4ID0gInZvbGQ6IjsKIAotdm9pZCBEZXZtYXBwZXI6OmlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwgKmlvLCBzaXplX3QgZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGZsYWdzKSB7Cit2b2lkIERldm1hcHBlcjo6aW9jdGxJbml0KHN0cnVjdCBkbV9pb2N0bCogaW8sIHNpemVfdCBkYXRhU2l6ZSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgZmxhZ3MpIHsKICAgICBtZW1zZXQoaW8sIDAsIGRhdGFTaXplKTsKICAgICBpby0+ZGF0YV9zaXplID0gZGF0YVNpemU7CiAgICAgaW8tPmRhdGFfc3RhcnQgPSBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKQEAgLTU0LDE3ICs1MiwxNiBAQAogICAgIGlvLT5mbGFncyA9IGZsYWdzOwogICAgIGlmIChuYW1lKSB7CiAgICAgICAgIHNpemVfdCByZXQgPSBzdHJsY3B5KGlvLT5uYW1lLCBuYW1lLCBzaXplb2YoaW8tPm5hbWUpKTsKLSAgICAgICAgaWYgKHJldCA+PSBzaXplb2YoaW8tPm5hbWUpKQotICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgaWYgKHJldCA+PSBzaXplb2YoaW8tPm5hbWUpKSBhYm9ydCgpOwogICAgIH0KIH0KIAotaW50IERldm1hcHBlcjo6Y3JlYXRlKGNvbnN0IGNoYXIgKm5hbWVfcmF3LCBjb25zdCBjaGFyICpsb29wRmlsZSwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciAqdWJ1ZmZlciwgc2l6ZV90IGxlbikgeworaW50IERldm1hcHBlcjo6Y3JlYXRlKGNvbnN0IGNoYXIqIG5hbWVfcmF3LCBjb25zdCBjaGFyKiBsb29wRmlsZSwgY29uc3QgY2hhcioga2V5LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY2hhciogdWJ1ZmZlciwgc2l6ZV90IGxlbikgewogICAgIGF1dG8gbmFtZV9zdHJpbmcgPSBTdHJpbmdQcmludGYoIiVzJXMiLCBrVm9sZFByZWZpeCwgbmFtZV9yYXcpOwogICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBuYW1lX3N0cmluZy5jX3N0cigpOwogCi0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzcsOCArNzQsOCBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOwotIAorICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CisKICAgICAvLyBDcmVhdGUgdGhlIERNIGRldmljZQogICAgIGlvY3RsSW5pdChpbywgREVWTUFQUEVSX0JVRkZFUl9TSVpFLCBuYW1lLCAwKTsKIApAQCAtOTIsMTEgKzg5LDExIEBACiAgICAgLy8gU2V0IHRoZSBsZWdhY3kgZ2VvbWV0cnkKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgMCk7CiAKLSAgICBjaGFyICpnZW9QYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKKyAgICBjaGFyKiBnZW9QYXJhbXMgPSBidWZmZXIgKyBzaXplb2Yoc3RydWN0IGRtX2lvY3RsKTsKICAgICAvLyBicHM9NTEyIHNwYz04IHJlcz0zMiBuZnQ9MiBzZWM9ODE5MCBtaWQ9MHhmMCBzcHQ9NjMgaGRzPTY0IGhpZD0wIGJzcGY9OCByZGNsPTIgaW5mcz0xIGJrYnM9MgogICAgIHN0cmxjcHkoZ2VvUGFyYW1zLCAiMCA2NCA2MyAwIiwgREVWTUFQUEVSX0JVRkZFUl9TSVpFIC0gc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkpOwogICAgIGdlb1BhcmFtcyArPSBzdHJsZW4oZ2VvUGFyYW1zKSArIDE7Ci0gICAgZ2VvUGFyYW1zID0gKGNoYXIgKikgX2FsaWduKGdlb1BhcmFtcywgOCk7CisgICAgZ2VvUGFyYW1zID0gKGNoYXIqKV9hbGlnbihnZW9QYXJhbXMsIDgpOwogICAgIGlmIChpb2N0bChmZCwgRE1fREVWX1NFVF9HRU9NRVRSWSwgaW8pKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgRE1fREVWX1NFVF9HRU9NRVRSWSI7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKQEAgLTExNyw4ICsxMTQsOCBAQAogICAgIHNucHJpbnRmKHVidWZmZXIsIGxlbiwgIi9kZXYvYmxvY2svZG0tJXUiLCBtaW5vcik7CiAKICAgICAvLyBMb2FkIHRoZSB0YWJsZQotICAgIHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqdGd0OwotICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKikgJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CisgICAgc3RydWN0IGRtX3RhcmdldF9zcGVjKiB0Z3Q7CisgICAgdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyopJmJ1ZmZlcltzaXplb2Yoc3RydWN0IGRtX2lvY3RsKV07CiAKICAgICBpb2N0bEluaXQoaW8sIERFVk1BUFBFUl9CVUZGRVJfU0laRSwgbmFtZSwgRE1fU1RBVFVTX1RBQkxFX0ZMQUcpOwogICAgIGlvLT50YXJnZXRfY291bnQgPSAxOwpAQCAtMTI5LDEyICsxMjYsMTIgQEAKIAogICAgIHN0cmxjcHkodGd0LT50YXJnZXRfdHlwZSwgImNyeXB0Iiwgc2l6ZW9mKHRndC0+dGFyZ2V0X3R5cGUpKTsKIAotICAgIGNoYXIgKmNyeXB0UGFyYW1zID0gYnVmZmVyICsgc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKTsKKyAgICBjaGFyKiBjcnlwdFBhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CiAgICAgc25wcmludGYoY3J5cHRQYXJhbXMsCi0gICAgICAgICAgICBERVZNQVBQRVJfQlVGRkVSX1NJWkUgLSAoc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKSksCi0gICAgICAgICAgICAidHdvZmlzaCAlcyAwICVzIDAiLCBrZXksIGxvb3BGaWxlKTsKKyAgICAgICAgICAgICBERVZNQVBQRVJfQlVGRkVSX1NJWkUgLSAoc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCkgKyBzaXplb2Yoc3RydWN0IGRtX3RhcmdldF9zcGVjKSksCisgICAgICAgICAgICAgInR3b2Zpc2ggJXMgMCAlcyAwIiwga2V5LCBsb29wRmlsZSk7CiAgICAgY3J5cHRQYXJhbXMgKz0gc3RybGVuKGNyeXB0UGFyYW1zKSArIDE7Ci0gICAgY3J5cHRQYXJhbXMgPSAoY2hhciAqKSBfYWxpZ24oY3J5cHRQYXJhbXMsIDgpOworICAgIGNyeXB0UGFyYW1zID0gKGNoYXIqKV9hbGlnbihjcnlwdFBhcmFtcywgOCk7CiAgICAgdGd0LT5uZXh0ID0gY3J5cHRQYXJhbXMgLSBidWZmZXI7CiAKICAgICBpZiAoaW9jdGwoZmQsIERNX1RBQkxFX0xPQUQsIGlvKSkgewpAQCAtMTYwLDExICsxNTcsMTEgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IERldm1hcHBlcjo6ZGVzdHJveShjb25zdCBjaGFyICpuYW1lX3JhdykgeworaW50IERldm1hcHBlcjo6ZGVzdHJveShjb25zdCBjaGFyKiBuYW1lX3JhdykgewogICAgIGF1dG8gbmFtZV9zdHJpbmcgPSBTdHJpbmdQcmludGYoIiVzJXMiLCBrVm9sZFByZWZpeCwgbmFtZV9yYXcpOwogICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBuYW1lX3N0cmluZy5jX3N0cigpOwogCi0gICAgY2hhciAqYnVmZmVyID0gKGNoYXIgKikgbWFsbG9jKERFVk1BUFBFUl9CVUZGRVJfU0laRSk7CisgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgbWFsbG9jIjsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTc3LDggKzE3NCw4IEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgZG1faW9jdGwgKmlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7Ci0gCisgICAgc3RydWN0IGRtX2lvY3RsKiBpbyA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjsKKwogICAgIC8vIENyZWF0ZSB0aGUgRE0gZGV2aWNlCiAgICAgaW9jdGxJbml0KGlvLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG5hbWUsIDApOwogCkBAIC0xOTgsMTQgKzE5NSwxNCBAQAogCiBpbnQgRGV2bWFwcGVyOjpkZXN0cm95QWxsKCkgewogICAgIEFUUkFDRV9OQU1FKCJEZXZtYXBwZXI6OmRlc3Ryb3lBbGwiKTsKLSAgICBjaGFyICpidWZmZXIgPSAoY2hhciAqKSBtYWxsb2MoMTAyNCAqIDY0KTsKKyAgICBjaGFyKiBidWZmZXIgPSAoY2hhciopbWFsbG9jKDEwMjQgKiA2NCk7CiAgICAgaWYgKCFidWZmZXIpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCBtYWxsb2MiOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogICAgIG1lbXNldChidWZmZXIsIDAsICgxMDI0ICogNjQpKTsKIAotICAgIGNoYXIgKmJ1ZmZlcjIgPSAoY2hhciAqKSBtYWxsb2MoREVWTUFQUEVSX0JVRkZFUl9TSVpFKTsKKyAgICBjaGFyKiBidWZmZXIyID0gKGNoYXIqKW1hbGxvYyhERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwogICAgIGlmICghYnVmZmVyMikgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIG1hbGxvYyI7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKQEAgLTIyMCw3ICsyMTcsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgc3RydWN0IGRtX2lvY3RsICppbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAgICAgaW9jdGxJbml0KGlvLCAoMTAyNCAqIDY0KSwgTlVMTCwgMCk7CiAKICAgICBpZiAoaW9jdGwoZmQsIERNX0xJU1RfREVWSUNFUywgaW8pKSB7CkBAIC0yMzEsNyArMjI4LDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIHN0cnVjdCBkbV9uYW1lX2xpc3QgKm4gPSAoc3RydWN0IGRtX25hbWVfbGlzdCAqKSAoKChjaGFyICopIGJ1ZmZlcikgKyBpby0+ZGF0YV9zdGFydCk7CisgICAgc3RydWN0IGRtX25hbWVfbGlzdCogbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0KikoKChjaGFyKilidWZmZXIpICsgaW8tPmRhdGFfc3RhcnQpOwogICAgIGlmICghbi0+ZGV2KSB7CiAgICAgICAgIGZyZWUoYnVmZmVyKTsKICAgICAgICAgZnJlZShidWZmZXIyKTsKQEAgLTI0MSwxMyArMjM4LDEzIEBACiAKICAgICB1bnNpZ25lZCBueHQgPSAwOwogICAgIGRvIHsKLSAgICAgICAgbiA9IChzdHJ1Y3QgZG1fbmFtZV9saXN0ICopICgoKGNoYXIgKikgbikgKyBueHQpOworICAgICAgICBuID0gKHN0cnVjdCBkbV9uYW1lX2xpc3QqKSgoKGNoYXIqKW4pICsgbnh0KTsKICAgICAgICAgYXV0byBuYW1lID0gc3RkOjpzdHJpbmcobi0+bmFtZSk7CiAgICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKG5hbWUsIGtWb2xkUHJlZml4KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiVGVhcmluZyBkb3duIHN0YWxlIGRtIGRldmljZSBuYW1lZCAiIDw8IG5hbWU7CiAKICAgICAgICAgICAgIG1lbXNldChidWZmZXIyLCAwLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUpOwotICAgICAgICAgICAgc3RydWN0IGRtX2lvY3RsICppbzIgPSAoc3RydWN0IGRtX2lvY3RsICopIGJ1ZmZlcjI7CisgICAgICAgICAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvMiA9IChzdHJ1Y3QgZG1faW9jdGwqKWJ1ZmZlcjI7CiAgICAgICAgICAgICBpb2N0bEluaXQoaW8yLCBERVZNQVBQRVJfQlVGRkVSX1NJWkUsIG4tPm5hbWUsIDApOwogICAgICAgICAgICAgaWYgKGlvY3RsKGZkLCBETV9ERVZfUkVNT1ZFLCBpbzIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGVycm5vICE9IEVOWElPKSB7CkBAIC0yNTUsNyArMjUyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkZvdW5kIHVubWFuYWdlZCBkbSBkZXZpY2UgbmFtZWQgIiA8PCBuYW1lOworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiRm91bmQgdW5tYW5hZ2VkIGRtIGRldmljZSBuYW1lZCAiIDw8IG5hbWU7CiAgICAgICAgIH0KICAgICAgICAgbnh0ID0gbi0+bmV4dDsKICAgICB9IHdoaWxlIChueHQpOwpAQCAtMjY2LDkgKzI2Myw4IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgKkRldm1hcHBlcjo6X2FsaWduKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IGEpCi17Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgYWduID0gLS1hOwordm9pZCogRGV2bWFwcGVyOjpfYWxpZ24odm9pZCogcHRyLCB1bnNpZ25lZCBpbnQgYSkgeworICAgIHVuc2lnbmVkIGxvbmcgYWduID0gLS1hOwogCi0gICAgICAgIHJldHVybiAodm9pZCAqKSAoKCh1bnNpZ25lZCBsb25nKSBwdHIgKyBhZ24pICYgfmFnbik7CisgICAgcmV0dXJuICh2b2lkKikoKCh1bnNpZ25lZCBsb25nKXB0ciArIGFnbikgJiB+YWduKTsKIH0KZGlmZiAtLWdpdCBhL0Rldm1hcHBlci5oIGIvRGV2bWFwcGVyLmgKaW5kZXggN2JiOTc4Ni4uYjFmNmRmYSAxMDA2NDQKLS0tIGEvRGV2bWFwcGVyLmgKKysrIGIvRGV2bWFwcGVyLmgKQEAgLTE3LDIwICsxNywxOSBAQAogI2lmbmRlZiBfREVWTUFQUEVSX0gKICNkZWZpbmUgX0RFVk1BUFBFUl9ICiAKLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiBjbGFzcyBEZXZtYXBwZXIgewotcHVibGljOgotICAgIHN0YXRpYyBpbnQgY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmxvb3BGaWxlLCBjb25zdCBjaGFyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pOwotICAgIHN0YXRpYyBpbnQgZGVzdHJveShjb25zdCBjaGFyICpuYW1lKTsKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbnQgY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGxvb3BGaWxlLCBjb25zdCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzLCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW4pOworICAgIHN0YXRpYyBpbnQgZGVzdHJveShjb25zdCBjaGFyKiBuYW1lKTsKICAgICBzdGF0aWMgaW50IGRlc3Ryb3lBbGwoKTsKIAotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCAqX2FsaWduKHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IGEpOwotICAgIHN0YXRpYyB2b2lkIGlvY3RsSW5pdChzdHJ1Y3QgZG1faW9jdGwgKmlvLCBzaXplX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBmbGFncyk7CisgIHByaXZhdGU6CisgICAgc3RhdGljIHZvaWQqIF9hbGlnbih2b2lkKiBwdHIsIHVuc2lnbmVkIGludCBhKTsKKyAgICBzdGF0aWMgdm9pZCBpb2N0bEluaXQoc3RydWN0IGRtX2lvY3RsKiBpbywgc2l6ZV90IGRhdGFfc2l6ZSwgY29uc3QgY2hhciogbmFtZSwgdW5zaWduZWQgZmxhZ3MpOwogfTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9FbmNyeXB0SW5wbGFjZS5jcHAgYi9FbmNyeXB0SW5wbGFjZS5jcHAKaW5kZXggNjQ2MmRiZi4uZjU1OTMyZCAxMDA2NDQKLS0tIGEvRW5jcnlwdElucGxhY2UuY3BwCisrKyBiL0VuY3J5cHRJbnBsYWNlLmNwcApAQCAtMTYsMTYgKzE2LDE2IEBACiAKICNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0Lmg+CiAjaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+CiAjaW5jbHVkZSA8ZjJmc19zcGFyc2VibG9jay5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCkBAIC0zNiwxMyArMzYsMTEgQEAKICNpbmNsdWRlICJjcnlwdGZzLmgiCiAKIC8vIEZJWE1FIGhvcnJpYmxlIGN1dC1hbmQtcGFzdGUgY29kZQotc3RhdGljIGlubGluZSBpbnQgdW5peF9yZWFkKGludCAgZmQsIHZvaWQqICBidWZmLCBpbnQgIGxlbikKLXsKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXhfcmVhZChpbnQgZmQsIHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKICAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKHJlYWQoZmQsIGJ1ZmYsIGxlbikpOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1bml4X3dyaXRlKGludCAgZmQsIGNvbnN0IHZvaWQqICBidWZmLCBpbnQgIGxlbikKLXsKK3N0YXRpYyBpbmxpbmUgaW50IHVuaXhfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkKiBidWZmLCBpbnQgbGVuKSB7CiAgICAgcmV0dXJuIFRFTVBfRkFJTFVSRV9SRVRSWSh3cml0ZShmZCwgYnVmZiwgbGVuKSk7CiB9CiAKQEAgLTU3LDE1ICs1NSwxNCBAQAogI2RlZmluZSBCTE9DS1NfQVRfQV9USU1FIDEwMjQKICNlbmRpZgogCi1zdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEKLXsKK3N0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSB7CiAgICAgaW50IHJlYWxmZDsKICAgICBpbnQgY3J5cHRvZmQ7CiAgICAgb2ZmNjRfdCBudW1ibG9ja3M7CiAgICAgb2ZmNjRfdCBvbmVfcGN0LCBjdXJfcGN0LCBuZXdfcGN0OwogICAgIG9mZjY0X3QgYmxvY2tzX2FscmVhZHlfZG9uZSwgdG90X251bWJsb2NrczsKICAgICBvZmY2NF90IHVzZWRfYmxvY2tzX2FscmVhZHlfZG9uZSwgdG90X3VzZWRfYmxvY2tzOwotICAgIGNoYXIqIHJlYWxfYmxrZGV2LCAqIGNyeXB0b19ibGtkZXY7CisgICAgY2hhciAqcmVhbF9ibGtkZXYsICpjcnlwdG9fYmxrZGV2OwogICAgIGludCBjb3VudDsKICAgICBvZmY2NF90IG9mZnNldDsKICAgICBjaGFyKiBidWZmZXI7CkBAIC03Niw4ICs3Myw3IEBACiAgICAgYm9vbCBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllczsKIH07CiAKLXN0YXRpYyB2b2lkIHVwZGF0ZV9wcm9ncmVzcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEsIGludCBpc191c2VkKQoteworc3RhdGljIHZvaWQgdXBkYXRlX3Byb2dyZXNzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSwgaW50IGlzX3VzZWQpIHsKICAgICBkYXRhLT5ibG9ja3NfYWxyZWFkeV9kb25lKys7CiAKICAgICBpZiAoaXNfdXNlZCkgewpAQCAtMTA0LDE2ICsxMDAsMTQgQEAKICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiRXJyb3IgZ2V0dGluZyB0aW1lIjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRvdWJsZSBlbGFwc2VkX3RpbWUgPSBkaWZmdGltZSh0aW1lX25vdy50dl9zZWMsIGRhdGEtPnRpbWVfc3RhcnRlZCk7Ci0gICAgICAgICAgICBvZmY2NF90IHJlbWFpbmluZ19ibG9ja3MgPSBkYXRhLT50b3RfdXNlZF9ibG9ja3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZGF0YS0+dXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lOwotICAgICAgICAgICAgaW50IHJlbWFpbmluZ190aW1lID0gKGludCkoZWxhcHNlZF90aW1lICogcmVtYWluaW5nX2Jsb2NrcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBkYXRhLT51c2VkX2Jsb2Nrc19hbHJlYWR5X2RvbmUpOworICAgICAgICAgICAgb2ZmNjRfdCByZW1haW5pbmdfYmxvY2tzID0gZGF0YS0+dG90X3VzZWRfYmxvY2tzIC0gZGF0YS0+dXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lOworICAgICAgICAgICAgaW50IHJlbWFpbmluZ190aW1lID0KKyAgICAgICAgICAgICAgICAoaW50KShlbGFwc2VkX3RpbWUgKiByZW1haW5pbmdfYmxvY2tzIC8gZGF0YS0+dXNlZF9ibG9ja3NfYWxyZWFkeV9kb25lKTsKIAogICAgICAgICAgICAgLy8gQ2hhbmdlIHRpbWUgb25seSBpZiBub3QgeWV0IHNldCwgbG93ZXIsIG9yIGEgbG90IGhpZ2hlciBmb3IKICAgICAgICAgICAgIC8vIGJlc3QgdXNlciBleHBlcmllbmNlCi0gICAgICAgICAgICBpZiAoZGF0YS0+cmVtYWluaW5nX3RpbWUgPT0gLTEKLSAgICAgICAgICAgICAgICB8fCByZW1haW5pbmdfdGltZSA8IGRhdGEtPnJlbWFpbmluZ190aW1lCi0gICAgICAgICAgICAgICAgfHwgcmVtYWluaW5nX3RpbWUgPiBkYXRhLT5yZW1haW5pbmdfdGltZSArIDYwKSB7CisgICAgICAgICAgICBpZiAoZGF0YS0+cmVtYWluaW5nX3RpbWUgPT0gLTEgfHwgcmVtYWluaW5nX3RpbWUgPCBkYXRhLT5yZW1haW5pbmdfdGltZSB8fAorICAgICAgICAgICAgICAgIHJlbWFpbmluZ190aW1lID4gZGF0YS0+cmVtYWluaW5nX3RpbWUgKyA2MCkgewogICAgICAgICAgICAgICAgIGNoYXIgYnVmWzhdOwogICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIlZCIsIHJlbWFpbmluZ190aW1lKTsKICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgidm9sZC5lbmNyeXB0X3RpbWVfcmVtYWluaW5nIiwgYnVmKTsKQEAgLTEyMyw4ICsxMTcsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgbG9nX3Byb2dyZXNzKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSBjb25zdCogZGF0YSwgYm9vbCBjb21wbGV0ZWQpCi17CitzdGF0aWMgdm9pZCBsb2dfcHJvZ3Jlc3Moc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhIGNvbnN0KiBkYXRhLCBib29sIGNvbXBsZXRlZCkgewogICAgIC8vIFByZWNvbmRpdGlvbiAtIGlmIGNvbXBsZXRlZCBkYXRhID0gMCBlbHNlIGRhdGEgIT0gMAogCiAgICAgLy8gVHJhY2sgcHJvZ3Jlc3Mgc28gd2UgY2FuIHNraXAgbG9nZ2luZyBibG9ja3MKQEAgLTE0NywxMyArMTQwLDEyIEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGZsdXNoX291dHN0YW5kaW5nX2RhdGEoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhKQoteworc3RhdGljIGludCBmbHVzaF9vdXRzdGFuZGluZ19kYXRhKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogZGF0YSkgewogICAgIGlmIChkYXRhLT5jb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIExPRyhWRVJCT1NFKSA8PCAiQ29weWluZyAiIDw8IGRhdGEtPmNvdW50IDw8ICIgYmxvY2tzIGF0IG9mZnNldCAiIDw8IGRhdGEtPm9mZnNldDsKKyAgICBMT0coREVCVUcpIDw8ICJDb3B5aW5nICIgPDwgZGF0YS0+Y291bnQgPDwgIiBibG9ja3MgYXQgb2Zmc2V0ICIgPDwgZGF0YS0+b2Zmc2V0OwogCiAgICAgaWYgKHByZWFkNjQoZGF0YS0+cmVhbGZkLCBkYXRhLT5idWZmZXIsIGluZm8uYmxvY2tfc2l6ZSAqIGRhdGEtPmNvdW50LCBkYXRhLT5vZmZzZXQpIDw9IDApIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXJyb3IgcmVhZGluZyByZWFsX2Jsa2RldiAiIDw8IGRhdGEtPnJlYWxfYmxrZGV2IDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC0xNjUsMzAgKzE1NywyOSBAQAogICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9IGVsc2UgewotICAgICAgbG9nX3Byb2dyZXNzKGRhdGEsIGZhbHNlKTsKKyAgICAgICAgbG9nX3Byb2dyZXNzKGRhdGEsIGZhbHNlKTsKICAgICB9CiAKICAgICBkYXRhLT5jb3VudCA9IDA7Ci0gICAgZGF0YS0+bGFzdF93cml0dGVuX3NlY3RvciA9IChkYXRhLT5vZmZzZXQgKyBkYXRhLT5jb3VudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmZvLmJsb2NrX3NpemUgKiBDUllQVF9TRUNUT1JfU0laRSAtIDE7CisgICAgZGF0YS0+bGFzdF93cml0dGVuX3NlY3RvciA9CisgICAgICAgIChkYXRhLT5vZmZzZXQgKyBkYXRhLT5jb3VudCkgLyBpbmZvLmJsb2NrX3NpemUgKiBDUllQVF9TRUNUT1JfU0laRSAtIDE7CiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgZW5jcnlwdF9ncm91cHMoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKiBkYXRhKQoteworc3RhdGljIGludCBlbmNyeXB0X2dyb3VwcyhzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEqIGRhdGEpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKLSAgICB1OCAqYmxvY2tfYml0bWFwID0gMDsKKyAgICB1OCogYmxvY2tfYml0bWFwID0gMDsKICAgICB1bnNpZ25lZCBpbnQgYmxvY2s7CiAgICAgb2ZmNjRfdCByZXQ7CiAgICAgaW50IHJjID0gLTE7CiAKLSAgICBkYXRhLT5idWZmZXIgPSAoY2hhciopIG1hbGxvYyhpbmZvLmJsb2NrX3NpemUgKiBCTE9DS1NfQVRfQV9USU1FKTsKKyAgICBkYXRhLT5idWZmZXIgPSAoY2hhciopbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSAqIEJMT0NLU19BVF9BX1RJTUUpOwogICAgIGlmICghZGF0YS0+YnVmZmVyKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjcnlwdG8gYnVmZmVyIjsKICAgICAgICAgZ290byBlcnJvdXQ7CiAgICAgfQogCi0gICAgYmxvY2tfYml0bWFwID0gKHU4KikgbWFsbG9jKGluZm8uYmxvY2tfc2l6ZSk7CisgICAgYmxvY2tfYml0bWFwID0gKHU4KiltYWxsb2MoaW5mby5ibG9ja19zaXplKTsKICAgICBpZiAoIWJsb2NrX2JpdG1hcCkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJmYWlsZWQgdG8gYWxsb2NhdGUgYmxvY2sgYml0bWFwIjsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC0xOTgsMTEgKzE4OSw5IEBACiAgICAgICAgIExPRyhJTkZPKSA8PCAiRW5jcnlwdGluZyBncm91cCAiIDw8IGk7CiAKICAgICAgICAgdTMyIGZpcnN0X2Jsb2NrID0gYXV4X2luZm8uZmlyc3RfZGF0YV9ibG9jayArIGkgKiBpbmZvLmJsb2Nrc19wZXJfZ3JvdXA7Ci0gICAgICAgIHUzMiBibG9ja19jb3VudCA9IHN0ZDo6bWluKGluZm8uYmxvY2tzX3Blcl9ncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHUzMikoYXV4X2luZm8ubGVuX2Jsb2NrcyAtIGZpcnN0X2Jsb2NrKSk7CisgICAgICAgIHUzMiBibG9ja19jb3VudCA9IHN0ZDo6bWluKGluZm8uYmxvY2tzX3Blcl9ncm91cCwgKHUzMikoYXV4X2luZm8ubGVuX2Jsb2NrcyAtIGZpcnN0X2Jsb2NrKSk7CiAKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSAodTY0KWluZm8uYmxvY2tfc2l6ZQotICAgICAgICAgICAgICAgICAgICAgICAgICogYXV4X2luZm8uYmdfZGVzY1tpXS5iZ19ibG9ja19iaXRtYXA7CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKHU2NClpbmZvLmJsb2NrX3NpemUgKiBhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2Jsb2NrX2JpdG1hcDsKIAogICAgICAgICByZXQgPSBwcmVhZDY0KGRhdGEtPnJlYWxmZCwgYmxvY2tfYml0bWFwLCBpbmZvLmJsb2NrX3NpemUsIG9mZnNldCk7CiAgICAgICAgIGlmIChyZXQgIT0gKGludClpbmZvLmJsb2NrX3NpemUpIHsKQEAgLTIxNSw4ICsyMDQsOSBAQAogICAgICAgICBkYXRhLT5jb3VudCA9IDA7CiAKICAgICAgICAgZm9yIChibG9jayA9IDA7IGJsb2NrIDwgYmxvY2tfY291bnQ7IGJsb2NrKyspIHsKLSAgICAgICAgICAgIGludCB1c2VkID0gKGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZmxhZ3MgJiBFWFQ0X0JHX0JMT0NLX1VOSU5JVCkgPwotICAgICAgICAgICAgICAgICAgICAwIDogYml0bWFwX2dldF9iaXQoYmxvY2tfYml0bWFwLCBibG9jayk7CisgICAgICAgICAgICBpbnQgdXNlZCA9IChhdXhfaW5mby5iZ19kZXNjW2ldLmJnX2ZsYWdzICYgRVhUNF9CR19CTE9DS19VTklOSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYml0bWFwX2dldF9iaXQoYmxvY2tfYml0bWFwLCBibG9jayk7CiAgICAgICAgICAgICB1cGRhdGVfcHJvZ3Jlc3MoZGF0YSwgdXNlZCk7CiAgICAgICAgICAgICBpZiAodXNlZCkgewogICAgICAgICAgICAgICAgIGlmIChkYXRhLT5jb3VudCA9PSAwKSB7CkBAIC0yMzIsOCArMjIyLDggQEAKICAgICAgICAgICAgIG9mZnNldCArPSBpbmZvLmJsb2NrX3NpemU7CiAKICAgICAgICAgICAgIC8qIFdyaXRlIGRhdGEgaWYgd2UgYXJlIGFsaWduZWQgb3IgYnVmZmVyIHNpemUgcmVhY2hlZCAqLwotICAgICAgICAgICAgaWYgKG9mZnNldCAlIChpbmZvLmJsb2NrX3NpemUgKiBCTE9DS1NfQVRfQV9USU1FKSA9PSAwCi0gICAgICAgICAgICAgICAgfHwgZGF0YS0+Y291bnQgPT0gQkxPQ0tTX0FUX0FfVElNRSkgeworICAgICAgICAgICAgaWYgKG9mZnNldCAlIChpbmZvLmJsb2NrX3NpemUgKiBCTE9DS1NfQVRfQV9USU1FKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgZGF0YS0+Y291bnQgPT0gQkxPQ0tTX0FUX0FfVElNRSkgewogICAgICAgICAgICAgICAgIGlmIChmbHVzaF9vdXRzdGFuZGluZ19kYXRhKGRhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgICAgICAgICAgICAgIH0KQEAgLTI2MCw3ICsyNTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllcykgewogICAgIHUzMiBpOwogICAgIHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSBkYXRhOwotICAgIGludCByYzsgLy8gQ2FuJ3QgaW5pdGlhbGl6ZSB3aXRob3V0IGNhdXNpbmcgd2FybmluZyAtV2Nsb2JiZXJlZAorICAgIGludCByYzsgIC8vIENhbid0IGluaXRpYWxpemUgd2l0aG91dCBjYXVzaW5nIHdhcm5pbmcgLVdjbG9iYmVyZWQKICAgICBpbnQgcmV0cmllcyA9IFJFVFJZX01PVU5UX0FUVEVNUFRTOwogICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lX3N0YXJ0ZWQgPSB7MH07CiAKQEAgLTI3NSw3ICsyNjUsNyBAQAogICAgIGRhdGEuc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMgPSBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllczsKIAogICAgIExPRyhERUJVRykgPDwgIk9wZW5pbmciIDw8IHJlYWxfYmxrZGV2OwotICAgIGlmICggKGRhdGEucmVhbGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZGF0YS5yZWFsZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JEV1IgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldiA8PCAiIGZvciBpbnBsYWNlIGVuY3J5cHQiOwogICAgICAgICByYyA9IC0xOwogICAgICAgICBnb3RvIGVycm91dDsKQEAgLTI4Myw3ICsyNzMsNyBAQAogCiAgICAgTE9HKERFQlVHKSA8PCAiT3BlbmluZyIgPDwgY3J5cHRvX2Jsa2RldjsKICAgICAvLyBXYWl0IHVudGlsIHRoZSBibG9jayBkZXZpY2UgYXBwZWFycy4gIFJlLXVzZSB0aGUgbW91bnQgcmV0cnkgdmFsdWVzIHNpbmNlIGl0IGlzIHJlYXNvbmFibGUuCi0gICAgd2hpbGUgKChkYXRhLmNyeXB0b2ZkID0gb3BlbihjcnlwdG9fYmxrZGV2LCBPX1dST05MWXxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICB3aGlsZSAoKGRhdGEuY3J5cHRvZmQgPSBvcGVuKGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIGlmICgtLXJldHJpZXMpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIGNyeXB0b19ibGtkZXYgIiA8PCBjcnlwdG9fYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBleHQ0IGlucGxhY2UgZW5jcnlwdCwgcmV0cnlpbmciOwpAQCAtMjk2LDcgKzI4Niw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc2V0am1wKHNldGptcF9lbnYpKSB7IC8vIE5PTElOVAorICAgIGlmIChzZXRqbXAoc2V0am1wX2VudikpIHsgIC8vIE5PTElOVAogICAgICAgICBMT0coRVJST1IpIDw8ICJSZWFkaW5nIGV4dDQgZXh0ZW50IGNhdXNlZCBhbiBleGNlcHRpb24iOwogICAgICAgICByYyA9IC0xOwogICAgICAgICBnb3RvIGVycm91dDsKQEAgLTMxNiw3ICszMDYsNyBAQAogCiAgICAgZGF0YS50b3RfdXNlZF9ibG9ja3MgPSBkYXRhLm51bWJsb2NrczsKICAgICBmb3IgKGkgPSAwOyBpIDwgYXV4X2luZm8uZ3JvdXBzOyArK2kpIHsKLSAgICAgIGRhdGEudG90X3VzZWRfYmxvY2tzIC09IGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQ7CisgICAgICAgIGRhdGEudG90X3VzZWRfYmxvY2tzIC09IGF1eF9pbmZvLmJnX2Rlc2NbaV0uYmdfZnJlZV9ibG9ja3NfY291bnQ7CiAgICAgfQogCiAgICAgZGF0YS5vbmVfcGN0ID0gZGF0YS50b3RfdXNlZF9ibG9ja3MgLyAxMDA7CkBAIC0zNDUsOCArMzM1LDcgQEAKICAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIGxvZ19wcm9ncmVzc19mMmZzKHU2NCBibG9jaywgYm9vbCBjb21wbGV0ZWQpCi17CitzdGF0aWMgdm9pZCBsb2dfcHJvZ3Jlc3NfZjJmcyh1NjQgYmxvY2ssIGJvb2wgY29tcGxldGVkKSB7CiAgICAgLy8gUHJlY29uZGl0aW9uIC0gaWYgY29tcGxldGVkIGRhdGEgPSAwIGVsc2UgZGF0YSAhPSAwCiAKICAgICAvLyBUcmFjayBwcm9ncmVzcyBzbyB3ZSBjYW4gc2tpcCBsb2dnaW5nIGJsb2NrcwpAQCAtMzY5LDkgKzM1OCw4IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IGVuY3J5cHRfb25lX2Jsb2NrX2YyZnModTY0IHBvcywgdm9pZCAqZGF0YSkKLXsKLSAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgKnByaXZfZGF0ID0gKHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSAqKWRhdGE7CitzdGF0aWMgaW50IGVuY3J5cHRfb25lX2Jsb2NrX2YyZnModTY0IHBvcywgdm9pZCogZGF0YSkgeworICAgIHN0cnVjdCBlbmNyeXB0R3JvdXBzRGF0YSogcHJpdl9kYXQgPSAoc3RydWN0IGVuY3J5cHRHcm91cHNEYXRhKilkYXRhOwogCiAgICAgcHJpdl9kYXQtPmJsb2Nrc19hbHJlYWR5X2RvbmUgPSBwb3MgLSAxOwogICAgIHVwZGF0ZV9wcm9ncmVzcyhwcml2X2RhdCwgMSk7CkBAIC00MDAsNyArMzg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMpIHsKICAgICBzdHJ1Y3QgZW5jcnlwdEdyb3Vwc0RhdGEgZGF0YTsKLSAgICBzdHJ1Y3QgZjJmc19pbmZvICpmMmZzX2luZm8gPSBOVUxMOworICAgIHN0cnVjdCBmMmZzX2luZm8qIGYyZnNfaW5mbyA9IE5VTEw7CiAgICAgaW50IHJjID0gRU5BQkxFX0lOUExBQ0VfRVJSX09USEVSOwogICAgIGlmIChwcmV2aW91c2x5X2VuY3J5cHRlZF91cHRvID4gKnNpemVfYWxyZWFkeV9kb25lKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIk5vdCBmYXN0IGVuY3J5cHRpbmcgc2luY2UgcmVzdW1pbmcgcGFydCB3YXkgdGhyb3VnaCI7CkBAIC00MTIsMTEgKzQwMCwxMSBAQAogICAgIGRhdGEuc2V0X3Byb2dyZXNzX3Byb3BlcnRpZXMgPSBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllczsKICAgICBkYXRhLnJlYWxmZCA9IC0xOwogICAgIGRhdGEuY3J5cHRvZmQgPSAtMTsKLSAgICBpZiAoIChkYXRhLnJlYWxmZCA9IG9wZW42NChyZWFsX2Jsa2RldiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZGF0YS5yZWFsZmQgPSBvcGVuNjQocmVhbF9ibGtkZXYsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRXJyb3Igb3BlbmluZyByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2IDw8ICIgZm9yIGYyZnMgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgZ290byBlcnJvdXQ7CiAgICAgfQotICAgIGlmICggKGRhdGEuY3J5cHRvZmQgPSBvcGVuNjQoY3J5cHRvX2Jsa2RldiwgT19XUk9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChkYXRhLmNyeXB0b2ZkID0gb3BlbjY0KGNyeXB0b19ibGtkZXYsIE9fV1JPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIGNyeXB0b19ibGtkZXYgIiA8PCBjcnlwdG9fYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGYyZnMgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgcmMgPSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWOwpAQCAtNDI0LDggKzQxMiw3IEBACiAgICAgfQogCiAgICAgZjJmc19pbmZvID0gZ2VuZXJhdGVfZjJmc19pbmZvKGRhdGEucmVhbGZkKTsKLSAgICBpZiAoIWYyZnNfaW5mbykKLSAgICAgIGdvdG8gZXJyb3V0OworICAgIGlmICghZjJmc19pbmZvKSBnb3RvIGVycm91dDsKIAogICAgIGRhdGEubnVtYmxvY2tzID0gc2l6ZSAvIENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7CiAgICAgZGF0YS50b3RfbnVtYmxvY2tzID0gdG90X3NpemUgLyBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFOwpAQCAtNDM4LDcgKzQyNSw3IEBACiAgICAgZGF0YS50aW1lX3N0YXJ0ZWQgPSB0aW1lKE5VTEwpOwogICAgIGRhdGEucmVtYWluaW5nX3RpbWUgPSAtMTsKIAotICAgIGRhdGEuYnVmZmVyID0gKGNoYXIqKSBtYWxsb2MoZjJmc19pbmZvLT5ibG9ja19zaXplKTsKKyAgICBkYXRhLmJ1ZmZlciA9IChjaGFyKiltYWxsb2MoZjJmc19pbmZvLT5ibG9ja19zaXplKTsKICAgICBpZiAoIWRhdGEuYnVmZmVyKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjcnlwdG8gYnVmZmVyIjsKICAgICAgICAgZ290byBlcnJvdXQ7CkBAIC00NzUsMTggKzQ2MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBwcmV2aW91c2x5X2VuY3J5cHRlZF91cHRvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzZXRfcHJvZ3Jlc3NfcHJvcGVydGllcykgewogICAgIGludCByZWFsZmQsIGNyeXB0b2ZkOwotICAgIGNoYXIgKmJ1ZltDUllQVF9JTlBMQUNFX0JVRlNJWkVdOworICAgIGNoYXIqIGJ1ZltDUllQVF9JTlBMQUNFX0JVRlNJWkVdOwogICAgIGludCByYyA9IEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUjsKICAgICBvZmY2NF90IG51bWJsb2NrcywgaSwgcmVtYWluZGVyOwogICAgIG9mZjY0X3Qgb25lX3BjdCwgY3VyX3BjdCwgbmV3X3BjdDsKICAgICBvZmY2NF90IGJsb2Nrc19hbHJlYWR5X2RvbmUsIHRvdF9udW1ibG9ja3M7CiAKLSAgICBpZiAoIChyZWFsZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWXxPX0NMT0VYRUMpKSA8IDApIHsKKyAgICBpZiAoKHJlYWxmZCA9IG9wZW4ocmVhbF9ibGtkZXYsIE9fUkRPTkxZIHwgT19DTE9FWEVDKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciBvcGVuaW5nIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgcmV0dXJuIEVOQUJMRV9JTlBMQUNFX0VSUl9PVEhFUjsKICAgICB9CiAKLSAgICBpZiAoIChjcnlwdG9mZCA9IG9wZW4oY3J5cHRvX2Jsa2RldiwgT19XUk9OTFl8T19DTE9FWEVDKSkgPCAwKSB7CisgICAgaWYgKChjcnlwdG9mZCA9IG9wZW4oY3J5cHRvX2Jsa2RldiwgT19XUk9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIG9wZW5pbmcgY3J5cHRvX2Jsa2RldiAiIDw8IGNyeXB0b19ibGtkZXYgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKICAgICAgICAgY2xvc2UocmVhbGZkKTsKICAgICAgICAgcmV0dXJuIEVOQUJMRV9JTlBMQUNFX0VSUl9ERVY7CkBAIC01MTYsNyArNTAzLDcgQEAKICAgICAgICAgZ290byBlcnJvdXQ7CiAgICAgfQogCi0gICAgZm9yICg7aSA8IHNpemUgJiYgaSAlIENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkUgIT0gMDsgKytpKSB7CisgICAgZm9yICg7IGkgPCBzaXplICYmIGkgJSBDUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFICE9IDA7ICsraSkgewogICAgICAgICBpZiAodW5peF9yZWFkKHJlYWxmZCwgYnVmLCBDUllQVF9TRUNUT1JfU0laRSkgPD0gMCkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkVycm9yIHJlYWRpbmcgaW5pdGlhbCBzZWN0b3JzIGZyb20gcmVhbF9ibGtkZXYgIiA8PCByZWFsX2Jsa2RldgogICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKQEAgLTUzNCwxNCArNTIxLDE0IEBACiAgICAgb25lX3BjdCA9IHRvdF9udW1ibG9ja3MgLyAxMDA7CiAgICAgY3VyX3BjdCA9IDA7CiAgICAgLyogcHJvY2VzcyB0aGUgbWFqb3JpdHkgb2YgdGhlIGZpbGVzeXN0ZW0gaW4gYmxvY2tzICovCi0gICAgZm9yIChpLz1DUllQVF9TRUNUT1JTX1BFUl9CVUZTSVpFOyBpPG51bWJsb2NrczsgaSsrKSB7CisgICAgZm9yIChpIC89IENSWVBUX1NFQ1RPUlNfUEVSX0JVRlNJWkU7IGkgPCBudW1ibG9ja3M7IGkrKykgewogICAgICAgICBuZXdfcGN0ID0gKGkgKyBibG9ja3NfYWxyZWFkeV9kb25lKSAvIG9uZV9wY3Q7CiAgICAgICAgIGlmIChzZXRfcHJvZ3Jlc3NfcHJvcGVydGllcyAmJiBuZXdfcGN0ID4gY3VyX3BjdCkgewotICAgICAgICAgICAgY2hhciBidWZbOF07CisgICAgICAgICAgICBjaGFyIHByb3BlcnR5X2J1Zls4XTsKIAogICAgICAgICAgICAgY3VyX3BjdCA9IG5ld19wY3Q7Ci0gICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiJSIgUFJJZDY0LCBjdXJfcGN0KTsKLSAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlNldFByb3BlcnR5KCJ2b2xkLmVuY3J5cHRfcHJvZ3Jlc3MiLCBidWYpOworICAgICAgICAgICAgc25wcmludGYocHJvcGVydHlfYnVmLCBzaXplb2YocHJvcGVydHlfYnVmKSwgIiUiIFBSSWQ2NCwgY3VyX3BjdCk7CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTZXRQcm9wZXJ0eSgidm9sZC5lbmNyeXB0X3Byb2dyZXNzIiwgcHJvcGVydHlfYnVmKTsKICAgICAgICAgfQogICAgICAgICBpZiAodW5peF9yZWFkKHJlYWxmZCwgYnVmLCBDUllQVF9JTlBMQUNFX0JVRlNJWkUpIDw9IDApIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIHJlYWxfYmxrZGV2ICIgPDwgcmVhbF9ibGtkZXYgPDwgIiBmb3IgaW5wbGFjZSBlbmNyeXB0IjsKQEAgLTU1Nyw3ICs1NDQsNyBAQAogICAgIH0KIAogICAgIC8qIERvIGFueSByZW1haW5pbmcgc2VjdG9ycyAqLwotICAgIGZvciAoaT0wOyBpPHJlbWFpbmRlcjsgaSsrKSB7CisgICAgZm9yIChpID0gMDsgaSA8IHJlbWFpbmRlcjsgaSsrKSB7CiAgICAgICAgIGlmICh1bml4X3JlYWQocmVhbGZkLCBidWYsIENSWVBUX1NFQ1RPUl9TSVpFKSA8PSAwKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGZpbmFsIHNlY3RvcnMgZnJvbSByZWFsX2Jsa2RldiAiIDw8IHJlYWxfYmxrZGV2CiAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGlucGxhY2UgZW5jcnlwdCI7CkBAIC02MjYsOSArNjEzLDggQEAKICAgICBMT0coREVCVUcpIDw8ICJjcnlwdGZzX2VuYWJsZV9pbnBsYWNlX2Z1bGwoKT0iIDw8IHJjX2Z1bGw7CiAKICAgICAvKiBIYWNrIGZvciBiLzE3ODk4OTYyLCB0aGUgZm9sbG93aW5nIGlzIHRoZSBzeW1wdG9tLi4uICovCi0gICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVgotICAgICAgICAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYKLSAgICAgICAgJiYgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CisgICAgaWYgKHJjX2V4dDQgPT0gRU5BQkxFX0lOUExBQ0VfRVJSX0RFViAmJiByY19mMmZzID09IEVOQUJMRV9JTlBMQUNFX0VSUl9ERVYgJiYKKyAgICAgICAgcmNfZnVsbCA9PSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIkVOQUJMRV9JTlBMQUNFX0VSUl9ERVYiOwogICAgICAgICByZXR1cm4gRU5BQkxFX0lOUExBQ0VfRVJSX0RFVjsKICAgICB9CmRpZmYgLS1naXQgYS9GaWxlRGV2aWNlVXRpbHMuY3BwIGIvRmlsZURldmljZVV0aWxzLmNwcAppbmRleCBiYzlmNGJkLi5jZTkzOGE5IDEwMDY0NAotLS0gYS9GaWxlRGV2aWNlVXRpbHMuY3BwCisrKyBiL0ZpbGVEZXZpY2VVdGlscy5jcHAKQEAgLTE2LDE1ICsxNiwxNSBAQAogCiAjaW5jbHVkZSAiRmlsZURldmljZVV0aWxzLmgiCiAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmllbWFwLmg+Ci0jaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CkBAIC00MCwzOCArNDAsMzMgQEAKIG5hbWVzcGFjZSB2b2xkIHsKIAogLy8gR2l2ZW4gYSBmaWxlIHBhdGgsIGxvb2sgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGRldmljZSBpbiAvcHJvYy9tb3VudAotc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKQotewotICAgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBpbnQoKikoRklMRSopPiBtbnRzKHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInJlIiksIGVuZG1udGVudCk7CitzdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgaW50ICgqKShGSUxFKik+IG1udHMoc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAicmUiKSwgZW5kbW50ZW50KTsKICAgICBpZiAoIW1udHMpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuIC9wcm9jL21vdW50cyI7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICAgIHNpemVfdCBiZXN0X2xlbmd0aCA9IDA7Ci0gICAgc3RydWN0IG1udGVudCAqbW50OyAvLyBnZXRtbnRlbnQgcmV0dXJucyBhIHRocmVhZCBsb2NhbCwgc28gaXQncyBzYWZlLgorICAgIHN0cnVjdCBtbnRlbnQqIG1udDsgIC8vIGdldG1udGVudCByZXR1cm5zIGEgdGhyZWFkIGxvY2FsLCBzbyBpdCdzIHNhZmUuCiAgICAgd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQobW50cy5nZXQoKSkpICE9IG51bGxwdHIpIHsKICAgICAgICAgYXV0byBsID0gc3RybGVuKG1udC0+bW50X2Rpcik7Ci0gICAgICAgIGlmIChsID4gYmVzdF9sZW5ndGggJiYKLSAgICAgICAgICAgIHBhdGguc2l6ZSgpID4gbCAmJgotICAgICAgICAgICAgcGF0aFtsXSA9PSAnLycgJiYKKyAgICAgICAgaWYgKGwgPiBiZXN0X2xlbmd0aCAmJiBwYXRoLnNpemUoKSA+IGwgJiYgcGF0aFtsXSA9PSAnLycgJiYKICAgICAgICAgICAgIHBhdGguY29tcGFyZSgwLCBsLCBtbnQtPm1udF9kaXIpID09IDApIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtbnQtPm1udF9mc25hbWU7Ci0gICAgICAgICAgICAgICAgYmVzdF9sZW5ndGggPSBsOworICAgICAgICAgICAgcmVzdWx0ID0gbW50LT5tbnRfZnNuYW1lOworICAgICAgICAgICAgYmVzdF9sZW5ndGggPSBsOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXN1bHQuZW1wdHkoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8IkRpZG4ndCBmaW5kIGEgbW91bnRwb2ludCB0byBtYXRjaCBwYXRoICIgPDwgcGF0aDsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRGlkbid0IGZpbmQgYSBtb3VudHBvaW50IHRvIG1hdGNoIHBhdGggIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQogICAgIExPRyhERUJVRykgPDwgIkZvciBwYXRoICIgPDwgcGF0aCA8PCAiIGJsb2NrIGRldmljZSBpcyAiIDw8IHJlc3VsdDsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KQotewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgcGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCkpKTsKK3N0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiBQYXRoRmllbWFwKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50MzJfdCBleHRlbnRfY291bnQpIHsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4ocGF0aC5jX3N0cigpLCBPX1JET05MWSB8IE9fQ0xPRVhFQywgMCkpKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgaWYgKGVycm5vID09IEVOT0VOVCkgewogICAgICAgICAgICAgUExPRyhERUJVRykgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgcGF0aDsKQEAgLTg4LDcgKzgzLDcgQEAKICAgICBhdXRvIG1hcHBlZCA9IGZpZW1hcC0+Zm1fbWFwcGVkX2V4dGVudHM7CiAgICAgaWYgKG1hcHBlZCA8IDEgfHwgbWFwcGVkID4gZXh0ZW50X2NvdW50KSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkV4dGVudCBjb3VudCBub3QgaW4gYm91bmRzIDEgPD0gIiA8PCBtYXBwZWQgPDwgIiA8PSAiIDw8IGV4dGVudF9jb3VudAotICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IHBhdGg7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KICAgICByZXR1cm4gZmllbWFwOwpAQCAtOTksMTAgKzk0LDkgQEAKIAogbmFtZXNwYWNlIHsKIAotc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IGFsbG9jX2ZpZW1hcCh1aW50MzJfdCBleHRlbnRfY291bnQpCi17CitzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gYWxsb2NfZmllbWFwKHVpbnQzMl90IGV4dGVudF9jb3VudCkgewogICAgIHNpemVfdCBhbGxvY3NpemUgPSBvZmZzZXRvZihzdHJ1Y3QgZmllbWFwLCBmbV9leHRlbnRzW2V4dGVudF9jb3VudF0pOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdHJ1Y3QgZmllbWFwPiByZXMobmV3ICg6Om9wZXJhdG9yIG5ldyAoYWxsb2NzaXplKSkgc3RydWN0IGZpZW1hcCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IHJlcyhuZXcgKDo6b3BlcmF0b3IgbmV3KGFsbG9jc2l6ZSkpIHN0cnVjdCBmaWVtYXApOwogICAgIG1lbXNldChyZXMuZ2V0KCksIDAsIGFsbG9jc2l6ZSk7CiAgICAgcmVzLT5mbV9zdGFydCA9IDA7CiAgICAgcmVzLT5mbV9sZW5ndGggPSBVSU5UNjRfTUFYOwpAQCAtMTEyLDQgKzEwNiw0IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotfQorfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9GaWxlRGV2aWNlVXRpbHMuaCBiL0ZpbGVEZXZpY2VVdGlscy5oCmluZGV4IDRjMWQ0OWEuLjQ0MjhjZWYgMTAwNjQ0Ci0tLSBhL0ZpbGVEZXZpY2VVdGlscy5oCisrKyBiL0ZpbGVEZXZpY2VVdGlscy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQU5EUk9JRF9WT0xEX0ZJTEVERVZJQ0VVVElMU19ICiAjZGVmaW5lIEFORFJPSURfVk9MRF9GSUxFREVWSUNFVVRJTFNfSAogCi0jaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2ZpZW1hcC5oPgorI2luY2x1ZGUgPHN0cmluZz4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCiAvLyBHaXZlbiBhIGZpbGUgcGF0aCwgbG9vayBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgYmxvY2sgZGV2aWNlIGluIC9wcm9jL21vdW50Ci1zdGQ6OnN0cmluZyBCbG9ja0RldmljZUZvclBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpOworc3RkOjpzdHJpbmcgQmxvY2tEZXZpY2VGb3JQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKTsKIAogLy8gUmVhZCB0aGUgZmlsZSdzIEZJRU1BUAotc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBmaWVtYXA+IFBhdGhGaWVtYXAoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgsIHVpbnQzMl90IGV4dGVudF9jb3VudCk7CitzdGQ6OnVuaXF1ZV9wdHI8c3RydWN0IGZpZW1hcD4gUGF0aEZpZW1hcChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgdWludDMyX3QgZXh0ZW50X2NvdW50KTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9FeHQ0Q3J5cHQuY3BwIGIvRnNDcnlwdC5jcHAKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gRXh0NENyeXB0LmNwcApyZW5hbWUgdG8gRnNDcnlwdC5jcHAKaW5kZXggNjdiN2U5MC4uOTdmMjYxOSAxMDA2NDQKLS0tIGEvRXh0NENyeXB0LmNwcAorKysgYi9Gc0NyeXB0LmNwcApAQCAtMTQsNyArMTQsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgorI2luY2x1ZGUgIkZzQ3J5cHQuaCIKIAogI2luY2x1ZGUgIktleVN0b3JhZ2UuaCIKICNpbmNsdWRlICJLZXlVdGlsLmgiCkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9hbmRyb2lkLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCkBAIC01MCwxMyArNTAsMTQgQEAKICNpbmNsdWRlIDxjdXRpbHMvZnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCi0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAjaW5jbHVkZSA8a2V5dXRpbHMuaD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOwpAQCAtNzEsNyArNzIsNyBAQAogICAgIHN0ZDo6c3RyaW5nIGtleV9yYXdfcmVmOwogfTsKIAotY29uc3Qgc3RkOjpzdHJpbmcgZGV2aWNlX2tleV9kaXIgPSBzdGQ6OnN0cmluZygpICsgREFUQV9NTlRfUE9JTlQgKyBlNGNyeXB0X3VuZW5jcnlwdGVkX2ZvbGRlcjsKK2NvbnN0IHN0ZDo6c3RyaW5nIGRldmljZV9rZXlfZGlyID0gc3RkOjpzdHJpbmcoKSArIERBVEFfTU5UX1BPSU5UICsgZnNjcnlwdF91bmVuY3J5cHRlZF9mb2xkZXI7CiBjb25zdCBzdGQ6OnN0cmluZyBkZXZpY2Vfa2V5X3BhdGggPSBkZXZpY2Vfa2V5X2RpciArICIva2V5IjsKIGNvbnN0IHN0ZDo6c3RyaW5nIGRldmljZV9rZXlfdGVtcCA9IGRldmljZV9rZXlfZGlyICsgIi90ZW1wIjsKIApAQCAtOTMsOSArOTQsOSBAQAogLy8gVE9ETyBhYm9saXNoIHRoaXMgbWFwLCBwZXIgYi8yNjk0ODA1Mwogc3RkOjptYXA8dXNlcmlkX3QsIEtleUJ1ZmZlcj4gc19jZV9rZXlzOwogCi19Cit9ICAvLyBuYW1lc3BhY2UKIAotc3RhdGljIGJvb2wgZTRjcnlwdF9pc19lbXVsYXRlZCgpIHsKK3N0YXRpYyBib29sIGZzY3J5cHRfaXNfZW11bGF0ZWQoKSB7CiAgICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LnN5cy5lbXVsYXRlX2ZiZSIsIGZhbHNlKTsKIH0KIApAQCAtMTQ1LDggKzE0Niw3IEBACiB9CiAKIHN0YXRpYyBib29sIGdldF9jZV9rZXlfbmV3X3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcmVjdG9yeV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHBhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqY2Vfa2V5X3BhdGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocywgc3RkOjpzdHJpbmcqIGNlX2tleV9wYXRoKSB7CiAgICAgaWYgKHBhdGhzLmVtcHR5KCkpIHsKICAgICAgICAgKmNlX2tleV9wYXRoID0gZ2V0X2NlX2tleV9jdXJyZW50X3BhdGgoZGlyZWN0b3J5X3BhdGgpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE2Myw5ICsxNjMsOSBAQAogCiAvLyBEaXNjYXJkIGFsbCBrZXlzIGJ1dCB0aGUgbmFtZWQgb25lOyByZW5hbWUgaXQgdG8gY2Fub25pY2FsIG5hbWUuCiAvLyBObyBwb2ludCBpbiBhY3Rpbmcgb24gZXJyb3JzIGluIHRoaXM7IGlnbm9yZSB0aGVtLgotc3RhdGljIHZvaWQgZml4YXRlX3VzZXJfY2Vfa2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJlY3RvcnlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcgJnRvX2ZpeCwKK3N0YXRpYyB2b2lkIGZpeGF0ZV91c2VyX2NlX2tleShjb25zdCBzdGQ6OnN0cmluZyYgZGlyZWN0b3J5X3BhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b19maXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwYXRocykgewotICAgIGZvciAoYXV0byBjb25zdCBvdGhlcl9wYXRoOiBwYXRocykgeworICAgIGZvciAoYXV0byBjb25zdCBvdGhlcl9wYXRoIDogcGF0aHMpIHsKICAgICAgICAgaWYgKG90aGVyX3BhdGggIT0gdG9fZml4KSB7CiAgICAgICAgICAgICBhbmRyb2lkOjp2b2xkOjpkZXN0cm95S2V5KG90aGVyX3BhdGgpOwogICAgICAgICB9CkBAIC0xNzUsMTYgKzE3NSwxOCBAQAogICAgICAgICBMT0coREVCVUcpIDw8ICJSZW5hbWluZyAiIDw8IHRvX2ZpeCA8PCAiIHRvICIgPDwgY3VycmVudF9wYXRoOwogICAgICAgICBpZiAocmVuYW1lKHRvX2ZpeC5jX3N0cigpLCBjdXJyZW50X3BhdGguY19zdHIoKSkgIT0gMCkgewogICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiVW5hYmxlIHRvIHJlbmFtZSAiIDw8IHRvX2ZpeCA8PCAiIHRvICIgPDwgY3VycmVudF9wYXRoOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQorICAgIGFuZHJvaWQ6OnZvbGQ6OkZzeW5jRGlyZWN0b3J5KGRpcmVjdG9yeV9wYXRoKTsKIH0KIAogc3RhdGljIGJvb2wgcmVhZF9hbmRfZml4YXRlX3VzZXJfY2Vfa2V5KHVzZXJpZF90IHVzZXJfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6dm9sZDo6S2V5QXV0aGVudGljYXRpb24mIGF1dGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5QnVmZmVyICpjZV9rZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGNlX2tleSkgewogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgY2Vfa2V5X3BhdGg6IHBhdGhzKSB7CisgICAgZm9yIChhdXRvIGNvbnN0IGNlX2tleV9wYXRoIDogcGF0aHMpIHsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiVHJ5aW5nIHVzZXIgQ0Uga2V5ICIgPDwgY2Vfa2V5X3BhdGg7CiAgICAgICAgIGlmIChhbmRyb2lkOjp2b2xkOjpyZXRyaWV2ZUtleShjZV9rZXlfcGF0aCwgYXV0aCwgY2Vfa2V5KSkgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBrZXkiOwpAQCAtMjQyLDEyICsyNDQsMTQgQEAKICAgICAgICAgYXV0byBjb25zdCBwYXRocyA9IGdldF9jZV9rZXlfcGF0aHMoZGlyZWN0b3J5X3BhdGgpOwogICAgICAgICBzdGQ6OnN0cmluZyBjZV9rZXlfcGF0aDsKICAgICAgICAgaWYgKCFnZXRfY2Vfa2V5X25ld19wYXRoKGRpcmVjdG9yeV9wYXRoLCBwYXRocywgJmNlX2tleV9wYXRoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwKLSAgICAgICAgICAgICAgICBrRW1wdHlBdXRoZW50aWNhdGlvbiwgY2Vfa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwga0VtcHR5QXV0aGVudGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGZpeGF0ZV91c2VyX2NlX2tleShkaXJlY3RvcnlfcGF0aCwgY2Vfa2V5X3BhdGgsIHBhdGhzKTsKICAgICAgICAgLy8gV3JpdGUgREUga2V5IHNlY29uZDsgb25jZSB0aGlzIGlzIHdyaXR0ZW4sIGFsbCBpcyBnb29kLgogICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShnZXRfZGVfa2V5X3BhdGgodXNlcl9pZCksIHVzZXJfa2V5X3RlbXAsCi0gICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0VtcHR5QXV0aGVudGljYXRpb24sIGRlX2tleSkpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHN0ZDo6c3RyaW5nIGRlX3Jhd19yZWY7CiAgICAgaWYgKCFhbmRyb2lkOjp2b2xkOjppbnN0YWxsS2V5KGRlX2tleSwgJmRlX3Jhd19yZWYpKSByZXR1cm4gZmFsc2U7CkBAIC0yODEsNyArMjg1LDcgQEAKIH0KIAogc3RhdGljIGJvb2wgZW5zdXJlX3BvbGljeShjb25zdCBQb2xpY3lLZXlSZWYmIGtleV9yZWYsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgcmV0dXJuIGU0Y3J5cHRfcG9saWN5X2Vuc3VyZShwYXRoLmNfc3RyKCksIGtleV9yZWYua2V5X3Jhd19yZWYuZGF0YSgpLAorICAgIHJldHVybiBmc2NyeXB0X3BvbGljeV9lbnN1cmUocGF0aC5jX3N0cigpLCBrZXlfcmVmLmtleV9yYXdfcmVmLmRhdGEoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9yZWYua2V5X3Jhd19yZWYuc2l6ZSgpLCBrZXlfcmVmLmNvbnRlbnRzX21vZGUuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleV9yZWYuZmlsZW5hbWVzX21vZGUuY19zdHIoKSkgPT0gMDsKIH0KQEAgLTMyNSwxMyArMzI5LDEzIEBACiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnN0YWxsZWQgZGUga2V5IGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgfQogICAgIH0KLSAgICAvLyBleHQ0ZW5jOlRPRE86IGdvIHRocm91Z2ggYWxsIERFIGRpcmVjdG9yaWVzLCBlbnN1cmUgdGhhdCBhbGwgdXNlciBkaXJzIGhhdmUgdGhlCisgICAgLy8gZnNjcnlwdDpUT0RPOiBnbyB0aHJvdWdoIGFsbCBERSBkaXJlY3RvcmllcywgZW5zdXJlIHRoYXQgYWxsIHVzZXIgZGlycyBoYXZlIHRoZQogICAgIC8vIGNvcnJlY3QgcG9saWN5IHNldCBvbiB0aGVtLCBhbmQgdGhhdCBubyByb2d1ZSBvbmVzIGV4aXN0LgogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUoKSB7Ci0gICAgTE9HKElORk8pIDw8ICJlNGNyeXB0X2luaXRpYWxpemVfZ2xvYmFsX2RlIjsKK2Jvb2wgZnNjcnlwdF9pbml0aWFsaXplX2dsb2JhbF9kZSgpIHsKKyAgICBMT0coSU5GTykgPDwgImZzY3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUiOwogCiAgICAgaWYgKHNfZ2xvYmFsX2RlX2luaXRpYWxpemVkKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiQWxyZWFkeSBpbml0aWFsaXplZCI7CkBAIC0zNDUsMTMgKzM0OSwxMyBAQAogICAgIGdldF9kYXRhX2ZpbGVfZW5jcnlwdGlvbl9tb2RlcygmZGV2aWNlX3JlZik7CiAKICAgICBzdGQ6OnN0cmluZyBtb2Rlc3RyaW5nID0gZGV2aWNlX3JlZi5jb250ZW50c19tb2RlICsgIjoiICsgZGV2aWNlX3JlZi5maWxlbmFtZXNfbW9kZTsKLSAgICBzdGQ6OnN0cmluZyBtb2RlX2ZpbGVuYW1lID0gc3RkOjpzdHJpbmcoIi9kYXRhIikgKyBlNGNyeXB0X2tleV9tb2RlOworICAgIHN0ZDo6c3RyaW5nIG1vZGVfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGZzY3J5cHRfa2V5X21vZGU7CiAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpXcml0ZVN0cmluZ1RvRmlsZShtb2Rlc3RyaW5nLCBtb2RlX2ZpbGVuYW1lKSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHNhdmUgdHlwZSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyByZWZfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGU0Y3J5cHRfa2V5X3JlZjsKKyAgICBzdGQ6OnN0cmluZyByZWZfZmlsZW5hbWUgPSBzdGQ6OnN0cmluZygiL2RhdGEiKSArIGZzY3J5cHRfa2V5X3JlZjsKICAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlKGRldmljZV9yZWYua2V5X3Jhd19yZWYsIHJlZl9maWxlbmFtZSkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCBzYXZlIGtleSByZWZlcmVuY2UgdG86IiA8PCByZWZfZmlsZW5hbWU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTM2Miw5ICszNjYsOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfaW5pdF91c2VyMCgpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X2luaXRfdXNlcjAiOwotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Citib29sIGZzY3J5cHRfaW5pdF91c2VyMCgpIHsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X2luaXRfdXNlcjAiOworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9rZXlfZGlyLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9rZXlfZGlyICsgIi9jZSIsIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkpIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKCFwcmVwYXJlX2Rpcih1c2VyX2tleV9kaXIgKyAiL2RlIiwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgcmV0dXJuIGZhbHNlOwpAQCAtMzc4LDI4ICszODIsMjggQEAKICAgICAvLyBXZSBjYW4gb25seSBzYWZlbHkgcHJlcGFyZSBERSBzdG9yYWdlIGhlcmUsIHNpbmNlIENFIGtleXMgYXJlIHByb2JhYmx5CiAgICAgLy8gZW50YW5nbGVkIHdpdGggdXNlciBjcmVkZW50aWFscy4gIFRoZSBmcmFtZXdvcmsgd2lsbCBhbHdheXMgcHJlcGFyZSBDRQogICAgIC8vIHN0b3JhZ2Ugb25jZSBDRSBrZXlzIGFyZSBpbnN0YWxsZWQuCi0gICAgaWYgKCFlNGNyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlKCIiLCAwLCAwLCBhbmRyb2lkOjpvczo6SVZvbGQ6OlNUT1JBR0VfRkxBR19ERSkpIHsKKyAgICBpZiAoIWZzY3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UoIiIsIDAsIDAsIGFuZHJvaWQ6Om9zOjpJVm9sZDo6U1RPUkFHRV9GTEFHX0RFKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSB1c2VyIDAgc3RvcmFnZSI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBJZiB0aGlzIGlzIGEgbm9uLUZCRSBkZXZpY2UgdGhhdCByZWNlbnRseSBsZWZ0IGFuIGVtdWxhdGVkIG1vZGUsCiAgICAgLy8gcmVzdG9yZSB1c2VyIGRhdGEgZGlyZWN0b3JpZXMgdG8ga25vd24tZ29vZCBzdGF0ZS4KLSAgICBpZiAoIWU0Y3J5cHRfaXNfbmF0aXZlKCkgJiYgIWU0Y3J5cHRfaXNfZW11bGF0ZWQoKSkgewotICAgICAgICBlNGNyeXB0X3VubG9ja191c2VyX2tleSgwLCAwLCAiISIsICIhIik7CisgICAgaWYgKCFmc2NyeXB0X2lzX25hdGl2ZSgpICYmICFmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHsKKyAgICAgICAgZnNjcnlwdF91bmxvY2tfdXNlcl9rZXkoMCwgMCwgIiEiLCAiISIpOwogICAgIH0KIAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIGU0Y3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQgPDwgIiBzZXJpYWwgIiA8PCBzZXJpYWw7Ci0gICAgaWYgKCFlNGNyeXB0X2lzX25hdGl2ZSgpKSB7Citib29sIGZzY3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQgPDwgIiBzZXJpYWwgIiA8PCBzZXJpYWw7CisgICAgaWYgKCFmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvLyBGSVhNRSB0ZXN0IGZvciBleGlzdGVuY2Ugb2Yga2V5IHRoYXQgaXMgbm90IGxvYWRlZCB5ZXQKICAgICBpZiAoc19jZV9rZXlfcmF3X3JlZnMuY291bnQodXNlcl9pZCkgIT0gMCkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJBbHJlYWR5IGV4aXN0cywgY2FuJ3QgZTRjcnlwdF92b2xkX2NyZWF0ZV91c2VyX2tleSBmb3IgIiA8PCB1c2VyX2lkCisgICAgICAgIExPRyhFUlJPUikgPDwgIkFscmVhZHkgZXhpc3RzLCBjYW4ndCBmc2NyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5IGZvciAiIDw8IHVzZXJfaWQKICAgICAgICAgICAgICAgICAgICA8PCAiIHNlcmlhbCAiIDw8IHNlcmlhbDsKICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHdlIGZhaWwgdGhlIGNvbW1hbmQ/CiAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNDMyLDIyICs0MzYsMjIgQEAKICAgICByZXR1cm4gc3VjY2VzczsKIH0KIAotYm9vbCBlNGNyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV91c2VyX2tleSgiIDw8IHVzZXJfaWQgPDwgIikiOwotICAgIGlmICghZTRjcnlwdF9pc19uYXRpdmUoKSkgeworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfZGVzdHJveV91c2VyX2tleSgiIDw8IHVzZXJfaWQgPDwgIikiOworICAgIGlmICghZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKICAgICBzdGQ6OnN0cmluZyByYXdfcmVmOwogICAgIHN1Y2Nlc3MgJj0gZXZpY3RfY2Vfa2V5KHVzZXJfaWQpOwotICAgIHN1Y2Nlc3MgJj0gbG9va3VwX2tleV9yZWYoc19kZV9rZXlfcmF3X3JlZnMsIHVzZXJfaWQsICZyYXdfcmVmKQotICAgICAgICAmJiBhbmRyb2lkOjp2b2xkOjpldmljdEtleShyYXdfcmVmKTsKKyAgICBzdWNjZXNzICY9CisgICAgICAgIGxvb2t1cF9rZXlfcmVmKHNfZGVfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmcmF3X3JlZikgJiYgYW5kcm9pZDo6dm9sZDo6ZXZpY3RLZXkocmF3X3JlZik7CiAgICAgc19kZV9rZXlfcmF3X3JlZnMuZXJhc2UodXNlcl9pZCk7CiAgICAgYXV0byBpdCA9IHNfZXBoZW1lcmFsX3VzZXJzLmZpbmQodXNlcl9pZCk7CiAgICAgaWYgKGl0ICE9IHNfZXBoZW1lcmFsX3VzZXJzLmVuZCgpKSB7CiAgICAgICAgIHNfZXBoZW1lcmFsX3VzZXJzLmVyYXNlKGl0KTsKICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGF1dG8gY29uc3QgcGF0aDogZ2V0X2NlX2tleV9wYXRocyhnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpKSkgeworICAgICAgICBmb3IgKGF1dG8gY29uc3QgcGF0aCA6IGdldF9jZV9rZXlfcGF0aHMoZ2V0X2NlX2tleV9kaXJlY3RvcnlfcGF0aCh1c2VyX2lkKSkpIHsKICAgICAgICAgICAgIHN1Y2Nlc3MgJj0gYW5kcm9pZDo6dm9sZDo6ZGVzdHJveUtleShwYXRoKTsKICAgICAgICAgfQogICAgICAgICBhdXRvIGRlX2tleV9wYXRoID0gZ2V0X2RlX2tleV9wYXRoKHVzZXJfaWQpOwpAQCAtNDc4LDEzICs0ODIsMTMgQEAKICAgICBpZiAoY2htb2QocGF0aC5jX3N0cigpLCBtb2RlKSAhPSAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY2htb2QgIiA8PCBwYXRoOwogICAgICAgICAvLyBGSVhNRSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYi8yNjcxMzYyMgotICAgICAgICBpZiAoZTRjcnlwdF9pc19lbXVsYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHJldHVybiBmYWxzZTsKICAgICB9CiAjaWYgRU1VTEFURURfVVNFU19TRUxJTlVYCiAgICAgaWYgKHNlbGludXhfYW5kcm9pZF9yZXN0b3JlY29uKHBhdGguY19zdHIoKSwgU0VMSU5VWF9BTkRST0lEX1JFU1RPUkVDT05fRk9SQ0UpICE9IDApIHsKICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlc3RvcmVjb24gIiA8PCBwYXRoOwogICAgICAgICAvLyBGSVhNRSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYi8yNjcxMzYyMgotICAgICAgICBpZiAoZTRjcnlwdF9pc19lbXVsYXRlZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX2VtdWxhdGVkKCkpIHJldHVybiBmYWxzZTsKICAgICB9CiAjZW5kaWYKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTU0NywzNCArNTUxLDM1IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OnZvbGQ6OmRlc3Ryb3lLZXkocGF0aCk7CiB9CiAKLWJvb2wgZTRjcnlwdF9hZGRfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAorYm9vbCBmc2NyeXB0X2FkZF91c2VyX2tleV9hdXRoKHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbl9oZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldF9oZXgpIHsKLSAgICBMT0coREVCVUcpIDw8ICJlNGNyeXB0X2FkZF91c2VyX2tleV9hdXRoICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAorICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfYWRkX3VzZXJfa2V5X2F1dGggIiA8PCB1c2VyX2lkIDw8ICIgc2VyaWFsPSIgPDwgc2VyaWFsCiAgICAgICAgICAgICAgICA8PCAiIHRva2VuX3ByZXNlbnQ9IiA8PCAodG9rZW5faGV4ICE9ICIhIik7Ci0gICAgaWYgKCFlNGNyeXB0X2lzX25hdGl2ZSgpKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIWZzY3J5cHRfaXNfbmF0aXZlKCkpIHJldHVybiB0cnVlOwogICAgIGlmIChzX2VwaGVtZXJhbF91c2Vycy5jb3VudCh1c2VyX2lkKSAhPSAwKSByZXR1cm4gdHJ1ZTsKICAgICBzdGQ6OnN0cmluZyB0b2tlbiwgc2VjcmV0OwogICAgIGlmICghcGFyc2VfaGV4KHRva2VuX2hleCwgJnRva2VuKSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICghcGFyc2VfaGV4KHNlY3JldF9oZXgsICZzZWNyZXQpKSByZXR1cm4gZmFsc2U7Ci0gICAgYXV0byBhdXRoID0gc2VjcmV0LmVtcHR5KCkgPyBrRW1wdHlBdXRoZW50aWNhdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGFuZHJvaWQ6OnZvbGQ6OktleUF1dGhlbnRpY2F0aW9uKHRva2VuLCBzZWNyZXQpOworICAgIGF1dG8gYXV0aCA9CisgICAgICAgIHNlY3JldC5lbXB0eSgpID8ga0VtcHR5QXV0aGVudGljYXRpb24gOiBhbmRyb2lkOjp2b2xkOjpLZXlBdXRoZW50aWNhdGlvbih0b2tlbiwgc2VjcmV0KTsKICAgICBhdXRvIGl0ID0gc19jZV9rZXlzLmZpbmQodXNlcl9pZCk7CiAgICAgaWYgKGl0ID09IHNfY2Vfa2V5cy5lbmQoKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJLZXkgbm90IGxvYWRlZCBpbnRvIG1lbW9yeSwgY2FuJ3QgY2hhbmdlIGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBjb25zdCBhdXRvICZjZV9rZXkgPSBpdC0+c2Vjb25kOworICAgIGNvbnN0IGF1dG8mIGNlX2tleSA9IGl0LT5zZWNvbmQ7CiAgICAgYXV0byBjb25zdCBkaXJlY3RvcnlfcGF0aCA9IGdldF9jZV9rZXlfZGlyZWN0b3J5X3BhdGgodXNlcl9pZCk7CiAgICAgYXV0byBjb25zdCBwYXRocyA9IGdldF9jZV9rZXlfcGF0aHMoZGlyZWN0b3J5X3BhdGgpOwogICAgIHN0ZDo6c3RyaW5nIGNlX2tleV9wYXRoOwogICAgIGlmICghZ2V0X2NlX2tleV9uZXdfcGF0aChkaXJlY3RvcnlfcGF0aCwgcGF0aHMsICZjZV9rZXlfcGF0aCkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OnN0b3JlS2V5QXRvbWljYWxseShjZV9rZXlfcGF0aCwgdXNlcl9rZXlfdGVtcCwgYXV0aCwgY2Vfa2V5KSkgcmV0dXJuIGZhbHNlOworICAgIGlmICghYW5kcm9pZDo6dm9sZDo6RnN5bmNEaXJlY3RvcnkoZGlyZWN0b3J5X3BhdGgpKSByZXR1cm4gZmFsc2U7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZml4YXRlX25ld2VzdF91c2VyX2tleV9hdXRoICIgPDwgdXNlcl9pZDsKLSAgICBpZiAoIWU0Y3J5cHRfaXNfbmF0aXZlKCkpIHJldHVybiB0cnVlOworYm9vbCBmc2NyeXB0X2ZpeGF0ZV9uZXdlc3RfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkKSB7CisgICAgTE9HKERFQlVHKSA8PCAiZnNjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGggIiA8PCB1c2VyX2lkOworICAgIGlmICghZnNjcnlwdF9pc19uYXRpdmUoKSkgcmV0dXJuIHRydWU7CiAgICAgaWYgKHNfZXBoZW1lcmFsX3VzZXJzLmNvdW50KHVzZXJfaWQpICE9IDApIHJldHVybiB0cnVlOwogICAgIGF1dG8gY29uc3QgZGlyZWN0b3J5X3BhdGggPSBnZXRfY2Vfa2V5X2RpcmVjdG9yeV9wYXRoKHVzZXJfaWQpOwogICAgIGF1dG8gY29uc3QgcGF0aHMgPSBnZXRfY2Vfa2V5X3BhdGhzKGRpcmVjdG9yeV9wYXRoKTsKQEAgLTU4NywxMSArNTkyLDExIEBACiB9CiAKIC8vIFRPRE86IHJlbmFtZSB0byAnaW5zdGFsbCcgZm9yIGNvbnNpc3RlbmN5LCBhbmQgdGFrZSBmbGFncyB0byBrbm93IHdoaWNoIGtleXMgdG8gaW5zdGFsbAotYm9vbCBlNGNyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAorYm9vbCBmc2NyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW5faGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0X2hleCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfdW5sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAorICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfdW5sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZCA8PCAiIHNlcmlhbD0iIDw8IHNlcmlhbAogICAgICAgICAgICAgICAgPDwgIiB0b2tlbl9wcmVzZW50PSIgPDwgKHRva2VuX2hleCAhPSAiISIpOwotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgaWYgKHNfY2Vfa2V5X3Jhd19yZWZzLmNvdW50KHVzZXJfaWQpICE9IDApIHsKICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVHJpZWQgdG8gdW5sb2NrIGFscmVhZHktdW5sb2NrZWQga2V5IGZvciB1c2VyICIgPDwgdXNlcl9pZDsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNjIwLDExICs2MjUsMTEgQEAKIH0KIAogLy8gVE9ETzogcmVuYW1lIHRvICdldmljdCcgZm9yIGNvbnNpc3RlbmN5Ci1ib29sIGU0Y3J5cHRfbG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkKSB7Ci0gICAgTE9HKERFQlVHKSA8PCAiZTRjcnlwdF9sb2NrX3VzZXJfa2V5ICIgPDwgdXNlcl9pZDsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworYm9vbCBmc2NyeXB0X2xvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCkgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfbG9ja191c2VyX2tleSAiIDw8IHVzZXJfaWQ7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgcmV0dXJuIGV2aWN0X2NlX2tleSh1c2VyX2lkKTsKLSAgICB9IGVsc2UgaWYgKGU0Y3J5cHRfaXNfZW11bGF0ZWQoKSkgeworICAgIH0gZWxzZSBpZiAoZnNjcnlwdF9pc19lbXVsYXRlZCgpKSB7CiAgICAgICAgIC8vIFdoZW4gaW4gZW11bGF0aW9uIG1vZGUsIHdlIGp1c3QgdXNlIGNobW9kCiAgICAgICAgIGlmICghZW11bGF0ZWRfbG9jayhhbmRyb2lkOjp2b2xkOjpCdWlsZERhdGFTeXN0ZW1DZVBhdGgodXNlcl9pZCkpIHx8CiAgICAgICAgICAgICAhZW11bGF0ZWRfbG9jayhhbmRyb2lkOjp2b2xkOjpCdWlsZERhdGFNaXNjQ2VQYXRoKHVzZXJfaWQpKSB8fApAQCAtNjQ5LDkgKzY1NCw5IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsCitib29sIGZzY3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkLCB1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlIGZvciB2b2x1bWUgIiA8PCBlc2NhcGVfZW1wdHkodm9sdW1lX3V1aWQpCiAgICAgICAgICAgICAgICA8PCAiLCB1c2VyICIgPDwgdXNlcl9pZCA8PCAiLCBzZXJpYWwgIiA8PCBzZXJpYWwgPDwgIiwgZmxhZ3MgIiA8PCBmbGFnczsKIAogICAgIGlmIChmbGFncyAmIGFuZHJvaWQ6Om9zOjpJVm9sZDo6U1RPUkFHRV9GTEFHX0RFKSB7CkBAIC02NzAsNyArNjc1LDggQEAKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIoc3lzdGVtX2xlZ2FjeV9wYXRoLCAwNzAwLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogI2lmIE1BTkFHRV9NSVNDX0RJUlMKICAgICAgICAgICAgIGlmICghcHJlcGFyZV9kaXIobWlzY19sZWdhY3lfcGF0aCwgMDc1MCwgbXVsdGl1c2VyX2dldF91aWQodXNlcl9pZCwgQUlEX1NZU1RFTSksCi0gICAgICAgICAgICAgICAgICAgIG11bHRpdXNlcl9nZXRfdWlkKHVzZXJfaWQsIEFJRF9FVkVSWUJPRFkpKSkgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VyX2lkLCBBSURfRVZFUllCT0RZKSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogI2VuZGlmCiAgICAgICAgICAgICBpZiAoIXByZXBhcmVfZGlyKHByb2ZpbGVzX2RlX3BhdGgsIDA3NzEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pKSByZXR1cm4gZmFsc2U7CiAKQEAgLTY4MCw3ICs2ODYsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9kZV9wYXRoLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgICAgICBQb2xpY3lLZXlSZWYgZGVfcmVmOwogICAgICAgICAgICAgaWYgKHZvbHVtZV91dWlkLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWxvb2t1cF9rZXlfcmVmKHNfZGVfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmZGVfcmVmLmtleV9yYXdfcmVmKSkgcmV0dXJuIGZhbHNlOwpAQCAtNzExLDcgKzcxNyw3IEBACiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIobWVkaWFfY2VfcGF0aCwgMDc3MCwgQUlEX01FRElBX1JXLCBBSURfTUVESUFfUlcpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGlmICghcHJlcGFyZV9kaXIodXNlcl9jZV9wYXRoLCAwNzcxLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSkgcmV0dXJuIGZhbHNlOwogCi0gICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgICAgICBQb2xpY3lLZXlSZWYgY2VfcmVmOwogICAgICAgICAgICAgaWYgKHZvbHVtZV91dWlkLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoIWxvb2t1cF9rZXlfcmVmKHNfY2Vfa2V5X3Jhd19yZWZzLCB1c2VyX2lkLCAmY2VfcmVmLmtleV9yYXdfcmVmKSkgcmV0dXJuIGZhbHNlOwpAQCAtNzQwLDggKzc0Niw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncykgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKK2Jvb2wgZnNjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncykgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCkKICAgICAgICAgICAgICAgIDw8ICIsIHVzZXIgIiA8PCB1c2VyX2lkIDw8ICIsIGZsYWdzICIgPDwgZmxhZ3M7CiAgICAgYm9vbCByZXMgPSB0cnVlOwogCkBAIC03NjIsNyArNzY4LDcgQEAKICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X2RpcihtaXNjX2NlX3BhdGgpOwogICAgICAgICAgICAgcmVzICY9IGRlc3Ryb3lfZGlyKHZlbmRvcl9jZV9wYXRoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X3ZvbGtleShtaXNjX2NlX3BhdGgsIHZvbHVtZV91dWlkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNzkxLDcgKzc5Nyw3IEBACiAgICAgICAgICAgICByZXMgJj0gZGVzdHJveV9kaXIobWlzY19kZV9wYXRoKTsKICAgICAgICAgICAgIHJlcyAmPSBkZXN0cm95X2Rpcih2ZW5kb3JfZGVfcGF0aCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgICAgICAgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgICAgICAgICByZXMgJj0gZGVzdHJveV92b2xrZXkobWlzY19kZV9wYXRoLCB2b2x1bWVfdXVpZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgyNiw5ICs4MzIsOSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3ZvbHVtZV9rZXlzKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2x1bWVfdXVpZCkgeworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkKSB7CiAgICAgYm9vbCByZXMgPSB0cnVlOwotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZGVzdHJveV92b2x1bWVfa2V5cyBmb3Igdm9sdW1lICIgPDwgZXNjYXBlX2VtcHR5KHZvbHVtZV91dWlkKTsKKyAgICBMT0coREVCVUcpIDw8ICJmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMgZm9yIHZvbHVtZSAiIDw8IGVzY2FwZV9lbXB0eSh2b2x1bWVfdXVpZCk7CiAgICAgYXV0byBzZWNkaXNjYXJkYWJsZV9wYXRoID0gdm9sdW1lX3NlY2Rpc2NhcmRhYmxlX3BhdGgodm9sdW1lX3V1aWQpOwogICAgIHJlcyAmPSBhbmRyb2lkOjp2b2xkOjpydW5TZWNkaXNjYXJkU2luZ2xlKHNlY2Rpc2NhcmRhYmxlX3BhdGgpOwogICAgIHJlcyAmPSBkZXN0cm95X3ZvbHVtZV9rZXlzKCIvZGF0YS9taXNjX2NlIiwgdm9sdW1lX3V1aWQpOwpkaWZmIC0tZ2l0IGEvRXh0NENyeXB0LmggYi9Gc0NyeXB0LmgKc2ltaWxhcml0eSBpbmRleCA2MSUKcmVuYW1lIGZyb20gRXh0NENyeXB0LmgKcmVuYW1lIHRvIEZzQ3J5cHQuaAppbmRleCBhNDNhNjhhLi4xNmUyZjlhIDEwMDY0NAotLS0gYS9FeHQ0Q3J5cHQuaAorKysgYi9Gc0NyeXB0LmgKQEAgLTE4LDIxICsxOCwyMSBAQAogCiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogCi1ib29sIGU0Y3J5cHRfaW5pdGlhbGl6ZV9nbG9iYWxfZGUoKTsKK2Jvb2wgZnNjcnlwdF9pbml0aWFsaXplX2dsb2JhbF9kZSgpOwogCi1ib29sIGU0Y3J5cHRfaW5pdF91c2VyMCgpOwotYm9vbCBlNGNyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5KHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGJvb2wgZXBoZW1lcmFsKTsKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfa2V5KHVzZXJpZF90IHVzZXJfaWQpOwotYm9vbCBlNGNyeXB0X2FkZF91c2VyX2tleV9hdXRoKHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKK2Jvb2wgZnNjcnlwdF9pbml0X3VzZXIwKCk7Citib29sIGZzY3J5cHRfdm9sZF9jcmVhdGVfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpOworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCk7Citib29sIGZzY3J5cHRfYWRkX3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwotYm9vbCBlNGNyeXB0X2ZpeGF0ZV9uZXdlc3RfdXNlcl9rZXlfYXV0aCh1c2VyaWRfdCB1c2VyX2lkKTsKK2Jvb2wgZnNjcnlwdF9maXhhdGVfbmV3ZXN0X3VzZXJfa2V5X2F1dGgodXNlcmlkX3QgdXNlcl9pZCk7CiAKLWJvb2wgZTRjcnlwdF91bmxvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorYm9vbCBmc2NyeXB0X3VubG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkLCBpbnQgc2VyaWFsLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOwotYm9vbCBlNGNyeXB0X2xvY2tfdXNlcl9rZXkodXNlcmlkX3QgdXNlcl9pZCk7Citib29sIGZzY3J5cHRfbG9ja191c2VyX2tleSh1c2VyaWRfdCB1c2VyX2lkKTsKIAotYm9vbCBlNGNyeXB0X3ByZXBhcmVfdXNlcl9zdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2x1bWVfdXVpZCwgdXNlcmlkX3QgdXNlcl9pZCwgaW50IHNlcmlhbCwKK2Jvb2wgZnNjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBzZXJpYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKTsKLWJvb2wgZTRjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQsIHVzZXJpZF90IHVzZXJfaWQsIGludCBmbGFncyk7Citib29sIGZzY3J5cHRfZGVzdHJveV91c2VyX3N0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkLCB1c2VyaWRfdCB1c2VyX2lkLCBpbnQgZmxhZ3MpOwogCi1ib29sIGU0Y3J5cHRfZGVzdHJveV92b2x1bWVfa2V5cyhjb25zdCBzdGQ6OnN0cmluZyYgdm9sdW1lX3V1aWQpOworYm9vbCBmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbHVtZV91dWlkKTsKZGlmZiAtLWdpdCBhL0lkbGVNYWludC5jcHAgYi9JZGxlTWFpbnQuY3BwCmluZGV4IDVhMTliOGMuLjc5ODk0ZmMgMTAwNjQ0Ci0tLSBhL0lkbGVNYWludC5jcHAKKysrIGIvSWRsZU1haW50LmNwcApAQCAtMjQsMTggKzI0LDIwIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2hlYWx0aC9zdG9yYWdlLzEuMC9JU3RvcmFnZS5oPgogI2luY2x1ZGUgPGZzX21nci5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPGhhcmR3YXJlX2xlZ2FjeS9wb3dlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6QmFzZW5hbWU7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwpAQCAtNDMsNiArNDUsMTEgQEAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlRpbWVyOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGVhbHRoOjpzdG9yYWdlOjpWMV8wOjpJR2FyYmFnZUNvbGxlY3RDYWxsYmFjazsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoZWFsdGg6OnN0b3JhZ2U6OlYxXzA6OklTdG9yYWdlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhlYWx0aDo6c3RvcmFnZTo6VjFfMDo6UmVzdWx0OwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CkBAIC03Myw4ICs4MCw3IEBACiBzdGF0aWMgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgY3ZfYWJvcnQsIGN2X3N0b3A7CiBzdGF0aWMgc3RkOjptdXRleCBjdl9tOwogCi1zdGF0aWMgdm9pZCBhZGRGcm9tVm9sdW1lTWFuYWdlcihzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+KiBwYXRocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKK3N0YXRpYyB2b2lkIGFkZEZyb21Wb2x1bWVNYW5hZ2VyKHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4qIHBhdGhzLCBQYXRoVHlwZXMgcGF0aF90eXBlKSB7CiAgICAgVm9sdW1lTWFuYWdlciogdm0gPSBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpOwogICAgIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4gcHJpdmF0ZUlkczsKICAgICB2bS0+bGlzdFZvbHVtZXMoVm9sdW1lQmFzZTo6VHlwZTo6a1ByaXZhdGUsIHByaXZhdGVJZHMpOwpAQCAtODgsMTEgKzk0LDkgQEAKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNfdHlwZSA9IHZvbC0+Z2V0RnNUeXBlKCk7CiAgICAgICAgICAgICAgICAgaWYgKGZzX3R5cGUgPT0gImYyZnMiICYmIChSZWFscGF0aCh2b2wtPmdldFJhd0RtRGV2UGF0aCgpLCAmZ2NfcGF0aCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWxwYXRoKHZvbC0+Z2V0UmF3RGV2UGF0aCgpLCAmZ2NfcGF0aCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIgKyBCYXNlbmFtZShnY19wYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc190eXBlICsgIi8iICsgQmFzZW5hbWUoZ2NfcGF0aCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLQogICAgICAgICB9CiAgICAgfQogfQpAQCAtMTAwLDcgKzEwNCw3IEBACiBzdGF0aWMgdm9pZCBhZGRGcm9tRnN0YWIoc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiogcGF0aHMsIFBhdGhUeXBlcyBwYXRoX3R5cGUpIHsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8ZnN0YWIsIGRlY2x0eXBlKCZmc19tZ3JfZnJlZV9mc3RhYik+IGZzdGFiKGZzX21ncl9yZWFkX2ZzdGFiX2RlZmF1bHQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzX21ncl9mcmVlX2ZzdGFiKTsKLSAgICBzdHJ1Y3QgZnN0YWJfcmVjICpwcmV2X3JlYyA9IE5VTEw7CisgICAgc3RydWN0IGZzdGFiX3JlYyogcHJldl9yZWMgPSBOVUxMOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmc3RhYi0+bnVtX2VudHJpZXM7IGkrKykgewogICAgICAgICBhdXRvIGZzX3R5cGUgPSBzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKTsKQEAgLTEzMSwxMCArMTM1LDExIEBACiAgICAgICAgIH0gZWxzZSBpZiAocGF0aF90eXBlID09IFBhdGhUeXBlczo6a0Jsa0RldmljZSkgewogICAgICAgICAgICAgc3RkOjpzdHJpbmcgZ2NfcGF0aDsKICAgICAgICAgICAgIGlmIChzdGQ6OnN0cmluZyhmc3RhYi0+cmVjc1tpXS5mc190eXBlKSA9PSAiZjJmcyIgJiYKLSAgICAgICAgICAgICAgICBSZWFscGF0aChhbmRyb2lkOjp2b2xkOjpCbG9ja0RldmljZUZvclBhdGgoCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksICZnY19wYXRoKSkgewotICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIEJhc2VuYW1lKGdjX3BhdGgpKTsKKyAgICAgICAgICAgICAgICBSZWFscGF0aCgKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6QmxvY2tEZXZpY2VGb3JQYXRoKHN0ZDo6c3RyaW5nKGZzdGFiLT5yZWNzW2ldLm1vdW50X3BvaW50KSArICIvIiksCisgICAgICAgICAgICAgICAgICAgICZnY19wYXRoKSkgeworICAgICAgICAgICAgICAgIHBhdGhzLT5wdXNoX2JhY2soc3RkOjpzdHJpbmcoIi9zeXMvZnMvIikgKyBmc3RhYi0+cmVjc1tpXS5mc190eXBlICsgIi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2VuYW1lKGdjX3BhdGgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0xNzcsOCArMTgyLDggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5zZWNzX3QgdGltZSA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpIC0gc3RhcnQ7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIlRyaW1tZWQgIiA8PCByYW5nZS5sZW4gPDwgIiBieXRlcyBvbiAiIDw8IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBpbiAiIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJUcmltbWVkICIgPDwgcmFuZ2UubGVuIDw8ICIgYnl0ZXMgb24gIiA8PCBwYXRoIDw8ICIgaW4gIgorICAgICAgICAgICAgICAgICAgICAgIDw8IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyh0aW1lKSA8PCAibXMiOwogICAgICAgICAgICAgZXh0cmFzLnB1dExvbmcoU3RyaW5nMTYoImJ5dGVzIiksIHJhbmdlLmxlbik7CiAgICAgICAgICAgICBleHRyYXMucHV0TG9uZyhTdHJpbmcxNigidGltZSIpLCB0aW1lKTsKICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewpAQCAtMjIzLDggKzIyOCw4IEBACiAgICAgICAgIH0KIAogICAgICAgICBsay5sb2NrKCk7Ci0gICAgICAgIGFib3J0ZWQgPSBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXXsKLSAgICAgICAgICAgIHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDt9KTsKKyAgICAgICAgYWJvcnRlZCA9CisgICAgICAgICAgICBjdl9hYm9ydC53YWl0X2ZvcihsaywgMTBzLCBbXSB7IHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtBYm9ydDsgfSk7CiAgICAgICAgIGxrLnVubG9jaygpOwogICAgIH0KIApAQCAtMjU3LDEwICsyNjIsMTAgQEAKICAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLXN0YXRpYyB2b2lkIHJ1bkRldkdjKHZvaWQpIHsKK3N0YXRpYyB2b2lkIHJ1bkRldkdjRnN0YWIodm9pZCkgewogICAgIHN0ZDo6dW5pcXVlX3B0cjxmc3RhYiwgZGVjbHR5cGUoJmZzX21ncl9mcmVlX2ZzdGFiKT4gZnN0YWIoZnNfbWdyX3JlYWRfZnN0YWJfZGVmYXVsdCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNfbWdyX2ZyZWVfZnN0YWIpOwotICAgIHN0cnVjdCBmc3RhYl9yZWMgKnJlYyA9IE5VTEw7CisgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gTlVMTDsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnN0YWItPm51bV9lbnRyaWVzOyBpKyspIHsKICAgICAgICAgaWYgKGZzX21ncl9oYXNfc3lzZnNfcGF0aCgmZnN0YWItPnJlY3NbaV0pKSB7CkBAIC0yODQsNyArMjg5LDcgQEAKICAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIlJlYWRpbmcgbWFudWFsX2djIGZhaWxlZCBpbiAiIDw8IHBhdGg7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotCisgICAgICAgIHJlcXVpcmUgPSBhbmRyb2lkOjpiYXNlOjpUcmltKHJlcXVpcmUpOwogICAgICAgICBpZiAocmVxdWlyZSA9PSAiIiB8fCByZXF1aXJlID09ICJvZmYiIHx8IHJlcXVpcmUgPT0gImRpc2FibGVkIikgewogICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiTm8gbW9yZSB0byBkbyBEZXYgR0MiOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0zMDksNiArMzE0LDU3IEBACiAgICAgcmV0dXJuOwogfQogCitjbGFzcyBHY0NhbGxiYWNrIDogcHVibGljIElHYXJiYWdlQ29sbGVjdENhbGxiYWNrIHsKKyAgcHVibGljOgorICAgIFJldHVybjx2b2lkPiBvbkZpbmlzaChSZXN1bHQgcmVzdWx0KSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRmluaXNoZWQgPSB0cnVlOworICAgICAgICBtUmVzdWx0ID0gcmVzdWx0OworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBtQ3Yubm90aWZ5X2FsbCgpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICB2b2lkIHdhaXQodWludDY0X3Qgc2Vjb25kcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUN2LndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKHNlY29uZHMpLCBbdGhpc10geyByZXR1cm4gbUZpbmlzaGVkOyB9KTsKKworICAgICAgICBpZiAoIW1GaW5pc2hlZCkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJEZXYgR0Mgb24gSEFMIHRpbWVvdXQiOworICAgICAgICB9IGVsc2UgaWYgKG1SZXN1bHQgIT0gUmVzdWx0OjpTVUNDRVNTKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkRldiBHQyBvbiBIQUwgZmFpbGVkIHdpdGggIiA8PCB0b1N0cmluZyhtUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiRGV2IEdDIG9uIEhBTCBzdWNjZXNzZnVsIjsKKyAgICAgICAgfQorICAgIH0KKworICBwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DdjsKKyAgICBib29sIG1GaW5pc2hlZHtmYWxzZX07CisgICAgUmVzdWx0IG1SZXN1bHR7UmVzdWx0OjpVTktOT1dOX0VSUk9SfTsKK307CisKK3N0YXRpYyB2b2lkIHJ1bkRldkdjT25IYWwoc3A8SVN0b3JhZ2U+IHNlcnZpY2UpIHsKKyAgICBMT0coREVCVUcpIDw8ICJTdGFydCBEZXYgR0Mgb24gSEFMIjsKKyAgICBzcDxHY0NhbGxiYWNrPiBjYiA9IG5ldyBHY0NhbGxiYWNrKCk7CisgICAgYXV0byByZXQgPSBzZXJ2aWNlLT5nYXJiYWdlQ29sbGVjdChERVZHQ19USU1FT1VUX1NFQywgY2IpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCBzdGFydCBEZXYgR0Mgb24gSEFMOiAiIDw8IHJldC5kZXNjcmlwdGlvbigpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGNiLT53YWl0KERFVkdDX1RJTUVPVVRfU0VDKTsKK30KKworc3RhdGljIHZvaWQgcnVuRGV2R2Modm9pZCkgeworICAgIGF1dG8gc2VydmljZSA9IElTdG9yYWdlOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBydW5EZXZHY09uSGFsKHNlcnZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGZhbGxiYWNrIHRvIGxlZ2FjeSBjb2RlIHBhdGgKKyAgICAgICAgcnVuRGV2R2NGc3RhYigpOworICAgIH0KK30KKwogaW50IFJ1bklkbGVNYWludChjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsoY3ZfbSk7CiAgICAgaWYgKGlkbGVfbWFpbnRfc3RhdCAhPSBJZGxlTWFpbnRTdGF0czo6a1N0b3BwZWQpIHsKQEAgLTM2OSw4ICs0MjUsNyBAQAogICAgICAgICBjdl9hYm9ydC5ub3RpZnlfb25lKCk7CiAgICAgICAgIGxrLmxvY2soKTsKICAgICAgICAgTE9HKERFQlVHKSA8PCAiYWJvcnRpbmcgaWRsZSBtYWludGVuYW5jZSI7Ci0gICAgICAgIGN2X3N0b3Aud2FpdChsaywgW117Ci0gICAgICAgICAgICByZXR1cm4gaWRsZV9tYWludF9zdGF0ID09IElkbGVNYWludFN0YXRzOjprU3RvcHBlZDt9KTsKKyAgICAgICAgY3Zfc3RvcC53YWl0KGxrLCBbXSB7IHJldHVybiBpZGxlX21haW50X3N0YXQgPT0gSWRsZU1haW50U3RhdHM6OmtTdG9wcGVkOyB9KTsKICAgICB9CiAgICAgbGsudW5sb2NrKCk7CiAKZGlmZiAtLWdpdCBhL0tleUJ1ZmZlci5jcHAgYi9LZXlCdWZmZXIuY3BwCmluZGV4IGU3YWVkZTUuLjU2MzNiZjggMTAwNjQ0Ci0tLSBhL0tleUJ1ZmZlci5jcHAKKysrIGIvS2V5QnVmZmVyLmNwcApAQCAtMzQsNCArMzQsMyBAQAogCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvS2V5QnVmZmVyLmggYi9LZXlCdWZmZXIuaAppbmRleCAyMDg3MTg3Li5hNjgzMTFmIDEwMDY0NAotLS0gYS9LZXlCdWZmZXIuaAorKysgYi9LZXlCdWZmZXIuaApAQCAtMzMsMTcgKzMzLDE1IEBACiAjZGVmaW5lIE9QVE5PTkUgX19hdHRyaWJ1dGVfXygob3B0aW1pemUoIk8wIikpKQogI2VuZGlmICAvLyBub3QgX19jbGFuZ19fCiBpbmxpbmUgT1BUTk9ORSB2b2lkKiBtZW1zZXRfcyh2b2lkKiBzLCBpbnQgYywgc2l6ZV90IG4pIHsKLSAgICBpZiAoIXMpCi0gICAgICAgIHJldHVybiBzOworICAgIGlmICghcykgcmV0dXJuIHM7CiAgICAgcmV0dXJuIG1lbXNldChzLCBjLCBuKTsKIH0KICN1bmRlZiBPUFROT05FCiAKIC8vIEFsbG9jYXRvciB0aGF0IGRlbGVnYXRlcyB1c2VmdWwgd29yayB0byBzdGFuZGFyZCBvbmUgYnV0IHplcm9lcyBkYXRhIGJlZm9yZSBkZWFsbG9jYXRpbmcuCiBjbGFzcyBaZXJvaW5nQWxsb2NhdG9yIDogcHVibGljIHN0ZDo6YWxsb2NhdG9yPGNoYXI+IHsKLSAgICBwdWJsaWM6Ci0gICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pCi0gICAgeworICBwdWJsaWM6CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pIHsKICAgICAgICAgbWVtc2V0X3MocCwgMCwgbik7CiAgICAgICAgIHN0ZDo6YWxsb2NhdG9yPGNoYXI+OjpkZWFsbG9jYXRlKHAsIG4pOwogICAgIH0KQEAgLTYwLDQgKzU4LDMgQEAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZgotCmRpZmYgLS1naXQgYS9LZXlTdG9yYWdlLmNwcCBiL0tleVN0b3JhZ2UuY3BwCmluZGV4IDA1MTg5MzAuLmZjNzAwYzUgMTAwNjQ0Ci0tLSBhL0tleVN0b3JhZ2UuY3BwCisrKyBiL0tleVN0b3JhZ2UuY3BwCkBAIC0yMDIsNyArMjAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga206OktleVB1cnBvc2UgcHVycG9zZSwgY29uc3Qga206OkF1dGhvcml6YXRpb25TZXQmIGtleVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga206OkF1dGhvcml6YXRpb25TZXQmIG9wUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrbTo6SGFyZHdhcmVBdXRoVG9rZW4mIGF1dGhUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga206OkF1dGhvcml6YXRpb25TZXQqIG91dFBhcmFtcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbTo6QXV0aG9yaXphdGlvblNldCogb3V0UGFyYW1zLCBib29sIGtlZXBPbGQpIHsKICAgICBhdXRvIGttS2V5UGF0aCA9IGRpciArICIvIiArIGtGbl9rZXltYXN0ZXJfa2V5X2Jsb2I7CiAgICAgc3RkOjpzdHJpbmcga21LZXk7CiAgICAgaWYgKCFyZWFkRmlsZVRvU3RyaW5nKGttS2V5UGF0aCwgJmttS2V5KSkgcmV0dXJuIEtleW1hc3Rlck9wZXJhdGlvbigpOwpAQCAtMjE5LDEyICsyMTksMTQgQEAKICAgICAgICAgaWYgKCFrZXltYXN0ZXIudXBncmFkZUtleShrbUtleSwga2V5UGFyYW1zLCAmbmV3S2V5KSkgcmV0dXJuIEtleW1hc3Rlck9wZXJhdGlvbigpOwogICAgICAgICBhdXRvIG5ld0tleVBhdGggPSBkaXIgKyAiLyIgKyBrRm5fa2V5bWFzdGVyX2tleV9ibG9iX3VwZ3JhZGVkOwogICAgICAgICBpZiAoIXdyaXRlU3RyaW5nVG9GaWxlKG5ld0tleSwgbmV3S2V5UGF0aCkpIHJldHVybiBLZXltYXN0ZXJPcGVyYXRpb24oKTsKLSAgICAgICAgaWYgKHJlbmFtZShuZXdLZXlQYXRoLmNfc3RyKCksIGttS2V5UGF0aC5jX3N0cigpKSAhPSAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG1vdmUgdXBncmFkZWQga2V5IHRvIGxvY2F0aW9uOiAiIDw8IGttS2V5UGF0aDsKLSAgICAgICAgICAgIHJldHVybiBLZXltYXN0ZXJPcGVyYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWtleW1hc3Rlci5kZWxldGVLZXkoa21LZXkpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJLZXkgZGVsZXRpb24gZmFpbGVkIGR1cmluZyB1cGdyYWRlLCBjb250aW51aW5nIGFueXdheTogIiA8PCBkaXI7CisgICAgICAgIGlmICgha2VlcE9sZCkgeworICAgICAgICAgICAgaWYgKHJlbmFtZShuZXdLZXlQYXRoLmNfc3RyKCksIGttS2V5UGF0aC5jX3N0cigpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBtb3ZlIHVwZ3JhZGVkIGtleSB0byBsb2NhdGlvbjogIiA8PCBrbUtleVBhdGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIEtleW1hc3Rlck9wZXJhdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFrZXltYXN0ZXIuZGVsZXRlS2V5KGttS2V5KSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIktleSBkZWxldGlvbiBmYWlsZWQgZHVyaW5nIHVwZ3JhZGUsIGNvbnRpbnVpbmcgYW55d2F5OiAiIDw8IGRpcjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBrbUtleSA9IG5ld0tleTsKICAgICAgICAgTE9HKElORk8pIDw8ICJLZXkgdXBncmFkZWQ6ICIgPDwgZGlyOwpAQCAtMjMzLDEyICsyMzUsMTIgQEAKIAogc3RhdGljIGJvb2wgZW5jcnlwdFdpdGhLZXltYXN0ZXJLZXkoS2V5bWFzdGVyJiBrZXltYXN0ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrbTo6QXV0aG9yaXphdGlvblNldCYga2V5UGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga206OkhhcmR3YXJlQXV0aFRva2VuJiBhdXRoVG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXlCdWZmZXImIG1lc3NhZ2UsIHN0ZDo6c3RyaW5nKiBjaXBoZXJ0ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrbTo6SGFyZHdhcmVBdXRoVG9rZW4mIGF1dGhUb2tlbiwgY29uc3QgS2V5QnVmZmVyJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNpcGhlcnRleHQsIGJvb2wga2VlcE9sZCkgewogICAgIGttOjpBdXRob3JpemF0aW9uU2V0IG9wUGFyYW1zOwogICAgIGttOjpBdXRob3JpemF0aW9uU2V0IG91dFBhcmFtczsKLSAgICBhdXRvIG9wSGFuZGxlID0KLSAgICAgICAgYmVnaW4oa2V5bWFzdGVyLCBkaXIsIGttOjpLZXlQdXJwb3NlOjpFTkNSWVBULCBrZXlQYXJhbXMsIG9wUGFyYW1zLCBhdXRoVG9rZW4sICZvdXRQYXJhbXMpOworICAgIGF1dG8gb3BIYW5kbGUgPSBiZWdpbihrZXltYXN0ZXIsIGRpciwga206OktleVB1cnBvc2U6OkVOQ1JZUFQsIGtleVBhcmFtcywgb3BQYXJhbXMsIGF1dGhUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dFBhcmFtcywga2VlcE9sZCk7CiAgICAgaWYgKCFvcEhhbmRsZSkgcmV0dXJuIGZhbHNlOwogICAgIGF1dG8gbm9uY2VCbG9iID0gb3V0UGFyYW1zLkdldFRhZ1ZhbHVlKGttOjpUQUdfTk9OQ0UpOwogICAgIGlmICghbm9uY2VCbG9iLmlzT2soKSkgewpAQCAtMjYyLDEzICsyNjQsMTQgQEAKIHN0YXRpYyBib29sIGRlY3J5cHRXaXRoS2V5bWFzdGVyS2V5KEtleW1hc3RlciYga2V5bWFzdGVyLCBjb25zdCBzdGQ6OnN0cmluZyYgZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga206OkF1dGhvcml6YXRpb25TZXQmIGtleVBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGttOjpIYXJkd2FyZUF1dGhUb2tlbiYgYXV0aFRva2VuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNpcGhlcnRleHQsIEtleUJ1ZmZlciogbWVzc2FnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNpcGhlcnRleHQsIEtleUJ1ZmZlciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga2VlcE9sZCkgewogICAgIGF1dG8gbm9uY2UgPSBjaXBoZXJ0ZXh0LnN1YnN0cigwLCBHQ01fTk9OQ0VfQllURVMpOwogICAgIGF1dG8gYm9keUFuZE1hYyA9IGNpcGhlcnRleHQuc3Vic3RyKEdDTV9OT05DRV9CWVRFUyk7CiAgICAgYXV0byBvcFBhcmFtcyA9IGttOjpBdXRob3JpemF0aW9uU2V0QnVpbGRlcigpLkF1dGhvcml6YXRpb24oa206OlRBR19OT05DRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbTo6c3VwcG9ydDo6YmxvYjJoaWRsVmVjKG5vbmNlKSk7Ci0gICAgYXV0byBvcEhhbmRsZSA9Ci0gICAgICAgIGJlZ2luKGtleW1hc3RlciwgZGlyLCBrbTo6S2V5UHVycG9zZTo6REVDUllQVCwga2V5UGFyYW1zLCBvcFBhcmFtcywgYXV0aFRva2VuLCBudWxscHRyKTsKKyAgICBhdXRvIG9wSGFuZGxlID0gYmVnaW4oa2V5bWFzdGVyLCBkaXIsIGttOjpLZXlQdXJwb3NlOjpERUNSWVBULCBrZXlQYXJhbXMsIG9wUGFyYW1zLCBhdXRoVG9rZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIGtlZXBPbGQpOwogICAgIGlmICghb3BIYW5kbGUpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIW9wSGFuZGxlLnVwZGF0ZUNvbXBsZXRlbHkoYm9keUFuZE1hYywgbWVzc2FnZSkpIHJldHVybiBmYWxzZTsKICAgICBpZiAoIW9wSGFuZGxlLmZpbmlzaChudWxscHRyKSkgcmV0dXJuIGZhbHNlOwpAQCAtNDc0LDEyICs0NzcsMTQgQEAKICAgICAgICAga206OkF1dGhvcml6YXRpb25TZXQga2V5UGFyYW1zOwogICAgICAgICBrbTo6SGFyZHdhcmVBdXRoVG9rZW4gYXV0aFRva2VuOwogICAgICAgICBzdGQ6OnRpZShrZXlQYXJhbXMsIGF1dGhUb2tlbikgPSBiZWdpblBhcmFtcyhhdXRoLCBhcHBJZCk7Ci0gICAgICAgIGlmICghZW5jcnlwdFdpdGhLZXltYXN0ZXJLZXkoa2V5bWFzdGVyLCBkaXIsIGtleVBhcmFtcywgYXV0aFRva2VuLCBrZXksICZlbmNyeXB0ZWRLZXkpKQorICAgICAgICBpZiAoIWVuY3J5cHRXaXRoS2V5bWFzdGVyS2V5KGtleW1hc3RlciwgZGlyLCBrZXlQYXJhbXMsIGF1dGhUb2tlbiwga2V5LCAmZW5jcnlwdGVkS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWVuY3J5cHRXaXRob3V0S2V5bWFzdGVyKGFwcElkLCBrZXksICZlbmNyeXB0ZWRLZXkpKSByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICghd3JpdGVTdHJpbmdUb0ZpbGUoZW5jcnlwdGVkS2V5LCBkaXIgKyAiLyIgKyBrRm5fZW5jcnlwdGVkX2tleSkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIUZzeW5jRGlyZWN0b3J5KGRpcikpIHJldHVybiBmYWxzZTsKICAgICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtNTAyLDcgKzUwNyw4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgcmV0cmlldmVLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpciwgY29uc3QgS2V5QXV0aGVudGljYXRpb24mIGF1dGgsIEtleUJ1ZmZlcioga2V5KSB7Citib29sIHJldHJpZXZlS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXIsIGNvbnN0IEtleUF1dGhlbnRpY2F0aW9uJiBhdXRoLCBLZXlCdWZmZXIqIGtleSwKKyAgICAgICAgICAgICAgICAgYm9vbCBrZWVwT2xkKSB7CiAgICAgc3RkOjpzdHJpbmcgdmVyc2lvbjsKICAgICBpZiAoIXJlYWRGaWxlVG9TdHJpbmcoZGlyICsgIi8iICsga0ZuX3ZlcnNpb24sICZ2ZXJzaW9uKSkgcmV0dXJuIGZhbHNlOwogICAgIGlmICh2ZXJzaW9uICE9IGtDdXJyZW50VmVyc2lvbikgewpAQCAtNTI3LDcgKzUzMyw4IEBACiAgICAgICAgIGttOjpBdXRob3JpemF0aW9uU2V0IGtleVBhcmFtczsKICAgICAgICAga206OkhhcmR3YXJlQXV0aFRva2VuIGF1dGhUb2tlbjsKICAgICAgICAgc3RkOjp0aWUoa2V5UGFyYW1zLCBhdXRoVG9rZW4pID0gYmVnaW5QYXJhbXMoYXV0aCwgYXBwSWQpOwotICAgICAgICBpZiAoIWRlY3J5cHRXaXRoS2V5bWFzdGVyS2V5KGtleW1hc3RlciwgZGlyLCBrZXlQYXJhbXMsIGF1dGhUb2tlbiwgZW5jcnlwdGVkTWVzc2FnZSwga2V5KSkKKyAgICAgICAgaWYgKCFkZWNyeXB0V2l0aEtleW1hc3RlcktleShrZXltYXN0ZXIsIGRpciwga2V5UGFyYW1zLCBhdXRoVG9rZW4sIGVuY3J5cHRlZE1lc3NhZ2UsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwT2xkKSkKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWRlY3J5cHRXaXRob3V0S2V5bWFzdGVyKGFwcElkLCBlbmNyeXB0ZWRNZXNzYWdlLCBrZXkpKSByZXR1cm4gZmFsc2U7CkBAIC01NjgsNyArNTc1LDEwIEBACiAgICAgICAgIHN1Y2Nlc3MgJj0gZGVsZXRlS2V5KGRpcik7CiAgICAgfQogICAgIGF1dG8gc2VjZGlzY2FyZF9jbWQgPSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz57Ci0gICAgICAgIGtTZWNkaXNjYXJkUGF0aCwgIi0tIiwgZGlyICsgIi8iICsga0ZuX2VuY3J5cHRlZF9rZXksIGRpciArICIvIiArIGtGbl9zZWNkaXNjYXJkYWJsZSwKKyAgICAgICAga1NlY2Rpc2NhcmRQYXRoLAorICAgICAgICAiLS0iLAorICAgICAgICBkaXIgKyAiLyIgKyBrRm5fZW5jcnlwdGVkX2tleSwKKyAgICAgICAgZGlyICsgIi8iICsga0ZuX3NlY2Rpc2NhcmRhYmxlLAogICAgIH07CiAgICAgaWYgKHVzZXNfa20pIHsKICAgICAgICAgc2VjZGlzY2FyZF9jbWQuZW1wbGFjZV9iYWNrKGRpciArICIvIiArIGtGbl9rZXltYXN0ZXJfa2V5X2Jsb2IpOwpkaWZmIC0tZ2l0IGEvS2V5U3RvcmFnZS5oIGIvS2V5U3RvcmFnZS5oCmluZGV4IDc4NmU1YjQuLjI3NmI2YjkgMTAwNjQ0Ci0tLSBhL0tleVN0b3JhZ2UuaAorKysgYi9LZXlTdG9yYWdlLmgKQEAgLTMxLDcgKzMxLDcgQEAKIC8vIElmIG9ubHkgInNlY3JldCIgaXMgbm9uZW1wdHksIGl0IGlzIHVzZWQgdG8gZGVjcnlwdCBpbiBhIG5vbi1LZXltYXN0ZXIgcHJvY2Vzcy4KIGNsYXNzIEtleUF1dGhlbnRpY2F0aW9uIHsKICAgcHVibGljOgotICAgIEtleUF1dGhlbnRpY2F0aW9uKHN0ZDo6c3RyaW5nIHQsIHN0ZDo6c3RyaW5nIHMpIDogdG9rZW57dH0sIHNlY3JldHtzfSB7fTsKKyAgICBLZXlBdXRoZW50aWNhdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdCwgY29uc3Qgc3RkOjpzdHJpbmcmIHMpIDogdG9rZW57dH0sIHNlY3JldHtzfSB7fTsKIAogICAgIGJvb2wgdXNlc0tleW1hc3RlcigpIGNvbnN0IHsgcmV0dXJuICF0b2tlbi5lbXB0eSgpIHx8IHNlY3JldC5lbXB0eSgpOyB9OwogCkBAIC02MSw3ICs2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBLZXlBdXRoZW50aWNhdGlvbiYgYXV0aCwgY29uc3QgS2V5QnVmZmVyJiBrZXkpOwogCiAvLyBSZXRyaWV2ZSB0aGUga2V5IGZyb20gdGhlIG5hbWVkIGRpcmVjdG9yeS4KLWJvb2wgcmV0cmlldmVLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpciwgY29uc3QgS2V5QXV0aGVudGljYXRpb24mIGF1dGgsIEtleUJ1ZmZlcioga2V5KTsKK2Jvb2wgcmV0cmlldmVLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpciwgY29uc3QgS2V5QXV0aGVudGljYXRpb24mIGF1dGgsIEtleUJ1ZmZlcioga2V5LAorICAgICAgICAgICAgICAgICBib29sIGtlZXBPbGQgPSBmYWxzZSk7CiAKIC8vIFNlY3VyZWx5IGRlc3Ryb3kgdGhlIGtleSBzdG9yZWQgaW4gdGhlIG5hbWVkIGRpcmVjdG9yeSBhbmQgZGVsZXRlIHRoZSBkaXJlY3RvcnkuCiBib29sIGRlc3Ryb3lLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcik7CmRpZmYgLS1naXQgYS9LZXlVdGlsLmNwcCBiL0tleVV0aWwuY3BwCmluZGV4IDk4ODU0NDAuLjEyY2FlOWIgMTAwNjQ0Ci0tLSBhL0tleVV0aWwuY3BwCisrKyBiL0tleVV0aWwuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJLZXlVdGlsLmgiCiAKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgogI2luY2x1ZGUgPGlvbWFuaXA+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0zMiwyMiArMzMsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKIAotLy8gZXh0NGVuYzpUT0RPIGdldCB0aGlzIGNvbnN0IGZyb20gc29tZXdoZXJlIGdvb2QKLWNvbnN0IGludCBFWFQ0X0tFWV9ERVNDUklQVE9SX1NJWkUgPSA4OwotCi0vLyBleHQ0ZW5jOlRPRE8gSW5jbHVkZSBzdHJ1Y3R1cmUgZnJvbSBzb21ld2hlcmUgc2Vuc2libGUKLS8vIE1VU1QgYmUgaW4gc3luYyB3aXRoIGV4dDRfY3J5cHRvLmMgaW4ga2VybmVsCi1jb25zdGV4cHIgaW50IEVYVDRfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfWFRTID0gMTsKLWNvbnN0ZXhwciBpbnQgRVhUNF9BRVNfMjU2X1hUU19LRVlfU0laRSA9IDY0OwotY29uc3RleHByIGludCBFWFQ0X01BWF9LRVlfU0laRSA9IDY0Owotc3RydWN0IGV4dDRfZW5jcnlwdGlvbl9rZXkgewotICAgIHVpbnQzMl90IG1vZGU7Ci0gICAgY2hhciByYXdbRVhUNF9NQVhfS0VZX1NJWkVdOwotICAgIHVpbnQzMl90IHNpemU7Ci19OworY29uc3RleHByIGludCBGU19BRVNfMjU2X1hUU19LRVlfU0laRSA9IDY0OwogCiBib29sIHJhbmRvbUtleShLZXlCdWZmZXIqIGtleSkgewotICAgICprZXkgPSBLZXlCdWZmZXIoRVhUNF9BRVNfMjU2X1hUU19LRVlfU0laRSk7CisgICAgKmtleSA9IEtleUJ1ZmZlcihGU19BRVNfMjU2X1hUU19LRVlfU0laRSk7CiAgICAgaWYgKFJlYWRSYW5kb21CeXRlcyhrZXktPnNpemUoKSwga2V5LT5kYXRhKCkpICE9IDApIHsKICAgICAgICAgLy8gVE9ETyBzdGF0dXNfdCBwbGF5cyBiYWRseSB3aXRoIFBMT0csIGZpeCBpdC4KICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmFuZG9tIHJlYWQgZmFpbGVkIjsKQEAgLTU3LDcgKzQ2LDcgQEAKIH0KIAogLy8gR2V0IHJhdyBrZXlyZWYgLSB1c2VkIHRvIG1ha2Uga2V5bmFtZSBhbmQgdG8gcGFzcyB0byBpb2N0bAotc3RhdGljIHN0ZDo6c3RyaW5nIGdlbmVyYXRlS2V5UmVmKGNvbnN0IGNoYXIqIGtleSwgaW50IGxlbmd0aCkgeworc3RhdGljIHN0ZDo6c3RyaW5nIGdlbmVyYXRlS2V5UmVmKGNvbnN0IHVpbnQ4X3QqIGtleSwgaW50IGxlbmd0aCkgewogICAgIFNIQTUxMl9DVFggYzsKIAogICAgIFNIQTUxMl9Jbml0KCZjKTsKQEAgLTcwLDMwICs1OSwyNCBAQAogICAgIHVuc2lnbmVkIGNoYXIga2V5X3JlZjJbU0hBNTEyX0RJR0VTVF9MRU5HVEhdOwogICAgIFNIQTUxMl9GaW5hbChrZXlfcmVmMiwgJmMpOwogCi0gICAgc3RhdGljX2Fzc2VydChFWFQ0X0tFWV9ERVNDUklQVE9SX1NJWkUgPD0gU0hBNTEyX0RJR0VTVF9MRU5HVEgsCi0gICAgICAgICAgICAgICAgICAiSGFzaCB0b28gc2hvcnQgZm9yIGRlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gc3RkOjpzdHJpbmcoKGNoYXIqKWtleV9yZWYyLCBFWFQ0X0tFWV9ERVNDUklQVE9SX1NJWkUpOworICAgIHN0YXRpY19hc3NlcnQoRlNfS0VZX0RFU0NSSVBUT1JfU0laRSA8PSBTSEE1MTJfRElHRVNUX0xFTkdUSCwgIkhhc2ggdG9vIHNob3J0IGZvciBkZXNjcmlwdG9yIik7CisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKChjaGFyKilrZXlfcmVmMiwgRlNfS0VZX0RFU0NSSVBUT1JfU0laRSk7CiB9CiAKLXN0YXRpYyBib29sIGZpbGxLZXkoY29uc3QgS2V5QnVmZmVyJiBrZXksIGV4dDRfZW5jcnlwdGlvbl9rZXkqIGV4dDRfa2V5KSB7Ci0gICAgaWYgKGtleS5zaXplKCkgIT0gRVhUNF9BRVNfMjU2X1hUU19LRVlfU0laRSkgeworc3RhdGljIGJvb2wgZmlsbEtleShjb25zdCBLZXlCdWZmZXImIGtleSwgZnNjcnlwdF9rZXkqIGZzX2tleSkgeworICAgIGlmIChrZXkuc2l6ZSgpICE9IEZTX0FFU18yNTZfWFRTX0tFWV9TSVpFKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIldyb25nIHNpemUga2V5ICIgPDwga2V5LnNpemUoKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBzdGF0aWNfYXNzZXJ0KEVYVDRfQUVTXzI1Nl9YVFNfS0VZX1NJWkUgPD0gc2l6ZW9mKGV4dDRfa2V5LT5yYXcpLCAiS2V5IHRvbyBsb25nISIpOwotICAgIGV4dDRfa2V5LT5tb2RlID0gRVhUNF9FTkNSWVBUSU9OX01PREVfQUVTXzI1Nl9YVFM7Ci0gICAgZXh0NF9rZXktPnNpemUgPSBrZXkuc2l6ZSgpOwotICAgIG1lbXNldChleHQ0X2tleS0+cmF3LCAwLCBzaXplb2YoZXh0NF9rZXktPnJhdykpOwotICAgIG1lbWNweShleHQ0X2tleS0+cmF3LCBrZXkuZGF0YSgpLCBrZXkuc2l6ZSgpKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEZTX0FFU18yNTZfWFRTX0tFWV9TSVpFIDw9IHNpemVvZihmc19rZXktPnJhdyksICJLZXkgdG9vIGxvbmchIik7CisgICAgZnNfa2V5LT5tb2RlID0gRlNfRU5DUllQVElPTl9NT0RFX0FFU18yNTZfWFRTOworICAgIGZzX2tleS0+c2l6ZSA9IGtleS5zaXplKCk7CisgICAgbWVtc2V0KGZzX2tleS0+cmF3LCAwLCBzaXplb2YoZnNfa2V5LT5yYXcpKTsKKyAgICBtZW1jcHkoZnNfa2V5LT5yYXcsIGtleS5kYXRhKCksIGtleS5zaXplKCkpOwogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgY2hhciBjb25zdCogY29uc3QgTkFNRV9QUkVGSVhFU1tdID0gewotICAgICJleHQ0IiwKLSAgICAiZjJmcyIsCi0gICAgImZzY3J5cHQiLAotICAgIG51bGxwdHIKLX07CitzdGF0aWMgY2hhciBjb25zdCogY29uc3QgTkFNRV9QUkVGSVhFU1tdID0geyJleHQ0IiwgImYyZnMiLCAiZnNjcnlwdCIsIG51bGxwdHJ9OwogCiBzdGF0aWMgc3RkOjpzdHJpbmcga2V5bmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyYgcmF3X3JlZikgewogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvOwpAQCAtMTA1LDggKzg4LDggQEAKIH0KIAogLy8gR2V0IHRoZSBrZXlyaW5nIHdlIHN0b3JlIGFsbCBrZXlzIGluCi1zdGF0aWMgYm9vbCBlNGNyeXB0S2V5cmluZyhrZXlfc2VyaWFsX3QqIGRldmljZV9rZXlyaW5nKSB7Ci0gICAgKmRldmljZV9rZXlyaW5nID0ga2V5Y3RsX3NlYXJjaChLRVlfU1BFQ19TRVNTSU9OX0tFWVJJTkcsICJrZXlyaW5nIiwgImU0Y3J5cHQiLCAwKTsKK3N0YXRpYyBib29sIGZzY3J5cHRLZXlyaW5nKGtleV9zZXJpYWxfdCogZGV2aWNlX2tleXJpbmcpIHsKKyAgICAqZGV2aWNlX2tleXJpbmcgPSBrZXljdGxfc2VhcmNoKEtFWV9TUEVDX1NFU1NJT05fS0VZUklORywgImtleXJpbmciLCAiZnNjcnlwdCIsIDApOwogICAgIGlmICgqZGV2aWNlX2tleXJpbmcgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBmaW5kIGRldmljZSBrZXlyaW5nIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTE3LDE4ICsxMDAsMTggQEAKIC8vIEluc3RhbGwgcGFzc3dvcmQgaW50byBnbG9iYWwga2V5cmluZwogLy8gUmV0dXJuIHJhdyBrZXkgcmVmZXJlbmNlIGZvciB1c2UgaW4gcG9saWN5CiBib29sIGluc3RhbGxLZXkoY29uc3QgS2V5QnVmZmVyJiBrZXksIHN0ZDo6c3RyaW5nKiByYXdfcmVmKSB7Ci0gICAgLy8gUGxhY2UgZXh0NF9lbmNyeXB0aW9uX2tleSBpbnRvIGF1dG9tYXRpY2FsbHkgemVyb2luZyBidWZmZXIuCi0gICAgS2V5QnVmZmVyIGV4dDRLZXlCdWZmZXIoc2l6ZW9mKGV4dDRfZW5jcnlwdGlvbl9rZXkpKTsKLSAgICBleHQ0X2VuY3J5cHRpb25fa2V5ICZleHQ0X2tleSA9ICpyZWludGVycHJldF9jYXN0PGV4dDRfZW5jcnlwdGlvbl9rZXkqPihleHQ0S2V5QnVmZmVyLmRhdGEoKSk7CisgICAgLy8gUGxhY2UgZnNjcnlwdF9rZXkgaW50byBhdXRvbWF0aWNhbGx5IHplcm9pbmcgYnVmZmVyLgorICAgIEtleUJ1ZmZlciBmc0tleUJ1ZmZlcihzaXplb2YoZnNjcnlwdF9rZXkpKTsKKyAgICBmc2NyeXB0X2tleSYgZnNfa2V5ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8ZnNjcnlwdF9rZXkqPihmc0tleUJ1ZmZlci5kYXRhKCkpOwogCi0gICAgaWYgKCFmaWxsS2V5KGtleSwgJmV4dDRfa2V5KSkgcmV0dXJuIGZhbHNlOwotICAgICpyYXdfcmVmID0gZ2VuZXJhdGVLZXlSZWYoZXh0NF9rZXkucmF3LCBleHQ0X2tleS5zaXplKTsKKyAgICBpZiAoIWZpbGxLZXkoa2V5LCAmZnNfa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICpyYXdfcmVmID0gZ2VuZXJhdGVLZXlSZWYoZnNfa2V5LnJhdywgZnNfa2V5LnNpemUpOwogICAgIGtleV9zZXJpYWxfdCBkZXZpY2Vfa2V5cmluZzsKLSAgICBpZiAoIWU0Y3J5cHRLZXlyaW5nKCZkZXZpY2Vfa2V5cmluZykpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIWZzY3J5cHRLZXlyaW5nKCZkZXZpY2Vfa2V5cmluZykpIHJldHVybiBmYWxzZTsKICAgICBmb3IgKGNoYXIgY29uc3QqIGNvbnN0KiBuYW1lX3ByZWZpeCA9IE5BTUVfUFJFRklYRVM7ICpuYW1lX3ByZWZpeCAhPSBudWxscHRyOyBuYW1lX3ByZWZpeCsrKSB7CiAgICAgICAgIGF1dG8gcmVmID0ga2V5bmFtZSgqbmFtZV9wcmVmaXgsICpyYXdfcmVmKTsKICAgICAgICAga2V5X3NlcmlhbF90IGtleV9pZCA9Ci0gICAgICAgICAgICBhZGRfa2V5KCJsb2dvbiIsIHJlZi5jX3N0cigpLCAodm9pZCopJmV4dDRfa2V5LCBzaXplb2YoZXh0NF9rZXkpLCBkZXZpY2Vfa2V5cmluZyk7CisgICAgICAgICAgICBhZGRfa2V5KCJsb2dvbiIsIHJlZi5jX3N0cigpLCAodm9pZCopJmZzX2tleSwgc2l6ZW9mKGZzX2tleSksIGRldmljZV9rZXlyaW5nKTsKICAgICAgICAgaWYgKGtleV9pZCA9PSAtMSkgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBpbnNlcnQga2V5IGludG8ga2V5cmluZyAiIDw8IGRldmljZV9rZXlyaW5nOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTQxLDcgKzEyNCw3IEBACiAKIGJvb2wgZXZpY3RLZXkoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd19yZWYpIHsKICAgICBrZXlfc2VyaWFsX3QgZGV2aWNlX2tleXJpbmc7Ci0gICAgaWYgKCFlNGNyeXB0S2V5cmluZygmZGV2aWNlX2tleXJpbmcpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFmc2NyeXB0S2V5cmluZygmZGV2aWNlX2tleXJpbmcpKSByZXR1cm4gZmFsc2U7CiAgICAgYm9vbCBzdWNjZXNzID0gdHJ1ZTsKICAgICBmb3IgKGNoYXIgY29uc3QqIGNvbnN0KiBuYW1lX3ByZWZpeCA9IE5BTUVfUFJFRklYRVM7ICpuYW1lX3ByZWZpeCAhPSBudWxscHRyOyBuYW1lX3ByZWZpeCsrKSB7CiAgICAgICAgIGF1dG8gcmVmID0ga2V5bmFtZSgqbmFtZV9wcmVmaXgsIHJhd19yZWYpOwpAQCAtMTcwLDggKzE1Myw4IEBACiAgICAgICAgIGlmICghcmV0cmlldmVLZXkoa2V5X3BhdGgsIGtleV9hdXRoZW50aWNhdGlvbiwgJmtleSkpIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIWNyZWF0ZV9pZl9hYnNlbnQpIHsKLSAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8ga2V5IGZvdW5kIGluICIgPDwga2V5X3BhdGg7Ci0gICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGtleSBmb3VuZCBpbiAiIDw8IGtleV9wYXRoOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRpbmcgbmV3IGtleSBpbiAiIDw8IGtleV9wYXRoOwogICAgICAgICBpZiAoIXJhbmRvbUtleSgma2V5KSkgcmV0dXJuIGZhbHNlOwpAQCAtMTg1LDIwICsxNjgsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLCBLZXlCdWZmZXIqIGtleSkgeworYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLAorICAgICAgICAgICAgICAgICBLZXlCdWZmZXIqIGtleSwgYm9vbCBrZWVwT2xkKSB7CiAgICAgaWYgKHBhdGhFeGlzdHMoa2V5X3BhdGgpKSB7CiAgICAgICAgIExPRyhERUJVRykgPDwgIktleSBleGlzdHMsIHVzaW5nOiAiIDw8IGtleV9wYXRoOwotICAgICAgICBpZiAoIXJldHJpZXZlS2V5KGtleV9wYXRoLCBrRW1wdHlBdXRoZW50aWNhdGlvbiwga2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXJldHJpZXZlS2V5KGtleV9wYXRoLCBrRW1wdHlBdXRoZW50aWNhdGlvbiwga2V5LCBrZWVwT2xkKSkgcmV0dXJuIGZhbHNlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghY3JlYXRlX2lmX2Fic2VudCkgewotICAgICAgICAgICBMT0coRVJST1IpIDw8ICJObyBrZXkgZm91bmQgaW4gIiA8PCBrZXlfcGF0aDsKLSAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8ga2V5IGZvdW5kIGluICIgPDwga2V5X3BhdGg7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgTE9HKElORk8pIDw8ICJDcmVhdGluZyBuZXcga2V5IGluICIgPDwga2V5X3BhdGg7CiAgICAgICAgIGlmICghcmFuZG9tS2V5KGtleSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKCFzdG9yZUtleUF0b21pY2FsbHkoa2V5X3BhdGgsIHRtcF9wYXRoLAotICAgICAgICAgICAgICAgIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCAqa2V5KSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXN0b3JlS2V5QXRvbWljYWxseShrZXlfcGF0aCwgdG1wX3BhdGgsIGtFbXB0eUF1dGhlbnRpY2F0aW9uLCAqa2V5KSkgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KZGlmZiAtLWdpdCBhL0tleVV0aWwuaCBiL0tleVV0aWwuaAppbmRleCBhODVlY2ExLi43ZWU2NzI1IDEwMDY0NAotLS0gYS9LZXlVdGlsLmgKKysrIGIvS2V5VXRpbC5oCkBAIC0yMCw4ICsyMCw4IEBACiAjaW5jbHVkZSAiS2V5QnVmZmVyLmgiCiAjaW5jbHVkZSAiS2V5U3RvcmFnZS5oIgogCi0jaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKQEAgLTMyLDggKzMyLDggQEAKIGJvb2wgcmV0cmlldmVBbmRJbnN0YWxsS2V5KGJvb2wgY3JlYXRlX2lmX2Fic2VudCwgY29uc3QgS2V5QXV0aGVudGljYXRpb24mIGtleV9hdXRoZW50aWNhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGtleV9yZWYpOwotYm9vbCByZXRyaWV2ZUtleShib29sIGNyZWF0ZV9pZl9hYnNlbnQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfcGF0aCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRtcF9wYXRoLCBLZXlCdWZmZXIqIGtleSk7Citib29sIHJldHJpZXZlS2V5KGJvb2wgY3JlYXRlX2lmX2Fic2VudCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9wYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgdG1wX3BhdGgsCisgICAgICAgICAgICAgICAgIEtleUJ1ZmZlcioga2V5LCBib29sIGtlZXBPbGQgPSB0cnVlKTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9LZXltYXN0ZXIuaCBiL0tleW1hc3Rlci5oCmluZGV4IGZhYmUwZjQuLjQyYTJiNWQgMTAwNjQ0Ci0tLSBhL0tleW1hc3Rlci5oCisrKyBiL0tleW1hc3Rlci5oCkBAIC00Niw4ICs0Niw4IEBACiAgICAgfktleW1hc3Rlck9wZXJhdGlvbigpOwogICAgIC8vIElzIHRoaXMgaW5zdGFuY2UgdmFsaWQ/IFRoaXMgaXMgZmFsc2UgaWYgY3JlYXRpb24gZmFpbHMsIGFuZCBiZWNvbWVzCiAgICAgLy8gZmFsc2Ugb24gZmluaXNoIG9yIGlmIGFuIHVwZGF0ZSBmYWlscy4KLSAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgeyByZXR1cm4gbUVycm9yID09IGttOjpFcnJvckNvZGU6Ok9LOyB9Ci0gICAga206OkVycm9yQ29kZSBlcnJvckNvZGUoKSB7IHJldHVybiBtRXJyb3I7IH0KKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gbUVycm9yID09IGttOjpFcnJvckNvZGU6Ok9LOyB9CisgICAga206OkVycm9yQ29kZSBlcnJvckNvZGUoKSBjb25zdCB7IHJldHVybiBtRXJyb3I7IH0KICAgICAvLyBDYWxsICJ1cGRhdGUiIHJlcGVhdGVkbHkgdW50aWwgYWxsIG9mIHRoZSBpbnB1dCBpcyBjb25zdW1lZCwgYW5kCiAgICAgLy8gY29uY2F0ZW5hdGUgdGhlIG91dHB1dC4gUmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVEksIGNsYXNzIFRPPgpkaWZmIC0tZ2l0IGEvTG9vcC5jcHAgYi9Mb29wLmNwcAppbmRleCAzMzVjYTEzLi40OTI2ZWE4IDEwMDY0NAotLS0gYS9Mb29wLmNwcAorKysgYi9Mb29wLmNwcApAQCAtMTYsMjQgKzE2LDI0IEBACiAKICNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1BBQ0tBR0VfTUFOQUdFUgogCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTc5LDcgKzc5LDcgQEAKIAogICAgIHN0cnVjdCBsb29wX2luZm82NCBsaTsKICAgICBtZW1zZXQoJmxpLCAwLCBzaXplb2YobGkpKTsKLSAgICBzdHJsY3B5KChjaGFyKikgbGkubG9fY3J5cHRfbmFtZSwga1ZvbGRQcmVmaXgsIExPX05BTUVfU0laRSk7CisgICAgc3RybGNweSgoY2hhciopbGkubG9fY3J5cHRfbmFtZSwga1ZvbGRQcmVmaXgsIExPX05BTUVfU0laRSk7CiAgICAgaWYgKGlvY3RsKGRldmljZV9mZC5nZXQoKSwgTE9PUF9TRVRfU1RBVFVTNjQsICZsaSkgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBMT09QX1NFVF9TVEFUVVM2NCI7CiAgICAgICAgIHJldHVybiAtZXJybm87CkBAIC04OCw3ICs4OCw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpkZXN0cm95QnlEZXZpY2UoY29uc3QgY2hhciAqbG9vcERldmljZSkgeworaW50IExvb3A6OmRlc3Ryb3lCeURldmljZShjb25zdCBjaGFyKiBsb29wRGV2aWNlKSB7CiAgICAgaW50IGRldmljZV9mZDsKIAogICAgIGRldmljZV9mZCA9IG9wZW4obG9vcERldmljZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwpAQCAtMTM4LDcgKzEzOCw3IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIGF1dG8gaWQgPSBzdGQ6OnN0cmluZygoY2hhciopIGxpLmxvX2NyeXB0X25hbWUpOworICAgICAgICBhdXRvIGlkID0gc3RkOjpzdHJpbmcoKGNoYXIqKWxpLmxvX2NyeXB0X25hbWUpOwogICAgICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aChpZCwga1ZvbGRQcmVmaXgpKSB7CiAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJUZWFyaW5nIGRvd24gc3RhbGUgbG9vcCBkZXZpY2UgYXQgIiA8PCBwYXRoIDw8ICIgbmFtZWQgIiA8PCBpZDsKIApAQCAtMTQ2LDE0ICsxNDYsMTQgQEAKICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gTE9PUF9DTFJfRkQgIiA8PCBwYXRoOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJGb3VuZCB1bm1hbmFnZWQgbG9vcCBkZXZpY2UgYXQgIiA8PCBwYXRoIDw8ICIgbmFtZWQgIiA8PCBpZDsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkZvdW5kIHVubWFuYWdlZCBsb29wIGRldmljZSBhdCAiIDw8IHBhdGggPDwgIiBuYW1lZCAiIDw8IGlkOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpjcmVhdGVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CitpbnQgTG9vcDo6Y3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgewogICAgIHVuaXF1ZV9mZCBmZChvcGVuKGZpbGUsIE9fQ1JFQVQgfCBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NMT0VYRUMsIDA2MDApKTsKICAgICBpZiAoZmQuZ2V0KCkgPT0gLTEpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgaW1hZ2UgIiA8PCBmaWxlOwpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWludCBMb29wOjpyZXNpemVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CitpbnQgTG9vcDo6cmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycykgewogICAgIGludCBmZDsKIAogICAgIGlmICgoZmQgPSBvcGVuKGZpbGUsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgewpkaWZmIC0tZ2l0IGEvTG9vcC5oIGIvTG9vcC5oCmluZGV4IDEzMGM1YjYuLjRlNWY5YzEgMTAwNjQ0Ci0tLSBhL0xvb3AuaAorKysgYi9Mb29wLmgKQEAgLTE3LDE5ICsxNywyMCBAQAogI2lmbmRlZiBfTE9PUF9ICiAjZGVmaW5lIF9MT09QX0gKIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlIDxsaW51eC9sb29wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCiBjbGFzcyBMb29wIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHN0YXRpYyBjb25zdCBpbnQgTE9PUF9NQVggPSA0MDk2OwotcHVibGljOgorCisgIHB1YmxpYzoKICAgICBzdGF0aWMgaW50IGNyZWF0ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgc3RkOjpzdHJpbmcmIG91dF9kZXZpY2UpOwotICAgIHN0YXRpYyBpbnQgZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIgKmxvb3BEZXZpY2UpOworICAgIHN0YXRpYyBpbnQgZGVzdHJveUJ5RGV2aWNlKGNvbnN0IGNoYXIqIGxvb3BEZXZpY2UpOwogICAgIHN0YXRpYyBpbnQgZGVzdHJveUFsbCgpOwotICAgIHN0YXRpYyBpbnQgY3JlYXRlSW1hZ2VGaWxlKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7Ci0gICAgc3RhdGljIGludCByZXNpemVJbWFnZUZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKKyAgICBzdGF0aWMgaW50IGNyZWF0ZUltYWdlRmlsZShjb25zdCBjaGFyKiBmaWxlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMpOworICAgIHN0YXRpYyBpbnQgcmVzaXplSW1hZ2VGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CiB9OwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL01ldGFkYXRhQ3J5cHQuY3BwIGIvTWV0YWRhdGFDcnlwdC5jcHAKaW5kZXggYzE0YjlhMi4uNWM4YTA3NSAxMDA2NDQKLS0tIGEvTWV0YWRhdGFDcnlwdC5jcHAKKysrIGIvTWV0YWRhdGFDcnlwdC5jcHAKQEAgLTE0LDEzICsxNCwxMyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIktleUJ1ZmZlci5oIgogI2luY2x1ZGUgIk1ldGFkYXRhQ3J5cHQuaCIKKyNpbmNsdWRlICJLZXlCdWZmZXIuaCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dGhyZWFkPgogI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxhbGdvcml0aG0+CiAKICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgpAQCAtMzAsMTggKzMwLDIxIEBACiAKICNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3VuaXF1ZV9mZC5oPgogI2luY2x1ZGUgPGN1dGlscy9mcy5oPgogI2luY2x1ZGUgPGZzX21nci5oPgogCisjaW5jbHVkZSAiQ2hlY2twb2ludC5oIgogI2luY2x1ZGUgIkVuY3J5cHRJbnBsYWNlLmgiCiAjaW5jbHVkZSAiS2V5U3RvcmFnZS5oIgogI2luY2x1ZGUgIktleVV0aWwuaCIKLSNpbmNsdWRlICJzZWNvbnRleHQuaCIKKyNpbmNsdWRlICJLZXltYXN0ZXIuaCIKICNpbmNsdWRlICJVdGlscy5oIgogI2luY2x1ZGUgIlZvbGRVdGlsLmgiCisjaW5jbHVkZSAic2Vjb250ZXh0LmgiCiAKICNkZWZpbmUgRE1fQ1JZUFRfQlVGX1NJWkUgNDA5NgogI2RlZmluZSBUQUJMRV9MT0FEX1JFVFJJRVMgMTAKQEAgLTUxLDYgKzU0LDkgQEAKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtEbU5hbWVVc2VyZGF0YSA9ICJ1c2VyZGF0YSI7CiAKK3N0YXRpYyBjb25zdCBjaGFyKiBrRm5fa2V5bWFzdGVyX2tleV9ibG9iID0gImtleW1hc3Rlcl9rZXlfYmxvYiI7CitzdGF0aWMgY29uc3QgY2hhcioga0ZuX2tleW1hc3Rlcl9rZXlfYmxvYl91cGdyYWRlZCA9ICJrZXltYXN0ZXJfa2V5X2Jsb2JfdXBncmFkZWQiOworCiBzdGF0aWMgYm9vbCBtb3VudF92aWFfZnNfbWdyKGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBjb25zdCBjaGFyKiBibGtfZGV2aWNlKSB7CiAgICAgLy8gZnNfbWdyX2RvX21vdW50IHJ1bnMgZnNjay4gVXNlIHNldGV4ZWNjb24gdG8gcnVuIHRydXN0ZWQKICAgICAvLyBwYXJ0aXRpb25zIGluIHRoZSBmc2NrIGRvbWFpbi4KQEAgLTU5LDcgKzY1LDggQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICBhdXRvIG1vdW50X3JjID0gZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIGNvbnN0X2Nhc3Q8Y2hhcio+KG1vdW50X3BvaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGJsa19kZXZpY2UpLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KGJsa19kZXZpY2UpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6Y3BfbmVlZHNDaGVja3BvaW50KCkpOwogICAgIGlmIChzZXRleGVjY29uKG51bGxwdHIpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY2xlYXIgc2V0ZXhlY2NvbiI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTcyLDEyICs3OSw0MSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKKy8vIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIG9ycGhhbiBhIGtleSBpZiBpdCBpcyByZW1vdmVkIGJlZm9yZSBkZWxldGluZworLy8gVXBkYXRlIHRoaXMgb25jZSBrZXltYXN0ZXIgQVBJcyBjaGFuZ2UsIGFuZCB3ZSBoYXZlIGEgcHJvcGVyIGNvbW1pdC4KK3N0YXRpYyB2b2lkIGNvbW1pdF9rZXkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcikgeworICAgIHdoaWxlICghYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KCJ2b2xkLmNoZWNrcG9pbnRfY29tbWl0dGVkIiwgIjEiKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJXYWl0IGZvciBib290IHRpbWVkIG91dCI7CisgICAgfQorICAgIEtleW1hc3RlciBrZXltYXN0ZXI7CisgICAgYXV0byBrZXlQYXRoID0gZGlyICsgIi8iICsga0ZuX2tleW1hc3Rlcl9rZXlfYmxvYjsKKyAgICBhdXRvIG5ld0tleVBhdGggPSBkaXIgKyAiLyIgKyBrRm5fa2V5bWFzdGVyX2tleV9ibG9iX3VwZ3JhZGVkOworICAgIHN0ZDo6c3RyaW5nIGtleTsKKworICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhrZXlQYXRoLCAma2V5KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBvbGQga2V5OiAiIDw8IGRpcjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAocmVuYW1lKG5ld0tleVBhdGguY19zdHIoKSwga2V5UGF0aC5jX3N0cigpKSAhPSAwKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gbW92ZSB1cGdyYWRlZCBrZXkgdG8gbG9jYXRpb246ICIgPDwga2V5UGF0aDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWtleW1hc3Rlci5kZWxldGVLZXkoa2V5KSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJLZXkgZGVsZXRpb24gZmFpbGVkIGR1cmluZyB1cGdyYWRlLCBjb250aW51aW5nIGFueXdheTogIiA8PCBkaXI7CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiT2xkIEtleSBkZWxldGVkOiAiIDw8IGRpcjsKK30KKwogc3RhdGljIGJvb2wgcmVhZF9rZXkoc3RydWN0IGZzdGFiX3JlYyBjb25zdCogZGF0YV9yZWMsIGJvb2wgY3JlYXRlX2lmX2Fic2VudCwgS2V5QnVmZmVyKiBrZXkpIHsKICAgICBpZiAoIWRhdGFfcmVjLT5rZXlfZGlyKSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBnZXQga2V5X2RpciI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcga2V5X2RpciA9IGRhdGFfcmVjLT5rZXlfZGlyOworICAgIHN0ZDo6c3RyaW5nIHNLZXk7CiAgICAgYXV0byBkaXIgPSBrZXlfZGlyICsgIi9rZXkiOwogICAgIExPRyhERUJVRykgPDwgImtleV9kaXIva2V5OiAiIDw8IGRpcjsKICAgICBpZiAoZnNfbWtkaXJzKGRpci5jX3N0cigpLCAwNzAwKSkgewpAQCAtODUsMTAgKzEyMSwzMCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGF1dG8gdGVtcCA9IGtleV9kaXIgKyAiL3RtcCI7Ci0gICAgaWYgKCFhbmRyb2lkOjp2b2xkOjpyZXRyaWV2ZUtleShjcmVhdGVfaWZfYWJzZW50LCBkaXIsIHRlbXAsIGtleSkpIHJldHVybiBmYWxzZTsKKyAgICBhdXRvIG5ld0tleVBhdGggPSBkaXIgKyAiLyIgKyBrRm5fa2V5bWFzdGVyX2tleV9ibG9iX3VwZ3JhZGVkOworICAgIC8qIElmIHdlIGhhdmUgYSBsZWZ0b3ZlciB1cGdyYWRlZCBrZXksIGRlbGV0ZSBpdC4KKyAgICAgKiBXZSBlaXRoZXIgZmFpbGVkIGFuIHVwZGF0ZSBhbmQgbXVzdCByZXR1cm4gdG8gdGhlIG9sZCBrZXksCisgICAgICogb3Igd2UgcmVib290ZWQgYmVmb3JlIGNvbW1pdGluZyB0aGUga2V5cyBpbiBhIGZyZWFrIGFjY2lkZW50LgorICAgICAqIEVpdGhlciB3YXksIHdlIGNhbiByZS11cGdyYWRlIHRoZSBrZXkgaWYgd2UgbmVlZCB0by4KKyAgICAgKi8KKyAgICBLZXltYXN0ZXIga2V5bWFzdGVyOworICAgIGlmIChwYXRoRXhpc3RzKG5ld0tleVBhdGgpKSB7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZyhuZXdLZXlQYXRoLCAmc0tleSkpCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBvbGQga2V5OiAiIDw8IGRpcjsKKyAgICAgICAgZWxzZSBpZiAoIWtleW1hc3Rlci5kZWxldGVLZXkoc0tleSkpCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJPbGQga2V5IGRlbGV0aW9uIGZhaWxlZCwgY29udGludWluZyBhbnl3YXk6ICIgPDwgZGlyOworICAgICAgICBlbHNlCisgICAgICAgICAgICB1bmxpbmsobmV3S2V5UGF0aC5jX3N0cigpKTsKKyAgICB9CisgICAgYm9vbCBuZWVkc19jcCA9IGNwX25lZWRzQ2hlY2twb2ludCgpOworICAgIGlmICghYW5kcm9pZDo6dm9sZDo6cmV0cmlldmVLZXkoY3JlYXRlX2lmX2Fic2VudCwgZGlyLCB0ZW1wLCBrZXksIG5lZWRzX2NwKSkgcmV0dXJuIGZhbHNlOworICAgIGlmIChuZWVkc19jcCAmJiBwYXRoRXhpc3RzKG5ld0tleVBhdGgpKSBzdGQ6OnRocmVhZChjb21taXRfa2V5LCBkaXIpLmRldGFjaCgpOwogICAgIHJldHVybiB0cnVlOwogfQogCit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwogc3RhdGljIEtleUJ1ZmZlciBkZWZhdWx0X2tleV9wYXJhbXMoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYWxfYmxrZGV2LCBjb25zdCBLZXlCdWZmZXImIGtleSkgewogICAgIEtleUJ1ZmZlciBoZXhfa2V5OwogICAgIGlmIChhbmRyb2lkOjp2b2xkOjpTdHJUb0hleChrZXksIGhleF9rZXkpICE9IGFuZHJvaWQ6Ok9LKSB7CkBAIC05OSwzMyArMTU1LDIyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAotc3RhdGljIGJvb2wgZ2V0X251bWJlcl9vZl9zZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWFsX2Jsa2RldiwgdWludDY0X3QgKm5yX3NlYykgewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBkZXZfZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oCi0gICAgICAgIHJlYWxfYmxrZGV2LmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDLCAwKSkpOwotICAgIGlmIChkZXZfZmQgPT0gLTEpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgcmVhbF9ibGtkZXYgPDwgIiB0byBtZWFzdXJlIHNpemUiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVuc2lnbmVkIGxvbmcgcmVzOwotICAgIC8vIFRPRE86IHNob3VsZCB1c2UgQkxLR0VUU0laRTY0Ci0gICAgZ2V0X2Jsa2Rldl9zaXplKGRldl9mZC5nZXQoKSwgJnJlcyk7Ci0gICAgaWYgKHJlcyA9PSAwKSB7CitzdGF0aWMgYm9vbCBnZXRfbnVtYmVyX29mX3NlY3RvcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHJlYWxfYmxrZGV2LCB1aW50NjRfdCogbnJfc2VjKSB7CisgICAgaWYgKGFuZHJvaWQ6OnZvbGQ6OkdldEJsb2NrRGV2NTEyU2VjdG9ycyhyZWFsX2Jsa2RldiwgbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIG1lYXN1cmUgc2l6ZSBvZiAiIDw8IHJlYWxfYmxrZGV2OwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgICpucl9zZWMgPSByZXM7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXN0YXRpYyBzdHJ1Y3QgZG1faW9jdGwqIGRtX2lvY3RsX2luaXQoY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lKSB7CitzdGF0aWMgc3RydWN0IGRtX2lvY3RsKiBkbV9pb2N0bF9pbml0KGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1ZmZlcl9zaXplLCBjb25zdCBzdGQ6OnN0cmluZyYgZG1fbmFtZSkgewogICAgIGlmIChidWZmZXJfc2l6ZSA8IHNpemVvZihkbV9pb2N0bCkpIHsKICAgICAgICAgTE9HKEVSUk9SKSA8PCAiZG1faW9jdGwgYnVmZmVyIHRvbyBzbWFsbCI7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KIAogICAgIG1lbXNldChidWZmZXIsIDAsIGJ1ZmZlcl9zaXplKTsKLSAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopIGJ1ZmZlcjsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogICAgIGlvLT5kYXRhX3NpemUgPSBidWZmZXJfc2l6ZTsKICAgICBpby0+ZGF0YV9zdGFydCA9IHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpOwogICAgIGlvLT52ZXJzaW9uWzBdID0gNDsKQEAgLTEzOSw4ICsxODQsOCBAQAogc3RhdGljIGJvb2wgY3JlYXRlX2NyeXB0b19ibGtfZGV2KGNvbnN0IHN0ZDo6c3RyaW5nJiBkbV9uYW1lLCB1aW50NjRfdCBucl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldF90eXBlLCBjb25zdCBLZXlCdWZmZXImIGNyeXB0X3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogY3J5cHRvX2Jsa2RldikgewotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBkbV9mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgIi9kZXYvZGV2aWNlLW1hcHBlciIsIE9fUkRXUiB8IE9fQ0xPRVhFQywgMCkpKTsKKyAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZG1fZmQoCisgICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKCIvZGV2L2RldmljZS1tYXBwZXIiLCBPX1JEV1IgfCBPX0NMT0VYRUMsIDApKSk7CiAgICAgaWYgKGRtX2ZkID09IC0xKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJDYW5ub3Qgb3BlbiBkZXZpY2UtbWFwcGVyIjsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTU4LDEzICsyMDMsMTMgQEAKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkNhbm5vdCByZXRyaWV2ZSBkbS1jcnlwdCBkZXZpY2Ugc3RhdHVzICIgPDwgZG1fbmFtZTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAqY3J5cHRvX2Jsa2RldiA9IHN0ZDo6c3RyaW5nKCkgKyAiL2Rldi9ibG9jay9kbS0iICsgc3RkOjp0b19zdHJpbmcoCi0gICAgICAgIChpby0+ZGV2ICYgMHhmZikgfCAoKGlvLT5kZXYgPj4gMTIpICYgMHhmZmYwMCkpOworICAgICpjcnlwdG9fYmxrZGV2ID0gc3RkOjpzdHJpbmcoKSArICIvZGV2L2Jsb2NrL2RtLSIgKworICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoKGlvLT5kZXYgJiAweGZmKSB8ICgoaW8tPmRldiA+PiAxMikgJiAweGZmZjAwKSk7CiAKICAgICBpbyA9IGRtX2lvY3RsX2luaXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZG1fbmFtZSk7CiAgICAgc2l6ZV90IHBhcmFtaXggPSBpby0+ZGF0YV9zdGFydCArIHNpemVvZihzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMpOwogICAgIHNpemVfdCBudWxsaXggPSBwYXJhbWl4ICsgY3J5cHRfcGFyYW1zLnNpemUoKTsKLSAgICBzaXplX3QgZW5kaXggPSAobnVsbGl4ICsgMSArIDcpICYgODsgLy8gQWRkIHJvb20gZm9yIFwwIGFuZCBhbGlnbiB0byA4IGJ5dGUgYm91bmRhcnkKKyAgICBzaXplX3QgZW5kaXggPSAobnVsbGl4ICsgMSArIDcpICYgODsgIC8vIEFkZCByb29tIGZvciBcMCBhbmQgYWxpZ24gdG8gOCBieXRlIGJvdW5kYXJ5CiAKICAgICBpZiAoZW5kaXggPiBzaXplb2YoYnVmZmVyKSkgewogICAgICAgICBMT0coRVJST1IpIDw8ICJjcnlwdF9wYXJhbXMgdG9vIGJpZyBmb3IgRE1fQ1JZUFRfQlVGX1NJWkUiOwpAQCAtMTcyLDIxICsyMTcsMjEgQEAKICAgICB9CiAKICAgICBpby0+dGFyZ2V0X2NvdW50ID0gMTsKLSAgICBhdXRvIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMgKikgKGJ1ZmZlciArIGlvLT5kYXRhX3N0YXJ0KTsKKyAgICBhdXRvIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqKShidWZmZXIgKyBpby0+ZGF0YV9zdGFydCk7CiAgICAgdGd0LT5zdGF0dXMgPSAwOwogICAgIHRndC0+c2VjdG9yX3N0YXJ0ID0gMDsKICAgICB0Z3QtPmxlbmd0aCA9IG5yX3NlYzsKICAgICB0YXJnZXRfdHlwZS5jb3B5KHRndC0+dGFyZ2V0X3R5cGUsIHNpemVvZih0Z3QtPnRhcmdldF90eXBlKSk7CiAgICAgbWVtY3B5KGJ1ZmZlciArIHBhcmFtaXgsIGNyeXB0X3BhcmFtcy5kYXRhKCksCi0gICAgICAgICAgICBzdGQ6Om1pbihjcnlwdF9wYXJhbXMuc2l6ZSgpLCBzaXplb2YoYnVmZmVyKSAtIHBhcmFtaXgpKTsKKyAgICAgICAgICAgc3RkOjptaW4oY3J5cHRfcGFyYW1zLnNpemUoKSwgc2l6ZW9mKGJ1ZmZlcikgLSBwYXJhbWl4KSk7CiAgICAgYnVmZmVyW251bGxpeF0gPSAnXDAnOwogICAgIHRndC0+bmV4dCA9IGVuZGl4OwogCi0gICAgZm9yIChpbnQgaSA9IDA7IDsgaSsrKSB7CisgICAgZm9yIChpbnQgaSA9IDA7OyBpKyspIHsKICAgICAgICAgaWYgKGlvY3RsKGRtX2ZkLmdldCgpLCBETV9UQUJMRV9MT0FELCBpbykgPT0gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGkrMSA+PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKKyAgICAgICAgaWYgKGkgKyAxID49IFRBQkxFX0xPQURfUkVUUklFUykgewogICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkRNX1RBQkxFX0xPQUQgaW9jdGwgZmFpbGVkIjsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMjAzLDExICsyNDgsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBlNGNyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgbmVlZHNfZW5jcnlwdCkgewotICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkOiAiIDw8IG1vdW50X3BvaW50IDw8ICIgIiA8PCBuZWVkc19lbmNyeXB0OworYm9vbCBmc2NyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgbmVlZHNfZW5jcnlwdCkgeworICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkOiAiIDw8IG1vdW50X3BvaW50IDw8ICIgIiA8PCBuZWVkc19lbmNyeXB0OwogICAgIGF1dG8gZW5jcnlwdGVkX3N0YXRlID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoInJvLmNyeXB0by5zdGF0ZSIsICIiKTsKICAgICBpZiAoZW5jcnlwdGVkX3N0YXRlICE9ICIiKSB7Ci0gICAgICAgIExPRyhERUJVRykgPDwgImU0Y3J5cHRfZW5hYmxlX2NyeXB0byBnb3QgdW5leHBlY3RlZCBzdGFydGluZyBzdGF0ZTogIiA8PCBlbmNyeXB0ZWRfc3RhdGU7CisgICAgICAgIExPRyhERUJVRykgPDwgImZzY3J5cHRfZW5hYmxlX2NyeXB0byBnb3QgdW5leHBlY3RlZCBzdGFydGluZyBzdGF0ZTogIiA8PCBlbmNyeXB0ZWRfc3RhdGU7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgYXV0byBkYXRhX3JlYyA9IGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiX2RlZmF1bHQsIG1vdW50X3BvaW50KTsKZGlmZiAtLWdpdCBhL01ldGFkYXRhQ3J5cHQuaCBiL01ldGFkYXRhQ3J5cHQuaAppbmRleCA4NDFkYzk3Li5kODJhNDNiIDEwMDY0NAotLS0gYS9NZXRhZGF0YUNyeXB0LmgKKysrIGIvTWV0YWRhdGFDcnlwdC5oCkBAIC0xOSw2ICsxOSw2IEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKLWJvb2wgZTRjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50X3BvaW50LCBib29sIG5lZWRzX2VuY3J5cHQpOworYm9vbCBmc2NyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRfcG9pbnQsIGJvb2wgbmVlZHNfZW5jcnlwdCk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvTW92ZVN0b3JhZ2UuY3BwIGIvTW92ZVN0b3JhZ2UuY3BwCmluZGV4IDQ2MjQwMjYuLjQ2NTNlMDEgMTAwNjQ0Ci0tLSBhL01vdmVTdG9yYWdlLmNwcAorKysgYi9Nb3ZlU3RvcmFnZS5jcHAKQEAgLTI5LDcgKzI5LDggQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCi0jZGVmaW5lIENPTlNUUkFJTihhbW91bnQsIGxvdywgaGlnaCkgKChhbW91bnQpIDwgKGxvdykgPyAobG93KSA6ICgoYW1vdW50KSA+IChoaWdoKSA/IChoaWdoKSA6IChhbW91bnQpKSkKKyNkZWZpbmUgQ09OU1RSQUlOKGFtb3VudCwgbG93LCBoaWdoKSBcCisgICAgKChhbW91bnQpIDwgKGxvdykgPyAobG93KSA6ICgoYW1vdW50KSA+IChoaWdoKSA/IChoaWdoKSA6IChhbW91bnQpKSkKIAogc3RhdGljIGNvbnN0IGNoYXIqIGtQcm9wQmxvY2tpbmdFeGVjID0gInBlcnNpc3Quc3lzLmJsb2NraW5nX2V4ZWMiOwogCkBAIC00OCw3ICs0OSw3IEBACiBzdGF0aWMgY29uc3QgY2hhcioga1dha2VMb2NrID0gIk1vdmVUYXNrIjsKIAogc3RhdGljIHZvaWQgbm90aWZ5UHJvZ3Jlc3MoaW50IHByb2dyZXNzLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBpZiAobGlzdGVuZXIpIHsKICAgICAgICAgYW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlIGV4dHJhczsKICAgICAgICAgbGlzdGVuZXItPm9uU3RhdHVzKHByb2dyZXNzLCBleHRyYXMpOwpAQCAtNTYsNyArNTcsNyBAQAogfQogCiBzdGF0aWMgc3RhdHVzX3QgcHVzaEJhY2tDb250ZW50cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjbWQsCi0gICAgICAgIGJvb2wgYWRkV2lsZGNhcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkV2lsZGNhcmQpIHsKICAgICBESVIqIGRpciA9IG9wZW5kaXIocGF0aC5jX3N0cigpKTsKICAgICBpZiAoZGlyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtNzksNyArODAsNyBAQAogfQogCiBzdGF0aWMgc3RhdHVzX3QgZXhlY1JtKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBpbnQgc3RhcnRQcm9ncmVzcywgaW50IHN0ZXBQcm9ncmVzcywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBub3RpZnlQcm9ncmVzcyhzdGFydFByb2dyZXNzLCBsaXN0ZW5lcik7CiAKICAgICB1aW50NjRfdCBleHBlY3RlZEJ5dGVzID0gR2V0VHJlZUJ5dGVzKHBhdGgpOwpAQCAtMTE0LDE0ICsxMTUsMTcgQEAKIAogICAgICAgICBzbGVlcCgxKTsKICAgICAgICAgdWludDY0X3QgZGVsdGFGcmVlQnl0ZXMgPSBHZXRGcmVlQnl0ZXMocGF0aCkgLSBzdGFydEZyZWVCeXRlczsKLSAgICAgICAgbm90aWZ5UHJvZ3Jlc3Moc3RhcnRQcm9ncmVzcyArIENPTlNUUkFJTigoaW50KQotICAgICAgICAgICAgICAgICgoZGVsdGFGcmVlQnl0ZXMgKiBzdGVwUHJvZ3Jlc3MpIC8gZXhwZWN0ZWRCeXRlcyksIDAsIHN0ZXBQcm9ncmVzcyksIGxpc3RlbmVyKTsKKyAgICAgICAgbm90aWZ5UHJvZ3Jlc3MoCisgICAgICAgICAgICBzdGFydFByb2dyZXNzICsKKyAgICAgICAgICAgICAgICBDT05TVFJBSU4oKGludCkoKGRlbHRhRnJlZUJ5dGVzICogc3RlcFByb2dyZXNzKSAvIGV4cGVjdGVkQnl0ZXMpLCAwLCBzdGVwUHJvZ3Jlc3MpLAorICAgICAgICAgICAgbGlzdGVuZXIpOwogICAgIH0KICAgICByZXR1cm4gLTE7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBleGVjQ3AoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb21QYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgdG9QYXRoLCBpbnQgc3RhcnRQcm9ncmVzcywKLSAgICAgICAgaW50IHN0ZXBQcm9ncmVzcywgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0ZXBQcm9ncmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBub3RpZnlQcm9ncmVzcyhzdGFydFByb2dyZXNzLCBsaXN0ZW5lcik7CiAKICAgICB1aW50NjRfdCBleHBlY3RlZEJ5dGVzID0gR2V0VHJlZUJ5dGVzKGZyb21QYXRoKTsKQEAgLTEyOSw3ICsxMzMsNyBAQAogCiAgICAgaWYgKGV4cGVjdGVkQnl0ZXMgPiBzdGFydEZyZWVCeXRlcykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJEYXRhIHNpemUgIiA8PCBleHBlY3RlZEJ5dGVzIDw8ICIgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbiBmcmVlIHNwYWNlICIKLSAgICAgICAgICAgICAgICA8PCBzdGFydEZyZWVCeXRlczsKKyAgICAgICAgICAgICAgICAgICA8PCBzdGFydEZyZWVCeXRlczsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApAQCAtMTY1LDggKzE2OSwxMCBAQAogCiAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICB1aW50NjRfdCBkZWx0YUZyZWVCeXRlcyA9IHN0YXJ0RnJlZUJ5dGVzIC0gR2V0RnJlZUJ5dGVzKHRvUGF0aCk7Ci0gICAgICAgIG5vdGlmeVByb2dyZXNzKHN0YXJ0UHJvZ3Jlc3MgKyBDT05TVFJBSU4oKGludCkKLSAgICAgICAgICAgICAgICAoKGRlbHRhRnJlZUJ5dGVzICogc3RlcFByb2dyZXNzKSAvIGV4cGVjdGVkQnl0ZXMpLCAwLCBzdGVwUHJvZ3Jlc3MpLCBsaXN0ZW5lcik7CisgICAgICAgIG5vdGlmeVByb2dyZXNzKAorICAgICAgICAgICAgc3RhcnRQcm9ncmVzcyArCisgICAgICAgICAgICAgICAgQ09OU1RSQUlOKChpbnQpKChkZWx0YUZyZWVCeXRlcyAqIHN0ZXBQcm9ncmVzcykgLyBleHBlY3RlZEJ5dGVzKSwgMCwgc3RlcFByb2dyZXNzKSwKKyAgICAgICAgICAgIGxpc3RlbmVyKTsKICAgICB9CiAgICAgcmV0dXJuIC0xOwogfQpAQCAtMTg2LDggKzE5Miw4IEBACiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBtb3ZlU3RvcmFnZUludGVybmFsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgZnJvbSwKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiB0bywKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIHN0ZDo6c3RyaW5nIGZyb21QYXRoOwogICAgIHN0ZDo6c3RyaW5nIHRvUGF0aDsKIApAQCAtMjM5LDE3ICsyNDUsMTkgQEAKICAgICAvLyB1c2VmdWwgYW55d2F5LgogICAgIGV4ZWNSbSh0b1BhdGgsIDgwLCAxLCBsaXN0ZW5lcik7CiBmYWlsOgorICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICB7CiAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmdldExvY2soKSk7CiAgICAgICAgIGJyaW5nT25saW5lKGZyb20pOwogICAgICAgICBicmluZ09ubGluZSh0byk7CiAgICAgfQorICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogICAgIG5vdGlmeVByb2dyZXNzKGtNb3ZlRmFpbGVkSW50ZXJuYWxFcnJvciwgbGlzdGVuZXIpOwogICAgIHJldHVybiAtMTsKIH0KIAogdm9pZCBNb3ZlU3RvcmFnZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIGZyb20sIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxWb2x1bWVCYXNlPiYgdG8sCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGtXYWtlTG9jayk7CiAKICAgICBhbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGUgZXh0cmFzOwpkaWZmIC0tZ2l0IGEvTW92ZVN0b3JhZ2UuaCBiL01vdmVTdG9yYWdlLmgKaW5kZXggZDI3MTcwNC4uNDZmNzQ1ZiAxMDA2NDQKLS0tIGEvTW92ZVN0b3JhZ2UuaAorKysgYi9Nb3ZlU3RvcmFnZS5oCkBAIC0yNCw3ICsyNCw3IEBACiBuYW1lc3BhY2Ugdm9sZCB7CiAKIHZvaWQgTW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+JiBmcm9tLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Vm9sdW1lQmFzZT4mIHRvLAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9OZXRsaW5rSGFuZGxlci5jcHAgYi9OZXRsaW5rSGFuZGxlci5jcHAKaW5kZXggOTIxMzFlOS4uZDE4MGE5NSAxMDA2NDQKLS0tIGEvTmV0bGlua0hhbmRsZXIuY3BwCisrKyBiL05ldGxpbmtIYW5kbGVyLmNwcApAQCAtMTQsOSArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KQEAgLTI1LDEyICsyNSw5IEBACiAjaW5jbHVkZSAiTmV0bGlua0hhbmRsZXIuaCIKICNpbmNsdWRlICJWb2x1bWVNYW5hZ2VyLmgiCiAKLU5ldGxpbmtIYW5kbGVyOjpOZXRsaW5rSGFuZGxlcihpbnQgbGlzdGVuZXJTb2NrZXQpIDoKLSAgICAgICAgICAgICAgICBOZXRsaW5rTGlzdGVuZXIobGlzdGVuZXJTb2NrZXQpIHsKLX0KK05ldGxpbmtIYW5kbGVyOjpOZXRsaW5rSGFuZGxlcihpbnQgbGlzdGVuZXJTb2NrZXQpIDogTmV0bGlua0xpc3RlbmVyKGxpc3RlbmVyU29ja2V0KSB7fQogCi1OZXRsaW5rSGFuZGxlcjo6fk5ldGxpbmtIYW5kbGVyKCkgewotfQorTmV0bGlua0hhbmRsZXI6On5OZXRsaW5rSGFuZGxlcigpIHt9CiAKIGludCBOZXRsaW5rSGFuZGxlcjo6c3RhcnQoKSB7CiAgICAgcmV0dXJuIHRoaXMtPnN0YXJ0TGlzdGVuZXIoKTsKQEAgLTQwLDkgKzM3LDkgQEAKICAgICByZXR1cm4gdGhpcy0+c3RvcExpc3RlbmVyKCk7CiB9CiAKLXZvaWQgTmV0bGlua0hhbmRsZXI6Om9uRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpIHsKLSAgICBWb2x1bWVNYW5hZ2VyICp2bSA9IFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCk7Ci0gICAgY29uc3QgY2hhciAqc3Vic3lzID0gZXZ0LT5nZXRTdWJzeXN0ZW0oKTsKK3ZvaWQgTmV0bGlua0hhbmRsZXI6Om9uRXZlbnQoTmV0bGlua0V2ZW50KiBldnQpIHsKKyAgICBWb2x1bWVNYW5hZ2VyKiB2bSA9IFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCk7CisgICAgY29uc3QgY2hhciogc3Vic3lzID0gZXZ0LT5nZXRTdWJzeXN0ZW0oKTsKIAogICAgIGlmICghc3Vic3lzKSB7CiAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTm8gc3Vic3lzdGVtIGZvdW5kIGluIG5ldGxpbmsgZXZlbnQiOwpkaWZmIC0tZ2l0IGEvTmV0bGlua0hhbmRsZXIuaCBiL05ldGxpbmtIYW5kbGVyLmgKaW5kZXggNTZlYjIzYy4uOGFmNzU3NSAxMDA2NDQKLS0tIGEvTmV0bGlua0hhbmRsZXIuaAorKysgYi9OZXRsaW5rSGFuZGxlci5oCkBAIC0xOSwxNiArMTksMTUgQEAKIAogI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtMaXN0ZW5lci5oPgogCi1jbGFzcyBOZXRsaW5rSGFuZGxlcjogcHVibGljIE5ldGxpbmtMaXN0ZW5lciB7Ci0KLXB1YmxpYzoKK2NsYXNzIE5ldGxpbmtIYW5kbGVyIDogcHVibGljIE5ldGxpbmtMaXN0ZW5lciB7CisgIHB1YmxpYzoKICAgICBleHBsaWNpdCBOZXRsaW5rSGFuZGxlcihpbnQgbGlzdGVuZXJTb2NrZXQpOwogICAgIHZpcnR1YWwgfk5ldGxpbmtIYW5kbGVyKCk7CiAKICAgICBpbnQgc3RhcnQodm9pZCk7CiAgICAgaW50IHN0b3Aodm9pZCk7CiAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChOZXRsaW5rRXZlbnQgKmV2dCk7CisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgb25FdmVudChOZXRsaW5rRXZlbnQqIGV2dCk7CiB9OwogI2VuZGlmCmRpZmYgLS1naXQgYS9OZXRsaW5rTWFuYWdlci5jcHAgYi9OZXRsaW5rTWFuYWdlci5jcHAKaW5kZXggNDA5Y2RjOC4uYWFjZjRiOSAxMDA2NDQKLS0tIGEvTmV0bGlua01hbmFnZXIuY3BwCisrKyBiL05ldGxpbmtNYW5hZ2VyLmNwcApAQCAtMTQsMTIgKzE0LDEyIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKLSNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy91bi5oPgpAQCAtMjgsMTQgKzI4LDEzIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogCi0jaW5jbHVkZSAiTmV0bGlua01hbmFnZXIuaCIKICNpbmNsdWRlICJOZXRsaW5rSGFuZGxlci5oIgorI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAKLU5ldGxpbmtNYW5hZ2VyICpOZXRsaW5rTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKK05ldGxpbmtNYW5hZ2VyKiBOZXRsaW5rTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKIAotTmV0bGlua01hbmFnZXIgKk5ldGxpbmtNYW5hZ2VyOjpJbnN0YW5jZSgpIHsKLSAgICBpZiAoIXNJbnN0YW5jZSkKLSAgICAgICAgc0luc3RhbmNlID0gbmV3IE5ldGxpbmtNYW5hZ2VyKCk7CitOZXRsaW5rTWFuYWdlciogTmV0bGlua01hbmFnZXI6Okluc3RhbmNlKCkgeworICAgIGlmICghc0luc3RhbmNlKSBzSW5zdGFuY2UgPSBuZXcgTmV0bGlua01hbmFnZXIoKTsKICAgICByZXR1cm4gc0luc3RhbmNlOwogfQogCkBAIC00Myw4ICs0Miw3IEBACiAgICAgbUJyb2FkY2FzdGVyID0gTlVMTDsKIH0KIAotTmV0bGlua01hbmFnZXI6On5OZXRsaW5rTWFuYWdlcigpIHsKLX0KK05ldGxpbmtNYW5hZ2VyOjp+TmV0bGlua01hbmFnZXIoKSB7fQogCiBpbnQgTmV0bGlua01hbmFnZXI6OnN0YXJ0KCkgewogICAgIHN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CkBAIC01Niw4ICs1NCw3IEBACiAgICAgbmxhZGRyLm5sX3BpZCA9IGdldHBpZCgpOwogICAgIG5sYWRkci5ubF9ncm91cHMgPSAweGZmZmZmZmZmOwogCi0gICAgaWYgKChtU29jayA9IHNvY2tldChQRl9ORVRMSU5LLCBTT0NLX0RHUkFNIHwgU09DS19DTE9FWEVDLAotICAgICAgICAgICAgTkVUTElOS19LT0JKRUNUX1VFVkVOVCkpIDwgMCkgeworICAgIGlmICgobVNvY2sgPSBzb2NrZXQoUEZfTkVUTElOSywgU09DS19ER1JBTSB8IFNPQ0tfQ0xPRVhFQywgTkVUTElOS19LT0JKRUNUX1VFVkVOVCkpIDwgMCkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSB1ZXZlbnQgc29ja2V0IjsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTc2LDcgKzczLDcgQEAKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQogCi0gICAgaWYgKGJpbmQobVNvY2ssIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpIDwgMCkgeworICAgIGlmIChiaW5kKG1Tb2NrLCAoc3RydWN0IHNvY2thZGRyKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSkgPCAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gYmluZCB1ZXZlbnQgc29ja2V0IjsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvTmV0bGlua01hbmFnZXIuaCBiL05ldGxpbmtNYW5hZ2VyLmgKaW5kZXggOWM3YmExMS4uZTMxZmMyZSAxMDA2NDQKLS0tIGEvTmV0bGlua01hbmFnZXIuaAorKysgYi9OZXRsaW5rTWFuYWdlci5oCkBAIC0xNywzMiArMTcsMzIgQEAKICNpZm5kZWYgX05FVExJTktNQU5BR0VSX0gKICNkZWZpbmUgX05FVExJTktNQU5BR0VSX0gKIAotI2luY2x1ZGUgPHN5c3V0aWxzL1NvY2tldExpc3RlbmVyLmg+CiAjaW5jbHVkZSA8c3lzdXRpbHMvTmV0bGlua0xpc3RlbmVyLmg+CisjaW5jbHVkZSA8c3lzdXRpbHMvU29ja2V0TGlzdGVuZXIuaD4KIAogY2xhc3MgTmV0bGlua0hhbmRsZXI7CiAKIGNsYXNzIE5ldGxpbmtNYW5hZ2VyIHsKLXByaXZhdGU6Ci0gICAgc3RhdGljIE5ldGxpbmtNYW5hZ2VyICpzSW5zdGFuY2U7CisgIHByaXZhdGU6CisgICAgc3RhdGljIE5ldGxpbmtNYW5hZ2VyKiBzSW5zdGFuY2U7CiAKLXByaXZhdGU6Ci0gICAgU29ja2V0TGlzdGVuZXIgICAgICAgKm1Ccm9hZGNhc3RlcjsKLSAgICBOZXRsaW5rSGFuZGxlciAgICAgICAqbUhhbmRsZXI7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgbVNvY2s7CisgIHByaXZhdGU6CisgICAgU29ja2V0TGlzdGVuZXIqIG1Ccm9hZGNhc3RlcjsKKyAgICBOZXRsaW5rSGFuZGxlciogbUhhbmRsZXI7CisgICAgaW50IG1Tb2NrOwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5OZXRsaW5rTWFuYWdlcigpOwogCiAgICAgaW50IHN0YXJ0KCk7CiAgICAgaW50IHN0b3AoKTsKIAotICAgIHZvaWQgc2V0QnJvYWRjYXN0ZXIoU29ja2V0TGlzdGVuZXIgKnNsKSB7IG1Ccm9hZGNhc3RlciA9IHNsOyB9Ci0gICAgU29ja2V0TGlzdGVuZXIgKmdldEJyb2FkY2FzdGVyKCkgeyByZXR1cm4gbUJyb2FkY2FzdGVyOyB9CisgICAgdm9pZCBzZXRCcm9hZGNhc3RlcihTb2NrZXRMaXN0ZW5lciogc2wpIHsgbUJyb2FkY2FzdGVyID0gc2w7IH0KKyAgICBTb2NrZXRMaXN0ZW5lciogZ2V0QnJvYWRjYXN0ZXIoKSB7IHJldHVybiBtQnJvYWRjYXN0ZXI7IH0KIAotICAgIHN0YXRpYyBOZXRsaW5rTWFuYWdlciAqSW5zdGFuY2UoKTsKKyAgICBzdGF0aWMgTmV0bGlua01hbmFnZXIqIEluc3RhbmNlKCk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgTmV0bGlua01hbmFnZXIoKTsKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL1BSRVVQTE9BRC5jZmcgYi9QUkVVUExPQUQuY2ZnCmluZGV4IGM4ZGJmNzcuLmRjZjkyYmUgMTAwNjQ0Ci0tLSBhL1BSRVVQTE9BRC5jZmcKKysrIGIvUFJFVVBMT0FELmNmZwpAQCAtMywzICszLDYgQEAKIAogW0J1aWx0aW4gSG9va3MgT3B0aW9uc10KIGNsYW5nX2Zvcm1hdCA9IC0tY29tbWl0ICR7UFJFVVBMT0FEX0NPTU1JVH0gLS1zdHlsZSBmaWxlIC0tZXh0ZW5zaW9ucyBjLGgsY2MsY3BwCisKK1tIb29rIFNjcmlwdHNdCithb3NwX2hvb2sgPSAke1JFUE9fUk9PVH0vZnJhbWV3b3Jrcy9iYXNlL3Rvb2xzL2Fvc3AvYW9zcF9zaGEuc2ggJHtQUkVVUExPQURfQ09NTUlUfSAiLiIKZGlmZiAtLWdpdCBhL1Byb2Nlc3MuY3BwIGIvUHJvY2Vzcy5jcHAKaW5kZXggOTAzOGFmMi4uYTUwMjhmMiAxMDA2NDQKLS0tIGEvUHJvY2Vzcy5jcHAKKysrIGIvUHJvY2Vzcy5jcHAKQEAgLTE0LDI4ICsxNCwyOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZnRzLmg+Ci0jaW5jbHVkZSA8ZGlyZW50Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxwb2xsLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdzLmg+CiAKICNpbmNsdWRlICJQcm9jZXNzLmgiCiAKZGlmZiAtLWdpdCBhL1NjcnlwdFBhcmFtZXRlcnMuY3BwIGIvU2NyeXB0UGFyYW1ldGVycy5jcHAKaW5kZXggYzBlMjAzMC4uZjVhOTY0ZiAxMDA2NDQKLS0tIGEvU2NyeXB0UGFyYW1ldGVycy5jcHAKKysrIGIvU2NyeXB0UGFyYW1ldGVycy5jcHAKQEAgLTE5LDIwICsxOSwxOSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCi1ib29sIHBhcnNlX3NjcnlwdF9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIqIHBhcmFtc3RyLCBpbnQgKk5mLCBpbnQgKnJmLCBpbnQgKnBmKSB7Citib29sIHBhcnNlX3NjcnlwdF9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIqIHBhcmFtc3RyLCBpbnQqIE5mLCBpbnQqIHJmLCBpbnQqIHBmKSB7CiAgICAgaW50IHBhcmFtc1szXSA9IHt9OwotICAgIGNoYXIgKnRva2VuOwotICAgIGNoYXIgKnNhdmVwdHI7CisgICAgY2hhciogdG9rZW47CisgICAgY2hhciogc2F2ZXB0cjsKICAgICBpbnQgaTsKIAogICAgIC8qCiAgICAgICogVGhlIHRva2VuIHdlJ3JlIGxvb2tpbmcgZm9yIHNob3VsZCBiZSB0aHJlZSBpbnRlZ2VycyBzZXBhcmF0ZWQgYnkKICAgICAgKiBjb2xvbnMgKGUuZy4sICIxMjo4OjEiKS4gU2NhbiB0aGUgcHJvcGVydHkgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMuCiAgICAgICovCi0gICAgZm9yIChpID0gMCwgdG9rZW4gPSBzdHJ0b2tfcihjb25zdF9jYXN0PGNoYXIgKj4ocGFyYW1zdHIpLCAiOiIsICZzYXZlcHRyKTsKLSAgICAgICAgICAgIHRva2VuICE9IG51bGxwdHIgJiYgaSA8IDM7Ci0gICAgICAgICAgICBpKyssIHRva2VuID0gc3RydG9rX3IobnVsbHB0ciwgIjoiLCAmc2F2ZXB0cikpIHsKLSAgICAgICAgY2hhciAqZW5kcHRyOworICAgIGZvciAoaSA9IDAsIHRva2VuID0gc3RydG9rX3IoY29uc3RfY2FzdDxjaGFyKj4ocGFyYW1zdHIpLCAiOiIsICZzYXZlcHRyKTsKKyAgICAgICAgIHRva2VuICE9IG51bGxwdHIgJiYgaSA8IDM7IGkrKywgdG9rZW4gPSBzdHJ0b2tfcihudWxscHRyLCAiOiIsICZzYXZlcHRyKSkgeworICAgICAgICBjaGFyKiBlbmRwdHI7CiAgICAgICAgIHBhcmFtc1tpXSA9IHN0cnRvbCh0b2tlbiwgJmVuZHB0ciwgMTApOwogCiAgICAgICAgIC8qCkBAIC00NSw2ICs0NCw4IEBACiAgICAgaWYgKHRva2VuICE9IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICAqTmYgPSBwYXJhbXNbMF07ICpyZiA9IHBhcmFtc1sxXTsgKnBmID0gcGFyYW1zWzJdOworICAgICpOZiA9IHBhcmFtc1swXTsKKyAgICAqcmYgPSBwYXJhbXNbMV07CisgICAgKnBmID0gcGFyYW1zWzJdOwogICAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvU2NyeXB0UGFyYW1ldGVycy5oIGIvU2NyeXB0UGFyYW1ldGVycy5oCmluZGV4IDE5MDg0MmIuLmVkYjgwY2MgMTAwNjQ0Ci0tLSBhL1NjcnlwdFBhcmFtZXRlcnMuaAorKysgYi9TY3J5cHRQYXJhbWV0ZXJzLmgKQEAgLTIzLDYgKzIzLDYgQEAKICNkZWZpbmUgU0NSWVBUX1BST1AgInJvLmNyeXB0by5zY3J5cHRfcGFyYW1zIgogI2RlZmluZSBTQ1JZUFRfREVGQVVMVFMgIjE1OjM6MSIKIAotYm9vbCBwYXJzZV9zY3J5cHRfcGFyYW1ldGVycyhjb25zdCBjaGFyKiBwYXJhbXN0ciwgaW50ICpOZiwgaW50ICpyZiwgaW50ICpwZik7Citib29sIHBhcnNlX3NjcnlwdF9wYXJhbWV0ZXJzKGNvbnN0IGNoYXIqIHBhcmFtc3RyLCBpbnQqIE5mLCBpbnQqIHJmLCBpbnQqIHBmKTsKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9VdGlscy5jcHAgYi9VdGlscy5jcHAKaW5kZXggOThlOGE5Yi4uNWUxMjE5NCAxMDA2NDQKLS0tIGEvVXRpbHMuY3BwCisrKyBiL1V0aWxzLmNwcApAQCAtMTksMzEgKzE5LDM5IEBACiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgogI2luY2x1ZGUgInNlaGFuZGxlLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvY2hyb25vX3V0aWxzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2ZzLmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKLSNpbmNsdWRlIDxtdXRleD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0dmZzLmg+CisjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KIAogI2lmbmRlZiBVTU9VTlRfTk9GT0xMT1cKLSNkZWZpbmUgVU1PVU5UX05PRk9MTE9XICAgIDB4MDAwMDAwMDggIC8qIERvbid0IGZvbGxvdyBzeW1saW5rIG9uIHVtb3VudCAqLworI2RlZmluZSBVTU9VTlRfTk9GT0xMT1cgMHgwMDAwMDAwOCAvKiBEb24ndCBmb2xsb3cgc3ltbGluayBvbiB1bW91bnQgKi8KICNlbmRpZgogCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiB1c2luZyBhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwogCkBAIC04MSw4ICs4OSw4IEBACiAgICAgbW9kZV90IG1vZGUgPSAwNjYwIHwgU19JRkJMSzsKICAgICBpZiAobWtub2QoY3BhdGgsIG1vZGUsIGRldikgPCAwKSB7CiAgICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGRldmljZSBub2RlIGZvciAiIDw8IG1ham9yKGRldikKLSAgICAgICAgICAgICAgICAgICAgPDwgIjoiIDw8IG1pbm9yKGRldikgPDwgIiBhdCAiIDw8IHBhdGg7CisgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBkZXZpY2Ugbm9kZSBmb3IgIiA8PCBtYWpvcihkZXYpIDw8ICI6IiA8PCBtaW5vcihkZXYpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGF0ICIgPDwgcGF0aDsKICAgICAgICAgICAgIHJlcyA9IC1lcnJubzsKICAgICAgICAgfQogICAgIH0KQEAgLTIwOSw4ICsyMTcsOCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgcmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCwgYm9vbCB1bnRydXN0ZWQpIHsKK3N0YXRpYyBzdGF0dXNfdCByZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsLCBib29sIHVudHJ1c3RlZCkgewogICAgIGZzVHlwZS0+Y2xlYXIoKTsKICAgICBmc1V1aWQtPmNsZWFyKCk7CiAgICAgZnNMYWJlbC0+Y2xlYXIoKTsKQEAgLTIyOCw3ICsyMzYsNyBAQAogICAgIGNtZC5wdXNoX2JhY2socGF0aCk7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0cHV0OwotICAgIHN0YXR1c190IHJlcyA9IEZvcmtFeGVjdnAoY21kLCBvdXRwdXQsIHVudHJ1c3RlZCA/IHNCbGtpZFVudHJ1c3RlZENvbnRleHQgOiBzQmxraWRDb250ZXh0KTsKKyAgICBzdGF0dXNfdCByZXMgPSBGb3JrRXhlY3ZwKGNtZCwgJm91dHB1dCwgdW50cnVzdGVkID8gc0Jsa2lkVW50cnVzdGVkQ29udGV4dCA6IHNCbGtpZENvbnRleHQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJibGtpZCBmYWlsZWQgdG8gaWRlbnRpZnkgIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjQ0LDExMiArMjUyLDEwMiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLAotICAgICAgICBzdGQ6OnN0cmluZyogZnNVdWlkLCBzdGQ6OnN0cmluZyogZnNMYWJlbCkgeworc3RhdHVzX3QgUmVhZE1ldGFkYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CiAgICAgcmV0dXJuIHJlYWRNZXRhZGF0YShwYXRoLCBmc1R5cGUsIGZzVXVpZCwgZnNMYWJlbCwgZmFsc2UpOwogfQogCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKSB7CitzdGF0dXNfdCBSZWFkTWV0YWRhdGFVbnRydXN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsIHN0ZDo6c3RyaW5nKiBmc1V1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZzTGFiZWwpIHsKICAgICByZXR1cm4gcmVhZE1ldGFkYXRhKHBhdGgsIGZzVHlwZSwgZnNVdWlkLCBmc0xhYmVsLCB0cnVlKTsKIH0KIAotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpIHsKLSAgICByZXR1cm4gRm9ya0V4ZWN2cChhcmdzLCBudWxscHRyKTsKLX0KLQotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KSB7Ci0gICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soa1NlY3VyaXR5TG9jayk7Ci0gICAgc2l6ZV90IGFyZ2MgPSBhcmdzLnNpemUoKTsKLSAgICBjaGFyKiogYXJndiA9IChjaGFyKiopIGNhbGxvYyhhcmdjLCBzaXplb2YoY2hhciopKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewotICAgICAgICBhcmd2W2ldID0gKGNoYXIqKSBhcmdzW2ldLmNfc3RyKCk7Ci0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCBhcmdzW2ldOworc3RhdGljIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBDb252ZXJ0VG9Bcmd2KGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncykgeworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBhcmd2OworICAgIGFyZ3YucmVzZXJ2ZShhcmdzLnNpemUoKSArIDEpOworICAgIGZvciAoY29uc3QgYXV0byYgYXJnIDogYXJncykgeworICAgICAgICBpZiAoYXJndi5lbXB0eSgpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8IGFyZzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIiAgICAiIDw8IGFyZzsKICAgICAgICAgfQorICAgICAgICBhcmd2LmVtcGxhY2VfYmFjayhhcmcuZGF0YSgpKTsKICAgICB9Ci0KLSAgICBpZiAoY29udGV4dCkgewotICAgICAgICBpZiAoc2V0ZXhlY2Nvbihjb250ZXh0KSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24iOwotICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBhbmRyb2lkX2ZvcmtfZXhlY3ZwKGFyZ2MsIGFyZ3YsIE5VTEwsIGZhbHNlLCB0cnVlKTsKLSAgICBpZiAoY29udGV4dCkgewotICAgICAgICBpZiAoc2V0ZXhlY2NvbihudWxscHRyKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24iOwotICAgICAgICAgICAgYWJvcnQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZyZWUoYXJndik7Ci0gICAgcmV0dXJuIHJlczsKKyAgICBhcmd2LmVtcGxhY2VfYmFjayhudWxscHRyKTsKKyAgICByZXR1cm4gYXJndjsKIH0KIAotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0KSB7Ci0gICAgcmV0dXJuIEZvcmtFeGVjdnAoYXJncywgb3V0cHV0LCBudWxscHRyKTsKLX0KLQotc3RhdHVzX3QgRm9ya0V4ZWN2cChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgb3V0cHV0LCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCkgewotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGtTZWN1cml0eUxvY2spOwotICAgIHN0ZDo6c3RyaW5nIGNtZDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY21kICs9IGFyZ3NbaV0gKyAiICI7Ci0gICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCBhcmdzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICIgICAgIiA8PCBhcmdzW2ldOwotICAgICAgICB9Ci0gICAgfQotICAgIG91dHB1dC5jbGVhcigpOwotCi0gICAgaWYgKGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNldGV4ZWNjb24oY29udGV4dCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXRleGVjY29uIjsKLSAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgRklMRSogZnAgPSBwb3BlbihjbWQuY19zdHIoKSwgInIiKTsgLy8gTk9MSU5UCi0gICAgaWYgKGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNldGV4ZWNjb24obnVsbHB0cikpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXRleGVjY29uIjsKLSAgICAgICAgICAgIGFib3J0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KK3N0YXRpYyBzdGF0dXNfdCBSZWFkTGluZXNGcm9tRmRBbmRMb2coc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCB1ZmQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgaW50ICgqKShGSUxFKik+IGZwKGFuZHJvaWQ6OmJhc2U6OkZkb3BlbihzdGQ6Om1vdmUodWZkKSwgInIiKSwgZmNsb3NlKTsKICAgICBpZiAoIWZwKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcG9wZW4gIiA8PCBjbWQ7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJmZG9wZW4gaW4gUmVhZExpbmVzRnJvbUZkQW5kTG9nIjsKICAgICAgICAgcmV0dXJuIC1lcnJubzsKICAgICB9CisgICAgaWYgKG91dHB1dCkgb3V0cHV0LT5jbGVhcigpOwogICAgIGNoYXIgbGluZVsxMDI0XTsKLSAgICB3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkgIT0gbnVsbHB0cikgewotICAgICAgICBMT0coVkVSQk9TRSkgPDwgbGluZTsKLSAgICAgICAgb3V0cHV0LnB1c2hfYmFjayhzdGQ6OnN0cmluZyhsaW5lKSk7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZnAuZ2V0KCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCBsaW5lOworICAgICAgICBpZiAob3V0cHV0KSBvdXRwdXQtPmVtcGxhY2VfYmFjayhsaW5lKTsKICAgICB9Ci0gICAgaWYgKHBjbG9zZShmcCkgIT0gMCkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHBjbG9zZSAiIDw8IGNtZDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQpIHsKKyAgICBhdXRvIGFyZ3YgPSBDb252ZXJ0VG9Bcmd2KGFyZ3MpOworCisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIHBpcGVfcmVhZCwgcGlwZV93cml0ZTsKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBpcGUoJnBpcGVfcmVhZCwgJnBpcGVfd3JpdGUpKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJQaXBlIGluIEZvcmtFeGVjdnAiOwogICAgICAgICByZXR1cm4gLWVycm5vOwogICAgIH0KIAorICAgIHBpZF90IHBpZCA9IGZvcmsoKTsKKyAgICBpZiAocGlkID09IDApIHsKKyAgICAgICAgaWYgKGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChzZXRleGVjY29uKGNvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldGV4ZWNjb24gaW4gRm9ya0V4ZWN2cCI7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwaXBlX3JlYWQucmVzZXQoKTsKKyAgICAgICAgaWYgKGR1cDIocGlwZV93cml0ZS5nZXQoKSwgU1RET1VUX0ZJTEVOTykgPT0gLTEpIHsKKyAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJkdXAyIGluIEZvcmtFeGVjdnAiOworICAgICAgICAgICAgX2V4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgfQorICAgICAgICBwaXBlX3dyaXRlLnJlc2V0KCk7CisgICAgICAgIGV4ZWN2cChhcmd2WzBdLCBjb25zdF9jYXN0PGNoYXIqKj4oYXJndi5kYXRhKCkpKTsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImV4ZWMgaW4gRm9ya0V4ZWN2cCI7CisgICAgICAgIF9leGl0KEVYSVRfRkFJTFVSRSk7CisgICAgfQorICAgIGlmIChwaWQgPT0gLTEpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImZvcmsgaW4gRm9ya0V4ZWN2cCI7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcGlwZV93cml0ZS5yZXNldCgpOworICAgIGF1dG8gc3QgPSBSZWFkTGluZXNGcm9tRmRBbmRMb2cob3V0cHV0LCBzdGQ6Om1vdmUocGlwZV9yZWFkKSk7CisgICAgaWYgKHN0ICE9IDApIHJldHVybiBzdDsKKworICAgIGludCBzdGF0dXM7CisgICAgaWYgKHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSA9PSAtMSkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAid2FpdHBpZCBpbiBGb3JrRXhlY3ZwIjsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisgICAgaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJQcm9jZXNzIGRpZCBub3QgZXhpdCBub3JtYWxseSwgc3RhdHVzOiAiIDw8IHN0YXR1czsKKyAgICAgICAgcmV0dXJuIC1FQ0hJTEQ7CisgICAgfQorICAgIGlmIChXRVhJVFNUQVRVUyhzdGF0dXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIlByb2Nlc3MgZXhpdGVkIHdpdGggY29kZTogIiA8PCBXRVhJVFNUQVRVUyhzdGF0dXMpOworICAgICAgICByZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCiBwaWRfdCBGb3JrRXhlY3ZwQXN5bmMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKSB7Ci0gICAgc2l6ZV90IGFyZ2MgPSBhcmdzLnNpemUoKTsKLSAgICBjaGFyKiogYXJndiA9IChjaGFyKiopIGNhbGxvYyhhcmdjICsgMSwgc2l6ZW9mKGNoYXIqKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKLSAgICAgICAgYXJndltpXSA9IChjaGFyKikgYXJnc1tpXS5jX3N0cigpOwotICAgICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgYXJnc1tpXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiICAgICIgPDwgYXJnc1tpXTsKLSAgICAgICAgfQotICAgIH0KKyAgICBhdXRvIGFyZ3YgPSBDb252ZXJ0VG9Bcmd2KGFyZ3MpOwogCiAgICAgcGlkX3QgcGlkID0gZm9yaygpOwogICAgIGlmIChwaWQgPT0gMCkgewpAQCAtMzU3LDE4ICszNTUsMTQgQEAKICAgICAgICAgY2xvc2UoU1RET1VUX0ZJTEVOTyk7CiAgICAgICAgIGNsb3NlKFNUREVSUl9GSUxFTk8pOwogCi0gICAgICAgIGlmIChleGVjdnAoYXJndlswXSwgYXJndikpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZXhlYyI7Ci0gICAgICAgIH0KLQotICAgICAgICBfZXhpdCgxKTsKKyAgICAgICAgZXhlY3ZwKGFyZ3ZbMF0sIGNvbnN0X2Nhc3Q8Y2hhcioqPihhcmd2LmRhdGEoKSkpOworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiZXhlYyBpbiBGb3JrRXhlY3ZwQXN5bmMiOworICAgICAgICBfZXhpdChFWElUX0ZBSUxVUkUpOwogICAgIH0KLQogICAgIGlmIChwaWQgPT0gLTEpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBleGVjIjsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgImZvcmsgaW4gRm9ya0V4ZWN2cEFzeW5jIjsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLQotICAgIGZyZWUoYXJndik7CiAgICAgcmV0dXJuIHBpZDsKIH0KIApAQCAtNDAwLDEwICszOTQsMTAgQEAKIHN0YXR1c190IEdlbmVyYXRlUmFuZG9tVXVpZChzdGQ6OnN0cmluZyYgb3V0KSB7CiAgICAgc3RhdHVzX3QgcmVzID0gUmVhZFJhbmRvbUJ5dGVzKDE2LCBvdXQpOwogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgb3V0WzZdICY9IDB4MGY7ICAvKiBjbGVhciB2ZXJzaW9uICAgICAgICAqLwotICAgICAgICBvdXRbNl0gfD0gMHg0MDsgIC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCi0gICAgICAgIG91dFs4XSAmPSAweDNmOyAgLyogY2xlYXIgdmFyaWFudCAgICAgICAgKi8KLSAgICAgICAgb3V0WzhdIHw9IDB4ODA7ICAvKiBzZXQgdG8gSUVURiB2YXJpYW50ICAqLworICAgICAgICBvdXRbNl0gJj0gMHgwZjsgLyogY2xlYXIgdmVyc2lvbiAgICAgICAgKi8KKyAgICAgICAgb3V0WzZdIHw9IDB4NDA7IC8qIHNldCB0byB2ZXJzaW9uIDQgICAgICovCisgICAgICAgIG91dFs4XSAmPSAweDNmOyAvKiBjbGVhciB2YXJpYW50ICAgICAgICAqLworICAgICAgICBvdXRbOF0gfD0gMHg4MDsgLyogc2V0IHRvIElFVEYgdmFyaWFudCAgKi8KICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQxNSwyNCArNDA5LDI2IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaW50IHZhbCA9IDA7CiAgICAgICAgIHN3aXRjaCAoaGV4W2ldKSB7Ci0gICAgICAgIGNhc2UgJyAnOiBjYXNlICctJzogY2FzZSAnOic6IGNvbnRpbnVlOwotICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKLSAgICAgICAgY2FzZSAnZSc6IGNhc2UgJ0UnOiB2YWwgPSAxNDsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2QnOiBjYXNlICdEJzogdmFsID0gMTM7IGJyZWFrOwotICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKLSAgICAgICAgY2FzZSAnYic6IGNhc2UgJ0InOiB2YWwgPSAxMTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2EnOiBjYXNlICdBJzogdmFsID0gMTA7IGJyZWFrOwotICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzgnOiB2YWwgPSA4OyBicmVhazsKLSAgICAgICAgY2FzZSAnNyc6IHZhbCA9IDc7IGJyZWFrOwotICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzUnOiB2YWwgPSA1OyBicmVhazsKLSAgICAgICAgY2FzZSAnNCc6IHZhbCA9IDQ7IGJyZWFrOwotICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJzInOiB2YWwgPSAyOyBicmVhazsKLSAgICAgICAgY2FzZSAnMSc6IHZhbCA9IDE7IGJyZWFrOwotICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHJldHVybiAtRUlOVkFMOworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgY2FzZSAnICc6IGNhc2UgJy0nOiBjYXNlICc6JzogY29udGludWU7CisgICAgICAgICAgICBjYXNlICdmJzogY2FzZSAnRic6IHZhbCA9IDE1OyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiBjYXNlICdFJzogdmFsID0gMTQ7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnZCc6IGNhc2UgJ0QnOiB2YWwgPSAxMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzogY2FzZSAnQyc6IHZhbCA9IDEyOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2InOiBjYXNlICdCJzogdmFsID0gMTE7IGJyZWFrOworICAgICAgICAgICAgY2FzZSAnYSc6IGNhc2UgJ0EnOiB2YWwgPSAxMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc5JzogdmFsID0gOTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc4JzogdmFsID0gODsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc3JzogdmFsID0gNzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc2JzogdmFsID0gNjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc1JzogdmFsID0gNTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICc0JzogdmFsID0gNDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICczJzogdmFsID0gMzsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcyJzogdmFsID0gMjsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcxJzogdmFsID0gMTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlICcwJzogdmFsID0gMDsgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgfQogCiAgICAgICAgIGlmIChldmVuKSB7CkBAIC00NzUsMTAgKzQ3MSw0NiBAQAogICAgIHJldHVybiBTdHJUb0hleCh0bXAsIG91dCk7CiB9CiAKK3N0YXR1c190IEdldEJsb2NrRGV2U2l6ZShpbnQgZmQsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsIHNpemUpKSB7CisgICAgICAgIHJldHVybiAtZXJybm87CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKSB7CisgICAgaW50IGZkID0gb3BlbihwYXRoLmNfc3RyKCksIE9fUkRPTkxZIHwgT19DTE9FWEVDKTsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICB9CisKKyAgICByZXMgPSBHZXRCbG9ja0RldlNpemUoZmQsIHNpemUpOworCisgICAgY2xvc2UoZmQpOworCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKSB7CisgICAgdWludDY0X3Qgc2l6ZTsKKyAgICBzdGF0dXNfdCByZXMgPSBHZXRCbG9ja0RldlNpemUocGF0aCwgJnNpemUpOworCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgICpucl9zZWMgPSBzaXplIC8gNTEyOworCisgICAgcmV0dXJuIE9LOworfQorCiB1aW50NjRfdCBHZXRGcmVlQnl0ZXMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICBzdHJ1Y3Qgc3RhdHZmcyBzYjsKICAgICBpZiAoc3RhdHZmcyhwYXRoLmNfc3RyKCksICZzYikgPT0gMCkgewotICAgICAgICByZXR1cm4gKHVpbnQ2NF90KSBzYi5mX2JhdmFpbCAqIHNiLmZfZnJzaXplOworICAgICAgICByZXR1cm4gKHVpbnQ2NF90KXNiLmZfYmF2YWlsICogc2IuZl9mcnNpemU7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTQ4Niw3ICs1MTgsNyBAQAogCiAvLyBUT0RPOiBib3Jyb3dlZCBmcm9tIGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZGlza3VzYWdlLyB3aGljaCBzaG91bGQKIC8vIGV2ZW50dWFsbHkgYmUgbWlncmF0ZWQgaW50byBzeXN0ZW0vCi1zdGF0aWMgaW50NjRfdCBzdGF0X3NpemUoc3RydWN0IHN0YXQgKnMpIHsKK3N0YXRpYyBpbnQ2NF90IHN0YXRfc2l6ZShzdHJ1Y3Qgc3RhdCogcykgewogICAgIGludDY0X3QgYmxrc2l6ZSA9IHMtPnN0X2Jsa3NpemU7CiAgICAgLy8gY291bnQgYWN0dWFsIGJsb2NrcyB1c2VkIGluc3RlYWQgb2Ygbm9taW5hbCBmaWxlIHNpemUKICAgICBpbnQ2NF90IHNpemUgPSBzLT5zdF9ibG9ja3MgKiA1MTI7CkBAIC01MDQsOCArNTM2LDggQEAKIGludDY0X3QgY2FsY3VsYXRlX2Rpcl9zaXplKGludCBkZmQpIHsKICAgICBpbnQ2NF90IHNpemUgPSAwOwogICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgRElSICpkOwotICAgIHN0cnVjdCBkaXJlbnQgKmRlOworICAgIERJUiogZDsKKyAgICBzdHJ1Y3QgZGlyZW50KiBkZTsKIAogICAgIGQgPSBmZG9wZW5kaXIoZGZkKTsKICAgICBpZiAoZCA9PSBOVUxMKSB7CkBAIC01MTQsNyArNTQ2LDcgQEAKICAgICB9CiAKICAgICB3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkpIHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9IGRlLT5kX25hbWU7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUgPSBkZS0+ZF9uYW1lOwogICAgICAgICBpZiAoZnN0YXRhdChkZmQsIG5hbWUsICZzLCBBVF9TWU1MSU5LX05PRk9MTE9XKSA9PSAwKSB7CiAgICAgICAgICAgICBzaXplICs9IHN0YXRfc2l6ZSgmcyk7CiAgICAgICAgIH0KQEAgLTUyMywxMCArNTU1LDggQEAKIAogICAgICAgICAgICAgLyogYWx3YXlzIHNraXAgIi4iIGFuZCAiLi4iICovCiAgICAgICAgICAgICBpZiAobmFtZVswXSA9PSAnLicpIHsKLSAgICAgICAgICAgICAgICBpZiAobmFtZVsxXSA9PSAwKQotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICBpZiAoKG5hbWVbMV0gPT0gJy4nKSAmJiAobmFtZVsyXSA9PSAwKSkKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVbMV0gPT0gMCkgY29udGludWU7CisgICAgICAgICAgICAgICAgaWYgKChuYW1lWzFdID09ICcuJykgJiYgKG5hbWVbMl0gPT0gMCkpIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdWJmZCA9IG9wZW5hdChkZmQsIG5hbWUsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpOwpAQCAtNTQ1LDkgKzU3NSw3IEBACiAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgcGF0aDsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHVpbnQ2NF90IHJlcyA9IGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7Ci0gICAgICAgIGNsb3NlKGRpcmZkKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgcmV0dXJuIGNhbGN1bGF0ZV9kaXJfc2l6ZShkaXJmZCk7CiAgICAgfQogfQogCkBAIC01NjMsOCArNTkxLDcgQEAKIHN0YXR1c190IFdpcGVCbG9ja0RldmljZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIHN0YXR1c190IHJlcyA9IC0xOwogICAgIGNvbnN0IGNoYXIqIGNfcGF0aCA9IHBhdGguY19zdHIoKTsKLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgdW5zaWduZWQgbG9uZyBsb25nIHJhbmdlWzJdOworICAgIHVpbnQ2NF90IHJhbmdlWzJdID0gezAsIDB9OwogCiAgICAgaW50IGZkID0gVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oY19wYXRoLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKICAgICBpZiAoZmQgPT0gLTEpIHsKQEAgLTU3MiwxNCArNTk5LDExIEBACiAgICAgICAgIGdvdG8gZG9uZTsKICAgICB9CiAKLSAgICBpZiAoKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmbnJfc2VjKSkgPT0gLTEpIHsKKyAgICBpZiAoR2V0QmxvY2tEZXZTaXplKGZkLCAmcmFuZ2VbMV0pICE9IE9LKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZGV0ZXJtaW5lIHNpemUgb2YgIiA8PCBwYXRoOwogICAgICAgICBnb3RvIGRvbmU7CiAgICAgfQogCi0gICAgcmFuZ2VbMF0gPSAwOwotICAgIHJhbmdlWzFdID0gKHVuc2lnbmVkIGxvbmcgbG9uZykgbnJfc2VjICogNTEyOwotCiAgICAgTE9HKElORk8pIDw8ICJBYm91dCB0byBkaXNjYXJkICIgPDwgcmFuZ2VbMV0gPDwgIiBvbiAiIDw8IHBhdGg7CiAgICAgaWYgKGlvY3RsKGZkLCBCTEtESVNDQVJELCAmcmFuZ2UpID09IDApIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJEaXNjYXJkIHN1Y2Nlc3Mgb24gIiA8PCBwYXRoOwpAQCAtNTk0LDggKzYxOCw3IEBACiB9CiAKIHN0YXRpYyBib29sIGlzVmFsaWRGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgewotICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKQotICAgICAgICAgICAgfHwgKG5hbWUuZmluZCgnLycpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgIGlmIChuYW1lLmVtcHR5KCkgfHwgKG5hbWUgPT0gIi4iKSB8fCAobmFtZSA9PSAiLi4iKSB8fCAobmFtZS5maW5kKCcvJykgIT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTY5MCw3ICs3MTMsNyBAQAogfQogCiBzdGF0dXNfdCBSZXN0b3JlY29uUmVjdXJzaXZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7Ci0gICAgTE9HKFZFUkJPU0UpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKKyAgICBMT0coREVCVUcpIDw8ICJTdGFydGluZyByZXN0b3JlY29uIG9mICIgPDwgcGF0aDsKIAogICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhcioga1Jlc3RvcmVjb25TdHJpbmcgPSAic2VsaW51eC5yZXN0b3JlY29uX3JlY3Vyc2l2ZSI7CiAKQEAgLTY5OSw3ICs3MjIsNyBAQAogCiAgICAgYW5kcm9pZDo6YmFzZTo6V2FpdEZvclByb3BlcnR5KGtSZXN0b3JlY29uU3RyaW5nLCBwYXRoKTsKIAotICAgIExPRyhWRVJCT1NFKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CisgICAgTE9HKERFQlVHKSA8PCAiRmluaXNoZWQgcmVzdG9yZWNvbiBvZiAiIDw8IHBhdGg7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03MTUsOCArNzM4LDcgQEAKICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICBzc2l6ZV90IHNpemUgPSByZWFkbGlua2F0KGRpcmZkLCBwYXRoLmNfc3RyKCksICZidWZbMF0sIGJ1Zi5zaXplKCkpOwogICAgICAgICAvLyBVbnJlY292ZXJhYmxlIGVycm9yPwotICAgICAgICBpZiAoc2l6ZSA9PSAtMSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHNpemUgPT0gLTEpIHJldHVybiBmYWxzZTsKICAgICAgICAgLy8gSXQgZml0ISAoSWYgc2l6ZSA9PSBidWYuc2l6ZSgpLCBpdCBtYXkgaGF2ZSBiZWVuIHRydW5jYXRlZC4pCiAgICAgICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KHNpemUpIDwgYnVmLnNpemUoKSkgewogICAgICAgICAgICAgcmVzdWx0LT5hc3NpZ24oJmJ1ZlswXSwgc2l6ZSk7CkBAIC03MzEsNSArNzUzLDQ2IEBACiAgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8ua2VybmVsLnFlbXUiLCBmYWxzZSk7CiB9CiAKK3N0YXR1c190IFVubW91bnRUcmVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcmVmaXgpIHsKKyAgICBpZiAodW1vdW50MihwcmVmaXguY19zdHIoKSwgTU5UX0RFVEFDSCkpIHsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50ICIgPDwgcHJlZml4OworICAgICAgICByZXR1cm4gLWVycm5vOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFRPRE8oMTE4NzA4NjQ5KTogZml4IGR1cGxpY2F0aW9uIHdpdGggaW5pdC91dGlsLmgKK3N0YXR1c190IFdhaXRGb3JGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCkgeworICAgIGFuZHJvaWQ6OmJhc2U6OlRpbWVyIHQ7CisgICAgd2hpbGUgKHQuZHVyYXRpb24oKSA8IHRpbWVvdXQpIHsKKyAgICAgICAgc3RydWN0IHN0YXQgc2I7CisgICAgICAgIGlmIChzdGF0KGZpbGVuYW1lLCAmc2IpICE9IC0xKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIndhaXQgZm9yICciIDw8IGZpbGVuYW1lIDw8ICInIHRvb2sgIiA8PCB0OworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKDEwbXMpOworICAgIH0KKyAgICBMT0coV0FSTklORykgPDwgIndhaXQgZm9yICciIDw8IGZpbGVuYW1lIDw8ICInIHRpbWVkIG91dCBhbmQgdG9vayAiIDw8IHQ7CisgICAgcmV0dXJuIC0xOworfQorCitib29sIEZzeW5jRGlyZWN0b3J5KGNvbnN0IHN0ZDo6c3RyaW5nJiBkaXJuYW1lKSB7CisgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkIGZkKFRFTVBfRkFJTFVSRV9SRVRSWShvcGVuKGRpcm5hbWUuY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSk7CisgICAgaWYgKGZkID09IC0xKSB7CisgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGRpcm5hbWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGZzeW5jKGZkKSA9PSAtMSkgeworICAgICAgICBpZiAoZXJybm8gPT0gRVJPRlMgfHwgZXJybm8gPT0gRUlOVkFMKSB7CisgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJTa2lwIGZzeW5jICIgPDwgZGlybmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG9uIGEgZmlsZSBzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBzeW5jaHJvbml6YXRpb24iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBmc3luYyAiIDw8IGRpcm5hbWU7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvVXRpbHMuaCBiL1V0aWxzLmgKaW5kZXggNWNhYTRlOS4uMGIzNWE3YiAxMDA2NDQKLS0tIGEvVXRpbHMuaAorKysgYi9VdGlscy5oCkBAIC0yMCwxMiArMjAsMTMgQEAKICNpbmNsdWRlICJLZXlCdWZmZXIuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAKLSNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIHN0cnVjdCBESVI7CiAKQEAgLTU5LDI0ICs2MCwyNSBAQAogYm9vbCBGaW5kVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhdywgY29uc3Qgc3RkOjpzdHJpbmcmIGtleSwgc3RkOjpzdHJpbmcqIHZhbHVlKTsKIAogLyogUmVhZHMgZmlsZXN5c3RlbSBtZXRhZGF0YSBmcm9tIGRldmljZSBhdCBwYXRoICovCi1zdGF0dXNfdCBSZWFkTWV0YWRhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHN0ZDo6c3RyaW5nKiBmc1R5cGUsCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBmc1V1aWQsIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKK3N0YXR1c190IFJlYWRNZXRhZGF0YShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwgc3RkOjpzdHJpbmcqIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZnNMYWJlbCk7CiAKIC8qIFJlYWRzIGZpbGVzeXN0ZW0gbWV0YWRhdGEgZnJvbSB1bnRydXN0ZWQgZGV2aWNlIGF0IHBhdGggKi8KLXN0YXR1c190IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGZzVHlwZSwKLSAgICAgICAgc3RkOjpzdHJpbmcqIGZzVXVpZCwgc3RkOjpzdHJpbmcqIGZzTGFiZWwpOworc3RhdHVzX3QgUmVhZE1ldGFkYXRhVW50cnVzdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBzdGQ6OnN0cmluZyogZnNUeXBlLCBzdGQ6OnN0cmluZyogZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmc0xhYmVsKTsKIAogLyogUmV0dXJucyBlaXRoZXIgV0VYSVRTVEFUVVMoKSBzdGF0dXMsIG9yIGEgbmVnYXRpdmUgZXJybm8gKi8KLXN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzKTsKLXN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dCk7Ci0KLXN0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG91dHB1dCk7Ci1zdGF0dXNfdCBGb3JrRXhlY3ZwKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgYXJncywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBvdXRwdXQsIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0KTsKK3N0YXR1c190IEZvcmtFeGVjdnAoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBhcmdzLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIG91dHB1dCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0ID0gbnVsbHB0cik7CiAKIHBpZF90IEZvcmtFeGVjdnBBc3luYyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGFyZ3MpOwogCisvKiBHZXRzIGJsb2NrIGRldmljZSBzaXplIGluIGJ5dGVzICovCitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoaW50IGZkLCB1aW50NjRfdCogc2l6ZSk7CitzdGF0dXNfdCBHZXRCbG9ja0RldlNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIHVpbnQ2NF90KiBzaXplKTsKKy8qIEdldHMgYmxvY2sgZGV2aWNlIHNpemUgaW4gNTEyIGJ5dGUgc2VjdG9ycyAqLworc3RhdHVzX3QgR2V0QmxvY2tEZXY1MTJTZWN0b3JzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCB1aW50NjRfdCogbnJfc2VjKTsKKwogc3RhdHVzX3QgUmVhZFJhbmRvbUJ5dGVzKHNpemVfdCBieXRlcywgc3RkOjpzdHJpbmcmIG91dCk7CiBzdGF0dXNfdCBSZWFkUmFuZG9tQnl0ZXMoc2l6ZV90IGJ5dGVzLCBjaGFyKiBidWZmZXIpOwogc3RhdHVzX3QgR2VuZXJhdGVSYW5kb21VdWlkKHN0ZDo6c3RyaW5nJiBvdXQpOwpAQCAtMTI1LDYgKzEyNywxMiBAQAogLyogQ2hlY2tzIGlmIEFuZHJvaWQgaXMgcnVubmluZyBpbiBRRU1VICovCiBib29sIElzUnVubmluZ0luRW11bGF0b3IoKTsKIAorc3RhdHVzX3QgVW5tb3VudFRyZWUoY29uc3Qgc3RkOjpzdHJpbmcmIHByZWZpeCk7CisKK3N0YXR1c190IFdhaXRGb3JGaWxlKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7CisKK2Jvb2wgRnN5bmNEaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcmIGRpcm5hbWUpOworCiB9ICAvLyBuYW1lc3BhY2Ugdm9sZAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvVm9sZE5hdGl2ZVNlcnZpY2UuY3BwIGIvVm9sZE5hdGl2ZVNlcnZpY2UuY3BwCmluZGV4IDgxNTIzYzYuLmM1OGZmMDEgMTAwNjQ0Ci0tLSBhL1ZvbGROYXRpdmVTZXJ2aWNlLmNwcAorKysgYi9Wb2xkTmF0aXZlU2VydmljZS5jcHAKQEAgLTI0LDkgKzI0LDEwIEBACiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKIAotI2luY2x1ZGUgImNyeXB0ZnMuaCIKLSNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKKyNpbmNsdWRlICJDaGVja3BvaW50LmgiCisjaW5jbHVkZSAiRnNDcnlwdC5oIgogI2luY2x1ZGUgIk1ldGFkYXRhQ3J5cHQuaCIKKyNpbmNsdWRlICJjcnlwdGZzLmgiCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPHRocmVhZD4KQEAgLTM0LDggKzM1LDggQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgogI2luY2x1ZGUgPGZzX21nci5oPgorI2luY2x1ZGUgPGZzY3J5cHQvZnNjcnlwdC5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKQEAgLTgzLDExICs4NCwxMSBAQAogICAgIHVpZF90IHVpZDsKIAogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KHBlcm1pc3Npb24pLCByZWludGVycHJldF9jYXN0PGludDMyX3QqPigmcGlkKSwKLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ1aWQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KCZ1aWQpKSkgewogICAgICAgICByZXR1cm4gb2soKTsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9TRUNVUklUWSwKLSAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCAvIFBJRCAlZCBsYWNrcyBwZXJtaXNzaW9uICVzIiwgdWlkLCBwaWQsIHBlcm1pc3Npb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCAvIFBJRCAlZCBsYWNrcyBwZXJtaXNzaW9uICVzIiwgdWlkLCBwaWQsIHBlcm1pc3Npb24pKTsKICAgICB9CiB9CiAKQEAgLTk3LDcgKzk4LDcgQEAKICAgICAgICAgcmV0dXJuIG9rKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfU0VDVVJJVFksCi0gICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJVSUQgJWQgaXMgbm90IGV4cGVjdGVkIFVJRCAlZCIsIHVpZCwgZXhwZWN0ZWRVaWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlVJRCAlZCBpcyBub3QgZXhwZWN0ZWQgVUlEICVkIiwgdWlkLCBleHBlY3RlZFVpZCkpOwogICAgIH0KIH0KIApAQCAtMTA4LDcgKzEwOSw3IEBACiAgICAgZm9yIChjb25zdCBjaGFyJiBjIDogaWQpIHsKICAgICAgICAgaWYgKCFzdGQ6OmlzYWxudW0oYykgJiYgYyAhPSAnOicgJiYgYyAhPSAnLCcpIHsKICAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24oYmluZGVyOjpTdGF0dXM6OkVYX0lMTEVHQUxfQVJHVU1FTlQsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiSUQgJXMgaXMgbWFsZm9ybWVkIiwgaWQuY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIklEICVzIGlzIG1hbGZvcm1lZCIsIGlkLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKQEAgLTEyMCwxNiArMTIxLDE2IEBACiAgICAgfQogICAgIGlmIChwYXRoWzBdICE9ICcvJykgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyByZWxhdGl2ZSIsIHBhdGguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyByZWxhdGl2ZSIsIHBhdGguY19zdHIoKSkpOwogICAgIH0KICAgICBpZiAoKHBhdGggKyAnLycpLmZpbmQoIi8uLi8iKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgewogICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBzaGFkeSIsIHBhdGguY19zdHIoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBzaGFkeSIsIHBhdGguY19zdHIoKSkpOwogICAgIH0KICAgICBmb3IgKGNvbnN0IGNoYXImIGMgOiBwYXRoKSB7CiAgICAgICAgIGlmIChjID09ICdcMCcgfHwgYyA9PSAnXG4nKSB7CiAgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uKGJpbmRlcjo6U3RhdHVzOjpFWF9JTExFR0FMX0FSR1VNRU5ULAotICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIlBhdGggJXMgaXMgbWFsZm9ybWVkIiwgcGF0aC5jX3N0cigpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiUGF0aCAlcyBpcyBtYWxmb3JtZWQiLCBwYXRoLmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKQEAgLTE0MCw0NSArMTQxLDQ5IEBACiAgICAgZm9yIChjb25zdCBjaGFyJiBjIDogaGV4KSB7CiAgICAgICAgIGlmICghc3RkOjppc3hkaWdpdChjKSAmJiBjICE9ICc6JyAmJiBjICE9ICctJykgewogICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbihiaW5kZXI6OlN0YXR1czo6RVhfSUxMRUdBTF9BUkdVTUVOVCwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJIZXggJXMgaXMgbWFsZm9ybWVkIiwgaGV4LmNfc3RyKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJIZXggJXMgaXMgbWFsZm9ybWVkIiwgaGV4LmNfc3RyKCkpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gb2soKTsKIH0KIAotI2RlZmluZSBFTkZPUkNFX1VJRCh1aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrVWlkKCh1aWQpKTsgICAgICAgICAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBFTkZPUkNFX1VJRCh1aWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrVWlkKCh1aWQpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9JRChpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRJZCgoaWQpKTsgICAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9JRChpZCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRJZCgoaWQpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9QQVRIKHBhdGgpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRQYXRoKChwYXRoKSk7ICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9QQVRIKHBhdGgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzID0gY2hlY2tBcmd1bWVudFBhdGgoKHBhdGgpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBDSEVDS19BUkdVTUVOVF9IRVgoaGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGNoZWNrQXJndW1lbnRIZXgoKGhleCkpOyAgICAgICAgXAotICAgIGlmICghc3RhdHVzLmlzT2soKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQorI2RlZmluZSBDSEVDS19BUkdVTUVOVF9IRVgoaGV4KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBiaW5kZXI6OlN0YXR1cyBzdGF0dXMgPSBjaGVja0FyZ3VtZW50SGV4KChoZXgpKTsgXAorICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KIAotI2RlZmluZSBBQ1FVSVJFX0xPQ0sgXAorI2RlZmluZSBBQ1FVSVJFX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5nZXRMb2NrKCkpOyBcCiAgICAgQVRSQUNFX0NBTEwoKTsKIAotI2RlZmluZSBBQ1FVSVJFX0NSWVBUX0xPQ0sgXAorI2RlZmluZSBBQ1FVSVJFX0NSWVBUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmdldENyeXB0TG9jaygpKTsgXAogICAgIEFUUkFDRV9DQUxMKCk7CiAKQEAgLTE5Niw3ICsyMDEsNyBAQAogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAotc3RhdHVzX3QgVm9sZE5hdGl2ZVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICYgLyogYXJncyAqLykgeworc3RhdHVzX3QgVm9sZE5hdGl2ZVNlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiAvKiBhcmdzICovKSB7CiAgICAgYXV0byBvdXQgPSBzdGQ6OmZzdHJlYW0oU3RyaW5nUHJpbnRmKCIvcHJvYy9zZWxmL2ZkLyVkIiwgZmQpKTsKICAgICBjb25zdCBiaW5kZXI6OlN0YXR1cyBkdW1wX3Blcm1pc3Npb24gPSBjaGVja1Blcm1pc3Npb24oa0R1bXApOwogICAgIGlmICghZHVtcF9wZXJtaXNzaW9uLmlzT2soKSkgewpAQCAtMjExLDcgKzIxNiw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpzZXRMaXN0ZW5lcigKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKQEAgLTIyMywxMiArMjI4LDggQEAKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKIAogICAgIC8vIFNpbXBseSBhY3F1aXJlL3JlbGVhc2UgZWFjaCBsb2NrIGZvciB3YXRjaGRvZwotICAgIHsKLSAgICAgICAgQUNRVUlSRV9MT0NLOwotICAgIH0KLSAgICB7Ci0gICAgICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKLSAgICB9CisgICAgeyBBQ1FVSVJFX0xPQ0s7IH0KKyAgICB7IEFDUVVJUkVfQ1JZUFRfTE9DSzsgfQogCiAgICAgcmV0dXJuIG9rKCk7CiB9CkBAIC0yODMsNyArMjg0LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGlza0lkLCBpbnQzMl90IHBhcnRpdGlvblR5cGUsCi0gICAgICAgIGludDMyX3QgcmF0aW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYXRpbykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIENIRUNLX0FSR1VNRU5UX0lEKGRpc2tJZCk7CiAgICAgQUNRVUlSRV9MT0NLOwpAQCAtMjkzLDE1ICsyOTQsMTkgQEAKICAgICAgICAgcmV0dXJuIGVycm9yKCJGYWlsZWQgdG8gZmluZCBkaXNrICIgKyBkaXNrSWQpOwogICAgIH0KICAgICBzd2l0Y2ggKHBhcnRpdGlvblR5cGUpIHsKLSAgICBjYXNlIFBBUlRJVElPTl9UWVBFX1BVQkxJQzogcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25QdWJsaWMoKSk7Ci0gICAgY2FzZSBQQVJUSVRJT05fVFlQRV9QUklWQVRFOiByZXR1cm4gdHJhbnNsYXRlKGRpc2stPnBhcnRpdGlvblByaXZhdGUoKSk7Ci0gICAgY2FzZSBQQVJUSVRJT05fVFlQRV9NSVhFRDogcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25NaXhlZChyYXRpbykpOwotICAgIGRlZmF1bHQ6IHJldHVybiBlcnJvcigiVW5rbm93biB0eXBlICIgKyBzdGQ6OnRvX3N0cmluZyhwYXJ0aXRpb25UeXBlKSk7CisgICAgICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFVCTElDOgorICAgICAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZShkaXNrLT5wYXJ0aXRpb25QdWJsaWMoKSk7CisgICAgICAgIGNhc2UgUEFSVElUSU9OX1RZUEVfUFJJVkFURToKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uUHJpdmF0ZSgpKTsKKyAgICAgICAgY2FzZSBQQVJUSVRJT05fVFlQRV9NSVhFRDoKKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUoZGlzay0+cGFydGl0aW9uTWl4ZWQocmF0aW8pKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBlcnJvcigiVW5rbm93biB0eXBlICIgKyBzdGQ6OnRvX3N0cmluZyhwYXJ0aXRpb25UeXBlKSk7CiAgICAgfQogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Zm9yZ2V0UGFydGl0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXJ0R3VpZCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKHBhcnRHdWlkKTsKICAgICBDSEVDS19BUkdVTUVOVF9IRVgoZnNVdWlkKTsKQEAgLTMxMSw3ICszMTYsNyBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkLCBpbnQzMl90IG1vdW50RmxhZ3MsCi0gICAgICAgIGludDMyX3QgbW91bnRVc2VySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1vdW50VXNlcklkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQodm9sSWQpOwogICAgIEFDUVVJUkVfTE9DSzsKQEAgLTM4Nyw5ICszOTIsNyBAQAogICAgIGF1dG8gc3RhdHVzID0gcGF0aEZvclZvbElkKHZvbElkLCAmcGF0aCk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSByZXR1cm4gc3RhdHVzOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpCZW5jaG1hcmsocGF0aCwgbGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6QmVuY2htYXJrKHBhdGgsIGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKQEAgLTQwNCw4ICs0MDcsOSBAQAogICAgIHJldHVybiB0cmFuc2xhdGUoYW5kcm9pZDo6dm9sZDo6Q2hlY2tFbmNyeXB0aW9uKHBhdGgpKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdmVTdG9yYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tVm9sSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1ZvbElkLCBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdmVTdG9yYWdlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmcm9tVm9sSWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b1ZvbElkLAorICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSUQoZnJvbVZvbElkKTsKICAgICBDSEVDS19BUkdVTUVOVF9JRCh0b1ZvbElkKTsKQEAgLTQxOSw5ICs0MjMsNyBAQAogICAgICAgICByZXR1cm4gZXJyb3IoIkZhaWxlZCB0byBmaW5kIHZvbHVtZSAiICsgdG9Wb2xJZCk7CiAgICAgfQogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpNb3ZlU3RvcmFnZShmcm9tVm9sLCB0b1ZvbCwgbGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6TW92ZVN0b3JhZ2UoZnJvbVZvbCwgdG9Wb2wsIGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKQEAgLTQzMSwxMSArNDMzLDIwIEBACiAKICAgICBzdGQ6OnN0cmluZyB0bXA7CiAgICAgc3dpdGNoIChyZW1vdW50TW9kZSkgewotICAgIGNhc2UgUkVNT1VOVF9NT0RFX05PTkU6IHRtcCA9ICJub25lIjsgYnJlYWs7Ci0gICAgY2FzZSBSRU1PVU5UX01PREVfREVGQVVMVDogdG1wID0gImRlZmF1bHQiOyBicmVhazsKLSAgICBjYXNlIFJFTU9VTlRfTU9ERV9SRUFEOiB0bXAgPSAicmVhZCI7IGJyZWFrOwotICAgIGNhc2UgUkVNT1VOVF9NT0RFX1dSSVRFOiB0bXAgPSAid3JpdGUiOyBicmVhazsKLSAgICBkZWZhdWx0OiByZXR1cm4gZXJyb3IoIlVua25vd24gbW9kZSAiICsgc3RkOjp0b19zdHJpbmcocmVtb3VudE1vZGUpKTsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfTk9ORToKKyAgICAgICAgICAgIHRtcCA9ICJub25lIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFTU9VTlRfTU9ERV9ERUZBVUxUOgorICAgICAgICAgICAgdG1wID0gImRlZmF1bHQiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUkVNT1VOVF9NT0RFX1JFQUQ6CisgICAgICAgICAgICB0bXAgPSAicmVhZCI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRU1PVU5UX01PREVfV1JJVEU6CisgICAgICAgICAgICB0bXAgPSAid3JpdGUiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZXJyb3IoIlVua25vd24gbW9kZSAiICsgc3RkOjp0b19zdHJpbmcocmVtb3VudE1vZGUpKTsKICAgICB9CiAgICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdW50VWlkKHVpZCwgdG1wKSk7CiB9CkBAIC00NDksMTQgKzQ2MCwxNSBAQAogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LCBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksIGludDMyX3Qgb3duZXJHaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBDSEVDS19BUkdVTUVOVF9QQVRIKHNvdXJjZVBhdGgpOwogICAgIENIRUNLX0FSR1VNRU5UX0hFWChzb3VyY2VLZXkpOwogICAgIEFDUVVJUkVfTE9DSzsKIAogICAgIHJldHVybiB0cmFuc2xhdGUoCi0gICAgICAgICAgICBWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5jcmVhdGVPYmIoc291cmNlUGF0aCwgc291cmNlS2V5LCBvd25lckdpZCwgX2FpZGxfcmV0dXJuKSk7CisgICAgICAgIFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmNyZWF0ZU9iYihzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkLCBfYWlkbF9yZXR1cm4pKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKSB7CkBAIC00NjcsNTIgKzQ3OSw4NiBAQAogICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+ZGVzdHJveU9iYih2b2xJZCkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZnN0cmltKGludDMyX3QgZnN0cmltRmxhZ3MsCi0gICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlU3R1YlZvbHVtZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNMYWJlbCwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybikgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIENIRUNLX0FSR1VNRU5UX1BBVEgoc291cmNlUGF0aCk7CisgICAgQ0hFQ0tfQVJHVU1FTlRfUEFUSChtb3VudFBhdGgpOworICAgIENIRUNLX0FSR1VNRU5UX0hFWChmc1V1aWQpOworICAgIC8vIExhYmVsIGxpbWl0YXRpb24gc2VlbXMgdG8gYmUgZGlmZmVyZW50IGJldHdlZW4gZnMgKGluY2x1ZGluZyBhbGxvd2VkIGNoYXJhY3RlcnMpLCBzbyBjaGVja2luZworICAgIC8vIGlzIHF1aXRlIG1lYW5pbmdsZXNzLgorICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Y3JlYXRlU3R1YlZvbHVtZShzb3VyY2VQYXRoLCBtb3VudFBhdGgsIGZzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnNVdWlkLCBmc0xhYmVsLCBfYWlkbF9yZXR1cm4pKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmRlc3Ryb3lTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIENIRUNLX0FSR1VNRU5UX0lEKHZvbElkKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPmRlc3Ryb3lTdHViVm9sdW1lKHZvbElkKSk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmc3RyaW0oCisgICAgaW50MzJfdCBmc3RyaW1GbGFncywgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICBzdGQ6OnRocmVhZChbPV0oKSB7Ci0gICAgICAgIGFuZHJvaWQ6OnZvbGQ6OlRyaW0obGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6VHJpbShsaXN0ZW5lcik7IH0pLmRldGFjaCgpOwogICAgIHJldHVybiBvaygpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6cnVuSWRsZU1haW50KAotICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9MT0NLOwogCi0gICAgc3RkOjp0aHJlYWQoWz1dKCkgewotICAgICAgICBhbmRyb2lkOjp2b2xkOjpSdW5JZGxlTWFpbnQobGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6UnVuSWRsZU1haW50KGxpc3RlbmVyKTsgfSkuZGV0YWNoKCk7CiAgICAgcmV0dXJuIG9rKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjphYm9ydElkbGVNYWludCgKLSAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsKLSAgICAgICAgYW5kcm9pZDo6dm9sZDo6QWJvcnRJZGxlTWFpbnQobGlzdGVuZXIpOwotICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFs9XSgpIHsgYW5kcm9pZDo6dm9sZDo6QWJvcnRJZGxlTWFpbnQobGlzdGVuZXIpOyB9KS5kZXRhY2goKTsKICAgICByZXR1cm4gb2soKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om1vdW50QXBwRnVzZShpbnQzMl90IHVpZCwgaW50MzJfdCBwaWQsIGludDMyX3QgbW91bnRJZCwKLSAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgbW91bnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPm1vdW50QXBwRnVzZSh1aWQsIHBpZCwgbW91bnRJZCwgX2FpZGxfcmV0dXJuKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZShWb2x1bWVNYW5hZ2VyOjpJbnN0YW5jZSgpLT5tb3VudEFwcEZ1c2UodWlkLCBtb3VudElkLCBfYWlkbF9yZXR1cm4pKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnVubW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6dW5tb3VudEFwcEZ1c2UoaW50MzJfdCB1aWQsIGludDMyX3QgbW91bnRJZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGUoVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+dW5tb3VudEFwcEZ1c2UodWlkLCBwaWQsIG1vdW50SWQpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlKFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPnVubW91bnRBcHBGdXNlKHVpZCwgbW91bnRJZCkpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6b3BlbkFwcEZ1c2VGaWxlKGludDMyX3QgdWlkLCBpbnQzMl90IG1vdW50SWQsIGludDMyX3QgZmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIF9haWRsX3JldHVybikgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIGludCBmZCA9IFZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCktPm9wZW5BcHBGdXNlRmlsZSh1aWQsIG1vdW50SWQsIGZpbGVJZCwgZmxhZ3MpOworICAgIGlmIChmZCA9PSAtMSkgeworICAgICAgICByZXR1cm4gZXJyb3IoIkZhaWxlZCB0byBvcGVuIEFwcEZ1c2UgZmlsZSBmb3IgdWlkOiAiICsgc3RkOjp0b19zdHJpbmcodWlkKSArCisgICAgICAgICAgICAgICAgICAgICAiIG1vdW50SWQ6ICIgKyBzdGQ6OnRvX3N0cmluZyhtb3VudElkKSArICIgZmlsZUlkOiAiICsgc3RkOjp0b19zdHJpbmcoZmlsZUlkKSArCisgICAgICAgICAgICAgICAgICAgICAiIGZsYWdzOiAiICsgc3RkOjp0b19zdHJpbmcoZmxhZ3MpKTsKKyAgICB9CisKKyAgICAqX2FpZGxfcmV0dXJuID0gYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKGZkKTsKKyAgICByZXR1cm4gb2soKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUNoZWNrUGFzc3dvcmQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKSB7CkBAIC01NDEsNyArNTg3LDcgQEAKIH0KIAogc3RhdGljIGludCBmZGVFbmFibGVJbnRlcm5hbChpbnQzMl90IHBhc3N3b3JkVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkLAotICAgICAgICBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVuY3J5cHRpb25GbGFncykgewogICAgIGJvb2wgbm9VaSA9IChlbmNyeXB0aW9uRmxhZ3MgJiBWb2xkTmF0aXZlU2VydmljZTo6RU5DUllQVElPTl9GTEFHX05PX1VJKSAhPSAwOwogCiAgICAgZm9yIChpbnQgdHJpZXMgPSAwOyB0cmllcyA8IDI7ICsrdHJpZXMpIHsKQEAgLTU2MiwxNyArNjA4LDE3IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlRW5hYmxlKGludDMyX3QgcGFzc3dvcmRUeXBlLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKSB7CitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZmRlRW5hYmxlKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCiAgICAgTE9HKERFQlVHKSA8PCAiZmRlRW5hYmxlKCIgPDwgcGFzc3dvcmRUeXBlIDw8ICIsICosICIgPDwgZW5jcnlwdGlvbkZsYWdzIDw8ICIpIjsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJlNGNyeXB0X2lzX25hdGl2ZSwgZmRlRW5hYmxlIGludmFsaWQiOwotICAgICAgICByZXR1cm4gZXJyb3IoImU0Y3J5cHRfaXNfbmF0aXZlLCBmZGVFbmFibGUgaW52YWxpZCIpOworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZzY3J5cHRfaXNfbmF0aXZlLCBmZGVFbmFibGUgaW52YWxpZCI7CisgICAgICAgIHJldHVybiBlcnJvcigiZnNjcnlwdF9pc19uYXRpdmUsIGZkZUVuYWJsZSBpbnZhbGlkIik7CiAgICAgfQotICAgIExPRyhERUJVRykgPDwgIiFlNGNyeXB0X2lzX25hdGl2ZSwgc3Bhd25pbmcgZmRlRW5hYmxlSW50ZXJuYWwiOworICAgIExPRyhERUJVRykgPDwgIiFmc2NyeXB0X2lzX25hdGl2ZSwgc3Bhd25pbmcgZmRlRW5hYmxlSW50ZXJuYWwiOwogCiAgICAgLy8gU3Bhd24gYXMgdGhyZWFkIHNvIGluaXQgY2FuIGlzc3VlIGNvbW1hbmRzIGJhY2sgdG8gdm9sZCB3aXRob3V0CiAgICAgLy8gY2F1c2luZyBkZWFkbG9jaywgdXN1YWxseSBhcyBhIHJlc3VsdCBvZiBwcmVwX2RhdGFfZnMuCkBAIC01ODEsNyArNjI3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUNoYW5nZVBhc3N3b3JkKGludDMyX3QgcGFzc3dvcmRUeXBlLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTU5NSw4ICs2NDEsNyBAQAogICAgIHJldHVybiB0cmFuc2xhdGUoY3J5cHRmc192ZXJpZnlfcGFzc3dkKHBhc3N3b3JkLmNfc3RyKCkpKTsKIH0KIAotYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmZkZUdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCi0gICAgICAgIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVHZXRGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCkBAIC02MDksOCArNjU0LDcgQEAKICAgICB9CiB9CiAKLWJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVTZXRGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYga2V5LAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmZGVTZXRGaWVsZChjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKQEAgLTY0OCwxNCArNjkyLDE0IEBACiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9pbml0aWFsaXplX2dsb2JhbF9kZSgpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X2luaXRpYWxpemVfZ2xvYmFsX2RlKCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6bW91bnREZWZhdWx0RW5jcnlwdGVkKCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIGlmICghZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgIGlmICghZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICAvLyBTcGF3biBhcyB0aHJlYWQgc28gaW5pdCBjYW4gaXNzdWUgY29tbWFuZHMgYmFjayB0byB2b2xkIHdpdGhvdXQKICAgICAgICAgLy8gY2F1c2luZyBkZWFkbG9jaywgdXN1YWxseSBhcyBhIHJlc3VsdCBvZiBwcmVwX2RhdGFfZnMuCiAgICAgICAgIHN0ZDo6dGhyZWFkKCZjcnlwdGZzX21vdW50X2RlZmF1bHRfZW5jcnlwdGVkKS5kZXRhY2goKTsKQEAgLTY2Nyw3ICs3MTEsNyBAQAogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfaW5pdF91c2VyMCgpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X2luaXRfdXNlcjAoKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjppc0NvbnZlcnRpYmxlVG9GYmUoYm9vbCogX2FpZGxfcmV0dXJuKSB7CkBAIC02ODIsODEgKzcyNiwxNDIgQEAKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChtb3VudFBvaW50LCBmYWxzZSkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfbW91bnRfbWV0YWRhdGFfZW5jcnlwdGVkKG1vdW50UG9pbnQsIGZhbHNlKSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjplbmNyeXB0RnN0YWIoY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UG9pbnQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X21vdW50X21ldGFkYXRhX2VuY3J5cHRlZChtb3VudFBvaW50LCB0cnVlKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9tb3VudF9tZXRhZGF0YV9lbmNyeXB0ZWQobW91bnRQb2ludCwgdHJ1ZSkpOwogfQogCi1iaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6Y3JlYXRlVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBib29sIGVwaGVtZXJhbCkgeworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmNyZWF0ZVVzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X3ZvbGRfY3JlYXRlX3VzZXJfa2V5KHVzZXJJZCwgdXNlclNlcmlhbCwgZXBoZW1lcmFsKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF92b2xkX2NyZWF0ZV91c2VyX2tleSh1c2VySWQsIHVzZXJTZXJpYWwsIGVwaGVtZXJhbCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6ZGVzdHJveVVzZXJLZXkoaW50MzJfdCB1c2VySWQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2Rlc3Ryb3lfdXNlcl9rZXkodXNlcklkKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9kZXN0cm95X3VzZXJfa2V5KHVzZXJJZCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6YWRkVXNlcktleUF1dGgoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2FkZF91c2VyX2tleV9hdXRoKHVzZXJJZCwgdXNlclNlcmlhbCwgdG9rZW4sIHNlY3JldCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfYWRkX3VzZXJfa2V5X2F1dGgodXNlcklkLCB1c2VyU2VyaWFsLCB0b2tlbiwgc2VjcmV0KSk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpmaXhhdGVOZXdlc3RVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCkgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKIAotICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGU0Y3J5cHRfZml4YXRlX25ld2VzdF91c2VyX2tleV9hdXRoKHVzZXJJZCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfZml4YXRlX25ld2VzdF91c2VyX2tleV9hdXRoKHVzZXJJZCkpOwogfQogCiBiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6dW5sb2NrVXNlcktleShpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X3VubG9ja191c2VyX2tleSh1c2VySWQsIHVzZXJTZXJpYWwsIHRva2VuLCBzZWNyZXQpKTsKKyAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChmc2NyeXB0X3VubG9ja191c2VyX2tleSh1c2VySWQsIHVzZXJTZXJpYWwsIHRva2VuLCBzZWNyZXQpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkKSB7CiAgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CiAgICAgQUNRVUlSRV9DUllQVF9MT0NLOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9sb2NrX3VzZXJfa2V5KHVzZXJJZCkpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfbG9ja191c2VyX2tleSh1c2VySWQpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnByZXBhcmVVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBpbnQzMl90IGZsYWdzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpIHsKICAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKICAgICBzdGQ6OnN0cmluZyBlbXB0eV9zdHJpbmcgPSAiIjsKICAgICBhdXRvIHV1aWRfID0gdXVpZCA/ICp1dWlkIDogZW1wdHlfc3RyaW5nOwogICAgIENIRUNLX0FSR1VNRU5UX0hFWCh1dWlkXyk7CiAKICAgICBBQ1FVSVJFX0NSWVBUX0xPQ0s7Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZTRjcnlwdF9wcmVwYXJlX3VzZXJfc3RvcmFnZSh1dWlkXywgdXNlcklkLCB1c2VyU2VyaWFsLCBmbGFncykpOworICAgIHJldHVybiB0cmFuc2xhdGVCb29sKGZzY3J5cHRfcHJlcGFyZV91c2VyX3N0b3JhZ2UodXVpZF8sIHVzZXJJZCwgdXNlclNlcmlhbCwgZmxhZ3MpKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OmRlc3Ryb3lVc2VyU3RvcmFnZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjpzdHJpbmc+JiB1dWlkLAotICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCBmbGFncykgewogICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOwogICAgIHN0ZDo6c3RyaW5nIGVtcHR5X3N0cmluZyA9ICIiOwogICAgIGF1dG8gdXVpZF8gPSB1dWlkID8gKnV1aWQgOiBlbXB0eV9zdHJpbmc7CiAgICAgQ0hFQ0tfQVJHVU1FTlRfSEVYKHV1aWRfKTsKIAogICAgIEFDUVVJUkVfQ1JZUFRfTE9DSzsKLSAgICByZXR1cm4gdHJhbnNsYXRlQm9vbChlNGNyeXB0X2Rlc3Ryb3lfdXNlcl9zdG9yYWdlKHV1aWRfLCB1c2VySWQsIGZsYWdzKSk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJvb2woZnNjcnlwdF9kZXN0cm95X3VzZXJfc3RvcmFnZSh1dWlkXywgdXNlcklkLCBmbGFncykpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6c3RhcnRDaGVja3BvaW50KGludDMyX3QgcmV0cnkpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gY3Bfc3RhcnRDaGVja3BvaW50KHJldHJ5KTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om5lZWRzUm9sbGJhY2soYm9vbCogX2FpZGxfcmV0dXJuKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgKl9haWRsX3JldHVybiA9IGNwX25lZWRzUm9sbGJhY2soKTsKKyAgICByZXR1cm4gb2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6Om5lZWRzQ2hlY2twb2ludChib29sKiBfYWlkbF9yZXR1cm4pIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICAqX2FpZGxfcmV0dXJuID0gY3BfbmVlZHNDaGVja3BvaW50KCk7CisgICAgcmV0dXJuIG9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpjb21taXRDaGFuZ2VzKCkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9jb21taXRDaGFuZ2VzKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjpwcmVwYXJlQ2hlY2twb2ludCgpIHsKKyAgICBFTkZPUkNFX1VJRChBSURfU1lTVEVNKTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gY3BfcHJlcGFyZUNoZWNrcG9pbnQoKTsKK30KKworYmluZGVyOjpTdGF0dXMgVm9sZE5hdGl2ZVNlcnZpY2U6OnJlc3RvcmVDaGVja3BvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBvaW50KSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQ0hFQ0tfQVJHVU1FTlRfUEFUSChtb3VudFBvaW50KTsKKyAgICBBQ1FVSVJFX0xPQ0s7CisKKyAgICByZXR1cm4gY3BfcmVzdG9yZUNoZWNrcG9pbnQobW91bnRQb2ludCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIFZvbGROYXRpdmVTZXJ2aWNlOjptYXJrQm9vdEF0dGVtcHQoKSB7CisgICAgRU5GT1JDRV9VSUQoQUlEX1NZU1RFTSk7CisgICAgQUNRVUlSRV9MT0NLOworCisgICAgcmV0dXJuIGNwX21hcmtCb290QXR0ZW1wdCgpOworfQorCitiaW5kZXI6OlN0YXR1cyBWb2xkTmF0aXZlU2VydmljZTo6YWJvcnRDaGFuZ2VzKCkgeworICAgIEVORk9SQ0VfVUlEKEFJRF9TWVNURU0pOworICAgIEFDUVVJUkVfTE9DSzsKKworICAgIHJldHVybiBjcF9hYm9ydENoYW5nZXMoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHZvbGQKZGlmZiAtLWdpdCBhL1ZvbGROYXRpdmVTZXJ2aWNlLmggYi9Wb2xkTmF0aXZlU2VydmljZS5oCmluZGV4IDJlOTAxMDEuLjE2MWFjYjggMTAwNjQ0Ci0tLSBhL1ZvbGROYXRpdmVTZXJ2aWNlLmgKKysrIGIvVm9sZE5hdGl2ZVNlcnZpY2UuaApAQCAtMjYsMTAgKzI2LDEwIEBACiBuYW1lc3BhY2Ugdm9sZCB7CiAKIGNsYXNzIFZvbGROYXRpdmVTZXJ2aWNlIDogcHVibGljIEJpbmRlclNlcnZpY2U8Vm9sZE5hdGl2ZVNlcnZpY2U+LCBwdWJsaWMgb3M6OkJuVm9sZCB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICBzdGF0aWMgY2hhciBjb25zdCogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAidm9sZCI7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIHNldExpc3RlbmVyKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZExpc3RlbmVyPiYgbGlzdGVuZXIpOwogCkBAIC01MSwzOCArNTEsNDIgQEAKICAgICBiaW5kZXI6OlN0YXR1cyB1bm1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSk7CiAgICAgYmluZGVyOjpTdGF0dXMgYmVuY2htYXJrKGNvbnN0IHN0ZDo6c3RyaW5nJiB2b2xJZCwKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrRW5jcnlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgbW92ZVN0b3JhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmIGZyb21Wb2xJZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRvVm9sSWQsCi0gICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVtb3VudFVpZChpbnQzMl90IHVpZCwgaW50MzJfdCByZW1vdW50TW9kZSk7CiAKICAgICBiaW5kZXI6OlN0YXR1cyBta2RpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOwogCiAgICAgYmluZGVyOjpTdGF0dXMgY3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIF9haWRsX3JldHVybik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb3duZXJHaWQsIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOwogICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIGZzdHJpbShpbnQzMl90IGZzdHJpbUZsYWdzLAotICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOwotICAgIGJpbmRlcjo6U3RhdHVzIHJ1bklkbGVNYWludCgKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBhYm9ydElkbGVNYWludCgKLSAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6Om9zOjpJVm9sZFRhc2tMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjcmVhdGVTdHViVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc0xhYmVsLCBzdGQ6OnN0cmluZyogX2FpZGxfcmV0dXJuKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95U3R1YlZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgdm9sSWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgbW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkLAotICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkKiBfYWlkbF9yZXR1cm4pOwotICAgIGJpbmRlcjo6U3RhdHVzIHVubW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IHBpZCwgaW50MzJfdCBtb3VudElkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmc3RyaW0oaW50MzJfdCBmc3RyaW1GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIGJpbmRlcjo6U3RhdHVzIHJ1bklkbGVNYWludChjb25zdCBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRUYXNrTGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgYmluZGVyOjpTdGF0dXMgYWJvcnRJZGxlTWFpbnQoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkVGFza0xpc3RlbmVyPiYgbGlzdGVuZXIpOworCisgICAgYmluZGVyOjpTdGF0dXMgbW91bnRBcHBGdXNlKGludDMyX3QgdWlkLCBpbnQzMl90IG1vdW50SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKTsKKyAgICBiaW5kZXI6OlN0YXR1cyB1bm1vdW50QXBwRnVzZShpbnQzMl90IHVpZCwgaW50MzJfdCBtb3VudElkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBvcGVuQXBwRnVzZUZpbGUoaW50MzJfdCB1aWQsIGludDMyX3QgbW91bnRJZCwgaW50MzJfdCBmaWxlSWQsIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogX2FpZGxfcmV0dXJuKTsKIAogICAgIGJpbmRlcjo6U3RhdHVzIGZkZUNoZWNrUGFzc3dvcmQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVSZXN0YXJ0KCk7CiAgICAgYmluZGVyOjpTdGF0dXMgZmRlQ29tcGxldGUoaW50MzJfdCogX2FpZGxfcmV0dXJuKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBmZGVFbmFibGUoaW50MzJfdCBwYXNzd29yZFR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBmZGVDaGFuZ2VQYXNzd29yZChpbnQzMl90IHBhc3N3b3JkVHlwZSwKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXNzd29yZCk7CisgICAgYmluZGVyOjpTdGF0dXMgZmRlRW5hYmxlKGludDMyX3QgcGFzc3dvcmRUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGlvbkZsYWdzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBmZGVDaGFuZ2VQYXNzd29yZChpbnQzMl90IHBhc3N3b3JkVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhc3N3b3JkKTsKICAgICBiaW5kZXI6OlN0YXR1cyBmZGVWZXJpZnlQYXNzd29yZChjb25zdCBzdGQ6OnN0cmluZyYgcGFzc3dvcmQpOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZUdldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIHN0ZDo6c3RyaW5nKiBfYWlkbF9yZXR1cm4pOwogICAgIGJpbmRlcjo6U3RhdHVzIGZkZVNldEZpZWxkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CkBAIC0xMDEsMTggKzEwNSwzMCBAQAogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVVzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgYm9vbCBlcGhlbWVyYWwpOwogICAgIGJpbmRlcjo6U3RhdHVzIGRlc3Ryb3lVc2VyS2V5KGludDMyX3QgdXNlcklkKTsKIAotICAgIGJpbmRlcjo6U3RhdHVzIGFkZFVzZXJLZXlBdXRoKGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOworICAgIGJpbmRlcjo6U3RhdHVzIGFkZFVzZXJLZXlBdXRoKGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2VjcmV0KTsKICAgICBiaW5kZXI6OlN0YXR1cyBmaXhhdGVOZXdlc3RVc2VyS2V5QXV0aChpbnQzMl90IHVzZXJJZCk7CiAKLSAgICBiaW5kZXI6OlN0YXR1cyB1bmxvY2tVc2VyS2V5KGludDMyX3QgdXNlcklkLCBpbnQzMl90IHVzZXJTZXJpYWwsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdG9rZW4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZWNyZXQpOworICAgIGJpbmRlcjo6U3RhdHVzIHVubG9ja1VzZXJLZXkoaW50MzJfdCB1c2VySWQsIGludDMyX3QgdXNlclNlcmlhbCwgY29uc3Qgc3RkOjpzdHJpbmcmIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlY3JldCk7CiAgICAgYmluZGVyOjpTdGF0dXMgbG9ja1VzZXJLZXkoaW50MzJfdCB1c2VySWQpOwogCi0gICAgYmluZGVyOjpTdGF0dXMgcHJlcGFyZVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHVzZXJJZCwgaW50MzJfdCB1c2VyU2VyaWFsLCBpbnQzMl90IGZsYWdzKTsKLSAgICBiaW5kZXI6OlN0YXR1cyBkZXN0cm95VXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwKLSAgICAgICAgICAgIGludDMyX3QgdXNlcklkLCBpbnQzMl90IGZsYWdzKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBwcmVwYXJlVXNlclN0b3JhZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6c3RyaW5nPiYgdXVpZCwgaW50MzJfdCB1c2VySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdXNlclNlcmlhbCwgaW50MzJfdCBmbGFncyk7CisgICAgYmluZGVyOjpTdGF0dXMgZGVzdHJveVVzZXJTdG9yYWdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnN0cmluZz4mIHV1aWQsIGludDMyX3QgdXNlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzKTsKKworICAgIGJpbmRlcjo6U3RhdHVzIG1vdW50RXh0ZXJuYWxTdG9yYWdlRm9yQXBwKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlTmFtZSwgaW50MzJfdCBhcHBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2FuZGJveElkLCBpbnQzMl90IHVzZXJJZCk7CisKKyAgICBiaW5kZXI6OlN0YXR1cyBzdGFydENoZWNrcG9pbnQoaW50MzJfdCByZXRyeSk7CisgICAgYmluZGVyOjpTdGF0dXMgbmVlZHNDaGVja3BvaW50KGJvb2wqIF9haWRsX3JldHVybik7CisgICAgYmluZGVyOjpTdGF0dXMgbmVlZHNSb2xsYmFjayhib29sKiBfYWlkbF9yZXR1cm4pOworICAgIGJpbmRlcjo6U3RhdHVzIGNvbW1pdENoYW5nZXMoKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBwcmVwYXJlQ2hlY2twb2ludCgpOworICAgIGJpbmRlcjo6U3RhdHVzIHJlc3RvcmVDaGVja3BvaW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBvaW50KTsKKyAgICBiaW5kZXI6OlN0YXR1cyBtYXJrQm9vdEF0dGVtcHQoKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBhYm9ydENoYW5nZXMoKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCmRpZmYgLS1naXQgYS9Wb2xkVXRpbC5jcHAgYi9Wb2xkVXRpbC5jcHAKaW5kZXggYWZlOGI1My4uNGI5ODBiZSAxMDA2NDQKLS0tIGEvVm9sZFV0aWwuY3BwCisrKyBiL1ZvbGRVdGlsLmNwcApAQCAtMTQsMTMgKzE0LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgogCi1zdHJ1Y3QgZnN0YWIgKmZzdGFiX2RlZmF1bHQ7Ci0KLXZvaWQgZ2V0X2Jsa2Rldl9zaXplKGludCBmZCwgdW5zaWduZWQgbG9uZyogbnJfc2VjKSB7Ci0gIGlmICgoaW9jdGwoZmQsIEJMS0dFVFNJWkUsIG5yX3NlYykpID09IC0xKSB7Ci0gICAgKm5yX3NlYyA9IDA7Ci0gIH0KLX0KK3N0cnVjdCBmc3RhYiogZnN0YWJfZGVmYXVsdDsKZGlmZiAtLWdpdCBhL1ZvbGRVdGlsLmggYi9Wb2xkVXRpbC5oCmluZGV4IGZkNjY2NzIuLjc4MmUzNmQgMTAwNjQ0Ci0tLSBhL1ZvbGRVdGlsLmgKKysrIGIvVm9sZFV0aWwuaApAQCAtMjAsMTAgKzIwLDggQEAKICNpbmNsdWRlIDxmc3RhYi9mc3RhYi5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi1leHRlcm4gc3RydWN0IGZzdGFiICpmc3RhYl9kZWZhdWx0OworZXh0ZXJuIHN0cnVjdCBmc3RhYiogZnN0YWJfZGVmYXVsdDsKIAogI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpCiAKLXZvaWQgZ2V0X2Jsa2Rldl9zaXplKGludCBmZCwgdW5zaWduZWQgbG9uZyogbnJfc2VjKTsKLQogI2VuZGlmCmRpZmYgLS1naXQgYS9Wb2x1bWVNYW5hZ2VyLmNwcCBiL1ZvbHVtZU1hbmFnZXIuY3BwCmluZGV4IDhjMzI1ODcuLmNlMmQ5MzUgMTAwNjQ0Ci0tLSBhL1ZvbHVtZU1hbmFnZXIuY3BwCisrKyBiL1ZvbHVtZU1hbmFnZXIuY3BwCkBAIC0yNiw4ICsyNiw4IEBACiAjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIApAQCAtNDgsMTAgKzQ4LDExIEBACiAKICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgorI2luY2x1ZGUgPGZzY3J5cHQvZnNjcnlwdC5oPgogCisjaW5jbHVkZSAiQXBwRnVzZVV0aWwuaCIKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKLSNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKKyNpbmNsdWRlICJGc0NyeXB0LmgiCiAjaW5jbHVkZSAiTG9vcC5oIgogI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiUHJvY2Vzcy5oIgpAQCAtNjMsNyArNjQsOSBAQAogI2luY2x1ZGUgImZzL1ZmYXQuaCIKICNpbmNsdWRlICJtb2RlbC9FbXVsYXRlZFZvbHVtZS5oIgogI2luY2x1ZGUgIm1vZGVsL09iYlZvbHVtZS5oIgorI2luY2x1ZGUgIm1vZGVsL1N0dWJWb2x1bWUuaCIKIAordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aDsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZDsKIApAQCAtNzksMjQgKzgyLDIzIEBACiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluID0gMjQwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heCA9IDI1NDsKIAotVm9sdW1lTWFuYWdlciAqVm9sdW1lTWFuYWdlcjo6c0luc3RhbmNlID0gTlVMTDsKK1ZvbHVtZU1hbmFnZXIqIFZvbHVtZU1hbmFnZXI6OnNJbnN0YW5jZSA9IE5VTEw7CiAKLVZvbHVtZU1hbmFnZXIgKlZvbHVtZU1hbmFnZXI6Okluc3RhbmNlKCkgewotICAgIGlmICghc0luc3RhbmNlKQotICAgICAgICBzSW5zdGFuY2UgPSBuZXcgVm9sdW1lTWFuYWdlcigpOworVm9sdW1lTWFuYWdlciogVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKSB7CisgICAgaWYgKCFzSW5zdGFuY2UpIHNJbnN0YW5jZSA9IG5ldyBWb2x1bWVNYW5hZ2VyKCk7CiAgICAgcmV0dXJuIHNJbnN0YW5jZTsKIH0KIAogVm9sdW1lTWFuYWdlcjo6Vm9sdW1lTWFuYWdlcigpIHsKICAgICBtRGVidWcgPSBmYWxzZTsKICAgICBtTmV4dE9iYklkID0gMDsKKyAgICBtTmV4dFN0dWJWb2x1bWVJZCA9IDA7CiAgICAgLy8gRm9yIHNlY3VyaXR5IHJlYXNvbnMsIGFzc3VtZSB0aGF0IGEgc2VjdXJlIGtleWd1YXJkIGlzCiAgICAgLy8gc2hvd2luZyB1bnRpbCB3ZSBoZWFyIG90aGVyd2lzZQogICAgIG1TZWN1cmVLZXlndWFyZFNob3dpbmcgPSB0cnVlOwogfQogCi1Wb2x1bWVNYW5hZ2VyOjp+Vm9sdW1lTWFuYWdlcigpIHsKLX0KK1ZvbHVtZU1hbmFnZXI6On5Wb2x1bWVNYW5hZ2VyKCkge30KIAogaW50IFZvbHVtZU1hbmFnZXI6OnVwZGF0ZVZpcnR1YWxEaXNrKCkgewogICAgIEFUUkFDRV9OQU1FKCJWb2x1bWVNYW5hZ2VyOjp1cGRhdGVWaXJ0dWFsRGlzayIpOwpAQCAtMTE3LDggKzExOSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBhdXRvIGRpc2sgPSBuZXcgYW5kcm9pZDo6dm9sZDo6RGlzaygidmlydHVhbCIsIGJ1Zi5zdF9yZGV2LCAidmlydHVhbCIsCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprQWRvcHRhYmxlIHwgYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtTZCk7CisgICAgICAgICAgICBhdXRvIGRpc2sgPSBuZXcgYW5kcm9pZDo6dm9sZDo6RGlzaygKKyAgICAgICAgICAgICAgICAidmlydHVhbCIsIGJ1Zi5zdF9yZGV2LCAidmlydHVhbCIsCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtBZG9wdGFibGUgfCBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkKTsKICAgICAgICAgICAgIG1WaXJ0dWFsRGlzayA9IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPihkaXNrKTsKICAgICAgICAgICAgIGhhbmRsZURpc2tBZGRlZChtVmlydHVhbERpc2spOwogICAgICAgICB9CkBAIC0xNTcsNyArMTYwLDcgQEAKICAgICAvLyBzdG9yYWdlOyB0aGUgZnJhbWV3b3JrIHdpbGwgZGVjaWRlIGlmIGl0IHNob3VsZCBiZSBtb3VudGVkLgogICAgIENIRUNLKG1JbnRlcm5hbEVtdWxhdGVkID09IG51bGxwdHIpOwogICAgIG1JbnRlcm5hbEVtdWxhdGVkID0gc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+KAotICAgICAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6OkVtdWxhdGVkVm9sdW1lKCIvZGF0YS9tZWRpYSIpKTsKKyAgICAgICAgbmV3IGFuZHJvaWQ6OnZvbGQ6OkVtdWxhdGVkVm9sdW1lKCIvZGF0YS9tZWRpYSIpKTsKICAgICBtSW50ZXJuYWxFbXVsYXRlZC0+Y3JlYXRlKCk7CiAKICAgICAvLyBDb25zaWRlciBjcmVhdGluZyBhIHZpcnR1YWwgZGlzawpAQCAtMTczLDE3ICsxNzYsMTcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdm9pZCBWb2x1bWVNYW5hZ2VyOjpoYW5kbGVCbG9ja0V2ZW50KE5ldGxpbmtFdmVudCAqZXZ0KSB7Cit2b2lkIFZvbHVtZU1hbmFnZXI6OmhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50KiBldnQpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAKICAgICBpZiAobURlYnVnKSB7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiLS0tLS0tLS0tLS0tLS0tLSI7Ci0gICAgICAgIExPRyhWRVJCT1NFKSA8PCAiaGFuZGxlQmxvY2tFdmVudCB3aXRoIGFjdGlvbiAiIDw8IChpbnQpIGV2dC0+Z2V0QWN0aW9uKCk7CisgICAgICAgIExPRyhERUJVRykgPDwgIi0tLS0tLS0tLS0tLS0tLS0iOworICAgICAgICBMT0coREVCVUcpIDw8ICJoYW5kbGVCbG9ja0V2ZW50IHdpdGggYWN0aW9uICIgPDwgKGludClldnQtPmdldEFjdGlvbigpOwogICAgICAgICBldnQtPmR1bXAoKTsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBldmVudFBhdGgoZXZ0LT5maW5kUGFyYW0oIkRFVlBBVEgiKT9ldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpOiIiKTsKLSAgICBzdGQ6OnN0cmluZyBkZXZUeXBlKGV2dC0+ZmluZFBhcmFtKCJERVZUWVBFIik/ZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKToiIik7CisgICAgc3RkOjpzdHJpbmcgZXZlbnRQYXRoKGV2dC0+ZmluZFBhcmFtKCJERVZQQVRIIikgPyBldnQtPmZpbmRQYXJhbSgiREVWUEFUSCIpIDogIiIpOworICAgIHN0ZDo6c3RyaW5nIGRldlR5cGUoZXZ0LT5maW5kUGFyYW0oIkRFVlRZUEUiKSA/IGV2dC0+ZmluZFBhcmFtKCJERVZUWVBFIikgOiAiIik7CiAKICAgICBpZiAoZGV2VHlwZSAhPSAiZGlzayIpIHJldHVybjsKIApAQCAtMTkyLDQzICsxOTUsNDIgQEAKICAgICBkZXZfdCBkZXZpY2UgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CiAKICAgICBzd2l0Y2ggKGV2dC0+Z2V0QWN0aW9uKCkpIHsKLSAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQWRkOiB7Ci0gICAgICAgIGZvciAoY29uc3QgYXV0byYgc291cmNlIDogbURpc2tTb3VyY2VzKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlLT5tYXRjaGVzKGV2ZW50UGF0aCkpIHsKLSAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCBhc3N1bWUgdGhhdCBNTUMgYW5kIHZpcnRpby1ibGsgKHRoZSBsYXR0ZXIgaXMKLSAgICAgICAgICAgICAgICAvLyBlbXVsYXRvci1zcGVjaWZpYzsgc2VlIERpc2suY3BwIGZvciBkZXRhaWxzKSBkZXZpY2VzIGFyZSBTRCwKLSAgICAgICAgICAgICAgICAvLyBhbmQgdGhhdCBldmVyeXRoaW5nIGVsc2UgaXMgVVNCCi0gICAgICAgICAgICAgICAgaW50IGZsYWdzID0gc291cmNlLT5nZXRGbGFncygpOwotICAgICAgICAgICAgICAgIGlmIChtYWpvciA9PSBrTWFqb3JCbG9ja01tYwotICAgICAgICAgICAgICAgICAgICB8fCAoYW5kcm9pZDo6dm9sZDo6SXNSdW5uaW5nSW5FbXVsYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICYmIG1ham9yID49IChpbnQpIGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluCi0gICAgICAgICAgICAgICAgICAgICYmIG1ham9yIDw9IChpbnQpIGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWF4KSkgewotICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1NkOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprVXNiOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a0FkZDogeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzb3VyY2UgOiBtRGlza1NvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT5tYXRjaGVzKGV2ZW50UGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdywgYXNzdW1lIHRoYXQgTU1DIGFuZCB2aXJ0aW8tYmxrICh0aGUgbGF0dGVyIGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGVtdWxhdG9yLXNwZWNpZmljOyBzZWUgRGlzay5jcHAgZm9yIGRldGFpbHMpIGRldmljZXMgYXJlIFNELAorICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhhdCBldmVyeXRoaW5nIGVsc2UgaXMgVVNCCisgICAgICAgICAgICAgICAgICAgIGludCBmbGFncyA9IHNvdXJjZS0+Z2V0RmxhZ3MoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ham9yID09IGtNYWpvckJsb2NrTW1jIHx8IChhbmRyb2lkOjp2b2xkOjpJc1J1bm5pbmdJbkVtdWxhdG9yKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWpvciA+PSAoaW50KWtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFqb3IgPD0gKGludClrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IGFuZHJvaWQ6OnZvbGQ6OkRpc2s6OkZsYWdzOjprU2Q7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a1VzYjsKKyAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYXV0byBkaXNrID0gbmV3IGFuZHJvaWQ6OnZvbGQ6OkRpc2soZXZlbnRQYXRoLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPmdldE5pY2tuYW1lKCksIGZsYWdzKTsKLSAgICAgICAgICAgICAgICBoYW5kbGVEaXNrQWRkZWQoc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+KGRpc2spKTsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBkaXNrID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBhbmRyb2lkOjp2b2xkOjpEaXNrKGV2ZW50UGF0aCwgZGV2aWNlLCBzb3VyY2UtPmdldE5pY2tuYW1lKCksIGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRGlza0FkZGVkKHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPihkaXNrKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIE5ldGxpbmtFdmVudDo6QWN0aW9uOjprQ2hhbmdlOiB7Ci0gICAgICAgIExPRyhERUJVRykgPDwgIkRpc2sgYXQgIiA8PCBtYWpvciA8PCAiOiIgPDwgbWlub3IgPDwgIiBjaGFuZ2VkIjsKLSAgICAgICAgaGFuZGxlRGlza0NoYW5nZWQoZGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtSZW1vdmU6IHsKLSAgICAgICAgaGFuZGxlRGlza1JlbW92ZWQoZGV2aWNlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbmV4cGVjdGVkIGJsb2NrIGV2ZW50IGFjdGlvbiAiIDw8IChpbnQpIGV2dC0+Z2V0QWN0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KKyAgICAgICAgY2FzZSBOZXRsaW5rRXZlbnQ6OkFjdGlvbjo6a0NoYW5nZTogeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiRGlzayBhdCAiIDw8IG1ham9yIDw8ICI6IiA8PCBtaW5vciA8PCAiIGNoYW5nZWQiOworICAgICAgICAgICAgaGFuZGxlRGlza0NoYW5nZWQoZGV2aWNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgTmV0bGlua0V2ZW50OjpBY3Rpb246OmtSZW1vdmU6IHsKKyAgICAgICAgICAgIGhhbmRsZURpc2tSZW1vdmVkKGRldmljZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIlVuZXhwZWN0ZWQgYmxvY2sgZXZlbnQgYWN0aW9uICIgPDwgKGludClldnQtPmdldEFjdGlvbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTIzNyw3ICsyMzksNyBAQAogICAgIC8vIHVudGlsIHRoZSB1c2VyIHVubG9ja3MgdGhlIGRldmljZSB0byBhY3R1YWxseSB0b3VjaCBpdAogICAgIGlmIChtU2VjdXJlS2V5Z3VhcmRTaG93aW5nKSB7CiAgICAgICAgIExPRyhJTkZPKSA8PCAiRm91bmQgZGlzayBhdCAiIDw8IGRpc2stPmdldEV2ZW50UGF0aCgpCi0gICAgICAgICAgICAgICAgPDwgIiBidXQgZGVsYXlpbmcgc2NhbiBkdWUgdG8gc2VjdXJlIGtleWd1YXJkIjsKKyAgICAgICAgICAgICAgICAgIDw8ICIgYnV0IGRlbGF5aW5nIHNjYW4gZHVlIHRvIHNlY3VyZSBrZXlndWFyZCI7CiAgICAgICAgIG1QZW5kaW5nRGlza3MucHVzaF9iYWNrKGRpc2spOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRpc2stPmNyZWF0ZSgpOwpAQCAtMzA0LDYgKzMwNiwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIHZvbDsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHZvbCA6IG1TdHViVm9sdW1lcykgeworICAgICAgICBpZiAodm9sLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gdm9sOworICAgICAgICB9CisgICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgdm9sIDogbU9iYlZvbHVtZXMpIHsKICAgICAgICAgaWYgKHZvbC0+Z2V0SWQoKSA9PSBpZCkgewogICAgICAgICAgICAgcmV0dXJuIHZvbDsKQEAgLTMxMyw3ICszMjAsNyBAQAogfQogCiB2b2lkIFZvbHVtZU1hbmFnZXI6Omxpc3RWb2x1bWVzKGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U6OlR5cGUgdHlwZSwKLSAgICAgICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgbGlzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KSBjb25zdCB7CiAgICAgbGlzdC5jbGVhcigpOwogICAgIGZvciAoY29uc3QgYXV0byYgZGlzayA6IG1EaXNrcykgewogICAgICAgICBkaXNrLT5saXN0Vm9sdW1lcyh0eXBlLCBsaXN0KTsKQEAgLTMzMyw4ICszNDAsOCBAQAogICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5saW5rICIgPDwga2V5UGF0aDsKICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgIH0KLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgewotICAgICAgICBpZiAoIWU0Y3J5cHRfZGVzdHJveV92b2x1bWVfa2V5cyhmc1V1aWQpKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICAgICAgaWYgKCFmc2NyeXB0X2Rlc3Ryb3lfdm9sdW1lX2tleXMoZnNVdWlkKSkgewogICAgICAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwogICAgICAgICB9CiAgICAgfQpAQCAtNDEzLDMzICs0MjAsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IHVubW91bnRfdHJlZShjb25zdCBzdGQ6OnN0cmluZyYgcHJlZml4KSB7Ci0gICAgRklMRSogZnAgPSBzZXRtbnRlbnQoIi9wcm9jL21vdW50cyIsICJyIik7Ci0gICAgaWYgKGZwID09IE5VTEwpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9wcm9jL21vdW50cyI7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgLy8gU29tZSB2b2x1bWVzIGNhbiBiZSBzdGFja2VkIG9uIGVhY2ggb3RoZXIsIHNvIGZvcmNlIHVubW91bnQgaW4KLSAgICAvLyByZXZlcnNlIG9yZGVyIHRvIGdpdmUgdXMgdGhlIGJlc3QgY2hhbmNlIG9mIHN1Y2Nlc3MuCi0gICAgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiB0b1VubW91bnQ7Ci0gICAgbW50ZW50KiBtZW50cnk7Ci0gICAgd2hpbGUgKChtZW50cnkgPSBnZXRtbnRlbnQoZnApKSAhPSBOVUxMKSB7Ci0gICAgICAgIGF1dG8gdGVzdCA9IHN0ZDo6c3RyaW5nKG1lbnRyeS0+bW50X2RpcikgKyAiLyI7Ci0gICAgICAgIGlmIChhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHRlc3QsIHByZWZpeCkpIHsKLSAgICAgICAgICAgIHRvVW5tb3VudC5wdXNoX2Zyb250KHRlc3QpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVuZG1udGVudChmcCk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGggOiB0b1VubW91bnQpIHsKLSAgICAgICAgaWYgKHVtb3VudDIocGF0aC5jX3N0cigpLCBNTlRfREVUQUNIKSkgewotICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byB1bm1vdW50ICIgPDwgcGF0aDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogaW50IFZvbHVtZU1hbmFnZXI6OnJlbW91bnRVaWQodWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbW9kZSkgewogICAgIExPRyhERUJVRykgPDwgIlJlbW91bnRpbmcgIiA8PCB1aWQgPDwgIiBhcyBtb2RlICIgPDwgbW9kZTsKIApAQCAtNDk3LDcgKzQ3Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBXZSBwdXJwb3NlZnVsbHkgbGVhdmUgdGhlIG5hbWVzcGFjZSBvcGVuIGFjcm9zcyB0aGUgZm9yawotICAgICAgICBuc0ZkID0gb3BlbmF0KHBpZEZkLCAibnMvbW50IiwgT19SRE9OTFkpOyAvLyBub3QgT19DTE9FWEVDCisgICAgICAgIG5zRmQgPSBvcGVuYXQocGlkRmQsICJucy9tbnQiLCBPX1JET05MWSk7ICAvLyBub3QgT19DTE9FWEVDCiAgICAgICAgIGlmIChuc0ZkIDwgMCkgewogICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIG9wZW4gbmFtZXNwYWNlIGZvciAiIDw8IGRlLT5kX25hbWU7CiAgICAgICAgICAgICBnb3RvIG5leHQ7CkBAIC01MDksNyArNDg5LDcgQEAKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdW5tb3VudF90cmVlKCIvc3RvcmFnZS8iKTsKKyAgICAgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OlVubW91bnRUcmVlKCIvc3RvcmFnZS8iKTsKIAogICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3RvcmFnZVNvdXJjZTsKICAgICAgICAgICAgIGlmIChtb2RlID09ICJkZWZhdWx0IikgewpAQCAtNTIyLDI2ICs1MDIsMjIgQEAKICAgICAgICAgICAgICAgICAvLyBTYW5lIGRlZmF1bHQgb2Ygbm8gc3RvcmFnZSB2aXNpYmxlCiAgICAgICAgICAgICAgICAgX2V4aXQoMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKG1vdW50KHN0b3JhZ2VTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlIiwKLSAgICAgICAgICAgICAgICAgICAgTlVMTCwgTVNfQklORCB8IE1TX1JFQywgTlVMTCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHN0b3JhZ2VTb3VyY2UgPDwgIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgPDwgZGUtPmRfbmFtZTsKKyAgICAgICAgICAgIGlmIChURU1QX0ZBSUxVUkVfUkVUUlkoCisgICAgICAgICAgICAgICAgICAgIG1vdW50KHN0b3JhZ2VTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlIiwgTlVMTCwgTVNfQklORCB8IE1TX1JFQywgTlVMTCkpID09IC0xKSB7CisgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHN0b3JhZ2VTb3VyY2UgPDwgIiBmb3IgIiA8PCBkZS0+ZF9uYW1lOwogICAgICAgICAgICAgICAgIF9leGl0KDEpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWShtb3VudChOVUxMLCAiL3N0b3JhZ2UiLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICBNU19SRUMgfCBNU19TTEFWRSwgTlVMTCkpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBzZXQgTVNfU0xBVkUgdG8gL3N0b3JhZ2UgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IGRlLT5kX25hbWU7CisgICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKG1vdW50KE5VTEwsICIvc3RvcmFnZSIsIE5VTEwsIE1TX1JFQyB8IE1TX1NMQVZFLCBOVUxMKSkgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldCBNU19TTEFWRSB0byAvc3RvcmFnZSBmb3IgIiA8PCBkZS0+ZF9uYW1lOwogICAgICAgICAgICAgICAgIF9leGl0KDEpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBNb3VudCB1c2VyLXNwZWNpZmljIHN5bWxpbmsgaGVscGVyIGludG8gcGxhY2UKICAgICAgICAgICAgIHVzZXJpZF90IHVzZXJfaWQgPSBtdWx0aXVzZXJfZ2V0X3VzZXJfaWQodWlkKTsKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzZXJTb3VyY2UoU3RyaW5nUHJpbnRmKCIvbW50L3VzZXIvJWQiLCB1c2VyX2lkKSk7Ci0gICAgICAgICAgICBpZiAoVEVNUF9GQUlMVVJFX1JFVFJZKG1vdW50KHVzZXJTb3VyY2UuY19zdHIoKSwgIi9zdG9yYWdlL3NlbGYiLAotICAgICAgICAgICAgICAgICAgICBOVUxMLCBNU19CSU5ELCBOVUxMKSkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG1vdW50ICIgPDwgdXNlclNvdXJjZSA8PCAiIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCBkZS0+ZF9uYW1lOworICAgICAgICAgICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSgKKyAgICAgICAgICAgICAgICAgICAgbW91bnQodXNlclNvdXJjZS5jX3N0cigpLCAiL3N0b3JhZ2Uvc2VsZiIsIE5VTEwsIE1TX0JJTkQsIE5VTEwpKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbW91bnQgIiA8PCB1c2VyU291cmNlIDw8ICIgZm9yICIgPDwgZGUtPmRfbmFtZTsKICAgICAgICAgICAgICAgICBfZXhpdCgxKTsKICAgICAgICAgICAgIH0KIApAQCAtNTU1LDcgKzUzMSw3IEBACiAgICAgICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChjaGlsZCwgbnVsbHB0ciwgMCkpOwogICAgICAgICB9CiAKLW5leHQ6CisgICAgbmV4dDoKICAgICAgICAgY2xvc2UobnNGZCk7CiAgICAgICAgIGNsb3NlKHBpZEZkKTsKICAgICB9CkBAIC01ODMsNyArNTU5LDcgQEAKIC8vIENhbiBiZSBjYWxsZWQgdHdpY2UgKHNlcXVlbnRpYWxseSkgZHVyaW5nIHNodXRkb3duLiBzaG91bGQgYmUgc2FmZSBmb3IgdGhhdC4KIGludCBWb2x1bWVNYW5hZ2VyOjpzaHV0ZG93bigpIHsKICAgICBpZiAobUludGVybmFsRW11bGF0ZWQgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gMDsgLy8gYWxyZWFkeSBzaHV0ZG93bgorICAgICAgICByZXR1cm4gMDsgIC8vIGFscmVhZHkgc2h1dGRvd24KICAgICB9CiAgICAgYW5kcm9pZDo6dm9sZDo6c1NsZWVwT25Vbm1vdW50ID0gZmFsc2U7CiAgICAgbUludGVybmFsRW11bGF0ZWQtPmRlc3Ryb3koKTsKQEAgLTU5MSw2ICs1NjcsNyBAQAogICAgIGZvciAoY29uc3QgYXV0byYgZGlzayA6IG1EaXNrcykgewogICAgICAgICBkaXNrLT5kZXN0cm95KCk7CiAgICAgfQorICAgIG1TdHViVm9sdW1lcy5jbGVhcigpOwogICAgIG1EaXNrcy5jbGVhcigpOwogICAgIG1QZW5kaW5nRGlza3MuY2xlYXIoKTsKICAgICBhbmRyb2lkOjp2b2xkOjpzU2xlZXBPblVubW91bnQgPSB0cnVlOwpAQCAtNjA1LDEzICs1ODIsMTYgQEAKICAgICBpZiAobUludGVybmFsRW11bGF0ZWQgIT0gbnVsbHB0cikgewogICAgICAgICBtSW50ZXJuYWxFbXVsYXRlZC0+dW5tb3VudCgpOwogICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN0dWIgOiBtU3R1YlZvbHVtZXMpIHsKKyAgICAgICAgc3R1Yi0+dW5tb3VudCgpOworICAgIH0KICAgICBmb3IgKGNvbnN0IGF1dG8mIGRpc2sgOiBtRGlza3MpIHsKICAgICAgICAgZGlzay0+dW5tb3VudEFsbCgpOwogICAgIH0KIAogICAgIC8vIFdvcnN0IGNhc2Ugd2UgbWlnaHQgaGF2ZSBzb21lIHN0YWxlIG1vdW50cyBsdXJraW5nIGFyb3VuZCwgc28KICAgICAvLyBmb3JjZSB1bm1vdW50IHRob3NlIGp1c3QgdG8gYmUgc2FmZS4KLSAgICBGSUxFKiBmcCA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInIiKTsKKyAgICBGSUxFKiBmcCA9IHNldG1udGVudCgiL3Byb2MvbW91bnRzIiwgInJlIik7CiAgICAgaWYgKGZwID09IE5VTEwpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9wcm9jL21vdW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CkBAIC02MjMsOSArNjAzLDEyIEBACiAgICAgbW50ZW50KiBtZW50cnk7CiAgICAgd2hpbGUgKChtZW50cnkgPSBnZXRtbnRlbnQoZnApKSAhPSBOVUxMKSB7CiAgICAgICAgIGF1dG8gdGVzdCA9IHN0ZDo6c3RyaW5nKG1lbnRyeS0+bW50X2Rpcik7Ci0gICAgICAgIGlmICgoYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCAiL21udC8iKSAmJgotICAgICAgICAgICAgICFhbmRyb2lkOjpiYXNlOjpTdGFydHNXaXRoKHRlc3QsICIvbW50L3ZlbmRvciIpKSB8fAotICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6U3RhcnRzV2l0aCh0ZXN0LCAiL3N0b3JhZ2UvIikpIHsKKyAgICAgICAgaWYgKChTdGFydHNXaXRoKHRlc3QsICIvbW50LyIpICYmCisjaWZkZWYgX19BTkRST0lEX0RFQlVHR0FCTEVfXworICAgICAgICAgICAgICFTdGFydHNXaXRoKHRlc3QsICIvbW50L3NjcmF0Y2giKSAmJgorI2VuZGlmCisgICAgICAgICAgICAgIVN0YXJ0c1dpdGgodGVzdCwgIi9tbnQvdmVuZG9yIikgJiYgIVN0YXJ0c1dpdGgodGVzdCwgIi9tbnQvcHJvZHVjdCIpKSB8fAorICAgICAgICAgICAgU3RhcnRzV2l0aCh0ZXN0LCAiL3N0b3JhZ2UvIikpIHsKICAgICAgICAgICAgIHRvVW5tb3VudC5wdXNoX2Zyb250KHRlc3QpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjQxLDcgKzYyNCw3IEBACiAKIGludCBWb2x1bWVNYW5hZ2VyOjpta2RpcnMoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpIHsKICAgICAvLyBPbmx5IG9mZmVyIHRvIGNyZWF0ZSBkaXJlY3RvcmllcyBmb3IgcGF0aHMgbWFuYWdlZCBieSB2b2xkCi0gICAgaWYgKGFuZHJvaWQ6OmJhc2U6OlN0YXJ0c1dpdGgocGF0aCwgIi9zdG9yYWdlLyIpKSB7CisgICAgaWYgKFN0YXJ0c1dpdGgocGF0aCwgIi9zdG9yYWdlLyIpKSB7CiAgICAgICAgIC8vIGZzX21rZGlycygpIGRvZXMgc3ltbGluayBjaGVja2luZyBhbmQgcmVsYXRpdmUgcGF0aCBlbmZvcmNlbWVudAogICAgICAgICByZXR1cm4gZnNfbWtkaXJzKHBhdGguY19zdHIoKSwgMDcwMCk7CiAgICAgfSBlbHNlIHsKQEAgLTY1MCwxNTcgKzYzMywxMiBAQAogICAgIH0KIH0KIAotc3RhdGljIHNpemVfdCBrQXBwRnVzZU1heE1vdW50UG9pbnROYW1lID0gMzI7Ci0KLXN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBnZXRNb3VudFBhdGgodWlkX3QgdWlkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgc3RkOjpzdHJpbmcqIHBhdGgpIHsKLSAgICBpZiAobmFtZS5zaXplKCkgPiBrQXBwRnVzZU1heE1vdW50UG9pbnROYW1lKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkFwcEZ1c2UgbW91bnQgbmFtZSBpcyB0b28gbG9uZy4iOwotICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmICghaXNhbG51bShuYW1lW2ldKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQXBwRnVzZSBtb3VudCBuYW1lIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVyLiI7Ci0gICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAqcGF0aCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiL21udC9hcHBmdXNlLyVkXyVzIiwgdWlkLCBuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBhbmRyb2lkOjpPSzsKLX0KLQotc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IG1vdW50SW5OYW1lc3BhY2UodWlkX3QgdWlkLCBpbnQgZGV2aWNlX2ZkLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewotICAgIC8vIFJlbW92ZSBleGlzdGluZyBtb3VudC4KLSAgICBhbmRyb2lkOjp2b2xkOjpGb3JjZVVubW91bnQocGF0aCk7Ci0KLSAgICBjb25zdCBhdXRvIG9wdHMgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAiZmQ9JWksIgotICAgICAgICAgICAgInJvb3Rtb2RlPTQwMDAwLCIKLSAgICAgICAgICAgICJkZWZhdWx0X3Blcm1pc3Npb25zLCIKLSAgICAgICAgICAgICJhbGxvd19vdGhlciwiCi0gICAgICAgICAgICAidXNlcl9pZD0lZCxncm91cF9pZD0lZCwiCi0gICAgICAgICAgICAiY29udGV4dD1cInU6b2JqZWN0X3I6YXBwX2Z1c2VfZmlsZTpzMFwiLCIKLSAgICAgICAgICAgICJmc2NvbnRleHQ9dTpvYmplY3RfcjphcHBfZnVzZWZzOnMwIiwKLSAgICAgICAgICAgIGRldmljZV9mZCwKLSAgICAgICAgICAgIHVpZCwKLSAgICAgICAgICAgIHVpZCk7Ci0KLSAgICBjb25zdCBpbnQgcmVzdWx0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKG1vdW50KAotICAgICAgICAgICAgIi9kZXYvZnVzZSIsIHBhdGguY19zdHIoKSwgImZ1c2UiLAotICAgICAgICAgICAgTVNfTk9TVUlEIHwgTVNfTk9ERVYgfCBNU19OT0VYRUMgfCBNU19OT0FUSU1FLCBvcHRzLmNfc3RyKCkpKTsKLSAgICBpZiAocmVzdWx0ICE9IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBtb3VudCAiIDw8IHBhdGg7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwotfQotCi1zdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgcnVuQ29tbWFuZEluTmFtZXNwYWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBjb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXZpY2VfZmQpIHsKLSAgICBpZiAoREVCVUdfQVBQRlVTRSkgewotICAgICAgICBMT0coREVCVUcpIDw8ICJSdW4gYXBwIGZ1c2UgY29tbWFuZCAiIDw8IGNvbW1hbmQgPDwgIiBmb3IgdGhlIHBhdGggIiA8PCBwYXRoCi0gICAgICAgICAgICAgICAgICAgPDwgIiBpbiBuYW1lc3BhY2UgIiA8PCB1aWQ7Ci0gICAgfQotCi0gICAgdW5pcXVlX2ZkIGRpcihvcGVuKCIvcHJvYyIsIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkgfCBPX0NMT0VYRUMpKTsKLSAgICBpZiAoZGlyLmdldCgpID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvcHJvYyI7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgLy8gT2J0YWlucyBwcm9jZXNzIGZpbGUgZGVzY3JpcHRvci4KLSAgICBjb25zdCBzdGQ6OnN0cmluZyBwaWRfc3RyID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCIlZCIsIHBpZCk7Ci0gICAgY29uc3QgdW5pcXVlX2ZkIHBpZF9mZCgKLSAgICAgICAgICAgIG9wZW5hdChkaXIuZ2V0KCksIHBpZF9zdHIuY19zdHIoKSwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSB8IE9fQ0xPRVhFQykpOwotICAgIGlmIChwaWRfZmQuZ2V0KCkgPT0gLTEpIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIC9wcm9jLyIgPDwgcGlkOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIC8vIENoZWNrIFVJRCBvZiBwcm9jZXNzLgotICAgIHsKLSAgICAgICAgc3RydWN0IHN0YXQgc2I7Ci0gICAgICAgIGNvbnN0IGludCByZXN1bHQgPSBmc3RhdChwaWRfZmQuZ2V0KCksICZzYik7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKLSAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc3RhdCAvcHJvYy8iIDw8IHBpZDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHNiLnN0X3VpZCAhPSBBSURfU1lTVEVNKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJPbmx5IHN5c3RlbSBjYW4gbW91bnQgYXBwZnVzZS4gVUlEIGV4cGVjdGVkPSIgPDwgQUlEX1NZU1RFTQotICAgICAgICAgICAgICAgICAgICA8PCAiLCBhY3R1YWw9IiA8PCBzYi5zdF91aWQ7Ci0gICAgICAgICAgICByZXR1cm4gLUVQRVJNOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTWF0Y2hlcyBzbyBmYXIsIGJ1dCByZWZ1c2UgdG8gdG91Y2ggaWYgaW4gcm9vdCBuYW1lc3BhY2UKLSAgICB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJvb3ROYW1lOwotICAgICAgICBzdGQ6OnN0cmluZyBwaWROYW1lOwotICAgICAgICBpZiAoIWFuZHJvaWQ6OnZvbGQ6OlJlYWRsaW5rYXQoZGlyLmdldCgpLCAiMS9ucy9tbnQiLCAmcm9vdE5hbWUpCi0gICAgICAgICAgICAgICAgfHwgIWFuZHJvaWQ6OnZvbGQ6OlJlYWRsaW5rYXQocGlkX2ZkLmdldCgpLCAibnMvbW50IiwgJnBpZE5hbWUpKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlYWQgbmFtZXNwYWNlcyI7Ci0gICAgICAgICAgICByZXR1cm4gLUVQRVJNOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb290TmFtZSA9PSBwaWROYW1lKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJEb24ndCBtb3VudCBhcHBmdXNlIGluIHJvb3QgbmFtZXNwYWNlIjsKLSAgICAgICAgICAgIHJldHVybiAtRVBFUk07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBwdXJwb3NlZnVsbHkgbGVhdmUgdGhlIG5hbWVzcGFjZSBvcGVuIGFjcm9zcyB0aGUgZm9yawotICAgIHVuaXF1ZV9mZCBuc19mZChvcGVuYXQocGlkX2ZkLmdldCgpLCAibnMvbW50IiwgT19SRE9OTFkpKTsgLy8gbm90IE9fQ0xPRVhFQwotICAgIGlmIChuc19mZC5nZXQoKSA8IDApIHsKLSAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBvcGVuIG5hbWVzcGFjZSBmb3IgL3Byb2MvIiA8PCBwaWQgPDwgIi9ucy9tbnQiOwotICAgICAgICByZXR1cm4gLWVycm5vOwotICAgIH0KLQotICAgIGludCBjaGlsZCA9IGZvcmsoKTsKLSAgICBpZiAoY2hpbGQgPT0gMCkgewotICAgICAgICBpZiAoc2V0bnMobnNfZmQuZ2V0KCksIENMT05FX05FV05TKSAhPSAwKSB7Ci0gICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNldG5zIjsKLSAgICAgICAgICAgIF9leGl0KC1lcnJubyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29tbWFuZCA9PSAibW91bnQiKSB7Ci0gICAgICAgICAgICBfZXhpdChtb3VudEluTmFtZXNwYWNlKHVpZCwgZGV2aWNlX2ZkLCBwYXRoKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAidW5tb3VudCIpIHsKLSAgICAgICAgICAgIC8vIElmIGl0J3MganVzdCBhZnRlciBhbGwgRkQgb3BlbmVkIG9uIG1vdW50IHBvaW50IGFyZSBjbG9zZWQsIHVtb3VudDIgY2FuIGZhaWwgd2l0aAotICAgICAgICAgICAgLy8gRUJVU1kuIFRvIGF2b2lkIHRoZSBjYXNlLCBzcGVjaWZ5IE1OVF9ERVRBQ0guCi0gICAgICAgICAgICBpZiAodW1vdW50MihwYXRoLmNfc3RyKCksIFVNT1VOVF9OT0ZPTExPVyB8IE1OVF9ERVRBQ0gpICE9IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgZXJybm8gIT0gRUlOVkFMICYmIGVycm5vICE9IEVOT0VOVCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gdW5tb3VudCBkaXJlY3RvcnkuIjsKLSAgICAgICAgICAgICAgICBfZXhpdCgtZXJybm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJtZGlyKHBhdGguY19zdHIoKSkgIT0gMCkgewotICAgICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBtb3VudCBkaXJlY3RvcnkuIjsKLSAgICAgICAgICAgICAgICBfZXhpdCgtZXJybm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgX2V4aXQoYW5kcm9pZDo6T0spOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBhcHBmdXNlIGNvbW1hbmQgIiA8PCBjb21tYW5kOwotICAgICAgICAgICAgX2V4aXQoLUVQRVJNKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjaGlsZCA9PSAtMSkgewotICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZvbGsgY2hpbGQgcHJvY2VzcyI7Ci0gICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgfQotCi0gICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzOwotICAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKGNoaWxkLCAmc3RhdHVzLCAwKSk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCiBpbnQgVm9sdW1lTWFuYWdlcjo6Y3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LAotICAgICAgICBpbnQzMl90IG93bmVyR2lkLCBzdGQ6OnN0cmluZyogb3V0Vm9sSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBvd25lckdpZCwgc3RkOjpzdHJpbmcqIG91dFZvbElkKSB7CiAgICAgaW50IGlkID0gbU5leHRPYmJJZCsrOwogCiAgICAgYXV0byB2b2wgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCi0gICAgICAgICAgICBuZXcgYW5kcm9pZDo6dm9sZDo6T2JiVm9sdW1lKGlkLCBzb3VyY2VQYXRoLCBzb3VyY2VLZXksIG93bmVyR2lkKSk7CisgICAgICAgIG5ldyBhbmRyb2lkOjp2b2xkOjpPYmJWb2x1bWUoaWQsIHNvdXJjZVBhdGgsIHNvdXJjZUtleSwgb3duZXJHaWQpKTsKICAgICB2b2wtPmNyZWF0ZSgpOwogCiAgICAgbU9iYlZvbHVtZXMucHVzaF9iYWNrKHZvbCk7CkBAIC04MjEsNDQgKzY1OSw0MCBAQAogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAotaW50IFZvbHVtZU1hbmFnZXI6Om1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIHBpZF90IHBpZCwgaW50IG1vdW50SWQsCi0gICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZGV2aWNlX2ZkKSB7Ci0gICAgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6dG9fc3RyaW5nKG1vdW50SWQpOworaW50IFZvbHVtZU1hbmFnZXI6OmNyZWF0ZVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzTGFiZWwsIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCkgeworICAgIGludCBpZCA9IG1OZXh0U3R1YlZvbHVtZUlkKys7CisgICAgYXV0byB2b2wgPSBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6dm9sZDo6Vm9sdW1lQmFzZT4oCisgICAgICAgIG5ldyBhbmRyb2lkOjp2b2xkOjpTdHViVm9sdW1lKGlkLCBzb3VyY2VQYXRoLCBtb3VudFBhdGgsIGZzVHlwZSwgZnNVdWlkLCBmc0xhYmVsKSk7CisgICAgdm9sLT5jcmVhdGUoKTsKIAotICAgIC8vIENoZWNrIG1vdW50IHBvaW50IG5hbWUuCi0gICAgc3RkOjpzdHJpbmcgcGF0aDsKLSAgICBpZiAoZ2V0TW91bnRQYXRoKHVpZCwgbmFtZSwgJnBhdGgpICE9IGFuZHJvaWQ6Ok9LKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgbW91bnQgcG9pbnQgbmFtZSI7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvLyBDcmVhdGUgZGlyZWN0b3JpZXMuCi0gICAgY29uc3QgYW5kcm9pZDo6c3RhdHVzX3QgcmVzdWx0ID0gYW5kcm9pZDo6dm9sZDo6UHJlcGFyZURpcihwYXRoLCAwNzAwLCAwLCAwKTsKLSAgICBpZiAocmVzdWx0ICE9IGFuZHJvaWQ6Ok9LKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcHJlcGFyZSBkaXJlY3RvcnkgIiA8PCBwYXRoOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLy8gT3BlbiBkZXZpY2UgRkQuCi0gICAgZGV2aWNlX2ZkLT5yZXNldChvcGVuKCIvZGV2L2Z1c2UiLCBPX1JEV1IpKTsgLy8gbm90IE9fQ0xPRVhFQwotICAgIGlmIChkZXZpY2VfZmQtPmdldCgpID09IC0xKSB7Ci0gICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiAvZGV2L2Z1c2UiOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgLy8gTW91bnQuCi0gICAgcmV0dXJuIHJ1bkNvbW1hbmRJbk5hbWVzcGFjZSgibW91bnQiLCB1aWQsIHBpZCwgcGF0aCwgZGV2aWNlX2ZkLT5nZXQoKSk7CisgICAgbVN0dWJWb2x1bWVzLnB1c2hfYmFjayh2b2wpOworICAgICpvdXRWb2xJZCA9IHZvbC0+Z2V0SWQoKTsKKyAgICByZXR1cm4gYW5kcm9pZDo6T0s7CiB9CiAKLWludCBWb2x1bWVNYW5hZ2VyOjp1bm1vdW50QXBwRnVzZSh1aWRfdCB1aWQsIHBpZF90IHBpZCwgaW50IG1vdW50SWQpIHsKLSAgICBzdGQ6OnN0cmluZyBuYW1lID0gc3RkOjp0b19zdHJpbmcobW91bnRJZCk7Ci0KLSAgICAvLyBDaGVjayBtb3VudCBwb2ludCBuYW1lLgotICAgIHN0ZDo6c3RyaW5nIHBhdGg7Ci0gICAgaWYgKGdldE1vdW50UGF0aCh1aWQsIG5hbWUsICZwYXRoKSAhPSBhbmRyb2lkOjpPSykgewotICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIG1vdW50IHBvaW50IG5hbWUiOwotICAgICAgICByZXR1cm4gLTE7CitpbnQgVm9sdW1lTWFuYWdlcjo6ZGVzdHJveVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKSB7CisgICAgYXV0byBpID0gbVN0dWJWb2x1bWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGkgIT0gbVN0dWJWb2x1bWVzLmVuZCgpKSB7CisgICAgICAgIGlmICgoKmkpLT5nZXRJZCgpID09IHZvbElkKSB7CisgICAgICAgICAgICAoKmkpLT5kZXN0cm95KCk7CisgICAgICAgICAgICBpID0gbVN0dWJWb2x1bWVzLmVyYXNlKGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBhbmRyb2lkOjpPSzsKK30KIAotICAgIHJldHVybiBydW5Db21tYW5kSW5OYW1lc3BhY2UoInVubW91bnQiLCB1aWQsIHBpZCwgcGF0aCwgLTEgLyogZGV2aWNlX2ZkICovKTsKK2ludCBWb2x1bWVNYW5hZ2VyOjptb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBpbnQgbW91bnRJZCwgdW5pcXVlX2ZkKiBkZXZpY2VfZmQpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6dm9sZDo6TW91bnRBcHBGdXNlKHVpZCwgbW91bnRJZCwgZGV2aWNlX2ZkKTsKK30KKworaW50IFZvbHVtZU1hbmFnZXI6OnVubW91bnRBcHBGdXNlKHVpZF90IHVpZCwgaW50IG1vdW50SWQpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6dm9sZDo6VW5tb3VudEFwcEZ1c2UodWlkLCBtb3VudElkKTsKK30KKworaW50IFZvbHVtZU1hbmFnZXI6Om9wZW5BcHBGdXNlRmlsZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBpbnQgZmlsZUlkLCBpbnQgZmxhZ3MpIHsKKyAgICByZXR1cm4gYW5kcm9pZDo6dm9sZDo6T3BlbkFwcEZ1c2VGaWxlKHVpZCwgbW91bnRJZCwgZmlsZUlkLCBmbGFncyk7CiB9CmRpZmYgLS1naXQgYS9Wb2x1bWVNYW5hZ2VyLmggYi9Wb2x1bWVNYW5hZ2VyLmgKaW5kZXggZmI0NTVkOC4uZTBhMWJkNiAxMDA2NDQKLS0tIGEvVm9sdW1lTWFuYWdlci5oCisrKyBiL1ZvbHVtZU1hbmFnZXIuaApAQCAtMTcsOCArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX1ZPTERfVk9MVU1FX01BTkFHRVJfSAogI2RlZmluZSBBTkRST0lEX1ZPTERfVk9MVU1FX01BTkFHRVJfSAogCi0jaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxsaXN0PgpAQCAtMjksMjQgKzI5LDIyIEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvdW5pcXVlX2ZkLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPHN5c3V0aWxzL05ldGxpbmtFdmVudC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLSNpbmNsdWRlIDxzeXN1dGlscy9OZXRsaW5rRXZlbnQuaD4KIAogI2luY2x1ZGUgImFuZHJvaWQvb3MvSVZvbGRMaXN0ZW5lci5oIgogCiAjaW5jbHVkZSAibW9kZWwvRGlzay5oIgogI2luY2x1ZGUgIm1vZGVsL1ZvbHVtZUJhc2UuaCIKIAotI2RlZmluZSBERUJVR19BUFBGVVNFIDAKLQogY2xhc3MgVm9sdW1lTWFuYWdlciB7Ci1wcml2YXRlOgotICAgIHN0YXRpYyBWb2x1bWVNYW5hZ2VyICpzSW5zdGFuY2U7CisgIHByaXZhdGU6CisgICAgc3RhdGljIFZvbHVtZU1hbmFnZXIqIHNJbnN0YW5jZTsKIAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgbURlYnVnOworICAgIGJvb2wgbURlYnVnOwogCi1wdWJsaWM6CisgIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5Wb2x1bWVNYW5hZ2VyKCk7CiAKICAgICAvLyBUT0RPOiBwaXBlIGFsbCByZXF1ZXN0cyB0aHJvdWdoIFZNIHRvIGF2b2lkIGV4cG9zaW5nIHRoaXMgbG9jawpAQCAtNTQsMjcgKzUyLDI2IEBACiAgICAgc3RkOjptdXRleCYgZ2V0Q3J5cHRMb2NrKCkgeyByZXR1cm4gbUNyeXB0TG9jazsgfQogCiAgICAgdm9pZCBzZXRMaXN0ZW5lcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gbGlzdGVuZXIpIHsgbUxpc3RlbmVyID0gbGlzdGVuZXI7IH0KLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXIoKSB7IHJldHVybiBtTGlzdGVuZXI7IH0KKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gZ2V0TGlzdGVuZXIoKSBjb25zdCB7IHJldHVybiBtTGlzdGVuZXI7IH0KIAogICAgIGludCBzdGFydCgpOwogICAgIGludCBzdG9wKCk7CiAKLSAgICB2b2lkIGhhbmRsZUJsb2NrRXZlbnQoTmV0bGlua0V2ZW50ICpldnQpOworICAgIHZvaWQgaGFuZGxlQmxvY2tFdmVudChOZXRsaW5rRXZlbnQqIGV2dCk7CiAKICAgICBjbGFzcyBEaXNrU291cmNlIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIERpc2tTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKSA6Ci0gICAgICAgICAgICAgICAgbVN5c1BhdHRlcm4oc3lzUGF0dGVybiksIG1OaWNrbmFtZShuaWNrbmFtZSksIG1GbGFncyhmbGFncykgewotICAgICAgICB9CisgICAgICBwdWJsaWM6CisgICAgICAgIERpc2tTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHN5c1BhdHRlcm4sIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKQorICAgICAgICAgICAgOiBtU3lzUGF0dGVybihzeXNQYXR0ZXJuKSwgbU5pY2tuYW1lKG5pY2tuYW1lKSwgbUZsYWdzKGZsYWdzKSB7fQogCiAgICAgICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzdGQ6OnN0cmluZyYgc3lzUGF0aCkgewogICAgICAgICAgICAgcmV0dXJuICFmbm1hdGNoKG1TeXNQYXR0ZXJuLmNfc3RyKCksIHN5c1BhdGguY19zdHIoKSwgMCk7CiAgICAgICAgIH0KIAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0Tmlja25hbWUoKSB7IHJldHVybiBtTmlja25hbWU7IH0KLSAgICAgICAgaW50IGdldEZsYWdzKCkgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXROaWNrbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OaWNrbmFtZTsgfQorICAgICAgICBpbnQgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAotICAgIHByaXZhdGU6CisgICAgICBwcml2YXRlOgogICAgICAgICBzdGQ6OnN0cmluZyBtU3lzUGF0dGVybjsKICAgICAgICAgc3RkOjpzdHJpbmcgbU5pY2tuYW1lOwogICAgICAgICBpbnQgbUZsYWdzOwpAQCAtODUsNyArODIsNyBAQAogICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPiBmaW5kRGlzayhjb25zdCBzdGQ6OnN0cmluZyYgaWQpOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlPiBmaW5kVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCk7CiAKLSAgICB2b2lkIGxpc3RWb2x1bWVzKGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U6OlR5cGUgdHlwZSwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgbGlzdCk7CisgICAgdm9pZCBsaXN0Vm9sdW1lcyhhbmRyb2lkOjp2b2xkOjpWb2x1bWVCYXNlOjpUeXBlIHR5cGUsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGxpc3QpIGNvbnN0OwogCiAgICAgaW50IGZvcmdldFBhcnRpdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgcGFydEd1aWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1V1aWQpOwogCkBAIC0xMTAsNyArMTA3LDcgQEAKICAgICBpbnQgdXBkYXRlVmlydHVhbERpc2soKTsKICAgICBpbnQgc2V0RGVidWcoYm9vbCBlbmFibGUpOwogCi0gICAgc3RhdGljIFZvbHVtZU1hbmFnZXIgKkluc3RhbmNlKCk7CisgICAgc3RhdGljIFZvbHVtZU1hbmFnZXIqIEluc3RhbmNlKCk7CiAKICAgICAvKgogICAgICAqIEVuc3VyZSB0aGF0IGFsbCBkaXJlY3RvcmllcyBhbG9uZyBnaXZlbiBwYXRoIGV4aXN0LCBjcmVhdGluZyBwYXJlbnQKQEAgLTEyMiwxMyArMTE5LDE5IEBACiAgICAgaW50IG1rZGlycyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAKICAgICBpbnQgY3JlYXRlT2JiKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYga2V5LCBpbnQzMl90IG93bmVyR2lkLAotICAgICAgICAgICAgc3RkOjpzdHJpbmcqIG91dFZvbElkKTsKKyAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXRWb2xJZCk7CiAgICAgaW50IGRlc3Ryb3lPYmIoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAotICAgIGludCBtb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBwaWRfdCBwaWQsIGludCBtb3VudElkLCBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQqIGRldmljZV9mZCk7Ci0gICAgaW50IHVubW91bnRBcHBGdXNlKHVpZF90IHVpZCwgcGlkX3QgcGlkLCBpbnQgbW91bnRJZCk7CisgICAgaW50IGNyZWF0ZVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtb3VudFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZnNMYWJlbCwgc3RkOjpzdHJpbmcqIG91dFZvbElkKTsKKyAgICBpbnQgZGVzdHJveVN0dWJWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHZvbElkKTsKIAotcHJpdmF0ZToKKyAgICBpbnQgbW91bnRBcHBGdXNlKHVpZF90IHVpZCwgaW50IG1vdW50SWQsIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCogZGV2aWNlX2ZkKTsKKyAgICBpbnQgdW5tb3VudEFwcEZ1c2UodWlkX3QgdWlkLCBpbnQgbW91bnRJZCk7CisgICAgaW50IG9wZW5BcHBGdXNlRmlsZSh1aWRfdCB1aWQsIGludCBtb3VudElkLCBpbnQgZmlsZUlkLCBpbnQgZmxhZ3MpOworCisgIHByaXZhdGU6CiAgICAgVm9sdW1lTWFuYWdlcigpOwogICAgIHZvaWQgcmVhZEluaXRpYWxTdGF0ZSgpOwogCkBAIC0xNDcsNiArMTUwLDcgQEAKICAgICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OkRpc2s+PiBtRGlza3M7CiAgICAgc3RkOjpsaXN0PHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjp2b2xkOjpEaXNrPj4gbVBlbmRpbmdEaXNrczsKICAgICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+PiBtT2JiVm9sdW1lczsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+PiBtU3R1YlZvbHVtZXM7CiAKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dXNlcmlkX3QsIGludD4gbUFkZGVkVXNlcnM7CiAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVzZXJpZF90PiBtU3RhcnRlZFVzZXJzOwpAQCAtMTU3LDYgKzE2MSw3IEBACiAgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OnZvbGQ6OlZvbHVtZUJhc2U+IG1QcmltYXJ5OwogCiAgICAgaW50IG1OZXh0T2JiSWQ7CisgICAgaW50IG1OZXh0U3R1YlZvbHVtZUlkOwogICAgIGJvb2wgbVNlY3VyZUtleWd1YXJkU2hvd2luZzsKIH07CiAKZGlmZiAtLWdpdCBhL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwgYi9iaW5kZXIvYW5kcm9pZC9vcy9JVm9sZC5haWRsCmluZGV4IDgzMDBhOGUuLjk3NmVhYjEgMTAwNjQ0Ci0tLSBhL2JpbmRlci9hbmRyb2lkL29zL0lWb2xkLmFpZGwKKysrIGIvYmluZGVyL2FuZHJvaWQvb3MvSVZvbGQuYWlkbApAQCAtNDQsMjIgKzQ0LDIyIEBACiAgICAgdm9pZCBjaGVja0VuY3J5cHRpb24oQHV0ZjhJbkNwcCBTdHJpbmcgdm9sSWQpOwogCiAgICAgdm9pZCBtb3ZlU3RvcmFnZShAdXRmOEluQ3BwIFN0cmluZyBmcm9tVm9sSWQsIEB1dGY4SW5DcHAgU3RyaW5nIHRvVm9sSWQsCi0gICAgICAgICAgICBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CiAKICAgICB2b2lkIHJlbW91bnRVaWQoaW50IHVpZCwgaW50IHJlbW91bnRNb2RlKTsKIAogICAgIHZvaWQgbWtkaXJzKEB1dGY4SW5DcHAgU3RyaW5nIHBhdGgpOwogCi0gICAgQHV0ZjhJbkNwcCBTdHJpbmcgY3JlYXRlT2JiKEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZVBhdGgsCi0gICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VLZXksIGludCBvd25lckdpZCk7CisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgY3JlYXRlT2JiKEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZVBhdGgsIEB1dGY4SW5DcHAgU3RyaW5nIHNvdXJjZUtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG93bmVyR2lkKTsKICAgICB2b2lkIGRlc3Ryb3lPYmIoQHV0ZjhJbkNwcCBTdHJpbmcgdm9sSWQpOwogCiAgICAgdm9pZCBmc3RyaW0oaW50IGZzdHJpbUZsYWdzLCBJVm9sZFRhc2tMaXN0ZW5lciBsaXN0ZW5lcik7CiAgICAgdm9pZCBydW5JZGxlTWFpbnQoSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwogICAgIHZvaWQgYWJvcnRJZGxlTWFpbnQoSVZvbGRUYXNrTGlzdGVuZXIgbGlzdGVuZXIpOwogCi0gICAgRmlsZURlc2NyaXB0b3IgbW91bnRBcHBGdXNlKGludCB1aWQsIGludCBwaWQsIGludCBtb3VudElkKTsKLSAgICB2b2lkIHVubW91bnRBcHBGdXNlKGludCB1aWQsIGludCBwaWQsIGludCBtb3VudElkKTsKKyAgICBGaWxlRGVzY3JpcHRvciBtb3VudEFwcEZ1c2UoaW50IHVpZCwgaW50IG1vdW50SWQpOworICAgIHZvaWQgdW5tb3VudEFwcEZ1c2UoaW50IHVpZCwgaW50IG1vdW50SWQpOwogCiAgICAgdm9pZCBmZGVDaGVja1Bhc3N3b3JkKEB1dGY4SW5DcHAgU3RyaW5nIHBhc3N3b3JkKTsKICAgICB2b2lkIGZkZVJlc3RhcnQoKTsKQEAgLTg0LDE1ICs4NCwzNCBAQAogICAgIHZvaWQgY3JlYXRlVXNlcktleShpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgYm9vbGVhbiBlcGhlbWVyYWwpOwogICAgIHZvaWQgZGVzdHJveVVzZXJLZXkoaW50IHVzZXJJZCk7CiAKLSAgICB2b2lkIGFkZFVzZXJLZXlBdXRoKGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBAdXRmOEluQ3BwIFN0cmluZyB0b2tlbiwgQHV0ZjhJbkNwcCBTdHJpbmcgc2VjcmV0KTsKKyAgICB2b2lkIGFkZFVzZXJLZXlBdXRoKGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBAdXRmOEluQ3BwIFN0cmluZyB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CiAgICAgdm9pZCBmaXhhdGVOZXdlc3RVc2VyS2V5QXV0aChpbnQgdXNlcklkKTsKIAotICAgIHZvaWQgdW5sb2NrVXNlcktleShpbnQgdXNlcklkLCBpbnQgdXNlclNlcmlhbCwgQHV0ZjhJbkNwcCBTdHJpbmcgdG9rZW4sIEB1dGY4SW5DcHAgU3RyaW5nIHNlY3JldCk7CisgICAgdm9pZCB1bmxvY2tVc2VyS2V5KGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBAdXRmOEluQ3BwIFN0cmluZyB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgc2VjcmV0KTsKICAgICB2b2lkIGxvY2tVc2VyS2V5KGludCB1c2VySWQpOwogCi0gICAgdm9pZCBwcmVwYXJlVXNlclN0b3JhZ2UoQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nIHV1aWQsIGludCB1c2VySWQsIGludCB1c2VyU2VyaWFsLCBpbnQgc3RvcmFnZUZsYWdzKTsKKyAgICB2b2lkIHByZXBhcmVVc2VyU3RvcmFnZShAbnVsbGFibGUgQHV0ZjhJbkNwcCBTdHJpbmcgdXVpZCwgaW50IHVzZXJJZCwgaW50IHVzZXJTZXJpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0b3JhZ2VGbGFncyk7CiAgICAgdm9pZCBkZXN0cm95VXNlclN0b3JhZ2UoQG51bGxhYmxlIEB1dGY4SW5DcHAgU3RyaW5nIHV1aWQsIGludCB1c2VySWQsIGludCBzdG9yYWdlRmxhZ3MpOwogCisgICAgdm9pZCBzdGFydENoZWNrcG9pbnQoaW50IHJldHJ5KTsKKyAgICBib29sZWFuIG5lZWRzQ2hlY2twb2ludCgpOworICAgIGJvb2xlYW4gbmVlZHNSb2xsYmFjaygpOworICAgIHZvaWQgYWJvcnRDaGFuZ2VzKCk7CisgICAgdm9pZCBjb21taXRDaGFuZ2VzKCk7CisgICAgdm9pZCBwcmVwYXJlQ2hlY2twb2ludCgpOworICAgIHZvaWQgcmVzdG9yZUNoZWNrcG9pbnQoQHV0ZjhJbkNwcCBTdHJpbmcgZGV2aWNlKTsKKyAgICB2b2lkIG1hcmtCb290QXR0ZW1wdCgpOworCisgICAgQHV0ZjhJbkNwcCBTdHJpbmcgY3JlYXRlU3R1YlZvbHVtZShAdXRmOEluQ3BwIFN0cmluZyBzb3VyY2VQYXRoLAorICAgICAgICAgICAgQHV0ZjhJbkNwcCBTdHJpbmcgbW91bnRQYXRoLCBAdXRmOEluQ3BwIFN0cmluZyBmc1R5cGUsCisgICAgICAgICAgICBAdXRmOEluQ3BwIFN0cmluZyBmc1V1aWQsIEB1dGY4SW5DcHAgU3RyaW5nIGZzTGFiZWwpOworICAgIHZvaWQgZGVzdHJveVN0dWJWb2x1bWUoQHV0ZjhJbkNwcCBTdHJpbmcgdm9sSWQpOworCisgICAgRmlsZURlc2NyaXB0b3Igb3BlbkFwcEZ1c2VGaWxlKGludCB1aWQsIGludCBtb3VudElkLCBpbnQgZmlsZUlkLCBpbnQgZmxhZ3MpOworCiAgICAgY29uc3QgaW50IEVOQ1JZUFRJT05fRkxBR19OT19VSSA9IDQ7CiAKICAgICBjb25zdCBpbnQgRU5DUllQVElPTl9TVEFURV9OT05FID0gMTsKQEAgLTExMyw4ICsxMzIsOCBAQAogCiAgICAgY29uc3QgaW50IFBBU1NXT1JEX1RZUEVfUEFTU1dPUkQgPSAwOwogICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX0RFRkFVTFQgPSAxOwotICAgIGNvbnN0IGludCBQQVNTV09SRF9UWVBFX1BJTiA9IDI7Ci0gICAgY29uc3QgaW50IFBBU1NXT1JEX1RZUEVfUEFUVEVSTiA9IDM7CisgICAgY29uc3QgaW50IFBBU1NXT1JEX1RZUEVfUEFUVEVSTiA9IDI7CisgICAgY29uc3QgaW50IFBBU1NXT1JEX1RZUEVfUElOID0gMzsKIAogICAgIGNvbnN0IGludCBTVE9SQUdFX0ZMQUdfREUgPSAxOwogICAgIGNvbnN0IGludCBTVE9SQUdFX0ZMQUdfQ0UgPSAyOwpAQCAtMTM5LDQgKzE1OCw1IEBACiAgICAgY29uc3QgaW50IFZPTFVNRV9UWVBFX0VNVUxBVEVEID0gMjsKICAgICBjb25zdCBpbnQgVk9MVU1FX1RZUEVfQVNFQyA9IDM7CiAgICAgY29uc3QgaW50IFZPTFVNRV9UWVBFX09CQiA9IDQ7CisgICAgY29uc3QgaW50IFZPTFVNRV9UWVBFX1NUVUIgPSA1OwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRmcy5jcHAgYi9jcnlwdGZzLmNwcAppbmRleCBlMjA2ZDliLi5kNjYxOTUyIDEwMDY0NAotLS0gYS9jcnlwdGZzLmNwcAorKysgYi9jcnlwdGZzLmNwcApAQCAtMjAsNTUgKzIwLDYzIEBACiAgKgogICovCiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvd2FpdC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KLSNpbmNsdWRlIDxsaW51eC9kbS1pb2N0bC5oPgotI2luY2x1ZGUgPGxpYmdlbi5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2RlZmluZSBMT0dfVEFHICJDcnlwdGZzIgorCisjaW5jbHVkZSAiY3J5cHRmcy5oIgorCisjaW5jbHVkZSAiQ2hlY2twb2ludC5oIgorI2luY2x1ZGUgIkVuY3J5cHRJbnBsYWNlLmgiCisjaW5jbHVkZSAiRnNDcnlwdC5oIgorI2luY2x1ZGUgIktleW1hc3Rlci5oIgorI2luY2x1ZGUgIlByb2Nlc3MuaCIKKyNpbmNsdWRlICJTY3J5cHRQYXJhbWV0ZXJzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKKyNpbmNsdWRlICJzZWNvbnRleHQuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPGJvb3Rsb2FkZXJfbWVzc2FnZS9ib290bG9hZGVyX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYW5kcm9pZF9yZWJvb3QuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF91dGlscy5oPgorI2luY2x1ZGUgPGYyZnNfc3BhcnNlYmxvY2suaD4KKyNpbmNsdWRlIDxmc19tZ3IuaD4KKyNpbmNsdWRlIDxmc2NyeXB0L2ZzY3J5cHQuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9ldnAuaD4KICNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X3V0aWxzLmg+Ci0jaW5jbHVkZSA8bGludXgva2Rldl90Lmg+Ci0jaW5jbHVkZSA8ZnNfbWdyLmg+Ci0jaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KLSNpbmNsdWRlICJjcnlwdGZzLmgiCi0jaW5jbHVkZSAic2Vjb250ZXh0LmgiCi0jZGVmaW5lIExPR19UQUcgIkNyeXB0ZnMiCi0jaW5jbHVkZSAiY3V0aWxzL2xvZy5oIgotI2luY2x1ZGUgImN1dGlscy9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY3V0aWxzL2FuZHJvaWRfcmVib290LmgiCi0jaW5jbHVkZSAiaGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmgiCi0jaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+Ci0jaW5jbHVkZSAiU2NyeXB0UGFyYW1ldGVycy5oIgotI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJWb2xkVXRpbC5oIgotI2luY2x1ZGUgIkV4dDRDcnlwdC5oIgotI2luY2x1ZGUgImYyZnNfc3BhcnNlYmxvY2suaCIKLSNpbmNsdWRlICJFbmNyeXB0SW5wbGFjZS5oIgotI2luY2x1ZGUgIlByb2Nlc3MuaCIKLSNpbmNsdWRlICJLZXltYXN0ZXIuaCIKLSNpbmNsdWRlICJhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oIgotI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaCIKLSNpbmNsdWRlIDxib290bG9hZGVyX21lc3NhZ2UvYm9vdGxvYWRlcl9tZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpYmdlbi5oPgorI2luY2x1ZGUgPGxpbnV4L2RtLWlvY3RsLmg+CisjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKwogZXh0ZXJuICJDIiB7CiAjaW5jbHVkZSA8Y3J5cHRvX3NjcnlwdC5oPgogfQogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CiAKICNkZWZpbmUgVU5VU0VEIF9fYXR0cmlidXRlX18oKHVudXNlZCkpCiAKQEAgLTc4LDE0ICs4NiwxMiBAQAogCiBjb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTID0gMTY7CiBjb25zdGV4cHIgc2l6ZV90IElOVEVSTUVESUFURV9JVl9MRU5fQllURVMgPSAxNjsKLWNvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0JVRl9TSVpFID0KLSAgICAoSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMgKyBJTlRFUk1FRElBVEVfSVZfTEVOX0JZVEVTKTsKK2NvbnN0ZXhwciBzaXplX3QgSU5URVJNRURJQVRFX0JVRl9TSVpFID0gKElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTICsgSU5URVJNRURJQVRFX0lWX0xFTl9CWVRFUyk7CiAKIC8vIFNDUllQVF9MRU4gaXMgdXNlZCBieSBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBmb3IgaXRzIGludGVybWVkaWF0ZSBrZXkuCi1zdGF0aWNfYXNzZXJ0KElOVEVSTUVESUFURV9CVUZfU0laRSA9PSBTQ1JZUFRfTEVOLAotICAgICAgICAgICAgICAiTWlzbWF0Y2ggb2YgaW50ZXJtZWRpYXRlIGtleSBzaXplcyIpOworc3RhdGljX2Fzc2VydChJTlRFUk1FRElBVEVfQlVGX1NJWkUgPT0gU0NSWVBUX0xFTiwgIk1pc21hdGNoIG9mIGludGVybWVkaWF0ZSBrZXkgc2l6ZXMiKTsKIAotI2RlZmluZSBLRVlfSU5fRk9PVEVSICAiZm9vdGVyIgorI2RlZmluZSBLRVlfSU5fRk9PVEVSICJmb290ZXIiCiAKICNkZWZpbmUgREVGQVVMVF9QQVNTV09SRCAiZGVmYXVsdF9wYXNzd29yZCIKIApAQCAtMTExLDI3ICsxMTcsMjUgQEAKIHN0YXRpYyBpbnQgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpOwogCiBzdGF0aWMgdW5zaWduZWQgY2hhciBzYXZlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKLXN0YXRpYyBjaGFyICpzYXZlZF9tb3VudF9wb2ludDsKLXN0YXRpYyBpbnQgIG1hc3Rlcl9rZXlfc2F2ZWQgPSAwOwotc3RhdGljIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBlcnNpc3RfZGF0YSA9IE5VTEw7CitzdGF0aWMgY2hhciogc2F2ZWRfbW91bnRfcG9pbnQ7CitzdGF0aWMgaW50IG1hc3Rlcl9rZXlfc2F2ZWQgPSAwOworc3RhdGljIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBlcnNpc3RfZGF0YSA9IE5VTEw7CiAKIC8qIFNob3VsZCB3ZSB1c2Uga2V5bWFzdGVyPyAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCkgewogICAgIHJldHVybiBrZXltYXN0ZXJfY29tcGF0aWJpbGl0eV9jcnlwdGZzX3NjcnlwdCgpOwogfQogCiAvKiBDcmVhdGUgYSBuZXcga2V5bWFzdGVyIGtleSBhbmQgc3RvcmUgaXQgaW4gdGhpcyBmb290ZXIgKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0cikKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NyZWF0ZV9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIGlmIChmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpIHsKICAgICAgICAgU0xPR0koIkFscmVhZHkgaGF2ZSBrZXkiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaW50IHJjID0ga2V5bWFzdGVyX2NyZWF0ZV9rZXlfZm9yX2NyeXB0ZnNfc2NyeXB0KFJTQV9LRVlfU0laRSwgUlNBX0VYUE9ORU5ULAotICAgICAgICAgICAgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCwgZnRyLT5rZXltYXN0ZXJfYmxvYiwgS0VZTUFTVEVSX0JMT0JfU0laRSwKLSAgICAgICAgICAgICZmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpOworICAgIGludCByYyA9IGtleW1hc3Rlcl9jcmVhdGVfa2V5X2Zvcl9jcnlwdGZzX3NjcnlwdCgKKyAgICAgICAgUlNBX0tFWV9TSVpFLCBSU0FfRVhQT05FTlQsIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQsIGZ0ci0+a2V5bWFzdGVyX2Jsb2IsCisgICAgICAgIEtFWU1BU1RFUl9CTE9CX1NJWkUsICZmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUpOwogICAgIGlmIChyYykgewogICAgICAgICBpZiAoZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplID4gS0VZTUFTVEVSX0JMT0JfU0laRSkgewogICAgICAgICAgICAgU0xPR0UoIktleW1hc3RlciBrZXkgYmxvYiB0b28gbGFyZ2UiKTsKQEAgLTE0NCwxMiArMTQ4LDkgQEAKIH0KIAogLyogVGhpcyBzaWducyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBrZXltYXN0ZXIga2V5LiAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Qoc3RydWN0IGNyeXB0X21udF9mdHIgKmZ0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKipzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnNpZ25hdHVyZV9zaXplKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3Qoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwgY29uc3QgdW5zaWduZWQgY2hhciogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLCB1bnNpZ25lZCBjaGFyKiogc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBzaWduYXR1cmVfc2l6ZSkgewogICAgIHVuc2lnbmVkIGNoYXIgdG9fc2lnbltSU0FfS0VZX1NJWkVfQllURVNdOwogICAgIHNpemVfdCB0b19zaWduX3NpemUgPSBzaXplb2YodG9fc2lnbik7CiAgICAgbWVtc2V0KHRvX3NpZ24sIDAsIFJTQV9LRVlfU0laRV9CWVRFUyk7CkBAIC0yMjgsMjEgKzIyOSwyMCBAQAogc3RhdGljIGludCBwYXNzd29yZF9leHBpcnlfdGltZSA9IDA7CiBzdGF0aWMgY29uc3QgaW50IHBhc3N3b3JkX21heF9hZ2Vfc2Vjb25kcyA9IDYwOwogCi1lbnVtIGNsYXNzIFJlYm9vdFR5cGUge3JlYm9vdCwgcmVjb3ZlcnksIHNodXRkb3dufTsKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfcmVib290KFJlYm9vdFR5cGUgcnQpCi17Ci0gIHN3aXRjaCAocnQpIHsKLSAgICAgIGNhc2UgUmVib290VHlwZTo6cmVib290OgotICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290Iik7Ci0gICAgICAgICAgYnJlYWs7CitlbnVtIGNsYXNzIFJlYm9vdFR5cGUgeyByZWJvb3QsIHJlY292ZXJ5LCBzaHV0ZG93biB9Oworc3RhdGljIHZvaWQgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZSBydCkgeworICAgIHN3aXRjaCAocnQpIHsKKyAgICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWJvb3Q6CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInJlYm9vdCIpOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgIGNhc2UgUmVib290VHlwZTo6cmVjb3Zlcnk6Ci0gICAgICAgICAgcHJvcGVydHlfc2V0KEFORFJPSURfUkJfUFJPUEVSVFksICJyZWJvb3QscmVjb3ZlcnkiKTsKLSAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSZWJvb3RUeXBlOjpyZWNvdmVyeToKKyAgICAgICAgICAgIHByb3BlcnR5X3NldChBTkRST0lEX1JCX1BST1BFUlRZLCAicmVib290LHJlY292ZXJ5Iik7CisgICAgICAgICAgICBicmVhazsKIAotICAgICAgY2FzZSBSZWJvb3RUeXBlOjpzaHV0ZG93bjoKLSAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInNodXRkb3duIik7Ci0gICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUmVib290VHlwZTo6c2h1dGRvd246CisgICAgICAgICAgICBwcm9wZXJ0eV9zZXQoQU5EUk9JRF9SQl9QUk9QRVJUWSwgInNodXRkb3duIik7CisgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICBzbGVlcCgyMCk7CkBAIC0yNTEsOCArMjUxLDcgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGlvY3RsX2luaXQoc3RydWN0IGRtX2lvY3RsICppbywgc2l6ZV90IGRhdGFTaXplLCBjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBmbGFncykKLXsKK3N0YXRpYyB2b2lkIGlvY3RsX2luaXQoc3RydWN0IGRtX2lvY3RsKiBpbywgc2l6ZV90IGRhdGFTaXplLCBjb25zdCBjaGFyKiBuYW1lLCB1bnNpZ25lZCBmbGFncykgewogICAgIG1lbXNldChpbywgMCwgZGF0YVNpemUpOwogICAgIGlvLT5kYXRhX3NpemUgPSBkYXRhU2l6ZTsKICAgICBpby0+ZGF0YV9zdGFydCA9IHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpOwpAQCAtMjcwLDcgKzI2OSw3IEBACiBzdHJ1Y3QgQ3J5cHRvVHlwZTsKIAogLy8gVXNlIHRvIGdldCB0aGUgQ3J5cHRvVHlwZSBpbiB1c2Ugb24gdGhpcyBkZXZpY2UuCi1jb25zdCBDcnlwdG9UeXBlICZnZXRfY3J5cHRvX3R5cGUoKTsKK2NvbnN0IENyeXB0b1R5cGUmIGdldF9jcnlwdG9fdHlwZSgpOwogCiBzdHJ1Y3QgQ3J5cHRvVHlwZSB7CiAgICAgLy8gV2Ugc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0aW5nIENyeXB0b1R5cGVzIGFzIHBhcnQgb2YKQEAgLTI4Miw0MSArMjgxLDQwIEBACiAgICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X2tleXNpemUodWludDMyX3Qgc2l6ZSkgY29uc3QgewogICAgICAgICByZXR1cm4gQ3J5cHRvVHlwZSh0aGlzLT5wcm9wZXJ0eV9uYW1lLCB0aGlzLT5jcnlwdG9fbmFtZSwgc2l6ZSk7CiAgICAgfQotICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9wcm9wZXJ0eV9uYW1lKGNvbnN0IGNoYXIgKnByb3BlcnR5KSBjb25zdCB7CisgICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X3Byb3BlcnR5X25hbWUoY29uc3QgY2hhciogcHJvcGVydHkpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENyeXB0b1R5cGUocHJvcGVydHksIHRoaXMtPmNyeXB0b19uYW1lLCB0aGlzLT5rZXlzaXplKTsKICAgICB9Ci0gICAgY29uc3RleHByIENyeXB0b1R5cGUgc2V0X2NyeXB0b19uYW1lKGNvbnN0IGNoYXIgKmNyeXB0bykgY29uc3QgeworICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHNldF9jcnlwdG9fbmFtZShjb25zdCBjaGFyKiBjcnlwdG8pIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIENyeXB0b1R5cGUodGhpcy0+cHJvcGVydHlfbmFtZSwgY3J5cHRvLCB0aGlzLT5rZXlzaXplKTsKICAgICB9CiAKLSAgICBjb25zdGV4cHIgY29uc3QgY2hhciAqZ2V0X3Byb3BlcnR5X25hbWUoKSBjb25zdCB7IHJldHVybiBwcm9wZXJ0eV9uYW1lOyB9Ci0gICAgY29uc3RleHByIGNvbnN0IGNoYXIgKmdldF9jcnlwdG9fbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGNyeXB0b19uYW1lOyB9CisgICAgY29uc3RleHByIGNvbnN0IGNoYXIqIGdldF9wcm9wZXJ0eV9uYW1lKCkgY29uc3QgeyByZXR1cm4gcHJvcGVydHlfbmFtZTsgfQorICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBnZXRfY3J5cHRvX25hbWUoKSBjb25zdCB7IHJldHVybiBjcnlwdG9fbmFtZTsgfQogICAgIGNvbnN0ZXhwciB1aW50MzJfdCBnZXRfa2V5c2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGtleXNpemU7IH0KIAotIHByaXZhdGU6Ci0gICAgY29uc3QgY2hhciAqcHJvcGVydHlfbmFtZTsKLSAgICBjb25zdCBjaGFyICpjcnlwdG9fbmFtZTsKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyKiBwcm9wZXJ0eV9uYW1lOworICAgIGNvbnN0IGNoYXIqIGNyeXB0b19uYW1lOwogICAgIHVpbnQzMl90IGtleXNpemU7CiAKLSAgICBjb25zdGV4cHIgQ3J5cHRvVHlwZShjb25zdCBjaGFyICpwcm9wZXJ0eSwgY29uc3QgY2hhciAqY3J5cHRvLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtzaXplKQorICAgIGNvbnN0ZXhwciBDcnlwdG9UeXBlKGNvbnN0IGNoYXIqIHByb3BlcnR5LCBjb25zdCBjaGFyKiBjcnlwdG8sIHVpbnQzMl90IGtzaXplKQogICAgICAgICA6IHByb3BlcnR5X25hbWUocHJvcGVydHkpLCBjcnlwdG9fbmFtZShjcnlwdG8pLCBrZXlzaXplKGtzaXplKSB7fQotICAgIGZyaWVuZCBjb25zdCBDcnlwdG9UeXBlICZnZXRfY3J5cHRvX3R5cGUoKTsKLSAgICBzdGF0aWMgY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCk7CisgICAgZnJpZW5kIGNvbnN0IENyeXB0b1R5cGUmIGdldF9jcnlwdG9fdHlwZSgpOworICAgIHN0YXRpYyBjb25zdCBDcnlwdG9UeXBlJiBnZXRfZGV2aWNlX2NyeXB0b19hbGdvcml0aG0oKTsKIH07CiAKIC8vIFdlIG9ubHkgd2FudCB0byBwYXJzZSB0aGlzIHJlYWQtb25seSBwcm9wZXJ0eSBvbmNlLiAgQnV0IHdlIG5lZWQgdG8gd2FpdAogLy8gdW50aWwgdGhlIHN5c3RlbSBpcyBpbml0aWFsaXplZCBiZWZvcmUgd2UgY2FuIHJlYWQgaXQuICBTbyB3ZSB1c2UgYSBzdGF0aWMKIC8vIHNjb3BlZCB3aXRoaW4gdGhpcyBmdW5jdGlvbiB0byBnZXQgaXQgb25seSBvbmNlLgotY29uc3QgQ3J5cHRvVHlwZSAmZ2V0X2NyeXB0b190eXBlKCkgeworY29uc3QgQ3J5cHRvVHlwZSYgZ2V0X2NyeXB0b190eXBlKCkgewogICAgIHN0YXRpYyBDcnlwdG9UeXBlIGNyeXB0b190eXBlID0gQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCk7CiAgICAgcmV0dXJuIGNyeXB0b190eXBlOwogfQogCiBjb25zdGV4cHIgQ3J5cHRvVHlwZSBkZWZhdWx0X2NyeXB0b190eXBlID0gQ3J5cHRvVHlwZSgpCi0gICAgLnNldF9wcm9wZXJ0eV9uYW1lKCJBRVMtMTI4LUNCQyIpCi0gICAgLnNldF9jcnlwdG9fbmFtZSgiYWVzLWNiYy1lc3NpdjpzaGEyNTYiKQotICAgIC5zZXRfa2V5c2l6ZSgxNik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfcHJvcGVydHlfbmFtZSgiQUVTLTEyOC1DQkMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0X2NyeXB0b19uYW1lKCJhZXMtY2JjLWVzc2l2OnNoYTI1NiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRfa2V5c2l6ZSgxNik7CiAKIGNvbnN0ZXhwciBDcnlwdG9UeXBlIHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbXSA9IHsKICAgICBkZWZhdWx0X2NyeXB0b190eXBlLApAQCAtMzI3LDE5ICszMjUsMjAgQEAKICAgICAvLyBBZGQgbmV3IENyeXB0b1R5cGVzIGhlcmUuICBPcmRlciBpcyBub3QgaW1wb3J0YW50LgogfTsKIAotCiAvLyAtLS0tLS0tLS0tIFNUQVJUIENPTVBJTEUtVElNRSBTQU5JVFkgQ0hFQ0sgQkxPQ0sgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gV2UgY29uZmlybSBhbGwgc3VwcG9ydGVkX2NyeXB0b190eXBlcyBoYXZlIGEgc21hbGwgZW5vdWdoIGtleXNpemUgYW5kCiAvLyBoYWQgYm90aCBzZXRfcHJvcGVydHlfbmFtZSgpIGFuZCBzZXRfY3J5cHRvX25hbWUoKSBjYWxsZWQuCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciBzaXplX3QgYXJyYXlfbGVuZ3RoKFQgKCYpW05dKSB7IHJldHVybiBOOyB9Citjb25zdGV4cHIgc2l6ZV90IGFycmF5X2xlbmd0aChUICgmKVtOXSkgeworICAgIHJldHVybiBOOworfQogCiBjb25zdGV4cHIgYm9vbCBpbmRleE91dE9mQm91bmRzRm9yQ3J5cHRvVHlwZXMoc2l6ZV90IGluZGV4KSB7CiAgICAgcmV0dXJuIChpbmRleCA+PSBhcnJheV9sZW5ndGgoc3VwcG9ydGVkX2NyeXB0b190eXBlcykpOwogfQogCi1jb25zdGV4cHIgYm9vbCBpc1ZhbGlkQ3J5cHRvVHlwZShjb25zdCBDcnlwdG9UeXBlICZjcnlwdG9fdHlwZSkgeworY29uc3RleHByIGJvb2wgaXNWYWxpZENyeXB0b1R5cGUoY29uc3QgQ3J5cHRvVHlwZSYgY3J5cHRvX3R5cGUpIHsKICAgICByZXR1cm4gKChjcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpICE9IG51bGxwdHIpICYmCiAgICAgICAgICAgICAoY3J5cHRvX3R5cGUuZ2V0X2NyeXB0b19uYW1lKCkgIT0gbnVsbHB0cikgJiYKICAgICAgICAgICAgIChjcnlwdG9fdHlwZS5nZXRfa2V5c2l6ZSgpIDw9IE1BWF9LRVlfTEVOKSk7CkBAIC0zNTAsOCArMzQ5LDggQEAKIC8vIGJ1dCBpdCdzIGFzc2VydGluZyBhdCBjb21waWxlIHRpbWUgdGhhdCBhbGwgb2Ygb3VyIGtleSBsZW5ndGhzIGFyZSB2YWxpZC4KIGNvbnN0ZXhwciBib29sIHZhbGlkYXRlU3VwcG9ydGVkQ3J5cHRvVHlwZXMoc2l6ZV90IGluZGV4KSB7CiAgICAgcmV0dXJuIGluZGV4T3V0T2ZCb3VuZHNGb3JDcnlwdG9UeXBlcyhpbmRleCkgfHwKLSAgICAgICAgKGlzVmFsaWRDcnlwdG9UeXBlKHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbaW5kZXhdKSAmJgotICAgICAgICAgdmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcyhpbmRleCArIDEpKTsKKyAgICAgICAgICAgKGlzVmFsaWRDcnlwdG9UeXBlKHN1cHBvcnRlZF9jcnlwdG9fdHlwZXNbaW5kZXhdKSAmJgorICAgICAgICAgICAgdmFsaWRhdGVTdXBwb3J0ZWRDcnlwdG9UeXBlcyhpbmRleCArIDEpKTsKIH0KIAogc3RhdGljX2Fzc2VydCh2YWxpZGF0ZVN1cHBvcnRlZENyeXB0b1R5cGVzKDApLApAQCAtMzU5LDM0ICszNTgsMzAgQEAKICAgICAgICAgICAgICAgImluY29tcGxldGVseSBjb25zdHJ1Y3RlZC4iKTsKIC8vICAtLS0tLS0tLS0tIEVORCBDT01QSUxFLVRJTUUgU0FOSVRZIENIRUNLIEJMT0NLIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotCiAvLyBEb24ndCBjYWxsIHRoaXMgZGlyZWN0bHksIHVzZSBnZXRfY3J5cHRvX3R5cGUoKSwgd2hpY2ggY2FjaGVzIHRoaXMgcmVzdWx0LgotY29uc3QgQ3J5cHRvVHlwZSAmQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCkgeworY29uc3QgQ3J5cHRvVHlwZSYgQ3J5cHRvVHlwZTo6Z2V0X2RldmljZV9jcnlwdG9fYWxnb3JpdGhtKCkgewogICAgIGNvbnN0ZXhwciBjaGFyIENSWVBUX0FMR09fUFJPUFtdID0gInJvLmNyeXB0by5mZGVfYWxnb3JpdGhtIjsKICAgICBjaGFyIHBhcmFtc3RyW1BST1BFUlRZX1ZBTFVFX01BWF07CiAKLSAgICBwcm9wZXJ0eV9nZXQoQ1JZUFRfQUxHT19QUk9QLCBwYXJhbXN0ciwKLSAgICAgICAgICAgICAgICAgZGVmYXVsdF9jcnlwdG9fdHlwZS5nZXRfcHJvcGVydHlfbmFtZSgpKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJmN0eXBlIDogc3VwcG9ydGVkX2NyeXB0b190eXBlcykgeworICAgIHByb3BlcnR5X2dldChDUllQVF9BTEdPX1BST1AsIHBhcmFtc3RyLCBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOworICAgIGZvciAoYXV0byBjb25zdCYgY3R5cGUgOiBzdXBwb3J0ZWRfY3J5cHRvX3R5cGVzKSB7CiAgICAgICAgIGlmIChzdHJjbXAocGFyYW1zdHIsIGN0eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBjdHlwZTsKICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HRSgiSW52YWxpZCBuYW1lICglcykgZm9yICVzLiAgRGVmYXVsdGluZyB0byAlc1xuIiwgcGFyYW1zdHIsCi0gICAgICAgICAgQ1JZUFRfQUxHT19QUk9QLCBkZWZhdWx0X2NyeXB0b190eXBlLmdldF9wcm9wZXJ0eV9uYW1lKCkpOworICAgIEFMT0dFKCJJbnZhbGlkIG5hbWUgKCVzKSBmb3IgJXMuICBEZWZhdWx0aW5nIHRvICVzXG4iLCBwYXJhbXN0ciwgQ1JZUFRfQUxHT19QUk9QLAorICAgICAgICAgIGRlZmF1bHRfY3J5cHRvX3R5cGUuZ2V0X3Byb3BlcnR5X25hbWUoKSk7CiAgICAgcmV0dXJuIGRlZmF1bHRfY3J5cHRvX3R5cGU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCi0KLQogLyoqCiAgKiBHZXRzIHRoZSBkZWZhdWx0IGRldmljZSBzY3J5cHQgcGFyYW1ldGVycyBmb3Iga2V5IGRlcml2YXRpb24gdGltZSB0dW5pbmcuCiAgKiBUaGUgcGFyYW1ldGVycyBzaG91bGQgbGVhZCB0byBhYm91dCBvbmUgc2Vjb25kIGRlcml2YXRpb24gdGltZSBmb3IgdGhlCiAgKiBnaXZlbiBkZXZpY2UuCiAgKi8KLXN0YXRpYyB2b2lkIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyKSB7CitzdGF0aWMgdm9pZCBnZXRfZGV2aWNlX3NjcnlwdF9wYXJhbXMoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIGNoYXIgcGFyYW1zdHJbUFJPUEVSVFlfVkFMVUVfTUFYXTsKICAgICBpbnQgTmYsIHJmLCBwZjsKIApAQCAtNDA0LDE3ICszOTksMTYgQEAKICAgICByZXR1cm4gZ2V0X2NyeXB0b190eXBlKCkuZ2V0X2tleXNpemUoKTsKIH0KIAotY29uc3QgY2hhciAqY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSB7Citjb25zdCBjaGFyKiBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpIHsKICAgICByZXR1cm4gZ2V0X2NyeXB0b190eXBlKCkuZ2V0X2NyeXB0b19uYW1lKCk7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2ZzX3NpemUoY2hhciAqZGV2KQoteworc3RhdGljIHVpbnQ2NF90IGdldF9mc19zaXplKGNoYXIqIGRldikgewogICAgIGludCBmZCwgYmxvY2tfc2l6ZTsKICAgICBzdHJ1Y3QgZXh0NF9zdXBlcl9ibG9jayBzYjsKLSAgICBvZmY2NF90IGxlbjsKKyAgICB1aW50NjRfdCBsZW47CiAKLSAgICBpZiAoKGZkID0gb3BlbihkZXYsIE9fUkRPTkxZfE9fQ0xPRVhFQykpIDwgMCkgeworICAgIGlmICgoZmQgPSBvcGVuKGRldiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpKSA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGRldmljZSB0byBnZXQgZmlsZXN5c3RlbSBzaXplICIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC00MzcsNjggKzQzMSw1NyBAQAogICAgIH0KICAgICBibG9ja19zaXplID0gMTAyNCA8PCBzYi5zX2xvZ19ibG9ja19zaXplOwogICAgIC8qIGNvbXB1dGUgbGVuZ3RoIGluIGJ5dGVzICovCi0gICAgbGVuID0gKCAoKG9mZjY0X3Qpc2Iuc19ibG9ja3NfY291bnRfaGkgPDwgMzIpICsgc2Iuc19ibG9ja3NfY291bnRfbG8pICogYmxvY2tfc2l6ZTsKKyAgICBsZW4gPSAoKCh1aW50NjRfdClzYi5zX2Jsb2Nrc19jb3VudF9oaSA8PCAzMikgKyBzYi5zX2Jsb2Nrc19jb3VudF9sbykgKiBibG9ja19zaXplOwogCiAgICAgLyogcmV0dXJuIGxlbmd0aCBpbiBzZWN0b3JzICovCi0gICAgcmV0dXJuICh1bnNpZ25lZCBpbnQpIChsZW4gLyA1MTIpOworICAgIHJldHVybiBsZW4gLyA1MTI7CiB9CiAKLXN0YXRpYyBpbnQgZ2V0X2NyeXB0X2Z0cl9pbmZvKGNoYXIgKiptZXRhZGF0YV9mbmFtZSwgb2ZmNjRfdCAqb2ZmKQotewotICBzdGF0aWMgaW50IGNhY2hlZF9kYXRhID0gMDsKLSAgc3RhdGljIG9mZjY0X3QgY2FjaGVkX29mZiA9IDA7Ci0gIHN0YXRpYyBjaGFyIGNhY2hlZF9tZXRhZGF0YV9mbmFtZVtQUk9QRVJUWV9WQUxVRV9NQVhdID0gIiI7Ci0gIGludCBmZDsKLSAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gIGNoYXIgcmVhbF9ibGtkZXZbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgaW50IHJjID0gLTE7CitzdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfaW5mbyhjaGFyKiogbWV0YWRhdGFfZm5hbWUsIG9mZjY0X3QqIG9mZikgeworICAgIHN0YXRpYyBpbnQgY2FjaGVkX2RhdGEgPSAwOworICAgIHN0YXRpYyB1aW50NjRfdCBjYWNoZWRfb2ZmID0gMDsKKyAgICBzdGF0aWMgY2hhciBjYWNoZWRfbWV0YWRhdGFfZm5hbWVbUFJPUEVSVFlfVkFMVUVfTUFYXSA9ICIiOworICAgIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIgcmVhbF9ibGtkZXZbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpbnQgcmMgPSAtMTsKIAotICBpZiAoIWNhY2hlZF9kYXRhKSB7Ci0gICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIHJlYWxfYmxrZGV2LCBzaXplb2Yoa2V5X2xvYykpOworICAgIGlmICghY2FjaGVkX2RhdGEpIHsKKyAgICAgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIHJlYWxfYmxrZGV2LCBzaXplb2Yoa2V5X2xvYykpOwogCi0gICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKLSAgICAgIGlmICggKGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCkgewotICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gcmVhbCBibG9jayBkZXZpY2UgJXNcbiIsIHJlYWxfYmxrZGV2KTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotCi0gICAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgICAgaWYgKG5yX3NlYyAhPSAwKSB7Ci0gICAgICAgIC8qIElmIGl0J3MgYW4gZW5jcnlwdGVkIEFuZHJvaWQgcGFydGl0aW9uLCB0aGUgbGFzdCAxNiBLYnl0ZXMgY29udGFpbiB0aGUKLSAgICAgICAgICogZW5jcnlwdGlvbiBpbmZvIGZvb3RlciBhbmQga2V5LCBhbmQgcGxlbnR5IG9mIGJ5dGVzIHRvIHNwYXJlIGZvciBmdXR1cmUKLSAgICAgICAgICogZ3Jvd3RoLgotICAgICAgICAgKi8KLSAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIHJlYWxfYmxrZGV2LCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICAgIGNhY2hlZF9vZmYgPSAoKG9mZjY0X3QpbnJfc2VjICogNTEyKSAtIENSWVBUX0ZPT1RFUl9PRkZTRVQ7Ci0gICAgICAgIGNhY2hlZF9kYXRhID0gMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNMT0dFKCJDYW5ub3QgZ2V0IHNpemUgb2YgYmxvY2sgZGV2aWNlICVzXG4iLCByZWFsX2Jsa2Rldik7Ci0gICAgICB9Ci0gICAgICBjbG9zZShmZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN0cmxjcHkoY2FjaGVkX21ldGFkYXRhX2ZuYW1lLCBrZXlfbG9jLCBzaXplb2YoY2FjaGVkX21ldGFkYXRhX2ZuYW1lKSk7Ci0gICAgICBjYWNoZWRfb2ZmID0gMDsKLSAgICAgIGNhY2hlZF9kYXRhID0gMTsKKyAgICAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKKyAgICAgICAgICAgIGlmIChhbmRyb2lkOjp2b2xkOjpHZXRCbG9ja0RldlNpemUocmVhbF9ibGtkZXYsICZjYWNoZWRfb2ZmKSA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIC8qIElmIGl0J3MgYW4gZW5jcnlwdGVkIEFuZHJvaWQgcGFydGl0aW9uLCB0aGUgbGFzdCAxNiBLYnl0ZXMgY29udGFpbiB0aGUKKyAgICAgICAgICAgICAgICAgKiBlbmNyeXB0aW9uIGluZm8gZm9vdGVyIGFuZCBrZXksIGFuZCBwbGVudHkgb2YgYnl0ZXMgdG8gc3BhcmUgZm9yIGZ1dHVyZQorICAgICAgICAgICAgICAgICAqIGdyb3d0aC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBzdHJsY3B5KGNhY2hlZF9tZXRhZGF0YV9mbmFtZSwgcmVhbF9ibGtkZXYsIHNpemVvZihjYWNoZWRfbWV0YWRhdGFfZm5hbWUpKTsKKyAgICAgICAgICAgICAgICBjYWNoZWRfb2ZmIC09IENSWVBUX0ZPT1RFUl9PRkZTRVQ7CisgICAgICAgICAgICAgICAgY2FjaGVkX2RhdGEgPSAxOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RybGNweShjYWNoZWRfbWV0YWRhdGFfZm5hbWUsIGtleV9sb2MsIHNpemVvZihjYWNoZWRfbWV0YWRhdGFfZm5hbWUpKTsKKyAgICAgICAgICAgIGNhY2hlZF9vZmYgPSAwOworICAgICAgICAgICAgY2FjaGVkX2RhdGEgPSAxOworICAgICAgICB9CiAgICAgfQotICB9CiAKLSAgaWYgKGNhY2hlZF9kYXRhKSB7Ci0gICAgaWYgKG1ldGFkYXRhX2ZuYW1lKSB7Ci0gICAgICAgICptZXRhZGF0YV9mbmFtZSA9IGNhY2hlZF9tZXRhZGF0YV9mbmFtZTsKKyAgICBpZiAoY2FjaGVkX2RhdGEpIHsKKyAgICAgICAgaWYgKG1ldGFkYXRhX2ZuYW1lKSB7CisgICAgICAgICAgICAqbWV0YWRhdGFfZm5hbWUgPSBjYWNoZWRfbWV0YWRhdGFfZm5hbWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZikgeworICAgICAgICAgICAgKm9mZiA9IGNhY2hlZF9vZmY7CisgICAgICAgIH0KKyAgICAgICAgcmMgPSAwOwogICAgIH0KLSAgICBpZiAob2ZmKSB7Ci0gICAgICAgICpvZmYgPSBjYWNoZWRfb2ZmOwotICAgIH0KLSAgICByYyA9IDA7Ci0gIH0KIAotICByZXR1cm4gcmM7CisgICAgcmV0dXJuIHJjOwogfQogCiAvKiBTZXQgc2hhMjU2IGNoZWNrc3VtIGluIHN0cnVjdHVyZSAqLwotc3RhdGljIHZvaWQgc2V0X2Z0cl9zaGEoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKK3N0YXRpYyB2b2lkIHNldF9mdHJfc2hhKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBTSEEyNTZfQ1RYIGM7CiAgICAgU0hBMjU2X0luaXQoJmMpOwogICAgIG1lbXNldChjcnlwdF9mdHItPnNoYTI1NiwgMCwgc2l6ZW9mKGNyeXB0X2Z0ci0+c2hhMjU2KSk7CkBAIC01MDksODIgKzQ5Miw3NiBAQAogLyoga2V5IG9yIHNhbHQgY2FuIGJlIE5VTEwsIGluIHdoaWNoIGNhc2UganVzdCBza2lwIHdyaXRpbmcgdGhhdCB2YWx1ZS4gIFVzZWZ1bCB0bwogICogdXBkYXRlIHRoZSBmYWlsZWQgbW91bnQgY291bnQgYnV0IG5vdCBjaGFuZ2UgdGhlIGtleS4KICAqLwotc3RhdGljIGludCBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKLSAgaW50IGZkOwotICB1bnNpZ25lZCBpbnQgY250OwotICAvKiBzdGFydGluZ19vZmYgaXMgc2V0IHRvIHRoZSBTRUVLX1NFVCBvZmZzZXQKLSAgICogd2hlcmUgdGhlIGNyeXB0byBzdHJ1Y3R1cmUgc3RhcnRzCi0gICAqLwotICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKLSAgaW50IHJjID0gLTE7Ci0gIGNoYXIgKmZuYW1lID0gTlVMTDsKLSAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKK3N0YXRpYyBpbnQgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKKyAgICBpbnQgZmQ7CisgICAgdW5zaWduZWQgaW50IGNudDsKKyAgICAvKiBzdGFydGluZ19vZmYgaXMgc2V0IHRvIHRoZSBTRUVLX1NFVCBvZmZzZXQKKyAgICAgKiB3aGVyZSB0aGUgY3J5cHRvIHN0cnVjdHVyZSBzdGFydHMKKyAgICAgKi8KKyAgICBvZmY2NF90IHN0YXJ0aW5nX29mZjsKKyAgICBpbnQgcmMgPSAtMTsKKyAgICBjaGFyKiBmbmFtZSA9IE5VTEw7CisgICAgc3RydWN0IHN0YXQgc3RhdGJ1ZjsKIAotICBzZXRfZnRyX3NoYShjcnlwdF9mdHIpOworICAgIHNldF9mdHJfc2hhKGNyeXB0X2Z0cik7CiAKLSAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7Ci0gICAgU0xPR0UoIlVuYWJsZSB0byBnZXQgY3J5cHRfZnRyX2luZm9cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoZm5hbWVbMF0gIT0gJy8nKSB7Ci0gICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOwotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoIChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ1JFQVR8T19DTE9FWEVDLCAwNjAwKSkgPCAwKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBwdXRcbiIsIGZuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCi0gIGlmIChsc2VlazY0KGZkLCBzdGFydGluZ19vZmYsIFNFRUtfU0VUKSA9PSAtMSkgewotICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOwotICAgIGdvdG8gZXJyb3V0OwotICB9Ci0KLSAgaWYgKChjbnQgPSB3cml0ZShmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgewotICAgIFNMT0dFKCJDYW5ub3Qgd3JpdGUgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQotCi0gIGZzdGF0KGZkLCAmc3RhdGJ1Zik7Ci0gIC8qIElmIHRoZSBrZXlzIGFyZSBrZXB0IG9uIGEgcmF3IGJsb2NrIGRldmljZSwgZG8gbm90IHRyeSB0byB0cnVuY2F0ZSBpdC4gKi8KLSAgaWYgKFNfSVNSRUcoc3RhdGJ1Zi5zdF9tb2RlKSkgewotICAgIGlmIChmdHJ1bmNhdGUoZmQsIDB4NDAwMCkpIHsKLSAgICAgIFNMT0dFKCJDYW5ub3Qgc2V0IGZvb3RlciBmaWxlIHNpemVcbiIpOwotICAgICAgZ290byBlcnJvdXQ7CisgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbygmZm5hbWUsICZzdGFydGluZ19vZmYpKSB7CisgICAgICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKKyAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgfQorICAgIGlmIChmbmFtZVswXSAhPSAnLycpIHsKKyAgICAgICAgU0xPR0UoIlVuZXhwZWN0ZWQgdmFsdWUgZm9yIGNyeXB0byBrZXkgbG9jYXRpb25cbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICgoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19DTE9FWEVDLCAwNjAwKSkgPCAwKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBmb290ZXIgZmlsZSAlcyBmb3IgcHV0XG4iLCBmbmFtZSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CiAKLSAgLyogU3VjY2VzcyEgKi8KLSAgcmMgPSAwOworICAgIC8qIFNlZWsgdG8gdGhlIHN0YXJ0IG9mIHRoZSBjcnlwdCBmb290ZXIgKi8KKyAgICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlclxuIik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKworICAgIGlmICgoY250ID0gd3JpdGUoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKKyAgICAgICAgU0xPR0UoIkNhbm5vdCB3cml0ZSByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CisKKyAgICBmc3RhdChmZCwgJnN0YXRidWYpOworICAgIC8qIElmIHRoZSBrZXlzIGFyZSBrZXB0IG9uIGEgcmF3IGJsb2NrIGRldmljZSwgZG8gbm90IHRyeSB0byB0cnVuY2F0ZSBpdC4gKi8KKyAgICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpKSB7CisgICAgICAgIGlmIChmdHJ1bmNhdGUoZmQsIDB4NDAwMCkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2V0IGZvb3RlciBmaWxlIHNpemVcbiIpOworICAgICAgICAgICAgZ290byBlcnJvdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTdWNjZXNzISAqLworICAgIHJjID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7Ci0gIHJldHVybiByYzsKLQorICAgIGNsb3NlKGZkKTsKKyAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyBib29sIGNoZWNrX2Z0cl9zaGEoY29uc3Qgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikKLXsKK3N0YXRpYyBib29sIGNoZWNrX2Z0cl9zaGEoY29uc3Qgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNvcHk7CiAgICAgbWVtY3B5KCZjb3B5LCBjcnlwdF9mdHIsIHNpemVvZihjb3B5KSk7CiAgICAgc2V0X2Z0cl9zaGEoJmNvcHkpOwogICAgIHJldHVybiBtZW1jbXAoY29weS5zaGEyNTYsIGNyeXB0X2Z0ci0+c2hhMjU2LCBzaXplb2YoY29weS5zaGEyNTYpKSA9PSAwOwogfQogCi1zdGF0aWMgaW5saW5lIGludCB1bml4X3JlYWQoaW50ICBmZCwgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF9yZWFkKGludCBmZCwgdm9pZCogYnVmZiwgaW50IGxlbikgewogICAgIHJldHVybiBURU1QX0ZBSUxVUkVfUkVUUlkocmVhZChmZCwgYnVmZiwgbGVuKSk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IHVuaXhfd3JpdGUoaW50ICBmZCwgY29uc3Qgdm9pZCogIGJ1ZmYsIGludCAgbGVuKQoteworc3RhdGljIGlubGluZSBpbnQgdW5peF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQqIGJ1ZmYsIGludCBsZW4pIHsKICAgICByZXR1cm4gVEVNUF9GQUlMVVJFX1JFVFJZKHdyaXRlKGZkLCBidWZmLCBsZW4pKTsKIH0KIAotc3RhdGljIHZvaWQgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEoc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGEsIGludCBsZW4pCi17CitzdGF0aWMgdm9pZCBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShzdHJ1Y3QgY3J5cHRfcGVyc2lzdF9kYXRhKiBwZGF0YSwgaW50IGxlbikgewogICAgIG1lbXNldChwZGF0YSwgMCwgbGVuKTsKICAgICBwZGF0YS0+cGVyc2lzdF9tYWdpYyA9IFBFUlNJU1RfREFUQV9NQUdJQzsKICAgICBwZGF0YS0+cGVyc2lzdF92YWxpZF9lbnRyaWVzID0gMDsKQEAgLTU5NSwxOCArNTcyLDE3IEBACiAgKiBkYXRhLCBjcnlwdF9mdHIgaXMgYSBwb2ludGVyIHRvIHRoZSBzdHJ1Y3QgdG8gYmUgdXBkYXRlZCwgYW5kIG9mZnNldCBpcyB0aGUKICAqIGFic29sdXRlIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0X21udF9mdHIgb24gdGhlIHBhc3NlZCBpbiBmZC4KICAqLwotc3RhdGljIHZvaWQgdXBncmFkZV9jcnlwdF9mdHIoaW50IGZkLCBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyLCBvZmY2NF90IG9mZnNldCkKLXsKK3N0YXRpYyB2b2lkIHVwZ3JhZGVfY3J5cHRfZnRyKGludCBmZCwgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0ciwgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICBpbnQgb3JpZ19tYWpvciA9IGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbjsKICAgICBpbnQgb3JpZ19taW5vciA9IGNyeXB0X2Z0ci0+bWlub3JfdmVyc2lvbjsKIAogICAgIGlmICgoY3J5cHRfZnRyLT5tYWpvcl92ZXJzaW9uID09IDEpICYmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPT0gMCkpIHsKLSAgICAgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7CisgICAgICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhOwogICAgICAgICBvZmY2NF90IHBkYXRhX29mZnNldCA9IG9mZnNldCArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVDsKIAogICAgICAgICBTTE9HVygidXBncmFkaW5nIGNyeXB0byBmb290ZXIgdG8gMS4xIik7CiAKLSAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhICopbWFsbG9jKENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKKyAgICAgICAgcGRhdGEgPSAoY3J5cHRfcGVyc2lzdF9kYXRhKiltYWxsb2MoQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwogICAgICAgICBpZiAocGRhdGEgPT0gTlVMTCkgewogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBhbGxvY2F0ZSBwZXJzaXNlbnQgZGF0YVxuIik7CiAgICAgICAgICAgICByZXR1cm47CkBAIC02NTksOTEgKzYzNSw4OSBAQAogICAgIH0KIH0KIAorc3RhdGljIGludCBnZXRfY3J5cHRfZnRyX2FuZF9rZXkoc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgeworICAgIGludCBmZDsKKyAgICB1bnNpZ25lZCBpbnQgY250OworICAgIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOworICAgIGludCByYyA9IC0xOworICAgIGNoYXIqIGZuYW1lID0gTlVMTDsKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwogCi1zdGF0aWMgaW50IGdldF9jcnlwdF9mdHJfYW5kX2tleShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqY3J5cHRfZnRyKQotewotICBpbnQgZmQ7Ci0gIHVuc2lnbmVkIGludCBjbnQ7Ci0gIG9mZjY0X3Qgc3RhcnRpbmdfb2ZmOwotICBpbnQgcmMgPSAtMTsKLSAgY2hhciAqZm5hbWUgPSBOVUxMOwotICBzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworICAgIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgeworICAgICAgICBTTE9HRSgiVW5hYmxlIHRvIGdldCBjcnlwdF9mdHJfaW5mb1xuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKGZuYW1lWzBdICE9ICcvJykgeworICAgICAgICBTTE9HRSgiVW5leHBlY3RlZCB2YWx1ZSBmb3IgY3J5cHRvIGtleSBsb2NhdGlvblxuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKChmZCA9IG9wZW4oZm5hbWUsIE9fUkRXUiB8IE9fQ0xPRVhFQykpIDwgMCkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZm9vdGVyIGZpbGUgJXMgZm9yIGdldFxuIiwgZm5hbWUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIGlmIChnZXRfY3J5cHRfZnRyX2luZm8oJmZuYW1lLCAmc3RhcnRpbmdfb2ZmKSkgewotICAgIFNMT0dFKCJVbmFibGUgdG8gZ2V0IGNyeXB0X2Z0cl9pbmZvXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGZuYW1lWzBdICE9ICcvJykgewotICAgIFNMT0dFKCJVbmV4cGVjdGVkIHZhbHVlIGZvciBjcnlwdG8ga2V5IGxvY2F0aW9uXG4iKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCAoZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1J8T19DTE9FWEVDKSkgPCAwKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCBvcGVuIGZvb3RlciBmaWxlICVzIGZvciBnZXRcbiIsIGZuYW1lKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KKyAgICAvKiBNYWtlIHN1cmUgaXQncyAxNiBLYnl0ZXMgaW4gbGVuZ3RoICovCisgICAgZnN0YXQoZmQsICZzdGF0YnVmKTsKKyAgICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpICYmIChzdGF0YnVmLnN0X3NpemUgIT0gMHg0MDAwKSkgeworICAgICAgICBTTE9HRSgiZm9vdGVyIGZpbGUgJXMgaXMgbm90IHRoZSBleHBlY3RlZCBzaXplIVxuIiwgZm5hbWUpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogTWFrZSBzdXJlIGl0J3MgMTYgS2J5dGVzIGluIGxlbmd0aCAqLwotICBmc3RhdChmZCwgJnN0YXRidWYpOwotICBpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpICYmIChzdGF0YnVmLnN0X3NpemUgIT0gMHg0MDAwKSkgewotICAgIFNMT0dFKCJmb290ZXIgZmlsZSAlcyBpcyBub3QgdGhlIGV4cGVjdGVkIHNpemUhXG4iLCBmbmFtZSk7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvKiBTZWVrIHRvIHRoZSBzdGFydCBvZiB0aGUgY3J5cHQgZm9vdGVyICovCisgICAgaWYgKGxzZWVrNjQoZmQsIHN0YXJ0aW5nX29mZiwgU0VFS19TRVQpID09IC0xKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgc2VlayB0byByZWFsIGJsb2NrIGRldmljZSBmb290ZXJcbiIpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogU2VlayB0byB0aGUgc3RhcnQgb2YgdGhlIGNyeXB0IGZvb3RlciAqLwotICBpZiAobHNlZWs2NChmZCwgc3RhcnRpbmdfb2ZmLCBTRUVLX1NFVCkgPT0gLTEpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmICgoY250ID0gcmVhZChmZCwgY3J5cHRfZnRyLCBzaXplb2Yoc3RydWN0IGNyeXB0X21udF9mdHIpKSkgIT0gc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkgeworICAgICAgICBTTE9HRSgiQ2Fubm90IHJlYWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlmICggKGNudCA9IHJlYWQoZmQsIGNyeXB0X2Z0ciwgc2l6ZW9mKHN0cnVjdCBjcnlwdF9tbnRfZnRyKSkpICE9IHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpIHsKLSAgICBTTE9HRSgiQ2Fubm90IHJlYWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyXG4iKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmIChjcnlwdF9mdHItPm1hZ2ljICE9IENSWVBUX01OVF9NQUdJQykgeworICAgICAgICBTTE9HRSgiQmFkIG1hZ2ljIGZvciByZWFsIGJsb2NrIGRldmljZSAlc1xuIiwgZm5hbWUpOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgaWYgKGNyeXB0X2Z0ci0+bWFnaWMgIT0gQ1JZUFRfTU5UX01BR0lDKSB7Ci0gICAgU0xPR0UoIkJhZCBtYWdpYyBmb3IgcmVhbCBibG9jayBkZXZpY2UgJXNcbiIsIGZuYW1lKTsKLSAgICBnb3RvIGVycm91dDsKLSAgfQorICAgIGlmIChjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24gIT0gQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3QgdW5kZXJzdGFuZCBtYWpvciB2ZXJzaW9uICVkIHJlYWwgYmxvY2sgZGV2aWNlIGZvb3RlcjsgZXhwZWN0ZWQgJWRcbiIsCisgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWFqb3JfdmVyc2lvbiwgQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24gIT0gQ1VSUkVOVF9NQUpPUl9WRVJTSU9OKSB7Ci0gICAgU0xPR0UoIkNhbm5vdCB1bmRlcnN0YW5kIG1ham9yIHZlcnNpb24gJWQgcmVhbCBibG9jayBkZXZpY2UgZm9vdGVyOyBleHBlY3RlZCAlZFxuIiwKLSAgICAgICAgICBjcnlwdF9mdHItPm1ham9yX3ZlcnNpb24sIENVUlJFTlRfTUFKT1JfVkVSU0lPTik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvLyBXZSByaXNrIGJ1ZmZlciBvdmVyZmxvd3Mgd2l0aCBvdmVyc2l6ZWQga2V5cywgc28gd2UganVzdCByZWplY3QgdGhlbS4KKyAgICAvLyAwLXNpemVkIGtleXMgYXJlIHByb2JsZW1hdGljIChlc3NlbnRpYWxseSBieS1wYXNzaW5nIGVuY3J5cHRpb24pLCBhbmQKKyAgICAvLyBBRVMtQ0JDIGtleSB3cmFwcGluZyBvbmx5IHdvcmtzIGZvciBtdWx0aXBsZXMgb2YgMTYgYnl0ZXMuCisgICAgaWYgKChjcnlwdF9mdHItPmtleXNpemUgPT0gMCkgfHwgKChjcnlwdF9mdHItPmtleXNpemUgJSAxNikgIT0gMCkgfHwKKyAgICAgICAgKGNyeXB0X2Z0ci0+a2V5c2l6ZSA+IE1BWF9LRVlfTEVOKSkgeworICAgICAgICBTTE9HRSgKKyAgICAgICAgICAgICJJbnZhbGlkIGtleXNpemUgKCV1KSBmb3IgYmxvY2sgZGV2aWNlICVzOyBNdXN0IGJlIG5vbi16ZXJvLCAiCisgICAgICAgICAgICAiZGl2aXNpYmxlIGJ5IDE2LCBhbmQgPD0gJWRcbiIsCisgICAgICAgICAgICBjcnlwdF9mdHItPmtleXNpemUsIGZuYW1lLCBNQVhfS0VZX0xFTik7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvLyBXZSByaXNrIGJ1ZmZlciBvdmVyZmxvd3Mgd2l0aCBvdmVyc2l6ZWQga2V5cywgc28gd2UganVzdCByZWplY3QgdGhlbS4KLSAgLy8gMC1zaXplZCBrZXlzIGFyZSBwcm9ibGVtYXRpYyAoZXNzZW50aWFsbHkgYnktcGFzc2luZyBlbmNyeXB0aW9uKSwgYW5kCi0gIC8vIEFFUy1DQkMga2V5IHdyYXBwaW5nIG9ubHkgd29ya3MgZm9yIG11bHRpcGxlcyBvZiAxNiBieXRlcy4KLSAgaWYgKChjcnlwdF9mdHItPmtleXNpemUgPT0gMCkgfHwgKChjcnlwdF9mdHItPmtleXNpemUgJSAxNikgIT0gMCkgfHwKLSAgICAgIChjcnlwdF9mdHItPmtleXNpemUgPiBNQVhfS0VZX0xFTikpIHsKLSAgICBTTE9HRSgiSW52YWxpZCBrZXlzaXplICgldSkgZm9yIGJsb2NrIGRldmljZSAlczsgTXVzdCBiZSBub24temVybywgIgotICAgICAgICAgICJkaXZpc2libGUgYnkgMTYsIGFuZCA8PSAlZFxuIiwgY3J5cHRfZnRyLT5rZXlzaXplLCBmbmFtZSwKLSAgICAgICAgICBNQVhfS0VZX0xFTik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uID4gQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7CisgICAgICAgIFNMT0dXKCJXYXJuaW5nOiBjcnlwdG8gZm9vdGVyIG1pbm9yIHZlcnNpb24gJWQsIGV4cGVjdGVkIDw9ICVkLCBjb250aW51aW5nLi4uXG4iLAorICAgICAgICAgICAgICBjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24sIENVUlJFTlRfTUlOT1JfVkVSU0lPTik7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPiBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKLSAgICBTTE9HVygiV2FybmluZzogY3J5cHRvIGZvb3RlciBtaW5vciB2ZXJzaW9uICVkLCBleHBlY3RlZCA8PSAlZCwgY29udGludWluZy4uLlxuIiwKLSAgICAgICAgICBjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24sIENVUlJFTlRfTUlOT1JfVkVSU0lPTik7Ci0gIH0KKyAgICAvKiBJZiB0aGlzIGlzIGEgdmVyaW9uIDEuMCBjcnlwdF9mdHIsIG1ha2UgaXQgYSAxLjEgY3J5cHQgZm9vdGVyLCBhbmQgdXBkYXRlIHRoZQorICAgICAqIGNvcHkgb24gZGlzayBiZWZvcmUgcmV0dXJuaW5nLgorICAgICAqLworICAgIGlmIChjcnlwdF9mdHItPm1pbm9yX3ZlcnNpb24gPCBDVVJSRU5UX01JTk9SX1ZFUlNJT04pIHsKKyAgICAgICAgdXBncmFkZV9jcnlwdF9mdHIoZmQsIGNyeXB0X2Z0ciwgc3RhcnRpbmdfb2ZmKTsKKyAgICB9CiAKLSAgLyogSWYgdGhpcyBpcyBhIHZlcmlvbiAxLjAgY3J5cHRfZnRyLCBtYWtlIGl0IGEgMS4xIGNyeXB0IGZvb3RlciwgYW5kIHVwZGF0ZSB0aGUKLSAgICogY29weSBvbiBkaXNrIGJlZm9yZSByZXR1cm5pbmcuCi0gICAqLwotICBpZiAoY3J5cHRfZnRyLT5taW5vcl92ZXJzaW9uIDwgQ1VSUkVOVF9NSU5PUl9WRVJTSU9OKSB7Ci0gICAgdXBncmFkZV9jcnlwdF9mdHIoZmQsIGNyeXB0X2Z0ciwgc3RhcnRpbmdfb2ZmKTsKLSAgfQotCi0gIC8qIFN1Y2Nlc3MhICovCi0gIHJjID0gMDsKKyAgICAvKiBTdWNjZXNzISAqLworICAgIHJjID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7Ci0gIHJldHVybiByYzsKKyAgICBjbG9zZShmZCk7CisgICAgcmV0dXJuIHJjOwogfQogCi1zdGF0aWMgaW50IHZhbGlkYXRlX3BlcnNpc3RlbnRfZGF0YV9zdG9yYWdlKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17CitzdGF0aWMgaW50IHZhbGlkYXRlX3BlcnNpc3RlbnRfZGF0YV9zdG9yYWdlKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBpZiAoY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdICsgY3J5cHRfZnRyLT5wZXJzaXN0X2RhdGFfc2l6ZSA+CiAgICAgICAgIGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSkgewogICAgICAgICBTTE9HRSgiQ3J5cHRfZnRyIHBlcnNpc3QgZGF0YSByZWdpb25zIG92ZXJsYXAiKTsKQEAgLTc1Niw3ICs3MzAsNyBAQAogICAgIH0KIAogICAgIGlmICgoKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSArIGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX3NpemUpIC0KLSAgICAgICAgKGNyeXB0X2Z0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSAtIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCkpID4KKyAgICAgICAgIChjcnlwdF9mdHItPnBlcnNpc3RfZGF0YV9vZmZzZXRbMF0gLSBDUllQVF9GT09URVJfVE9fUEVSU0lTVF9PRkZTRVQpKSA+CiAgICAgICAgIENSWVBUX0ZPT1RFUl9PRkZTRVQpIHsKICAgICAgICAgU0xPR0UoIlBlcnNpc3RlbnQgZGF0YSBleHRlbmRzIHBhc3QgY3J5cHRvIGZvb3RlciIpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC03NjUsMTIgKzczOSwxMSBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGxvYWRfcGVyc2lzdGVudF9kYXRhKHZvaWQpCi17CitzdGF0aWMgaW50IGxvYWRfcGVyc2lzdGVudF9kYXRhKHZvaWQpIHsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGEgPSBOVUxMOworICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhID0gTlVMTDsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGNoYXIgKmZuYW1lOworICAgIGNoYXIqIGZuYW1lOwogICAgIGludCBmb3VuZCA9IDA7CiAgICAgaW50IGZkOwogICAgIGludCByZXQ7CkBAIC03ODEsMTAgKzc1NCw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotCiAgICAgLyogSWYgbm90IGVuY3J5cHRlZCwganVzdCBhbGxvY2F0ZSBhbiBlbXB0eSB0YWJsZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSopbWFsbG9jKENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKICAgICAgICAgaWYgKHBkYXRhKSB7CiAgICAgICAgICAgICBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShwZGF0YSwgQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOwpAQCAtNzk0LDEyICs3NjYsMTIgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgeworICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKQotICAgICAgICB8fCAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CisgICAgaWYgKChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA8IDEpIHx8CisgICAgICAgIChjcnlwdF9mdHIubWFqb3JfdmVyc2lvbiA9PSAxICYmIGNyeXB0X2Z0ci5taW5vcl92ZXJzaW9uIDwgMSkpIHsKICAgICAgICAgU0xPR0UoIkNyeXB0X2Z0ciB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTgxMyw3ICs3ODUsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JET05MWXxPX0NMT0VYRUMpOworICAgIGZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuICVzIG1ldGFkYXRhIGZpbGUiLCBmbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTgzMCw3ICs4MDIsNyBAQAogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZWVrIHRvIHJlYWQgcGVyc2lzdGVudCBkYXRhIG9uICVzIiwgZm5hbWUpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9Ci0gICAgICAgIGlmICh1bml4X3JlYWQoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIDwgMCl7CisgICAgICAgIGlmICh1bml4X3JlYWQoZmQsIHBkYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpIDwgMCkgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIHJlYWRpbmcgcGVyc2lzdGVudCBkYXRhIG9uIGl0ZXJhdGlvbiAlZCIsIGkpOwogICAgICAgICAgICAgZ290byBlcnIyOwogICAgICAgICB9CkBAIC04NTgsMTEgKzgzMCwxMCBAQAogICAgIHJldHVybiAtMTsKIH0KIAotc3RhdGljIGludCBzYXZlX3BlcnNpc3RlbnRfZGF0YSh2b2lkKQoteworc3RhdGljIGludCBzYXZlX3BlcnNpc3RlbnRfZGF0YSh2b2lkKSB7CiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwotICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEgKnBkYXRhOwotICAgIGNoYXIgKmZuYW1lOworICAgIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2RhdGEqIHBkYXRhOworICAgIGNoYXIqIGZuYW1lOwogICAgIG9mZjY0X3Qgd3JpdGVfb2Zmc2V0OwogICAgIG9mZjY0X3QgZXJhc2Vfb2Zmc2V0OwogICAgIGludCBmZDsKQEAgLTg3MywxMiArODQ0LDEyIEBACiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZihnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKKyAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAKLSAgICBpZiAoKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uIDwgMSkKLSAgICAgICAgfHwgKGNyeXB0X2Z0ci5tYWpvcl92ZXJzaW9uID09IDEgJiYgY3J5cHRfZnRyLm1pbm9yX3ZlcnNpb24gPCAxKSkgeworICAgIGlmICgoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPCAxKSB8fAorICAgICAgICAoY3J5cHRfZnRyLm1ham9yX3ZlcnNpb24gPT0gMSAmJiBjcnlwdF9mdHIubWlub3JfdmVyc2lvbiA8IDEpKSB7CiAgICAgICAgIFNMT0dFKCJDcnlwdF9mdHIgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC04OTIsNyArODYzLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAotICAgIGZkID0gb3BlbihmbmFtZSwgT19SRFdSfE9fQ0xPRVhFQyk7CisgICAgZmQgPSBvcGVuKGZuYW1lLCBPX1JEV1IgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA8IDApIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuICVzIG1ldGFkYXRhIGZpbGUiLCBmbmFtZSk7CiAgICAgICAgIHJldHVybiAtMTsKQEAgLTkxMCwyMCArODgxLDIwIEBACiAgICAgfQogCiAgICAgaWYgKHVuaXhfcmVhZChmZCwgcGRhdGEsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgPCAwKSB7Ci0gICAgICAgICAgICBTTE9HRSgiRXJyb3IgcmVhZGluZyBwZXJzaXN0ZW50IGRhdGEgYmVmb3JlIHNhdmUiKTsKLSAgICAgICAgICAgIGdvdG8gZXJyMjsKKyAgICAgICAgU0xPR0UoIkVycm9yIHJlYWRpbmcgcGVyc2lzdGVudCBkYXRhIGJlZm9yZSBzYXZlIik7CisgICAgICAgIGdvdG8gZXJyMjsKICAgICB9CiAKICAgICBpZiAocGRhdGEtPnBlcnNpc3RfbWFnaWMgPT0gUEVSU0lTVF9EQVRBX01BR0lDKSB7CiAgICAgICAgIC8qIFRoZSBmaXJzdCBjb3B5IGlzIHRoZSBjdXJlbnQgdmFsaWQgY29weSwgc28gd3JpdGUgdG8KICAgICAgICAgICogdGhlIHNlY29uZCBjb3B5IGFuZCBlcmFzZSB0aGlzIG9uZSAqLwotICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOwotICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOworICAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFsxXTsKKyAgICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMF07CiAgICAgfSBlbHNlIHsKICAgICAgICAgLyogVGhlIHNlY29uZCBjb3B5IG11c3QgYmUgdGhlIHZhbGlkIGNvcHksIHNvIHdyaXRlIHRvCiAgICAgICAgICAqIHRoZSBmaXJzdCBjb3B5LCBhbmQgZXJhc2UgdGhlIHNlY29uZCAqLwotICAgICAgIHdyaXRlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzBdOwotICAgICAgIGVyYXNlX29mZnNldCA9IGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdOworICAgICAgICB3cml0ZV9vZmZzZXQgPSBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX29mZnNldFswXTsKKyAgICAgICAgZXJhc2Vfb2Zmc2V0ID0gY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9vZmZzZXRbMV07CiAgICAgfQogCiAgICAgLyogV3JpdGUgdGhlIG5ldyBjb3B5IGZpcnN0LCBpZiBzdWNjZXNzZnVsLCB0aGVuIGVyYXNlIHRoZSBvbGQgY29weSAqLwpAQCAtOTMyLDE1ICs5MDMsMTQgQEAKICAgICAgICAgZ290byBlcnIyOwogICAgIH0KICAgICBpZiAodW5peF93cml0ZShmZCwgcGVyc2lzdF9kYXRhLCBjcnlwdF9mdHIucGVyc2lzdF9kYXRhX3NpemUpID09Ci0gICAgICAgIChpbnQpIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgeworICAgICAgICAoaW50KWNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgewogICAgICAgICBpZiAobHNlZWs2NChmZCwgZXJhc2Vfb2Zmc2V0LCBTRUVLX1NFVCkgPCAwKSB7CiAgICAgICAgICAgICBTTE9HRSgiQ2Fubm90IHNlZWsgdG8gZXJhc2UgcHJldmlvdXMgcGVyc2lzdGVudCBkYXRhIik7CiAgICAgICAgICAgICBnb3RvIGVycjI7CiAgICAgICAgIH0KICAgICAgICAgZnN5bmMoZmQpOwogICAgICAgICBtZW1zZXQocGRhdGEsIDAsIGNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSk7Ci0gICAgICAgIGlmICh1bml4X3dyaXRlKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSAhPQotICAgICAgICAgICAgKGludCkgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSB7CisgICAgICAgIGlmICh1bml4X3dyaXRlKGZkLCBwZGF0YSwgY3J5cHRfZnRyLnBlcnNpc3RfZGF0YV9zaXplKSAhPSAoaW50KWNyeXB0X2Z0ci5wZXJzaXN0X2RhdGFfc2l6ZSkgewogICAgICAgICAgICAgU0xPR0UoIkNhbm5vdCB3cml0ZSB0byBlcmFzZSBwcmV2aW91cyBwZXJzaXN0ZW50IGRhdGEiKTsKICAgICAgICAgICAgIGdvdG8gZXJyMjsKICAgICAgICAgfQpAQCAtOTY1LDg1ICs5MzUsODIgQEAKIC8qIENvbnZlcnQgYSBiaW5hcnkga2V5IG9mIHNwZWNpZmllZCBsZW5ndGggaW50byBhbiBhc2NpaSBoZXggc3RyaW5nIGVxdWl2YWxlbnQsCiAgKiB3aXRob3V0IHRoZSBsZWFkaW5nIDB4IGFuZCB3aXRoIG51bGwgdGVybWluYXRpb24KICAqLwotc3RhdGljIHZvaWQgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXNpemUsIGNoYXIgKm1hc3Rlcl9rZXlfYXNjaWkpIHsKK3N0YXRpYyB2b2lkIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShjb25zdCB1bnNpZ25lZCBjaGFyKiBtYXN0ZXJfa2V5LCB1bnNpZ25lZCBpbnQga2V5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBtYXN0ZXJfa2V5X2FzY2lpKSB7CiAgICAgdW5zaWduZWQgaW50IGksIGE7CiAgICAgdW5zaWduZWQgY2hhciBuaWJibGU7CiAKLSAgICBmb3IgKGk9MCwgYT0wOyBpPGtleXNpemU7IGkrKywgYSs9MikgeworICAgIGZvciAoaSA9IDAsIGEgPSAwOyBpIDwga2V5c2l6ZTsgaSsrLCBhICs9IDIpIHsKICAgICAgICAgLyogRm9yIGVhY2ggYnl0ZSwgd3JpdGUgb3V0IHR3byBhc2NpaSBoZXggZGlnaXRzICovCiAgICAgICAgIG5pYmJsZSA9IChtYXN0ZXJfa2V5W2ldID4+IDQpICYgMHhmOwogICAgICAgICBtYXN0ZXJfa2V5X2FzY2lpW2FdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CiAKICAgICAgICAgbmliYmxlID0gbWFzdGVyX2tleVtpXSAmIDB4ZjsKLSAgICAgICAgbWFzdGVyX2tleV9hc2NpaVthKzFdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CisgICAgICAgIG1hc3Rlcl9rZXlfYXNjaWlbYSArIDFdID0gbmliYmxlICsgKG5pYmJsZSA+IDkgPyAweDM3IDogMHgzMCk7CiAgICAgfQogCiAgICAgLyogQWRkIHRoZSBudWxsIHRlcm1pbmF0aW9uICovCiAgICAgbWFzdGVyX2tleV9hc2NpaVthXSA9ICdcMCc7Ci0KIH0KIAotc3RhdGljIGludCBsb2FkX2NyeXB0b19tYXBwaW5nX3RhYmxlKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKm1hc3Rlcl9rZXksIGNvbnN0IGNoYXIgKnJlYWxfYmxrX25hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludCBmZCwgY29uc3QgY2hhciAqZXh0cmFfcGFyYW1zKSB7Ci0gIGFsaWduYXMoc3RydWN0IGRtX2lvY3RsKSBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07Ci0gIHN0cnVjdCBkbV9pb2N0bCAqaW87Ci0gIHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqdGd0OwotICBjaGFyICpjcnlwdF9wYXJhbXM7Ci0gIC8vIFdlIG5lZWQgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IGVhY2ggYnl0ZSwgYW5kIG5lZWQgc3BhY2UgZm9yCi0gIC8vIHRoZSAnXDAnIHRlcm1pbmF0b3IuCi0gIGNoYXIgbWFzdGVyX2tleV9hc2NpaVtNQVhfS0VZX0xFTiAqIDIgKyAxXTsKLSAgc2l6ZV90IGJ1ZmZfb2Zmc2V0OwotICBpbnQgaTsKK3N0YXRpYyBpbnQgbG9hZF9jcnlwdG9fbWFwcGluZ190YWJsZShzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIG1hc3Rlcl9rZXksIGNvbnN0IGNoYXIqIHJlYWxfYmxrX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgaW50IGZkLCBjb25zdCBjaGFyKiBleHRyYV9wYXJhbXMpIHsKKyAgICBhbGlnbmFzKHN0cnVjdCBkbV9pb2N0bCkgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOworICAgIHN0cnVjdCBkbV9pb2N0bCogaW87CisgICAgc3RydWN0IGRtX3RhcmdldF9zcGVjKiB0Z3Q7CisgICAgY2hhciogY3J5cHRfcGFyYW1zOworICAgIC8vIFdlIG5lZWQgdHdvIEFTQ0lJIGNoYXJhY3RlcnMgdG8gcmVwcmVzZW50IGVhY2ggYnl0ZSwgYW5kIG5lZWQgc3BhY2UgZm9yCisgICAgLy8gdGhlICdcMCcgdGVybWluYXRvci4KKyAgICBjaGFyIG1hc3Rlcl9rZXlfYXNjaWlbTUFYX0tFWV9MRU4gKiAyICsgMV07CisgICAgc2l6ZV90IGJ1ZmZfb2Zmc2V0OworICAgIGludCBpOwogCi0gIGlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7CisgICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAKLSAgLyogTG9hZCB0aGUgbWFwcGluZyB0YWJsZSBmb3IgdGhpcyBkZXZpY2UgKi8KLSAgdGd0ID0gKHN0cnVjdCBkbV90YXJnZXRfc3BlYyAqKSAmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKKyAgICAvKiBMb2FkIHRoZSBtYXBwaW5nIHRhYmxlIGZvciB0aGlzIGRldmljZSAqLworICAgIHRndCA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3NwZWMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogCi0gIGlvY3RsX2luaXQoaW8sIERNX0NSWVBUX0JVRl9TSVpFLCBuYW1lLCAwKTsKLSAgaW8tPnRhcmdldF9jb3VudCA9IDE7Ci0gIHRndC0+c3RhdHVzID0gMDsKLSAgdGd0LT5zZWN0b3Jfc3RhcnQgPSAwOwotICB0Z3QtPmxlbmd0aCA9IGNyeXB0X2Z0ci0+ZnNfc2l6ZTsKLSAgc3RybGNweSh0Z3QtPnRhcmdldF90eXBlLCAiY3J5cHQiLCBETV9NQVhfVFlQRV9OQU1FKTsKKyAgICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7CisgICAgaW8tPnRhcmdldF9jb3VudCA9IDE7CisgICAgdGd0LT5zdGF0dXMgPSAwOworICAgIHRndC0+c2VjdG9yX3N0YXJ0ID0gMDsKKyAgICB0Z3QtPmxlbmd0aCA9IGNyeXB0X2Z0ci0+ZnNfc2l6ZTsKKyAgICBzdHJsY3B5KHRndC0+dGFyZ2V0X3R5cGUsICJjcnlwdCIsIERNX01BWF9UWVBFX05BTUUpOwogCi0gIGNyeXB0X3BhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7Ci0gIGNvbnZlcnRfa2V5X3RvX2hleF9hc2NpaShtYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUsIG1hc3Rlcl9rZXlfYXNjaWkpOworICAgIGNyeXB0X3BhcmFtcyA9IGJ1ZmZlciArIHNpemVvZihzdHJ1Y3QgZG1faW9jdGwpICsgc2l6ZW9mKHN0cnVjdCBkbV90YXJnZXRfc3BlYyk7CisgICAgY29udmVydF9rZXlfdG9faGV4X2FzY2lpKG1hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSwgbWFzdGVyX2tleV9hc2NpaSk7CiAKLSAgYnVmZl9vZmZzZXQgPSBjcnlwdF9wYXJhbXMgLSBidWZmZXI7Ci0gIFNMT0dJKCJFeHRyYSBwYXJhbWV0ZXJzIGZvciBkbV9jcnlwdDogJXNcbiIsIGV4dHJhX3BhcmFtcyk7Ci0gIHNucHJpbnRmKGNyeXB0X3BhcmFtcywgc2l6ZW9mKGJ1ZmZlcikgLSBidWZmX29mZnNldCwgIiVzICVzIDAgJXMgMCAlcyIsCi0gICAgICAgICAgIGNyeXB0X2Z0ci0+Y3J5cHRvX3R5cGVfbmFtZSwgbWFzdGVyX2tleV9hc2NpaSwgcmVhbF9ibGtfbmFtZSwKLSAgICAgICAgICAgZXh0cmFfcGFyYW1zKTsKLSAgY3J5cHRfcGFyYW1zICs9IHN0cmxlbihjcnlwdF9wYXJhbXMpICsgMTsKLSAgY3J5cHRfcGFyYW1zID0gKGNoYXIgKikgKCgodW5zaWduZWQgbG9uZyljcnlwdF9wYXJhbXMgKyA3KSAmIH44KTsgLyogQWxpZ24gdG8gYW4gOCBieXRlIGJvdW5kYXJ5ICovCi0gIHRndC0+bmV4dCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKKyAgICBidWZmX29mZnNldCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKKyAgICBTTE9HSSgiRXh0cmEgcGFyYW1ldGVycyBmb3IgZG1fY3J5cHQ6ICVzXG4iLCBleHRyYV9wYXJhbXMpOworICAgIHNucHJpbnRmKGNyeXB0X3BhcmFtcywgc2l6ZW9mKGJ1ZmZlcikgLSBidWZmX29mZnNldCwgIiVzICVzIDAgJXMgMCAlcyIsCisgICAgICAgICAgICAgY3J5cHRfZnRyLT5jcnlwdG9fdHlwZV9uYW1lLCBtYXN0ZXJfa2V5X2FzY2lpLCByZWFsX2Jsa19uYW1lLCBleHRyYV9wYXJhbXMpOworICAgIGNyeXB0X3BhcmFtcyArPSBzdHJsZW4oY3J5cHRfcGFyYW1zKSArIDE7CisgICAgY3J5cHRfcGFyYW1zID0KKyAgICAgICAgKGNoYXIqKSgoKHVuc2lnbmVkIGxvbmcpY3J5cHRfcGFyYW1zICsgNykgJiB+OCk7IC8qIEFsaWduIHRvIGFuIDggYnl0ZSBib3VuZGFyeSAqLworICAgIHRndC0+bmV4dCA9IGNyeXB0X3BhcmFtcyAtIGJ1ZmZlcjsKIAotICBmb3IgKGkgPSAwOyBpIDwgVEFCTEVfTE9BRF9SRVRSSUVTOyBpKyspIHsKLSAgICBpZiAoISBpb2N0bChmZCwgRE1fVEFCTEVfTE9BRCwgaW8pKSB7Ci0gICAgICBicmVhazsKKyAgICBmb3IgKGkgPSAwOyBpIDwgVEFCTEVfTE9BRF9SRVRSSUVTOyBpKyspIHsKKyAgICAgICAgaWYgKCFpb2N0bChmZCwgRE1fVEFCTEVfTE9BRCwgaW8pKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICB9Ci0gICAgdXNsZWVwKDUwMDAwMCk7Ci0gIH0KIAotICBpZiAoaSA9PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKLSAgICAvKiBXZSBmYWlsZWQgdG8gbG9hZCB0aGUgdGFibGUsIHJldHVybiBhbiBlcnJvciAqLwotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gaSArIDE7Ci0gIH0KKyAgICBpZiAoaSA9PSBUQUJMRV9MT0FEX1JFVFJJRVMpIHsKKyAgICAgICAgLyogV2UgZmFpbGVkIHRvIGxvYWQgdGhlIHRhYmxlLCByZXR1cm4gYW4gZXJyb3IgKi8KKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpICsgMTsKKyAgICB9CiB9CiAKLQotc3RhdGljIGludCBnZXRfZG1fY3J5cHRfdmVyc2lvbihpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsICBpbnQgKnZlcnNpb24pCi17CitzdGF0aWMgaW50IGdldF9kbV9jcnlwdF92ZXJzaW9uKGludCBmZCwgY29uc3QgY2hhciogbmFtZSwgaW50KiB2ZXJzaW9uKSB7CiAgICAgY2hhciBidWZmZXJbRE1fQ1JZUFRfQlVGX1NJWkVdOwotICAgIHN0cnVjdCBkbV9pb2N0bCAqaW87Ci0gICAgc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyAqdjsKKyAgICBzdHJ1Y3QgZG1faW9jdGwqIGlvOworICAgIHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMqIHY7CiAKLSAgICBpbyA9IChzdHJ1Y3QgZG1faW9jdGwgKikgYnVmZmVyOworICAgIGlvID0gKHN0cnVjdCBkbV9pb2N0bCopYnVmZmVyOwogCiAgICAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOwogCkBAIC0xMDU0LDE2ICsxMDIxLDE2IEBACiAgICAgLyogSXRlcmF0ZSBvdmVyIHRoZSByZXR1cm5lZCB2ZXJzaW9ucywgbG9va2luZyBmb3IgbmFtZSBvZiAiY3J5cHQiLgogICAgICAqIFdoZW4gZm91bmQsIGdldCBhbmQgcmV0dXJuIHRoZSB2ZXJzaW9uLgogICAgICAqLwotICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyAqKSAmYnVmZmVyW3NpemVvZihzdHJ1Y3QgZG1faW9jdGwpXTsKKyAgICB2ID0gKHN0cnVjdCBkbV90YXJnZXRfdmVyc2lvbnMqKSZidWZmZXJbc2l6ZW9mKHN0cnVjdCBkbV9pb2N0bCldOwogICAgIHdoaWxlICh2LT5uZXh0KSB7Ci0gICAgICAgIGlmICghIHN0cmNtcCh2LT5uYW1lLCAiY3J5cHQiKSkgeworICAgICAgICBpZiAoIXN0cmNtcCh2LT5uYW1lLCAiY3J5cHQiKSkgewogICAgICAgICAgICAgLyogV2UgZm91bmQgdGhlIGNyeXB0IGRyaXZlciwgcmV0dXJuIHRoZSB2ZXJzaW9uLCBhbmQgZ2V0IG91dCAqLwogICAgICAgICAgICAgdmVyc2lvblswXSA9IHYtPnZlcnNpb25bMF07CiAgICAgICAgICAgICB2ZXJzaW9uWzFdID0gdi0+dmVyc2lvblsxXTsKICAgICAgICAgICAgIHZlcnNpb25bMl0gPSB2LT52ZXJzaW9uWzJdOwogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgdiA9IChzdHJ1Y3QgZG1fdGFyZ2V0X3ZlcnNpb25zICopKCgoY2hhciAqKXYpICsgdi0+bmV4dCk7CisgICAgICAgIHYgPSAoc3RydWN0IGRtX3RhcmdldF92ZXJzaW9ucyopKCgoY2hhciopdikgKyB2LT5uZXh0KTsKICAgICB9CiAKICAgICByZXR1cm4gLTE7CkBAIC0xMTU3LDkxICsxMTI0LDkwIEBACiAgICAgICAgIGdvdG8gZXJyb3V0OwogICAgIH0KIAorICAgIC8qIEVuc3VyZSB0aGUgZG0gZGV2aWNlIGhhcyBiZWVuIGNyZWF0ZWQgYmVmb3JlIHJldHVybmluZy4gKi8KKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6V2FpdEZvckZpbGUoY3J5cHRvX2Jsa19uYW1lLCAxcykgPCAwKSB7CisgICAgICAgIC8vIFdhaXRGb3JGaWxlIGdlbmVyYXRlcyBhIHN1aXRhYmxlIGxvZyBtZXNzYWdlCisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KKwogICAgIC8qIFdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vIGVycm9ycy4gIFdvb3QhICovCiAgICAgcmV0dmFsID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7ICAgLyogSWYgZmQgaXMgPDAgZnJvbSBhIGZhaWxlZCBvcGVuIGNhbGwsIGl0J3Mgc2FmZSB0byBqdXN0IGlnbm9yZSB0aGUgY2xvc2UgZXJyb3IgKi8KKyAgICBjbG9zZShmZCk7IC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCiAKLSAgcmV0dXJuIHJldHZhbDsKKyAgICByZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IGRlbGV0ZV9jcnlwdG9fYmxrX2Rldihjb25zdCBjaGFyICpuYW1lKQotewotICBpbnQgZmQ7Ci0gIGNoYXIgYnVmZmVyW0RNX0NSWVBUX0JVRl9TSVpFXTsKLSAgc3RydWN0IGRtX2lvY3RsICppbzsKLSAgaW50IHJldHZhbCA9IC0xOworc3RhdGljIGludCBkZWxldGVfY3J5cHRvX2Jsa19kZXYoY29uc3QgY2hhciogbmFtZSkgeworICAgIGludCBmZDsKKyAgICBjaGFyIGJ1ZmZlcltETV9DUllQVF9CVUZfU0laRV07CisgICAgc3RydWN0IGRtX2lvY3RsKiBpbzsKKyAgICBpbnQgcmV0dmFsID0gLTE7CisgICAgaW50IGVycjsKIAotICBpZiAoKGZkID0gb3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSfE9fQ0xPRVhFQykpIDwgMCApIHsKLSAgICBTTE9HRSgiQ2Fubm90IG9wZW4gZGV2aWNlLW1hcHBlclxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpZiAoKGZkID0gb3BlbigiL2Rldi9kZXZpY2UtbWFwcGVyIiwgT19SRFdSIHwgT19DTE9FWEVDKSkgPCAwKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3Qgb3BlbiBkZXZpY2UtbWFwcGVyXG4iKTsKKyAgICAgICAgZ290byBlcnJvdXQ7CisgICAgfQogCi0gIGlvID0gKHN0cnVjdCBkbV9pb2N0bCAqKSBidWZmZXI7CisgICAgaW8gPSAoc3RydWN0IGRtX2lvY3RsKilidWZmZXI7CiAKLSAgaW9jdGxfaW5pdChpbywgRE1fQ1JZUFRfQlVGX1NJWkUsIG5hbWUsIDApOwotICBpZiAoaW9jdGwoZmQsIERNX0RFVl9SRU1PVkUsIGlvKSkgewotICAgIFNMT0dFKCJDYW5ub3QgcmVtb3ZlIGRtLWNyeXB0IGRldmljZVxuIik7Ci0gICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICBpb2N0bF9pbml0KGlvLCBETV9DUllQVF9CVUZfU0laRSwgbmFtZSwgMCk7CisgICAgZXJyID0gaW9jdGwoZmQsIERNX0RFVl9SRU1PVkUsIGlvKTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIFNMT0dFKCJDYW5ub3QgcmVtb3ZlIGRtLWNyeXB0IGRldmljZSAlczogJXNcbiIsIG5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIGdvdG8gZXJyb3V0OworICAgIH0KIAotICAvKiBXZSBtYWRlIGl0IGhlcmUgd2l0aCBubyBlcnJvcnMuICBXb290ISAqLwotICByZXR2YWwgPSAwOworICAgIC8qIFdlIG1hZGUgaXQgaGVyZSB3aXRoIG5vIGVycm9ycy4gIFdvb3QhICovCisgICAgcmV0dmFsID0gMDsKIAogZXJyb3V0OgotICBjbG9zZShmZCk7ICAgIC8qIElmIGZkIGlzIDwwIGZyb20gYSBmYWlsZWQgb3BlbiBjYWxsLCBpdCdzIHNhZmUgdG8ganVzdCBpZ25vcmUgdGhlIGNsb3NlIGVycm9yICovCisgICAgY2xvc2UoZmQpOyAvKiBJZiBmZCBpcyA8MCBmcm9tIGEgZmFpbGVkIG9wZW4gY2FsbCwgaXQncyBzYWZlIHRvIGp1c3QgaWdub3JlIHRoZSBjbG9zZSBlcnJvciAqLwogCi0gIHJldHVybiByZXR2YWw7Ci0KKyAgICByZXR1cm4gcmV0dmFsOwogfQogCi1zdGF0aWMgaW50IHBia2RmMihjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMgVU5VU0VEKQoteworc3RhdGljIGludCBwYmtkZjIoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LCB1bnNpZ25lZCBjaGFyKiBpa2V5LAorICAgICAgICAgICAgICAgICAgdm9pZCogcGFyYW1zIFVOVVNFRCkgewogICAgIFNMT0dJKCJVc2luZyBwYmtkZjIgZm9yIGNyeXB0ZnMgS0RGIik7CiAKICAgICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGEga2V5IGFuZCBJViB0aGF0IGNhbiBkZWNyeXB0IHRoZSBtYXN0ZXIga2V5ICovCi0gICAgcmV0dXJuIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEocGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFTSF9DT1VOVCwgSU5URVJNRURJQVRFX0JVRl9TSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkpICE9IDE7CisgICAgcmV0dXJuIFBLQ1M1X1BCS0RGMl9ITUFDX1NIQTEocGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sIEhBU0hfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFLCBpa2V5KSAhPSAxOwogfQogCi1zdGF0aWMgaW50IHNjcnlwdChjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNhbHQsCi0gICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMpCi17CitzdGF0aWMgaW50IHNjcnlwdChjb25zdCBjaGFyKiBwYXNzd2QsIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNhbHQsIHVuc2lnbmVkIGNoYXIqIGlrZXksIHZvaWQqIHBhcmFtcykgewogICAgIFNMT0dJKCJVc2luZyBzY3J5cHQgZm9yIGNyeXB0ZnMgS0RGIik7CiAKLSAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyICopIHBhcmFtczsKKyAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyKilwYXJhbXM7CiAKICAgICBpbnQgTiA9IDEgPDwgZnRyLT5OX2ZhY3RvcjsKICAgICBpbnQgciA9IDEgPDwgZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgZnRyLT5wX2ZhY3RvcjsKIAogICAgIC8qIFR1cm4gdGhlIHBhc3N3b3JkIGludG8gYSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgICBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLAotICAgICAgICAgICAgICAgICAgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCisgICAgY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCiAgICAgICAgICAgICAgICAgICBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOwogCi0gICByZXR1cm4gMDsKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzY3J5cHRfa2V5bWFzdGVyKGNvbnN0IGNoYXIgKnBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICppa2V5LCB2b2lkICpwYXJhbXMpCi17CitzdGF0aWMgaW50IHNjcnlwdF9rZXltYXN0ZXIoY29uc3QgY2hhciogcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBzYWx0LCB1bnNpZ25lZCBjaGFyKiBpa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHBhcmFtcykgewogICAgIFNMT0dJKCJVc2luZyBzY3J5cHQgd2l0aCBrZXltYXN0ZXIgZm9yIGNyeXB0ZnMgS0RGIik7CiAKICAgICBpbnQgcmM7CiAgICAgc2l6ZV90IHNpZ25hdHVyZV9zaXplOwogICAgIHVuc2lnbmVkIGNoYXIqIHNpZ25hdHVyZTsKLSAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyICopIHBhcmFtczsKKyAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyID0gKHN0cnVjdCBjcnlwdF9tbnRfZnRyKilwYXJhbXM7CiAKICAgICBpbnQgTiA9IDEgPDwgZnRyLT5OX2ZhY3RvcjsKICAgICBpbnQgciA9IDEgPDwgZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgZnRyLT5wX2ZhY3RvcjsKIAotICAgIHJjID0gY3J5cHRvX3NjcnlwdCgoY29uc3QgdWludDhfdCopcGFzc3dkLCBzdHJsZW4ocGFzc3dkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc2FsdCwgU0FMVF9MRU4sIE4sIHIsIHAsIGlrZXksCisgICAgcmMgPSBjcnlwdG9fc2NyeXB0KChjb25zdCB1aW50OF90KilwYXNzd2QsIHN0cmxlbihwYXNzd2QpLCBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKIAogICAgIGlmIChyYykgewpAQCAtMTI0OSwxNCArMTIxNSwxMyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKGtleW1hc3Rlcl9zaWduX29iamVjdChmdHIsIGlrZXksIElOVEVSTUVESUFURV9CVUZfU0laRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaWduYXR1cmUsICZzaWduYXR1cmVfc2l6ZSkpIHsKKyAgICBpZiAoa2V5bWFzdGVyX3NpZ25fb2JqZWN0KGZ0ciwgaWtleSwgSU5URVJNRURJQVRFX0JVRl9TSVpFLCAmc2lnbmF0dXJlLCAmc2lnbmF0dXJlX3NpemUpKSB7CiAgICAgICAgIFNMT0dFKCJTaWduaW5nIGZhaWxlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgcmMgPSBjcnlwdG9fc2NyeXB0KHNpZ25hdHVyZSwgc2lnbmF0dXJlX3NpemUsIHNhbHQsIFNBTFRfTEVOLAotICAgICAgICAgICAgICAgICAgICAgICBOLCByLCBwLCBpa2V5LCBJTlRFUk1FRElBVEVfQlVGX1NJWkUpOworICAgIHJjID0gY3J5cHRvX3NjcnlwdChzaWduYXR1cmUsIHNpZ25hdHVyZV9zaXplLCBzYWx0LCBTQUxUX0xFTiwgTiwgciwgcCwgaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgSU5URVJNRURJQVRFX0JVRl9TSVpFKTsKICAgICBmcmVlKHNpZ25hdHVyZSk7CiAKICAgICBpZiAocmMpIHsKQEAgLTEyNjcsMTIgKzEyMzIsMTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBlbmNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciAqcGFzc3dkLCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZGVjcnlwdGVkX21hc3Rlcl9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICplbmNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIpCi17Ci0gICAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7IDAgfTsKK3N0YXRpYyBpbnQgZW5jcnlwdF9tYXN0ZXJfa2V5KGNvbnN0IGNoYXIqIHBhc3N3ZCwgY29uc3QgdW5zaWduZWQgY2hhciogc2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogZW5jcnlwdGVkX21hc3Rlcl9rZXksIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKKyAgICB1bnNpZ25lZCBjaGFyIGlrZXlbSU5URVJNRURJQVRFX0JVRl9TSVpFXSA9IHswfTsKICAgICBFVlBfQ0lQSEVSX0NUWCBlX2N0eDsKICAgICBpbnQgZW5jcnlwdGVkX2xlbiwgZmluYWxfbGVuOwogICAgIGludCByYyA9IDA7CkBAIC0xMjgxLDQ2ICsxMjQ0LDQ2IEBACiAgICAgZ2V0X2RldmljZV9zY3J5cHRfcGFyYW1zKGNyeXB0X2Z0cik7CiAKICAgICBzd2l0Y2ggKGNyeXB0X2Z0ci0+a2RmX3R5cGUpIHsKLSAgICBjYXNlIEtERl9TQ1JZUFRfS0VZTUFTVEVSOgotICAgICAgICBpZiAoa2V5bWFzdGVyX2NyZWF0ZV9rZXkoY3J5cHRfZnRyKSkgewotICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jcmVhdGVfa2V5IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9CisgICAgICAgIGNhc2UgS0RGX1NDUllQVF9LRVlNQVNURVI6CisgICAgICAgICAgICBpZiAoa2V5bWFzdGVyX2NyZWF0ZV9rZXkoY3J5cHRfZnRyKSkgeworICAgICAgICAgICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY3JlYXRlX2tleSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgaWYgKHNjcnlwdF9rZXltYXN0ZXIocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7Ci0gICAgICAgICAgICBTTE9HRSgic2NyeXB0IGZhaWxlZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOworICAgICAgICAgICAgaWYgKHNjcnlwdF9rZXltYXN0ZXIocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIGNhc2UgS0RGX1NDUllQVDoKLSAgICAgICAgaWYgKHNjcnlwdChwYXNzd2QsIHNhbHQsIGlrZXksIGNyeXB0X2Z0cikpIHsKLSAgICAgICAgICAgIFNMT0dFKCJzY3J5cHQgZmFpbGVkIik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS0RGX1NDUllQVDoKKyAgICAgICAgICAgIGlmIChzY3J5cHQocGFzc3dkLCBzYWx0LCBpa2V5LCBjcnlwdF9mdHIpKSB7CisgICAgICAgICAgICAgICAgU0xPR0UoInNjcnlwdCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNMT0dFKCJJbnZhbGlkIGtkZl90eXBlIik7Ci0gICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIFNMT0dFKCJJbnZhbGlkIGtkZl90eXBlIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCiAgICAgLyogSW5pdGlhbGl6ZSB0aGUgZGVjcnlwdGlvbiBlbmdpbmUgKi8KICAgICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZlX2N0eCk7Ci0gICAgaWYgKCEgRVZQX0VuY3J5cHRJbml0X2V4KCZlX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlrZXkrSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7CisgICAgaWYgKCFFVlBfRW5jcnlwdEluaXRfZXgoJmVfY3R4LCBFVlBfYWVzXzEyOF9jYmMoKSwgTlVMTCwgaWtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpa2V5ICsgSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVMpKSB7CiAgICAgICAgIFNMT0dFKCJFVlBfRW5jcnlwdEluaXQgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmZV9jdHgsIDApOyAvKiBUdXJuIG9mZiBwYWRkaW5nIGFzIG91ciBkYXRhIGlzIGJsb2NrIGFsaWduZWQgKi8KIAogICAgIC8qIEVuY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KLSAgICBpZiAoISBFVlBfRW5jcnlwdFVwZGF0ZSgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZW5jcnlwdGVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplKSkgeworICAgIGlmICghRVZQX0VuY3J5cHRVcGRhdGUoJmVfY3R4LCBlbmNyeXB0ZWRfbWFzdGVyX2tleSwgJmVuY3J5cHRlZF9sZW4sIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5rZXlzaXplKSkgewogICAgICAgICBTTE9HRSgiRVZQX0VuY3J5cHRVcGRhdGUgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBpZiAoISBFVlBfRW5jcnlwdEZpbmFsX2V4KCZlX2N0eCwgZW5jcnlwdGVkX21hc3Rlcl9rZXkgKyBlbmNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgeworICAgIGlmICghRVZQX0VuY3J5cHRGaW5hbF9leCgmZV9jdHgsIGVuY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZW5jcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKICAgICAgICAgU0xPR0UoIkVWUF9FbmNyeXB0RmluYWwgZmFpbGVkXG4iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTEzMzksMTMgKzEzMDIsMTIgQEAKICAgICBpbnQgciA9IDEgPDwgY3J5cHRfZnRyLT5yX2ZhY3RvcjsKICAgICBpbnQgcCA9IDEgPDwgY3J5cHRfZnRyLT5wX2ZhY3RvcjsKIAotICAgIHJjID0gY3J5cHRvX3NjcnlwdChpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUywKLSAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwgTiwgciwgcCwKLSAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAorICAgIHJjID0gY3J5cHRvX3NjcnlwdChpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUywgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgTiwgciwgcCwgY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5LAogICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY3J5cHRfZnRyLT5zY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSk7CiAKICAgICBpZiAocmMpIHsKLSAgICAgIFNMT0dFKCJlbmNyeXB0X21hc3Rlcl9rZXk6IGNyeXB0b19zY3J5cHQgZmFpbGVkIik7CisgICAgICAgIFNMT0dFKCJlbmNyeXB0X21hc3Rlcl9rZXk6IGNyeXB0b19zY3J5cHQgZmFpbGVkIik7CiAgICAgfQogCiAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmZV9jdHgpOwpAQCAtMTM1Myw2MCArMTMxNSw1NyBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgoY29uc3QgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpzYWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmVuY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBrZXlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKmRlY3J5cHRlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtkZl9mdW5jIGtkZiwgdm9pZCAqa2RmX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIGludGVybWVkaWF0ZV9rZXlfc2l6ZSkKLXsKLSAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7IDAgfTsKLSAgRVZQX0NJUEhFUl9DVFggZF9jdHg7Ci0gIGludCBkZWNyeXB0ZWRfbGVuLCBmaW5hbF9sZW47CitzdGF0aWMgaW50IGRlY3J5cHRfbWFzdGVyX2tleV9hdXgoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBzYWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGVuY3J5cHRlZF9tYXN0ZXJfa2V5LCBzaXplX3Qga2V5c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiBkZWNyeXB0ZWRfbWFzdGVyX2tleSwga2RmX2Z1bmMga2RmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGtkZl9wYXJhbXMsIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7CisgICAgdW5zaWduZWQgY2hhciBpa2V5W0lOVEVSTUVESUFURV9CVUZfU0laRV0gPSB7MH07CisgICAgRVZQX0NJUEhFUl9DVFggZF9jdHg7CisgICAgaW50IGRlY3J5cHRlZF9sZW4sIGZpbmFsX2xlbjsKIAotICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGFuIGludGVybWVkaWF0ZSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlCi0gICAgIG1hc3RlciBrZXkgKi8KLSAgaWYgKGtkZihwYXNzd2QsIHNhbHQsIGlrZXksIGtkZl9wYXJhbXMpKSB7Ci0gICAgU0xPR0UoImtkZiBmYWlsZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvKiBJbml0aWFsaXplIHRoZSBkZWNyeXB0aW9uIGVuZ2luZSAqLwotICBFVlBfQ0lQSEVSX0NUWF9pbml0KCZkX2N0eCk7Ci0gIGlmICghIEVWUF9EZWNyeXB0SW5pdF9leCgmZF9jdHgsIEVWUF9hZXNfMTI4X2NiYygpLCBOVUxMLCBpa2V5LCBpa2V5K0lOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygmZF9jdHgsIDApOyAvKiBUdXJuIG9mZiBwYWRkaW5nIGFzIG91ciBkYXRhIGlzIGJsb2NrIGFsaWduZWQgKi8KLSAgLyogRGVjcnlwdCB0aGUgbWFzdGVyIGtleSAqLwotICBpZiAoISBFVlBfRGVjcnlwdFVwZGF0ZSgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCAmZGVjcnlwdGVkX2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfbWFzdGVyX2tleSwga2V5c2l6ZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCEgRVZQX0RlY3J5cHRGaW5hbF9leCgmZF9jdHgsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5ICsgZGVjcnlwdGVkX2xlbiwgJmZpbmFsX2xlbikpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoZGVjcnlwdGVkX2xlbiArIGZpbmFsX2xlbiAhPSBzdGF0aWNfY2FzdDxpbnQ+KGtleXNpemUpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLyogQ29weSBpbnRlcm1lZGlhdGUga2V5IGlmIG5lZWRlZCBieSBwYXJhbXMgKi8KLSAgaWYgKGludGVybWVkaWF0ZV9rZXkgJiYgaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7Ci0gICAgKmludGVybWVkaWF0ZV9rZXkgPSAodW5zaWduZWQgY2hhciopIG1hbGxvYyhJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7Ci0gICAgaWYgKCppbnRlcm1lZGlhdGVfa2V5KSB7Ci0gICAgICBtZW1jcHkoKmludGVybWVkaWF0ZV9rZXksIGlrZXksIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKTsKLSAgICAgICppbnRlcm1lZGlhdGVfa2V5X3NpemUgPSBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUzsKKyAgICAvKiBUdXJuIHRoZSBwYXNzd29yZCBpbnRvIGFuIGludGVybWVkaWF0ZSBrZXkgYW5kIElWIHRoYXQgY2FuIGRlY3J5cHQgdGhlCisgICAgICAgbWFzdGVyIGtleSAqLworICAgIGlmIChrZGYocGFzc3dkLCBzYWx0LCBpa2V5LCBrZGZfcGFyYW1zKSkgeworICAgICAgICBTTE9HRSgia2RmIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICB9CiAKLSAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgmZF9jdHgpOworICAgIC8qIEluaXRpYWxpemUgdGhlIGRlY3J5cHRpb24gZW5naW5lICovCisgICAgRVZQX0NJUEhFUl9DVFhfaW5pdCgmZF9jdHgpOworICAgIGlmICghRVZQX0RlY3J5cHRJbml0X2V4KCZkX2N0eCwgRVZQX2Flc18xMjhfY2JjKCksIE5VTEwsIGlrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWtleSArIElOVEVSTUVESUFURV9LRVlfTEVOX0JZVEVTKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCZkX2N0eCwgMCk7IC8qIFR1cm4gb2ZmIHBhZGRpbmcgYXMgb3VyIGRhdGEgaXMgYmxvY2sgYWxpZ25lZCAqLworICAgIC8qIERlY3J5cHQgdGhlIG1hc3RlciBrZXkgKi8KKyAgICBpZiAoIUVWUF9EZWNyeXB0VXBkYXRlKCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksICZkZWNyeXB0ZWRfbGVuLCBlbmNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleXNpemUpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFFVlBfRGVjcnlwdEZpbmFsX2V4KCZkX2N0eCwgZGVjcnlwdGVkX21hc3Rlcl9rZXkgKyBkZWNyeXB0ZWRfbGVuLCAmZmluYWxfbGVuKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQogCi0gIHJldHVybiAwOworICAgIGlmIChkZWNyeXB0ZWRfbGVuICsgZmluYWxfbGVuICE9IHN0YXRpY19jYXN0PGludD4oa2V5c2l6ZSkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8qIENvcHkgaW50ZXJtZWRpYXRlIGtleSBpZiBuZWVkZWQgYnkgcGFyYW1zICovCisgICAgaWYgKGludGVybWVkaWF0ZV9rZXkgJiYgaW50ZXJtZWRpYXRlX2tleV9zaXplKSB7CisgICAgICAgICppbnRlcm1lZGlhdGVfa2V5ID0gKHVuc2lnbmVkIGNoYXIqKW1hbGxvYyhJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7CisgICAgICAgIGlmICgqaW50ZXJtZWRpYXRlX2tleSkgeworICAgICAgICAgICAgbWVtY3B5KCppbnRlcm1lZGlhdGVfa2V5LCBpa2V5LCBJTlRFUk1FRElBVEVfS0VZX0xFTl9CWVRFUyk7CisgICAgICAgICAgICAqaW50ZXJtZWRpYXRlX2tleV9zaXplID0gSU5URVJNRURJQVRFX0tFWV9MRU5fQllURVM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCZkX2N0eCk7CisKKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgZ2V0X2tkZl9mdW5jKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsIGtkZl9mdW5jICprZGYsIHZvaWQqKiBrZGZfcGFyYW1zKQoteworc3RhdGljIHZvaWQgZ2V0X2tkZl9mdW5jKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIsIGtkZl9mdW5jKiBrZGYsIHZvaWQqKiBrZGZfcGFyYW1zKSB7CiAgICAgaWYgKGZ0ci0+a2RmX3R5cGUgPT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKICAgICAgICAgKmtkZiA9IHNjcnlwdF9rZXltYXN0ZXI7CiAgICAgICAgICprZGZfcGFyYW1zID0gZnRyOwpAQCAtMTQxOSwyMCArMTM3OCwxNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciAqcGFzc3dkLCB1bnNpZ25lZCBjaGFyICpkZWNyeXB0ZWRfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyICpjcnlwdF9mdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyKiogaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogaW50ZXJtZWRpYXRlX2tleV9zaXplKQoteworc3RhdGljIGludCBkZWNyeXB0X21hc3Rlcl9rZXkoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBkZWNyeXB0ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIHVuc2lnbmVkIGNoYXIqKiBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBpbnRlcm1lZGlhdGVfa2V5X3NpemUpIHsKICAgICBrZGZfZnVuYyBrZGY7Ci0gICAgdm9pZCAqa2RmX3BhcmFtczsKKyAgICB2b2lkKiBrZGZfcGFyYW1zOwogICAgIGludCByZXQ7CiAKICAgICBnZXRfa2RmX2Z1bmMoY3J5cHRfZnRyLCAma2RmLCAma2RmX3BhcmFtcyk7Ci0gICAgcmV0ID0gZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5rZXlzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGtkZiwga2RmX3BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9rZXksIGludGVybWVkaWF0ZV9rZXlfc2l6ZSk7CisgICAgcmV0ID0gZGVjcnlwdF9tYXN0ZXJfa2V5X2F1eChwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgY3J5cHRfZnRyLT5tYXN0ZXJfa2V5LCBjcnlwdF9mdHItPmtleXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNyeXB0ZWRfbWFzdGVyX2tleSwga2RmLCBrZGZfcGFyYW1zLCBpbnRlcm1lZGlhdGVfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKICAgICBpZiAocmV0ICE9IDApIHsKICAgICAgICAgU0xPR1coImZhaWx1cmUgZGVjcnlwdGluZyBtYXN0ZXIga2V5Iik7CiAgICAgfQpAQCAtMTQ0MCwxMyArMTM5NiwxMyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXRpYyBpbnQgY3JlYXRlX2VuY3J5cHRlZF9yYW5kb21fa2V5KGNvbnN0IGNoYXIgKnBhc3N3ZCwgdW5zaWduZWQgY2hhciAqbWFzdGVyX2tleSwgdW5zaWduZWQgY2hhciAqc2FsdCwKLSAgICAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgKmNyeXB0X2Z0cikgeworc3RhdGljIGludCBjcmVhdGVfZW5jcnlwdGVkX3JhbmRvbV9rZXkoY29uc3QgY2hhciogcGFzc3dkLCB1bnNpZ25lZCBjaGFyKiBtYXN0ZXJfa2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogc2FsdCwgc3RydWN0IGNyeXB0X21udF9mdHIqIGNyeXB0X2Z0cikgewogICAgIGludCBmZDsKICAgICB1bnNpZ25lZCBjaGFyIGtleV9idWZbTUFYX0tFWV9MRU5dOwogCiAgICAgLyogR2V0IHNvbWUgcmFuZG9tIGJpdHMgZm9yIGEga2V5ICovCi0gICAgZmQgPSBvcGVuKCIvZGV2L3VyYW5kb20iLCBPX1JET05MWXxPX0NMT0VYRUMpOworICAgIGZkID0gb3BlbigiL2Rldi91cmFuZG9tIiwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIHJlYWQoZmQsIGtleV9idWYsIHNpemVvZihrZXlfYnVmKSk7CiAgICAgcmVhZChmZCwgc2FsdCwgU0FMVF9MRU4pOwogICAgIGNsb3NlKGZkKTsKQEAgLTE0NTUsMTMgKzE0MTEsMTIgQEAKICAgICByZXR1cm4gZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgc2FsdCwga2V5X2J1ZiwgbWFzdGVyX2tleSwgY3J5cHRfZnRyKTsKIH0KIAotaW50IHdhaXRfYW5kX3VubW91bnQoY29uc3QgY2hhciAqbW91bnRwb2ludCwgYm9vbCBraWxsKQoteworaW50IHdhaXRfYW5kX3VubW91bnQoY29uc3QgY2hhciogbW91bnRwb2ludCwgYm9vbCBraWxsKSB7CiAgICAgaW50IGksIGVyciwgcmM7CiAjZGVmaW5lIFdBSVRfVU5NT1VOVF9DT1VOVCAyMAogCiAgICAgLyogIE5vdyB1bW91bnQgdGhlIHRtcGZzIGZpbGVzeXN0ZW0gKi8KLSAgICBmb3IgKGk9MDsgaTxXQUlUX1VOTU9VTlRfQ09VTlQ7IGkrKykgeworICAgIGZvciAoaSA9IDA7IGkgPCBXQUlUX1VOTU9VTlRfQ09VTlQ7IGkrKykgewogICAgICAgICBpZiAodW1vdW50KG1vdW50cG9pbnQpID09IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDkwLDE5ICsxNDQ1LDE4IEBACiAgICAgfQogCiAgICAgaWYgKGkgPCBXQUlUX1VOTU9VTlRfQ09VTlQpIHsKLSAgICAgIFNMT0dEKCJ1bm1vdW50aW5nICVzIHN1Y2NlZWRlZFxuIiwgbW91bnRwb2ludCk7Ci0gICAgICByYyA9IDA7CisgICAgICAgIFNMT0dEKCJ1bm1vdW50aW5nICVzIHN1Y2NlZWRlZFxuIiwgbW91bnRwb2ludCk7CisgICAgICAgIHJjID0gMDsKICAgICB9IGVsc2UgewotICAgICAgYW5kcm9pZDo6dm9sZDo6S2lsbFByb2Nlc3Nlc1dpdGhPcGVuRmlsZXMobW91bnRwb2ludCwgMCk7Ci0gICAgICBTTE9HRSgidW5tb3VudGluZyAlcyBmYWlsZWQ6ICVzXG4iLCBtb3VudHBvaW50LCBzdHJlcnJvcihlcnIpKTsKLSAgICAgIHJjID0gLTE7CisgICAgICAgIGFuZHJvaWQ6OnZvbGQ6OktpbGxQcm9jZXNzZXNXaXRoT3BlbkZpbGVzKG1vdW50cG9pbnQsIDApOworICAgICAgICBTTE9HRSgidW5tb3VudGluZyAlcyBmYWlsZWQ6ICVzXG4iLCBtb3VudHBvaW50LCBzdHJlcnJvcihlcnIpKTsKKyAgICAgICAgcmMgPSAtMTsKICAgICB9CiAKICAgICByZXR1cm4gcmM7CiB9CiAKLXN0YXRpYyB2b2lkIHByZXBfZGF0YV9mcyh2b2lkKQoteworc3RhdGljIHZvaWQgcHJlcF9kYXRhX2ZzKHZvaWQpIHsKICAgICAvLyBOT1RFOiBwb3N0X2ZzX2RhdGEgcmVzdWx0cyBpbiBpbml0IGNhbGxpbmcgYmFjayBhcm91bmQgdG8gdm9sZCwgc28gYWxsCiAgICAgLy8gY2FsbGVycyB0byB0aGlzIG1ldGhvZCBtdXN0IGJlIGFzeW5jCiAKQEAgLTE1MTIsMTcgKzE0NjYsMTQgQEAKICAgICBTTE9HRCgiSnVzdCB0cmlnZ2VyZWQgcG9zdF9mc19kYXRhIik7CiAKICAgICAvKiBXYWl0IGEgbWF4IG9mIDUwIHNlY29uZHMsIGhvcGVmdWxseSBpdCB0YWtlcyBtdWNoIGxlc3MgKi8KLSAgICB3aGlsZSAoIWFuZHJvaWQ6OmJhc2U6OldhaXRGb3JQcm9wZXJ0eSgidm9sZC5wb3N0X2ZzX2RhdGFfZG9uZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzZWNvbmRzKDE1KSkpIHsKKyAgICB3aGlsZSAoIWFuZHJvaWQ6OmJhc2U6OldhaXRGb3JQcm9wZXJ0eSgidm9sZC5wb3N0X2ZzX2RhdGFfZG9uZSIsICIxIiwgc3RkOjpjaHJvbm86OnNlY29uZHMoMTUpKSkgewogICAgICAgICAvKiBXZSB0aW1lZCBvdXQgdG8gcHJlcCAvZGF0YSBpbiB0aW1lLiAgQ29udGludWUgd2FpdC4gKi8KICAgICAgICAgU0xPR0UoIndhaXRlZCAxNXMgZm9yIHZvbGQucG9zdF9mc19kYXRhX2RvbmUsIHN0aWxsIHdhaXRpbmcuLi4iKTsKICAgICB9CiAgICAgU0xPR0QoInBvc3RfZnNfZGF0YSBkb25lIik7CiB9CiAKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfc2V0X2NvcnJ1cHQoKQoteworc3RhdGljIHZvaWQgY3J5cHRmc19zZXRfY29ycnVwdCgpIHsKICAgICAvLyBNYXJrIHRoZSBmb290ZXIgYXMgYmFkCiAgICAgc3RydWN0IGNyeXB0X21udF9mdHIgY3J5cHRfZnRyOwogICAgIGlmIChnZXRfY3J5cHRfZnRyX2FuZF9rZXkoJmNyeXB0X2Z0cikpIHsKQEAgLTE1MzcsMTEgKzE0ODgsMTAgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNyeXB0ZnNfdHJpZ2dlcl9yZXN0YXJ0X21pbl9mcmFtZXdvcmsoKQoteworc3RhdGljIHZvaWQgY3J5cHRmc190cmlnZ2VyX3Jlc3RhcnRfbWluX2ZyYW1ld29yaygpIHsKICAgICBpZiAoZnNfbWdyX2RvX3RtcGZzX21vdW50KERBVEFfTU5UX1BPSU5UKSkgewotICAgICAgU0xPR0UoIkZhaWxlZCB0byBtb3VudCB0bXBmcyBvbiBkYXRhIC0gcGFuaWMiKTsKLSAgICAgIHJldHVybjsKKyAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBtb3VudCB0bXBmcyBvbiBkYXRhIC0gcGFuaWMiKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGlmIChwcm9wZXJ0eV9zZXQoInZvbGQuZGVjcnlwdCIsICJ0cmlnZ2VyX3Bvc3RfZnNfZGF0YSIpKSB7CkBAIC0xNTU2LDE0ICsxNTA2LDEzIEBACiB9CiAKIC8qIHJldHVybnMgPCAwIG9uIGZhaWx1cmUgKi8KLXN0YXRpYyBpbnQgY3J5cHRmc19yZXN0YXJ0X2ludGVybmFsKGludCByZXN0YXJ0X21haW4pCi17CitzdGF0aWMgaW50IGNyeXB0ZnNfcmVzdGFydF9pbnRlcm5hbChpbnQgcmVzdGFydF9tYWluKSB7CiAgICAgY2hhciBjcnlwdG9fYmxrZGV2W01BWFBBVEhMRU5dOwogICAgIGludCByYyA9IC0xOwogICAgIHN0YXRpYyBpbnQgcmVzdGFydF9zdWNjZXNzZnVsID0gMDsKIAogICAgIC8qIFZhbGlkYXRlIHRoYXQgaXQncyBPSyB0byBjYWxsIHRoaXMgcm91dGluZSAqLwotICAgIGlmICghIG1hc3Rlcl9rZXlfc2F2ZWQpIHsKKyAgICBpZiAoIW1hc3Rlcl9rZXlfc2F2ZWQpIHsKICAgICAgICAgU0xPR0UoIkVuY3J5cHRlZCBmaWxlc3lzdGVtIG5vdCB2YWxpZGF0ZWQsIGFib3J0aW5nIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0xNjEyLDcgKzE1NjEsNyBAQAogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgaWYgKCEgKHJjID0gd2FpdF9hbmRfdW5tb3VudChEQVRBX01OVF9QT0lOVCwgdHJ1ZSkpICkgeworICAgIGlmICghKHJjID0gd2FpdF9hbmRfdW5tb3VudChEQVRBX01OVF9QT0lOVCwgdHJ1ZSkpKSB7CiAgICAgICAgIC8qIElmIHJvLmNyeXB0by5yZWFkb25seSBpcyBzZXQgdG8gMSwgbW91bnQgdGhlIGRlY3J5cHRlZAogICAgICAgICAgKiBmaWxlc3lzdGVtIHJlYWRvbmx5LiAgVGhpcyBpcyB1c2VkIHdoZW4gL2RhdGEgaXMgbW91bnRlZCBieQogICAgICAgICAgKiByZWNvdmVyeSBtb2RlLgpAQCAtMTYyMSw3ICsxNTcwLDkgQEAKICAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5jcnlwdG8ucmVhZG9ubHkiLCByb19wcm9wLCAiIik7CiAgICAgICAgIGlmIChzdHJsZW4ocm9fcHJvcCkgPiAwICYmIHN0ZDo6c3RvaShyb19wcm9wKSkgewogICAgICAgICAgICAgc3RydWN0IGZzdGFiX3JlYyogcmVjID0gZnNfbWdyX2dldF9lbnRyeV9mb3JfbW91bnRfcG9pbnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQpOwotICAgICAgICAgICAgcmVjLT5mbGFncyB8PSBNU19SRE9OTFk7CisgICAgICAgICAgICBpZiAocmVjKSB7CisgICAgICAgICAgICAgICAgcmVjLT5mbGFncyB8PSBNU19SRE9OTFk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAvKiBJZiB0aGF0IHN1Y2NlZWRlZCwgdGhlbiBtb3VudCB0aGUgZGVjcnlwdGVkIGZpbGVzeXN0ZW0gKi8KQEAgLTE2MzIsMTkgKzE1ODMsMTggQEAKICAgICAgICAgICogZnNfbWdyX2RvX21vdW50IHJ1bnMgZnNjay4gVXNlIHNldGV4ZWNjb24gdG8gcnVuIHRydXN0ZWQKICAgICAgICAgICogcGFydGl0aW9ucyBpbiB0aGUgZnNjayBkb21haW4uCiAgICAgICAgICAqLwotICAgICAgICBpZiAoc2V0ZXhlY2NvbihzZWNvbnRleHRGc2NrKCkpKXsKKyAgICAgICAgaWYgKHNldGV4ZWNjb24oc2Vjb250ZXh0RnNjaygpKSkgewogICAgICAgICAgICAgU0xPR0UoIkZhaWxlZCB0byBzZXRleGVjY29uIik7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KLSAgICAgICAgd2hpbGUgKChtb3VudF9yYyA9IGZzX21ncl9kb19tb3VudChmc3RhYl9kZWZhdWx0LCBEQVRBX01OVF9QT0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdG9fYmxrZGV2LCAwKSkKLSAgICAgICAgICAgICAgICE9IDApIHsKKyAgICAgICAgYm9vbCBuZWVkc19jcCA9IGFuZHJvaWQ6OnZvbGQ6OmNwX25lZWRzQ2hlY2twb2ludCgpOworICAgICAgICB3aGlsZSAoKG1vdW50X3JjID0gZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5ULCBjcnlwdG9fYmxrZGV2LCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRzX2NwKSkgIT0gMCkgewogICAgICAgICAgICAgaWYgKG1vdW50X3JjID09IEZTX01HUl9ET01OVF9CVVNZKSB7CiAgICAgICAgICAgICAgICAgLyogVE9ETzogaW52b2tlIHNvbWV0aGluZyBzaW1pbGFyIHRvCiAgICAgICAgICAgICAgICAgICAgUHJvY2Vzczo6a2lsbFByb2Nlc3NXaXRoT3BlbkZpbGVzKERBVEFfTU5UX1BPSU5ULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWVzID4gUkVUUllfTU9VTlRfQVRURU1QVC8yID8gMSA6IDIgKSAqLwotICAgICAgICAgICAgICAgIFNMT0dJKCJGYWlsZWQgdG8gbW91bnQgJXMgYmVjYXVzZSBpdCBpcyBidXN5IC0gd2FpdGluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgY3J5cHRvX2Jsa2Rldik7CisgICAgICAgICAgICAgICAgU0xPR0koIkZhaWxlZCB0byBtb3VudCAlcyBiZWNhdXNlIGl0IGlzIGJ1c3kgLSB3YWl0aW5nIiwgY3J5cHRvX2Jsa2Rldik7CiAgICAgICAgICAgICAgICAgaWYgKC0tcmV0cmllcykgewogICAgICAgICAgICAgICAgICAgICBzbGVlcChSRVRSWV9NT1VOVF9ERUxBWV9TRUNPTkRTKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTY4NywxMCArMTYzNyw5IEBACiAgICAgcmV0dXJuIHJjOwogfQogCi1pbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpCi17CitpbnQgY3J5cHRmc19yZXN0YXJ0KHZvaWQpIHsKICAgICBTTE9HSSgiY3J5cHRmc19yZXN0YXJ0Iik7Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiY3J5cHRmc19yZXN0YXJ0IG5vdCB2YWxpZCBmb3IgZmlsZSBlbmNyeXB0aW9uOiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTY5OSwxOTMgKzE2NDgsMTg5IEBACiAgICAgcmV0dXJuIGNyeXB0ZnNfcmVzdGFydF9pbnRlcm5hbCgxKTsKIH0KIAotc3RhdGljIGludCBkb19jcnlwdG9fY29tcGxldGUoY29uc3QgY2hhciAqbW91bnRfcG9pbnQpCi17Ci0gIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKLSAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CitzdGF0aWMgaW50IGRvX2NyeXB0b19jb21wbGV0ZShjb25zdCBjaGFyKiBtb3VudF9wb2ludCkgeworICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKKyAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIGNoYXIga2V5X2xvY1tQUk9QRVJUWV9WQUxVRV9NQVhdOwogCi0gIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikgKSB7Ci0gICAgU0xPR0UoIm5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwgYWJvcnRpbmciKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7Ci0gIH0KLQotICAvLyBjcnlwdG9fY29tcGxldGUgaXMgZnVsbCBkaXNrIGVuY3J5cHRlZCBzdGF0dXMKLSAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7Ci0gIH0KLQotICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpKSB7Ci0gICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIGtleV9sb2MsIDAsIHNpemVvZihrZXlfbG9jKSk7Ci0KLSAgICAvKgotICAgICAqIE9ubHkgcmVwb3J0IHRoaXMgZXJyb3IgaWYga2V5X2xvYyBpcyBhIGZpbGUgYW5kIGl0IGV4aXN0cy4KLSAgICAgKiBJZiB0aGUgZGV2aWNlIHdhcyBuZXZlciBlbmNyeXB0ZWQsIGFuZCAvZGF0YSBpcyBub3QgbW91bnRhYmxlIGZvcgotICAgICAqIHNvbWUgcmVhc29uLCByZXR1cm5pbmcgMSBzaG91bGQgcHJldmVudCB0aGUgVUkgZnJvbSBwcmVzZW50aW5nIHRoZQotICAgICAqIGEgImVudGVyIHBhc3N3b3JkIiBzY3JlZW4sIG9yIHdvcnNlLCBhICJwcmVzcyBidXR0b24gdG8gd2lwZSB0aGUKLSAgICAgKiBkZXZpY2UiIHNjcmVlbi4KLSAgICAgKi8KLSAgICBpZiAoKGtleV9sb2NbMF0gPT0gJy8nKSAmJiAoYWNjZXNzKCJrZXlfbG9jIiwgRl9PSykgPT0gLTEpKSB7Ci0gICAgICBTTE9HRSgibWFzdGVyIGtleSBmaWxlIGRvZXMgbm90IGV4aXN0LCBhYm9ydGluZyIpOwotICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwotICAgIH0gZWxzZSB7Ci0gICAgICBTTE9HRSgiRXJyb3IgZ2V0dGluZyBjcnlwdCBmb290ZXIgYW5kIGtleVxuIik7Ci0gICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0JBRF9NRVRBREFUQTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOworICAgIGlmIChzdHJjbXAoZW5jcnlwdGVkX3N0YXRlLCAiZW5jcnlwdGVkIikpIHsKKyAgICAgICAgU0xPR0UoIm5vdCBydW5uaW5nIHdpdGggZW5jcnlwdGlvbiwgYWJvcnRpbmciKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEOwogICAgIH0KLSAgfQogCi0gIC8vIFRlc3QgZm9yIHBvc3NpYmxlIGVycm9yIGZsYWdzCi0gIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTKXsKLSAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIGlzIHBhcnR3YXkgY29tcGxldGVkXG4iKTsKLSAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX1BBUlRJQUw7Ci0gIH0KKyAgICAvLyBjcnlwdG9fY29tcGxldGUgaXMgZnVsbCBkaXNrIGVuY3J5cHRlZCBzdGF0dXMKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgeworICAgICAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX05PVF9FTkNSWVBURUQ7CisgICAgfQogCi0gIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUpewotICAgIFNMT0dFKCJFbmNyeXB0aW9uIHByb2Nlc3Mgd2FzIGludGVycnVwdGVkIGJ1dCBjYW5ub3QgY29udGludWVcbiIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UOwotICB9CisgICAgaWYgKGdldF9jcnlwdF9mdHJfYW5kX2tleSgmY3J5cHRfZnRyKSkgeworICAgICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwga2V5X2xvYywgMCwgc2l6ZW9mKGtleV9sb2MpKTsKIAotICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfREFUQV9DT1JSVVBUKXsKLSAgICBTTE9HRSgiRW5jcnlwdGlvbiBpcyBzdWNjZXNzZnVsIGJ1dCBkYXRhIGlzIGNvcnJ1cHRcbiIpOwotICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQ09SUlVQVDsKLSAgfQorICAgICAgICAvKgorICAgICAgICAgKiBPbmx5IHJlcG9ydCB0aGlzIGVycm9yIGlmIGtleV9sb2MgaXMgYSBmaWxlIGFuZCBpdCBleGlzdHMuCisgICAgICAgICAqIElmIHRoZSBkZXZpY2Ugd2FzIG5ldmVyIGVuY3J5cHRlZCwgYW5kIC9kYXRhIGlzIG5vdCBtb3VudGFibGUgZm9yCisgICAgICAgICAqIHNvbWUgcmVhc29uLCByZXR1cm5pbmcgMSBzaG91bGQgcHJldmVudCB0aGUgVUkgZnJvbSBwcmVzZW50aW5nIHRoZQorICAgICAgICAgKiBhICJlbnRlciBwYXNzd29yZCIgc2NyZWVuLCBvciB3b3JzZSwgYSAicHJlc3MgYnV0dG9uIHRvIHdpcGUgdGhlCisgICAgICAgICAqIGRldmljZSIgc2NyZWVuLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChrZXlfbG9jWzBdID09ICcvJykgJiYgKGFjY2Vzcygia2V5X2xvYyIsIEZfT0spID09IC0xKSkgeworICAgICAgICAgICAgU0xPR0UoIm1hc3RlciBrZXkgZmlsZSBkb2VzIG5vdCBleGlzdCwgYWJvcnRpbmciKTsKKyAgICAgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFNMT0dFKCJFcnJvciBnZXR0aW5nIGNyeXB0IGZvb3RlciBhbmQga2V5XG4iKTsKKyAgICAgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfQkFEX01FVEFEQVRBOworICAgICAgICB9CisgICAgfQogCi0gIC8qIFdlIHBhc3NlZCB0aGUgdGVzdCEgV2Ugc2hhbGwgZGltaW5pc2gsIGFuZCByZXR1cm4gdG8gdGhlIHdlc3QgKi8KLSAgcmV0dXJuIENSWVBUT19DT01QTEVURV9FTkNSWVBURUQ7CisgICAgLy8gVGVzdCBmb3IgcG9zc2libGUgZXJyb3IgZmxhZ3MKKyAgICBpZiAoY3J5cHRfZnRyLmZsYWdzICYgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUykgeworICAgICAgICBTTE9HRSgiRW5jcnlwdGlvbiBwcm9jZXNzIGlzIHBhcnR3YXkgY29tcGxldGVkXG4iKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9QQVJUSUFMOworICAgIH0KKworICAgIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUpIHsKKyAgICAgICAgU0xPR0UoIkVuY3J5cHRpb24gcHJvY2VzcyB3YXMgaW50ZXJydXB0ZWQgYnV0IGNhbm5vdCBjb250aW51ZVxuIik7CisgICAgICAgIHJldHVybiBDUllQVE9fQ09NUExFVEVfSU5DT05TSVNURU5UOworICAgIH0KKworICAgIGlmIChjcnlwdF9mdHIuZmxhZ3MgJiBDUllQVF9EQVRBX0NPUlJVUFQpIHsKKyAgICAgICAgU0xPR0UoIkVuY3J5cHRpb24gaXMgc3VjY2Vzc2Z1bCBidXQgZGF0YSBpcyBjb3JydXB0XG4iKTsKKyAgICAgICAgcmV0dXJuIENSWVBUT19DT01QTEVURV9DT1JSVVBUOworICAgIH0KKworICAgIC8qIFdlIHBhc3NlZCB0aGUgdGVzdCEgV2Ugc2hhbGwgZGltaW5pc2gsIGFuZCByZXR1cm4gdG8gdGhlIHdlc3QgKi8KKyAgICByZXR1cm4gQ1JZUFRPX0NPTVBMRVRFX0VOQ1JZUFRFRDsKIH0KIAotc3RhdGljIGludCB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpwYXNzd2QsIGNvbnN0IGNoYXIgKm1vdW50X3BvaW50LCBjb25zdCBjaGFyICpsYWJlbCkKLXsKLSAgdW5zaWduZWQgY2hhciBkZWNyeXB0ZWRfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07Ci0gIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKLSAgY2hhciByZWFsX2Jsa2RldltNQVhQQVRITEVOXTsKLSAgY2hhciB0bXBfbW91bnRfcG9pbnRbNjRdOwotICB1bnNpZ25lZCBpbnQgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudDsKLSAgaW50IHJjOwotICBpbnQgdXNlX2tleW1hc3RlciA9IDA7Ci0gIGludCB1cGdyYWRlID0gMDsKLSAgdW5zaWduZWQgY2hhciogaW50ZXJtZWRpYXRlX2tleSA9IDA7Ci0gIHNpemVfdCBpbnRlcm1lZGlhdGVfa2V5X3NpemUgPSAwOwotICBpbnQgTiA9IDEgPDwgY3J5cHRfZnRyLT5OX2ZhY3RvcjsKLSAgaW50IHIgPSAxIDw8IGNyeXB0X2Z0ci0+cl9mYWN0b3I7Ci0gIGludCBwID0gMSA8PCBjcnlwdF9mdHItPnBfZmFjdG9yOworc3RhdGljIGludCB0ZXN0X21vdW50X2VuY3J5cHRlZF9mcyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogY3J5cHRfZnRyLCBjb25zdCBjaGFyKiBwYXNzd2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1vdW50X3BvaW50LCBjb25zdCBjaGFyKiBsYWJlbCkgeworICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOworICAgIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKKyAgICBjaGFyIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOworICAgIGNoYXIgdG1wX21vdW50X3BvaW50WzY0XTsKKyAgICB1bnNpZ25lZCBpbnQgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudDsKKyAgICBpbnQgcmM7CisgICAgaW50IHVzZV9rZXltYXN0ZXIgPSAwOworICAgIGludCB1cGdyYWRlID0gMDsKKyAgICB1bnNpZ25lZCBjaGFyKiBpbnRlcm1lZGlhdGVfa2V5ID0gMDsKKyAgICBzaXplX3QgaW50ZXJtZWRpYXRlX2tleV9zaXplID0gMDsKKyAgICBpbnQgTiA9IDEgPDwgY3J5cHRfZnRyLT5OX2ZhY3RvcjsKKyAgICBpbnQgciA9IDEgPDwgY3J5cHRfZnRyLT5yX2ZhY3RvcjsKKyAgICBpbnQgcCA9IDEgPDwgY3J5cHRfZnRyLT5wX2ZhY3RvcjsKIAotICBTTE9HRCgiY3J5cHRfZnRyLT5mc19zaXplID0gJWxsZFxuIiwgY3J5cHRfZnRyLT5mc19zaXplKTsKLSAgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCA9IGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CisgICAgU0xPR0QoImNyeXB0X2Z0ci0+ZnNfc2l6ZSA9ICVsbGRcbiIsIGNyeXB0X2Z0ci0+ZnNfc2l6ZSk7CisgICAgb3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCA9IGNyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CiAKLSAgaWYgKCEgKGNyeXB0X2Z0ci0+ZmxhZ3MgJiBDUllQVF9NTlRfS0VZX1VORU5DUllQVEVEKSApIHsKLSAgICBpZiAoZGVjcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcm1lZGlhdGVfa2V5LCAmaW50ZXJtZWRpYXRlX2tleV9zaXplKSkgewotICAgICAgU0xPR0UoIkZhaWxlZCB0byBkZWNyeXB0IG1hc3RlciBrZXlcbiIpOwotICAgICAgcmMgPSAtMTsKLSAgICAgIGdvdG8gZXJyb3V0OworICAgIGlmICghKGNyeXB0X2Z0ci0+ZmxhZ3MgJiBDUllQVF9NTlRfS0VZX1VORU5DUllQVEVEKSkgeworICAgICAgICBpZiAoZGVjcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ciwgJmludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVybWVkaWF0ZV9rZXlfc2l6ZSkpIHsKKyAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZGVjcnlwdCBtYXN0ZXIga2V5XG4iKTsKKyAgICAgICAgICAgIHJjID0gLTE7CisgICAgICAgICAgICBnb3RvIGVycm91dDsKKyAgICAgICAgfQogICAgIH0KLSAgfQogCi0gIGZzX21ncl9nZXRfY3J5cHRfaW5mbyhmc3RhYl9kZWZhdWx0LCAwLCByZWFsX2Jsa2Rldiwgc2l6ZW9mKHJlYWxfYmxrZGV2KSk7CisgICAgZnNfbWdyX2dldF9jcnlwdF9pbmZvKGZzdGFiX2RlZmF1bHQsIDAsIHJlYWxfYmxrZGV2LCBzaXplb2YocmVhbF9ibGtkZXYpKTsKIAotICAvLyBDcmVhdGUgY3J5cHRvIGJsb2NrIGRldmljZSAtIGFsbCAobm9uIGZhdGFsKSBjb2RlIHBhdGhzCi0gIC8vIG5lZWQgaXQKLSAgaWYgKGNyZWF0ZV9jcnlwdG9fYmxrX2RldihjcnlwdF9mdHIsIGRlY3J5cHRlZF9tYXN0ZXJfa2V5LCByZWFsX2Jsa2RldiwgY3J5cHRvX2Jsa2RldiwgbGFiZWwsIDApKSB7Ci0gICAgICBTTE9HRSgiRXJyb3IgY3JlYXRpbmcgZGVjcnlwdGVkIGJsb2NrIGRldmljZVxuIik7Ci0gICAgICByYyA9IC0xOwotICAgICAgZ290byBlcnJvdXQ7Ci0gIH0KKyAgICAvLyBDcmVhdGUgY3J5cHRvIGJsb2NrIGRldmljZSAtIGFsbCAobm9uIGZhdGFsKSBjb2RlIHBhdGhzCisgICAgLy8gbmVlZCBpdAorICAgIGlmIChjcmVhdGVfY3J5cHRvX2Jsa19kZXYoY3J5cHRfZnRyLCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgcmVhbF9ibGtkZXYsIGNyeXB0b19ibGtkZXYsIGxhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpIHsKKyAgICAgICAgU0xPR0UoIkVycm9yIGNyZWF0aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOworICAgICAgICByYyA9IC0xOworICAgICAgICBnb3RvIGVycm91dDsKKyAgICB9CiAKLSAgLyogV29yayBvdXQgaWYgdGhlIHByb2JsZW0gaXMgdGhlIHBhc3N3b3JkIG9yIHRoZSBkYXRhICovCi0gIHVuc2lnbmVkIGNoYXIgc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleVtzaXplb2YoY3J5cHRfZnRyLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KV07CisgICAgLyogV29yayBvdXQgaWYgdGhlIHByb2JsZW0gaXMgdGhlIHBhc3N3b3JkIG9yIHRoZSBkYXRhICovCisgICAgdW5zaWduZWQgY2hhciBzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5W3NpemVvZihjcnlwdF9mdHItPnNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpXTsKIAotICByYyA9IGNyeXB0b19zY3J5cHQoaW50ZXJtZWRpYXRlX2tleSwgaW50ZXJtZWRpYXRlX2tleV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLT5zYWx0LCBzaXplb2YoY3J5cHRfZnRyLT5zYWx0KSwKLSAgICAgICAgICAgICAgICAgICAgIE4sIHIsIHAsIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCi0gICAgICAgICAgICAgICAgICAgICBzaXplb2Yoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSkpOworICAgIHJjID0gY3J5cHRvX3NjcnlwdChpbnRlcm1lZGlhdGVfa2V5LCBpbnRlcm1lZGlhdGVfa2V5X3NpemUsIGNyeXB0X2Z0ci0+c2FsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGNyeXB0X2Z0ci0+c2FsdCksIE4sIHIsIHAsIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSk7CiAKLSAgLy8gRG9lcyB0aGUga2V5IG1hdGNoIHRoZSBjcnlwdG8gZm9vdGVyPwotICBpZiAocmMgPT0gMCAmJiBtZW1jbXAoc2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihzY3J5cHRlZF9pbnRlcm1lZGlhdGVfa2V5KSkgPT0gMCkgewotICAgIFNMT0dJKCJQYXNzd29yZCBtYXRjaGVzIik7Ci0gICAgcmMgPSAwOwotICB9IGVsc2UgewotICAgIC8qIFRyeSBtb3VudGluZyB0aGUgZmlsZSBzeXN0ZW0gYW55d2F5LCBqdXN0IGluIGNhc2UgdGhlIHByb2JsZW0ncyB3aXRoCi0gICAgICogdGhlIGZvb3Rlciwgbm90IHRoZSBrZXkuICovCi0gICAgc25wcmludGYodG1wX21vdW50X3BvaW50LCBzaXplb2YodG1wX21vdW50X3BvaW50KSwgIiVzL3RtcF9tbnQiLAotICAgICAgICAgICAgIG1vdW50X3BvaW50KTsKLSAgICBta2Rpcih0bXBfbW91bnRfcG9pbnQsIDA3NTUpOwotICAgIGlmIChmc19tZ3JfZG9fbW91bnQoZnN0YWJfZGVmYXVsdCwgREFUQV9NTlRfUE9JTlQsIGNyeXB0b19ibGtkZXYsIHRtcF9tb3VudF9wb2ludCkpIHsKLSAgICAgIFNMT0dFKCJFcnJvciB0ZW1wIG1vdW50aW5nIGRlY3J5cHRlZCBibG9jayBkZXZpY2VcbiIpOwotICAgICAgZGVsZXRlX2NyeXB0b19ibGtfZGV2KGxhYmVsKTsKLQotICAgICAgcmMgPSArK2NyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7Ci0gICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAvLyBEb2VzIHRoZSBrZXkgbWF0Y2ggdGhlIGNyeXB0byBmb290ZXI/CisgICAgaWYgKHJjID09IDAgJiYgbWVtY21wKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXksIGNyeXB0X2Z0ci0+c2NyeXB0ZWRfaW50ZXJtZWRpYXRlX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXkpKSA9PSAwKSB7CisgICAgICAgIFNMT0dJKCJQYXNzd29yZCBtYXRjaGVzIik7CisgICAgICAgIHJjID0gMDsKICAgICB9IGVsc2UgewotICAgICAgLyogU3VjY2VzcyEgKi8KLSAgICAgIFNMT0dJKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIGJ1dCBkZWNyeXB0ZWQgZHJpdmUgbW91bnRlZCAtIGNvbnRpbnVlIik7Ci0gICAgICB1bW91bnQodG1wX21vdW50X3BvaW50KTsKLSAgICAgIHJjID0gMDsKLSAgICB9Ci0gIH0KKyAgICAgICAgLyogVHJ5IG1vdW50aW5nIHRoZSBmaWxlIHN5c3RlbSBhbnl3YXksIGp1c3QgaW4gY2FzZSB0aGUgcHJvYmxlbSdzIHdpdGgKKyAgICAgICAgICogdGhlIGZvb3Rlciwgbm90IHRoZSBrZXkuICovCisgICAgICAgIHNucHJpbnRmKHRtcF9tb3VudF9wb2ludCwgc2l6ZW9mKHRtcF9tb3VudF9wb2ludCksICIlcy90bXBfbW50IiwgbW91bnRfcG9pbnQpOworICAgICAgICBta2Rpcih0bXBfbW91bnRfcG9pbnQsIDA3NTUpOworICAgICAgICBpZiAoZnNfbWdyX2RvX21vdW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5ULCBjcnlwdG9fYmxrZGV2LCB0bXBfbW91bnRfcG9pbnQpKSB7CisgICAgICAgICAgICBTTE9HRSgiRXJyb3IgdGVtcCBtb3VudGluZyBkZWNyeXB0ZWQgYmxvY2sgZGV2aWNlXG4iKTsKKyAgICAgICAgICAgIGRlbGV0ZV9jcnlwdG9fYmxrX2RldihsYWJlbCk7CiAKLSAgaWYgKHJjID09IDApIHsKLSAgICBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50ID0gMDsKLSAgICBpZiAob3JpZ19mYWlsZWRfZGVjcnlwdF9jb3VudCAhPSAwKSB7Ci0gICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKLSAgICB9Ci0KLSAgICAvKiBTYXZlIHRoZSBuYW1lIG9mIHRoZSBjcnlwdG8gYmxvY2sgZGV2aWNlCi0gICAgICogc28gd2UgY2FuIG1vdW50IGl0IHdoZW4gcmVzdGFydGluZyB0aGUgZnJhbWV3b3JrLiAqLwotICAgIHByb3BlcnR5X3NldCgicm8uY3J5cHRvLmZzX2NyeXB0b19ibGtkZXYiLCBjcnlwdG9fYmxrZGV2KTsKLQotICAgIC8qIEFsc28gc2F2ZSBhIHRoZSBtYXN0ZXIga2V5IHNvIHdlIGNhbiByZWVuY3J5cHRlZCB0aGUga2V5Ci0gICAgICogdGhlIGtleSB3aGVuIHdlIHdhbnQgdG8gY2hhbmdlIHRoZSBwYXNzd29yZCBvbiBpdC4gKi8KLSAgICBtZW1jcHkoc2F2ZWRfbWFzdGVyX2tleSwgZGVjcnlwdGVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci0+a2V5c2l6ZSk7Ci0gICAgc2F2ZWRfbW91bnRfcG9pbnQgPSBzdHJkdXAobW91bnRfcG9pbnQpOwotICAgIG1hc3Rlcl9rZXlfc2F2ZWQgPSAxOwotICAgIFNMT0dEKCIlcygpOiBNYXN0ZXIga2V5IHNhdmVkXG4iLCBfX0ZVTkNUSU9OX18pOwotICAgIHJjID0gMDsKLQotICAgIC8vIFVwZ3JhZGUgaWYgd2UncmUgbm90IHVzaW5nIHRoZSBsYXRlc3QgS0RGLgotICAgIHVzZV9rZXltYXN0ZXIgPSBrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSgpOwotICAgIGlmIChjcnlwdF9mdHItPmtkZl90eXBlID09IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7Ci0gICAgICAgIC8vIERvbid0IGFsbG93IGRvd25ncmFkZQotICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAxICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVF9LRVlNQVNURVIpIHsKLSAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOwotICAgICAgICB1cGdyYWRlID0gMTsKLSAgICB9IGVsc2UgaWYgKHVzZV9rZXltYXN0ZXIgPT0gMCAmJiBjcnlwdF9mdHItPmtkZl90eXBlICE9IEtERl9TQ1JZUFQpIHsKLSAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7Ci0gICAgICAgIHVwZ3JhZGUgPSAxOwotICAgIH0KLQotICAgIGlmICh1cGdyYWRlKSB7Ci0gICAgICAgIHJjID0gZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLT5zYWx0LCBzYXZlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHItPm1hc3Rlcl9rZXksIGNyeXB0X2Z0cik7Ci0gICAgICAgIGlmICghcmMpIHsKLSAgICAgICAgICAgIHJjID0gcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7Ci0gICAgICAgIH0KLSAgICAgICAgU0xPR0QoIktleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIHVwZ3JhZGU6IHJjPSVkXG4iLCByYyk7Ci0KLSAgICAgICAgLy8gRG8gbm90IGZhaWwgZXZlbiBpZiB1cGdyYWRlIGZhaWxlZCAtIG1hY2hpbmUgaXMgYm9vdGFibGUKLSAgICAgICAgLy8gTm90ZSB0aGF0IGlmIHRoaXMgY29kZSBpcyBldmVyIGhpdCwgdGhlcmUgaXMgYSAqc2VyaW91cyogcHJvYmxlbQotICAgICAgICAvLyBzaW5jZSBLREZzIHNob3VsZCBuZXZlciBmYWlsLiBZb3UgKm11c3QqIGZpeCB0aGUga2RmIGJlZm9yZQotICAgICAgICAvLyBwcm9jZWVkaW5nIQotICAgICAgICBpZiAocmMpIHsKLSAgICAgICAgICBTTE9HVygiVXBncmFkZSBmYWlsZWQgd2l0aCBlcnJvciAlZCwiCi0gICAgICAgICAgICAgICAgIiBidXQgY29udGludWluZyB3aXRoIHByZXZpb3VzIHN0YXRlIiwKLSAgICAgICAgICAgICAgICByYyk7Ci0gICAgICAgICAgcmMgPSAwOworICAgICAgICAgICAgcmMgPSArK2NyeXB0X2Z0ci0+ZmFpbGVkX2RlY3J5cHRfY291bnQ7CisgICAgICAgICAgICBwdXRfY3J5cHRfZnRyX2FuZF9rZXkoY3J5cHRfZnRyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIFN1Y2Nlc3MhICovCisgICAgICAgICAgICBTTE9HSSgiUGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBidXQgZGVjcnlwdGVkIGRyaXZlIG1vdW50ZWQgLSBjb250aW51ZSIpOworICAgICAgICAgICAgdW1vdW50KHRtcF9tb3VudF9wb2ludCk7CisgICAgICAgICAgICByYyA9IDA7CiAgICAgICAgIH0KICAgICB9Ci0gIH0KIAotIGVycm91dDoKLSAgaWYgKGludGVybWVkaWF0ZV9rZXkpIHsKLSAgICBtZW1zZXQoaW50ZXJtZWRpYXRlX2tleSwgMCwgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKLSAgICBmcmVlKGludGVybWVkaWF0ZV9rZXkpOwotICB9Ci0gIHJldHVybiByYzsKKyAgICBpZiAocmMgPT0gMCkgeworICAgICAgICBjcnlwdF9mdHItPmZhaWxlZF9kZWNyeXB0X2NvdW50ID0gMDsKKyAgICAgICAgaWYgKG9yaWdfZmFpbGVkX2RlY3J5cHRfY291bnQgIT0gMCkgeworICAgICAgICAgICAgcHV0X2NyeXB0X2Z0cl9hbmRfa2V5KGNyeXB0X2Z0cik7CisgICAgICAgIH0KKworICAgICAgICAvKiBTYXZlIHRoZSBuYW1lIG9mIHRoZSBjcnlwdG8gYmxvY2sgZGV2aWNlCisgICAgICAgICAqIHNvIHdlIGNhbiBtb3VudCBpdCB3aGVuIHJlc3RhcnRpbmcgdGhlIGZyYW1ld29yay4gKi8KKyAgICAgICAgcHJvcGVydHlfc2V0KCJyby5jcnlwdG8uZnNfY3J5cHRvX2Jsa2RldiIsIGNyeXB0b19ibGtkZXYpOworCisgICAgICAgIC8qIEFsc28gc2F2ZSBhIHRoZSBtYXN0ZXIga2V5IHNvIHdlIGNhbiByZWVuY3J5cHRlZCB0aGUga2V5CisgICAgICAgICAqIHRoZSBrZXkgd2hlbiB3ZSB3YW50IHRvIGNoYW5nZSB0aGUgcGFzc3dvcmQgb24gaXQuICovCisgICAgICAgIG1lbWNweShzYXZlZF9tYXN0ZXJfa2V5LCBkZWNyeXB0ZWRfbWFzdGVyX2tleSwgY3J5cHRfZnRyLT5rZXlzaXplKTsKKyAgICAgICAgc2F2ZWRfbW91bnRfcG9pbnQgPSBzdHJkdXAobW91bnRfcG9pbnQpOworICAgICAgICBtYXN0ZXJfa2V5X3NhdmVkID0gMTsKKyAgICAgICAgU0xPR0QoIiVzKCk6IE1hc3RlciBrZXkgc2F2ZWRcbiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJjID0gMDsKKworICAgICAgICAvLyBVcGdyYWRlIGlmIHdlJ3JlIG5vdCB1c2luZyB0aGUgbGF0ZXN0IEtERi4KKyAgICAgICAgdXNlX2tleW1hc3RlciA9IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5KCk7CisgICAgICAgIGlmIChjcnlwdF9mdHItPmtkZl90eXBlID09IEtERl9TQ1JZUFRfS0VZTUFTVEVSKSB7CisgICAgICAgICAgICAvLyBEb24ndCBhbGxvdyBkb3duZ3JhZGUKKyAgICAgICAgfSBlbHNlIGlmICh1c2Vfa2V5bWFzdGVyID09IDEgJiYgY3J5cHRfZnRyLT5rZGZfdHlwZSAhPSBLREZfU0NSWVBUX0tFWU1BU1RFUikgeworICAgICAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOworICAgICAgICAgICAgdXBncmFkZSA9IDE7CisgICAgICAgIH0gZWxzZSBpZiAodXNlX2tleW1hc3RlciA9PSAwICYmIGNyeXB0X2Z0ci0+a2RmX3R5cGUgIT0gS0RGX1NDUllQVCkgeworICAgICAgICAgICAgY3J5cHRfZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7CisgICAgICAgICAgICB1cGdyYWRlID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cGdyYWRlKSB7CisgICAgICAgICAgICByYyA9IGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci0+c2FsdCwgc2F2ZWRfbWFzdGVyX2tleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci0+bWFzdGVyX2tleSwgY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIGlmICghcmMpIHsKKyAgICAgICAgICAgICAgICByYyA9IHB1dF9jcnlwdF9mdHJfYW5kX2tleShjcnlwdF9mdHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU0xPR0QoIktleSBEZXJpdmF0aW9uIEZ1bmN0aW9uIHVwZ3JhZGU6IHJjPSVkXG4iLCByYyk7CisKKyAgICAgICAgICAgIC8vIERvIG5vdCBmYWlsIGV2ZW4gaWYgdXBncmFkZSBmYWlsZWQgLSBtYWNoaW5lIGlzIGJvb3RhYmxlCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaWYgdGhpcyBjb2RlIGlzIGV2ZXIgaGl0LCB0aGVyZSBpcyBhICpzZXJpb3VzKiBwcm9ibGVtCisgICAgICAgICAgICAvLyBzaW5jZSBLREZzIHNob3VsZCBuZXZlciBmYWlsLiBZb3UgKm11c3QqIGZpeCB0aGUga2RmIGJlZm9yZQorICAgICAgICAgICAgLy8gcHJvY2VlZGluZyEKKyAgICAgICAgICAgIGlmIChyYykgeworICAgICAgICAgICAgICAgIFNMT0dXKAorICAgICAgICAgICAgICAgICAgICAiVXBncmFkZSBmYWlsZWQgd2l0aCBlcnJvciAlZCwiCisgICAgICAgICAgICAgICAgICAgICIgYnV0IGNvbnRpbnVpbmcgd2l0aCBwcmV2aW91cyBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgIHJjKTsKKyAgICAgICAgICAgICAgICByYyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK2Vycm91dDoKKyAgICBpZiAoaW50ZXJtZWRpYXRlX2tleSkgeworICAgICAgICBtZW1zZXQoaW50ZXJtZWRpYXRlX2tleSwgMCwgaW50ZXJtZWRpYXRlX2tleV9zaXplKTsKKyAgICAgICAgZnJlZShpbnRlcm1lZGlhdGVfa2V5KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOwogfQogCiAvKgpAQCAtMTg5NiwxOSArMTg0MSwxMCBAQAogICoKICAqIG91dF9jcnlwdG9fYmxrZGV2IG11c3QgYmUgTUFYUEFUSExFTi4KICAqLwotaW50IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShjb25zdCBjaGFyKiBsYWJlbCwgY29uc3QgY2hhciogcmVhbF9ibGtkZXYsCi0gICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGtleSwgY2hhciogb3V0X2NyeXB0b19ibGtkZXYpIHsKLSAgICBpbnQgZmQgPSBvcGVuKHJlYWxfYmxrZGV2LCBPX1JET05MWXxPX0NMT0VYRUMpOwotICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIG9wZW4gJXM6ICVzIiwgcmVhbF9ibGtkZXYsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYyA9IDA7Ci0gICAgZ2V0X2Jsa2Rldl9zaXplKGZkLCAmbnJfc2VjKTsKLSAgICBjbG9zZShmZCk7Ci0KLSAgICBpZiAobnJfc2VjID09IDApIHsKK2ludCBjcnlwdGZzX3NldHVwX2V4dF92b2x1bWUoY29uc3QgY2hhciogbGFiZWwsIGNvbnN0IGNoYXIqIHJlYWxfYmxrZGV2LCBjb25zdCB1bnNpZ25lZCBjaGFyKiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIG91dF9jcnlwdG9fYmxrZGV2KSB7CisgICAgdWludDY0X3QgbnJfc2VjID0gMDsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCAmbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIG9mICVzOiAlcyIsIHJlYWxfYmxrZGV2LCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTkxNywxMCArMTg1MywxMCBAQAogICAgIG1lbXNldCgmZXh0X2NyeXB0X2Z0ciwgMCwgc2l6ZW9mKGV4dF9jcnlwdF9mdHIpKTsKICAgICBleHRfY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWM7CiAgICAgZXh0X2NyeXB0X2Z0ci5rZXlzaXplID0gY3J5cHRmc19nZXRfa2V5c2l6ZSgpOwotICAgIHN0cmxjcHkoKGNoYXIqKSBleHRfY3J5cHRfZnRyLmNyeXB0b190eXBlX25hbWUsIGNyeXB0ZnNfZ2V0X2NyeXB0b19uYW1lKCksCisgICAgc3RybGNweSgoY2hhciopZXh0X2NyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLAogICAgICAgICAgICAgTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOKTsKICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkgJiYKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSAmJgogICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInJvLmNyeXB0by5hbGxvd19lbmNyeXB0X292ZXJyaWRlIiwgZmFsc2UpKQogICAgICAgICBmbGFncyB8PSBDUkVBVEVfQ1JZUFRPX0JMS19ERVZfRkxBR1NfQUxMT1dfRU5DUllQVF9PVkVSUklERTsKIApAQCAtMTkzMiwyMSArMTg2OCwyMCBAQAogICogc3RvcmFnZSB2b2x1bWUuCiAgKi8KIGludCBjcnlwdGZzX3JldmVydF9leHRfdm9sdW1lKGNvbnN0IGNoYXIqIGxhYmVsKSB7Ci0gICAgcmV0dXJuIGRlbGV0ZV9jcnlwdG9fYmxrX2RldigoY2hhciopIGxhYmVsKTsKKyAgICByZXR1cm4gZGVsZXRlX2NyeXB0b19ibGtfZGV2KChjaGFyKilsYWJlbCk7CiB9CiAKLWludCBjcnlwdGZzX2NyeXB0b19jb21wbGV0ZSh2b2lkKQotewotICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOworaW50IGNyeXB0ZnNfY3J5cHRvX2NvbXBsZXRlKHZvaWQpIHsKKyAgICByZXR1cm4gZG9fY3J5cHRvX2NvbXBsZXRlKCIvZGF0YSIpOwogfQogCi1pbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpCi17CitpbnQgY2hlY2tfdW5tb3VudGVkX2FuZF9nZXRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIpIHsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKCBtYXN0ZXJfa2V5X3NhdmVkIHx8IHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKLSAgICAgICAgU0xPR0UoImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgotICAgICAgICAgICAgICAiIGFib3J0aW5nIik7CisgICAgaWYgKG1hc3Rlcl9rZXlfc2F2ZWQgfHwgc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CisgICAgICAgIFNMT0dFKAorICAgICAgICAgICAgImVuY3J5cHRlZCBmcyBhbHJlYWR5IHZhbGlkYXRlZCBvciBub3QgcnVubmluZyB3aXRoIGVuY3J5cHRpb24sIgorICAgICAgICAgICAgIiBhYm9ydGluZyIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCkBAIC0xOTU4LDEwICsxODkzLDkgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IGNyeXB0ZnNfY2hlY2tfcGFzc3dkKGNvbnN0IGNoYXIgKnBhc3N3ZCkKLXsKK2ludCBjcnlwdGZzX2NoZWNrX3Bhc3N3ZChjb25zdCBjaGFyKiBwYXNzd2QpIHsKICAgICBTTE9HSSgiY3J5cHRmc19jaGVja19wYXNzd2QiKTsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2NoZWNrX3Bhc3N3ZCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMTk3NSw4ICsxOTA5LDcgQEAKICAgICAgICAgcmV0dXJuIHJjOwogICAgIH0KIAotICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9NTlRfUE9JTlQsIENSWVBUT19CTE9DS19ERVZJQ0UpOworICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgcGFzc3dkLCBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgaWYgKHJjKSB7CiAgICAgICAgIFNMT0dFKCJQYXNzd29yZCBkaWQgbm90IG1hdGNoIik7CiAgICAgICAgIHJldHVybiByYzsKQEAgLTE5ODgsOCArMTkyMSw4IEBACiAgICAgICAgIC8vIEZpcnN0LCB3ZSBtdXN0IGRlbGV0ZSB0aGUgY3J5cHRvIGJsb2NrIGRldmljZSB0aGF0CiAgICAgICAgIC8vIHRlc3RfbW91bnRfZW5jcnlwdGVkX2ZzIGxlYXZlcyBiZWhpbmQgYXMgYSBzaWRlIGVmZmVjdAogICAgICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7Ci0gICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQVRBX01OVF9QT0lOVCwgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CisgICAgICAgIHJjID0gdGVzdF9tb3VudF9lbmNyeXB0ZWRfZnMoJmNyeXB0X2Z0ciwgREVGQVVMVF9QQVNTV09SRCwgREFUQV9NTlRfUE9JTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAgICAgICAgIGlmIChyYykgewogICAgICAgICAgICAgU0xPR0UoIkRlZmF1bHQgcGFzc3dvcmQgZGlkIG5vdCBtYXRjaCBvbiByZWJvb3QgZW5jcnlwdGlvbiIpOwogICAgICAgICAgICAgcmV0dXJuIHJjOwpAQCAtMjAxNSwxNSArMTk0OCwxNCBAQAogICAgIHJldHVybiByYzsKIH0KIAotaW50IGNyeXB0ZnNfdmVyaWZ5X3Bhc3N3ZChjb25zdCBjaGFyICpwYXNzd2QpCi17CitpbnQgY3J5cHRmc192ZXJpZnlfcGFzc3dkKGNvbnN0IGNoYXIqIHBhc3N3ZCkgewogICAgIHN0cnVjdCBjcnlwdF9tbnRfZnRyIGNyeXB0X2Z0cjsKICAgICB1bnNpZ25lZCBjaGFyIGRlY3J5cHRlZF9tYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsKICAgICBjaGFyIGVuY3J5cHRlZF9zdGF0ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgIGludCByYzsKIAogICAgIHByb3BlcnR5X2dldCgicm8uY3J5cHRvLnN0YXRlIiwgZW5jcnlwdGVkX3N0YXRlLCAiIik7Ci0gICAgaWYgKHN0cmNtcChlbmNyeXB0ZWRfc3RhdGUsICJlbmNyeXB0ZWQiKSApIHsKKyAgICBpZiAoc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIFNMT0dFKCJkZXZpY2Ugbm90IGVuY3J5cHRlZCwgYWJvcnRpbmciKTsKICAgICAgICAgcmV0dXJuIC0yOwogICAgIH0KQEAgLTIwNjYsOCArMTk5OCw3IEBACiAgKiBQcmVzdW1hYmx5LCBhdCBhIG1pbmltdW0sIHRoZSBjYWxsZXIgd2lsbCB1cGRhdGUgdGhlCiAgKiBmaWxlc3lzdGVtIHNpemUgYW5kIGNyeXB0b190eXBlX25hbWUgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgogICovCi1zdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIpCi17CitzdGF0aWMgaW50IGNyeXB0ZnNfaW5pdF9jcnlwdF9tbnRfZnRyKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBmdHIpIHsKICAgICBvZmY2NF90IG9mZjsKIAogICAgIG1lbXNldChmdHIsIDAsIHNpemVvZihzdHJ1Y3QgY3J5cHRfbW50X2Z0cikpOwpAQCAtMjA3OCwxNyArMjAwOSwxNyBAQAogICAgIGZ0ci0+a2V5c2l6ZSA9IGNyeXB0ZnNfZ2V0X2tleXNpemUoKTsKIAogICAgIHN3aXRjaCAoa2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHkoKSkgewotICAgIGNhc2UgMToKLSAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFRfS0VZTUFTVEVSOworICAgICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIDA6Ci0gICAgICAgIGZ0ci0+a2RmX3R5cGUgPSBLREZfU0NSWVBUOwotICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZnRyLT5rZGZfdHlwZSA9IEtERl9TQ1JZUFQ7CisgICAgICAgICAgICBicmVhazsKIAotICAgIGRlZmF1bHQ6Ci0gICAgICAgIFNMT0dFKCJrZXltYXN0ZXJfY2hlY2tfY29tcGF0aWJpbGl0eSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgU0xPR0UoImtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5IGZhaWxlZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGdldF9kZXZpY2Vfc2NyeXB0X3BhcmFtcyhmdHIpOwpAQCAtMjA5Niw4ICsyMDI3LDcgQEAKICAgICBmdHItPnBlcnNpc3RfZGF0YV9zaXplID0gQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkU7CiAgICAgaWYgKGdldF9jcnlwdF9mdHJfaW5mbyhOVUxMLCAmb2ZmKSA9PSAwKSB7CiAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFswXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVDsKLSAgICAgICAgZnRyLT5wZXJzaXN0X2RhdGFfb2Zmc2V0WzFdID0gb2ZmICsgQ1JZUFRfRk9PVEVSX1RPX1BFUlNJU1RfT0ZGU0VUICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CisgICAgICAgIGZ0ci0+cGVyc2lzdF9kYXRhX29mZnNldFsxXSA9IG9mZiArIENSWVBUX0ZPT1RFUl9UT19QRVJTSVNUX09GRlNFVCArIGZ0ci0+cGVyc2lzdF9kYXRhX3NpemU7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0yMTA1LDkgKzIwMzUsOCBAQAogCiAjZGVmaW5lIEZSQU1FV09SS19CT09UX1dBSVQgNjAKIAotc3RhdGljIGludCBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY29uc3QgY2hhciogZmlsZW5hbWUsIF9fbGU4KiBidWYpCi17Ci0gICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFl8T19DTE9FWEVDKTsKK3N0YXRpYyBpbnQgY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBfX2xlOCogYnVmKSB7CisgICAgaW50IGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwogICAgIGlmIChmZCA9PSAtMSkgewogICAgICAgICBTTE9HRSgiRXJyb3Igb3BlbmluZyBmaWxlICVzIiwgZmlsZW5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yMTMzLDcgKzIwNjIsNyBAQAogCiBzdGF0aWMgaW50IGNyeXB0ZnNfZW5hYmxlX2FsbF92b2x1bWVzKHN0cnVjdCBjcnlwdF9tbnRfZnRyKiBjcnlwdF9mdHIsIGNoYXIqIGNyeXB0b19ibGtkZXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIHJlYWxfYmxrZGV2LCBpbnQgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0bykgewotICAgIG9mZjY0X3QgY3VyX2VuY3J5cHRpb25fZG9uZT0wLCB0b3RfZW5jcnlwdGlvbl9zaXplPTA7CisgICAgb2ZmNjRfdCBjdXJfZW5jcnlwdGlvbl9kb25lID0gMCwgdG90X2VuY3J5cHRpb25fc2l6ZSA9IDA7CiAgICAgaW50IHJjID0gLTE7CiAKICAgICAvKiBUaGUgc2l6ZSBvZiB0aGUgdXNlcmRhdGEgcGFydGl0aW9uLCBhbmQgYWRkIGluIHRoZSB2b2xkIHZvbHVtZXMgYmVsb3cgKi8KQEAgLTIxNjksMTcgKzIwOTgsMTYgQEAKIGludCBjcnlwdGZzX2VuYWJsZV9pbnRlcm5hbChpbnQgY3J5cHRfdHlwZSwgY29uc3QgY2hhciogcGFzc3dkLCBpbnQgbm9fdWkpIHsKICAgICBjaGFyIGNyeXB0b19ibGtkZXZbTUFYUEFUSExFTl0sIHJlYWxfYmxrZGV2W01BWFBBVEhMRU5dOwogICAgIHVuc2lnbmVkIGNoYXIgZGVjcnlwdGVkX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwotICAgIGludCByYz0tMSwgaTsKKyAgICBpbnQgcmMgPSAtMSwgaTsKICAgICBzdHJ1Y3QgY3J5cHRfbW50X2Z0ciBjcnlwdF9mdHI7Ci0gICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSAqcGRhdGE7CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSogcGRhdGE7CiAgICAgY2hhciBlbmNyeXB0ZWRfc3RhdGVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBjaGFyIGxvY2tpZFszMl0gPSB7IDAgfTsKKyAgICBjaGFyIGxvY2tpZFszMl0gPSB7MH07CiAgICAgY2hhciBrZXlfbG9jW1BST1BFUlRZX1ZBTFVFX01BWF07CiAgICAgaW50IG51bV92b2xzOwogICAgIG9mZjY0X3QgcHJldmlvdXNseV9lbmNyeXB0ZWRfdXB0byA9IDA7CiAgICAgYm9vbCByZWJvb3RFbmNyeXB0aW9uID0gZmFsc2U7CiAgICAgYm9vbCBvbmx5Q3JlYXRlSGVhZGVyID0gZmFsc2U7Ci0gICAgaW50IGZkID0gLTE7CiAKICAgICBpZiAoZ2V0X2NyeXB0X2Z0cl9hbmRfa2V5KCZjcnlwdF9mdHIpID09IDApIHsKICAgICAgICAgaWYgKGNyeXB0X2Z0ci5mbGFncyAmIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MpIHsKQEAgLTIyMjMsMjUgKzIxNTEsMTcgQEAKICAgICBmc19tZ3JfZ2V0X2NyeXB0X2luZm8oZnN0YWJfZGVmYXVsdCwgMCwgcmVhbF9ibGtkZXYsIHNpemVvZihyZWFsX2Jsa2RldikpOwogCiAgICAgLyogR2V0IHRoZSBzaXplIG9mIHRoZSByZWFsIGJsb2NrIGRldmljZSAqLwotICAgIGZkID0gb3BlbihyZWFsX2Jsa2RldiwgT19SRE9OTFl8T19DTE9FWEVDKTsKLSAgICBpZiAoZmQgPT0gLTEpIHsKLSAgICAgICAgU0xPR0UoIkNhbm5vdCBvcGVuIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwotICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwotICAgIH0KLSAgICB1bnNpZ25lZCBsb25nIG5yX3NlYzsKLSAgICBnZXRfYmxrZGV2X3NpemUoZmQsICZucl9zZWMpOwotICAgIGlmIChucl9zZWMgPT0gMCkgeworICAgIHVpbnQ2NF90IG5yX3NlYzsKKyAgICBpZiAoYW5kcm9pZDo6dm9sZDo6R2V0QmxvY2tEZXY1MTJTZWN0b3JzKHJlYWxfYmxrZGV2LCAmbnJfc2VjKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBzaXplIG9mIGJsb2NrIGRldmljZSAlc1xuIiwgcmVhbF9ibGtkZXYpOwogICAgICAgICBnb3RvIGVycm9yX3VuZW5jcnlwdGVkOwogICAgIH0KLSAgICBjbG9zZShmZCk7CiAKICAgICAvKiBJZiBkb2luZyBpbnBsYWNlIGVuY3J5cHRpb24sIG1ha2Ugc3VyZSB0aGUgb3JpZyBmcyBkb2Vzbid0IGluY2x1ZGUgdGhlIGNyeXB0byBmb290ZXIgKi8KICAgICBpZiAoIXN0cmNtcChrZXlfbG9jLCBLRVlfSU5fRk9PVEVSKSkgewotICAgICAgICB1bnNpZ25lZCBpbnQgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKKyAgICAgICAgdWludDY0X3QgZnNfc2l6ZV9zZWMsIG1heF9mc19zaXplX3NlYzsKICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZnNfc2l6ZShyZWFsX2Jsa2Rldik7Ci0gICAgICAgIGlmIChmc19zaXplX3NlYyA9PSAwKQotICAgICAgICAgICAgZnNfc2l6ZV9zZWMgPSBnZXRfZjJmc19maWxlc3lzdGVtX3NpemVfc2VjKHJlYWxfYmxrZGV2KTsKKyAgICAgICAgaWYgKGZzX3NpemVfc2VjID09IDApIGZzX3NpemVfc2VjID0gZ2V0X2YyZnNfZmlsZXN5c3RlbV9zaXplX3NlYyhyZWFsX2Jsa2Rldik7CiAKICAgICAgICAgbWF4X2ZzX3NpemVfc2VjID0gbnJfc2VjIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CiAKQEAgLTIyNTUsNyArMjE3NSw3IEBACiAgICAgICogZGV2aWNlIHRvIHNsZWVwIG9uIHVzLiAgV2UnbGwgZ3JhYiBhIHBhcnRpYWwgd2FrZWxvY2ssIGFuZCBpZiB0aGUgVUkKICAgICAgKiB3YW50cyB0byBrZWVwIHRoZSBzY3JlZW4gb24sIGl0IGNhbiBncmFiIGEgZnVsbCB3YWtlbG9jay4KICAgICAgKi8KLSAgICBzbnByaW50Zihsb2NraWQsIHNpemVvZihsb2NraWQpLCAiZW5hYmxlY3J5cHRvJWQiLCAoaW50KSBnZXRwaWQoKSk7CisgICAgc25wcmludGYobG9ja2lkLCBzaXplb2YobG9ja2lkKSwgImVuYWJsZWNyeXB0byVkIiwgKGludClnZXRwaWQoKSk7CiAgICAgYWNxdWlyZV93YWtlX2xvY2soUEFSVElBTF9XQUtFX0xPQ0ssIGxvY2tpZCk7CiAKICAgICAvKiBUaGUgaW5pdCBmaWxlcyBhcmUgc2V0dXAgdG8gc3RvcCB0aGUgY2xhc3MgbWFpbiBhbmQgbGF0ZSBzdGFydCB3aGVuCkBAIC0yMzE1LDggKzIyMzUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFzdHJjbXAoa2V5X2xvYywgS0VZX0lOX0ZPT1RFUikpIHsKLSAgICAgICAgICAgIGNyeXB0X2Z0ci5mc19zaXplID0gbnJfc2VjCi0gICAgICAgICAgICAgIC0gKENSWVBUX0ZPT1RFUl9PRkZTRVQgLyBDUllQVF9TRUNUT1JfU0laRSk7CisgICAgICAgICAgICBjcnlwdF9mdHIuZnNfc2l6ZSA9IG5yX3NlYyAtIChDUllQVF9GT09URVJfT0ZGU0VUIC8gQ1JZUFRfU0VDVE9SX1NJWkUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgY3J5cHRfZnRyLmZzX3NpemUgPSBucl9zZWM7CiAgICAgICAgIH0KQEAgLTIzMzAsNyArMjI0OSw4IEBACiAgICAgICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgfD0gQ1JZUFRfSU5DT05TSVNURU5UX1NUQVRFOwogICAgICAgICB9CiAgICAgICAgIGNyeXB0X2Z0ci5jcnlwdF90eXBlID0gY3J5cHRfdHlwZTsKLSAgICAgICAgc3RybGNweSgoY2hhciAqKWNyeXB0X2Z0ci5jcnlwdG9fdHlwZV9uYW1lLCBjcnlwdGZzX2dldF9jcnlwdG9fbmFtZSgpLCBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOworICAgICAgICBzdHJsY3B5KChjaGFyKiljcnlwdF9mdHIuY3J5cHRvX3R5cGVfbmFtZSwgY3J5cHRmc19nZXRfY3J5cHRvX25hbWUoKSwKKyAgICAgICAgICAgICAgICBNQVhfQ1JZUFRPX1RZUEVfTkFNRV9MRU4pOwogCiAgICAgICAgIC8qIE1ha2UgYW4gZW5jcnlwdGVkIG1hc3RlciBrZXkgKi8KICAgICAgICAgaWYgKGNyZWF0ZV9lbmNyeXB0ZWRfcmFuZG9tX2tleShvbmx5Q3JlYXRlSGVhZGVyID8gREVGQVVMVF9QQVNTV09SRCA6IHBhc3N3ZCwKQEAgLTIzNDQsOCArMjI2NCw4IEBACiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGZha2VfbWFzdGVyX2tleVtNQVhfS0VZX0xFTl07CiAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXlbTUFYX0tFWV9MRU5dOwogICAgICAgICAgICAgbWVtc2V0KGZha2VfbWFzdGVyX2tleSwgMCwgc2l6ZW9mKGZha2VfbWFzdGVyX2tleSkpOwotICAgICAgICAgICAgZW5jcnlwdF9tYXN0ZXJfa2V5KHBhc3N3ZCwgY3J5cHRfZnRyLnNhbHQsIGZha2VfbWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRfZmFrZV9tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKKyAgICAgICAgICAgIGVuY3J5cHRfbWFzdGVyX2tleShwYXNzd2QsIGNyeXB0X2Z0ci5zYWx0LCBmYWtlX21hc3Rlcl9rZXksIGVuY3J5cHRlZF9mYWtlX21hc3Rlcl9rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CiAgICAgICAgIH0KIAogICAgICAgICAvKiBXcml0ZSB0aGUga2V5IHRvIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbiAqLwpAQCAtMjM1NSwxMSArMjI3NSwxMSBAQAogICAgICAgICAgKiBJZiBub25lLCBjcmVhdGUgYSB2YWxpZCBlbXB0eSB0YWJsZSBhbmQgc2F2ZSB0aGF0LgogICAgICAgICAgKi8KICAgICAgICAgaWYgKCFwZXJzaXN0X2RhdGEpIHsKLSAgICAgICAgICAgIHBkYXRhID0gKGNyeXB0X3BlcnNpc3RfZGF0YSAqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7Ci0gICAgICAgICAgIGlmIChwZGF0YSkgewotICAgICAgICAgICAgICAgaW5pdF9lbXB0eV9wZXJzaXN0X2RhdGEocGRhdGEsIENSWVBUX1BFUlNJU1RfREFUQV9TSVpFKTsKLSAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOwotICAgICAgICAgICB9CisgICAgICAgICAgICBwZGF0YSA9IChjcnlwdF9wZXJzaXN0X2RhdGEqKW1hbGxvYyhDUllQVF9QRVJTSVNUX0RBVEFfU0laRSk7CisgICAgICAgICAgICBpZiAocGRhdGEpIHsKKyAgICAgICAgICAgICAgICBpbml0X2VtcHR5X3BlcnNpc3RfZGF0YShwZGF0YSwgQ1JZUFRfUEVSU0lTVF9EQVRBX1NJWkUpOworICAgICAgICAgICAgICAgIHBlcnNpc3RfZGF0YSA9IHBkYXRhOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGlmIChwZXJzaXN0X2RhdGEpIHsKICAgICAgICAgICAgIHNhdmVfcGVyc2lzdGVudF9kYXRhKCk7CkBAIC0yMzkzLDggKzIzMTMsOCBAQAogICAgICAgICBfX2xlOCBoYXNoX2ZpcnN0X2Jsb2NrW1NIQTI1Nl9ESUdFU1RfTEVOR1RIXTsKICAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgaGFzaF9maXJzdF9ibG9jayk7CiAKLSAgICAgICAgaWYgKCFyYyAmJiBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgeworICAgICAgICBpZiAoIXJjICYmCisgICAgICAgICAgICBtZW1jbXAoaGFzaF9maXJzdF9ibG9jaywgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2ssIHNpemVvZihoYXNoX2ZpcnN0X2Jsb2NrKSkgIT0gMCkgewogICAgICAgICAgICAgU0xPR0UoIkNoZWNrc3VtcyBkbyBub3QgbWF0Y2ggLSB0cmlnZ2VyIHdpcGUiKTsKICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgIH0KQEAgLTI0MDcsOCArMjMyNyw3IEBACiAKICAgICAvKiBDYWxjdWxhdGUgY2hlY2tzdW0gaWYgd2UgYXJlIG5vdCBmaW5pc2hlZCAqLwogICAgIGlmICghcmMgJiYgY3J5cHRfZnRyLmVuY3J5cHRlZF91cHRvICE9IGNyeXB0X2Z0ci5mc19zaXplKSB7Ci0gICAgICAgIHJjID0gY3J5cHRmc19TSEEyNTZfZmlsZWJsb2NrKGNyeXB0b19ibGtkZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5oYXNoX2ZpcnN0X2Jsb2NrKTsKKyAgICAgICAgcmMgPSBjcnlwdGZzX1NIQTI1Nl9maWxlYmxvY2soY3J5cHRvX2Jsa2RldiwgY3J5cHRfZnRyLmhhc2hfZmlyc3RfYmxvY2spOwogICAgICAgICBpZiAocmMpIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBjYWxjdWxhdGluZyBjaGVja3N1bSBmb3IgY29udGludWluZyBlbmNyeXB0aW9uIik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMjQxOCw3ICsyMzM3LDcgQEAKICAgICAvKiBVbmRvIHRoZSBkbS1jcnlwdCBtYXBwaW5nIHdoZXRoZXIgd2Ugc3VjY2VlZCBvciBub3QgKi8KICAgICBkZWxldGVfY3J5cHRvX2Jsa19kZXYoQ1JZUFRPX0JMT0NLX0RFVklDRSk7CiAKLSAgICBpZiAoISByYykgeworICAgIGlmICghcmMpIHsKICAgICAgICAgLyogU3VjY2VzcyAqLwogICAgICAgICBjcnlwdF9mdHIuZmxhZ3MgJj0gfkNSWVBUX0lOQ09OU0lTVEVOVF9TVEFURTsKIApAQCAtMjQ2Niw4ICsyMzg1LDcgQEAKICAgICAgICAgICAgIFNMT0dFKCJlbmNyeXB0aW9uIGZhaWxlZCAtIHJlYm9vdGluZyBpbnRvIHJlY292ZXJ5IHRvIHdpcGUgZGF0YVxuIik7CiAgICAgICAgICAgICBzdGQ6OnN0cmluZyBlcnI7CiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3B0aW9ucyA9IHsKLSAgICAgICAgICAgICAgICAiLS13aXBlX2RhdGFcbi0tcmVhc29uPWNyeXB0ZnNfZW5hYmxlX2ludGVybmFsXG4iCi0gICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICItLXdpcGVfZGF0YVxuLS1yZWFzb249Y3J5cHRmc19lbmFibGVfaW50ZXJuYWxcbiJ9OwogICAgICAgICAgICAgaWYgKCF3cml0ZV9ib290bG9hZGVyX21lc3NhZ2Uob3B0aW9ucywgJmVycikpIHsKICAgICAgICAgICAgICAgICBTTE9HRSgiY291bGQgbm90IHdyaXRlIGJvb3Rsb2FkZXIgbWVzc2FnZTogJXMiLCBlcnIuY19zdHIoKSk7CiAgICAgICAgICAgICB9CkBAIC0yNTAwLDcgKzI0MTgsOSBAQAogICAgICAqIGJ1dCB0aGUgZnJhbWV3b3JrIGlzIHN0b3BwZWQgYW5kIG5vdCByZXN0YXJ0ZWQgdG8gc2hvdyB0aGUgZXJyb3IsIHNvIGl0J3MgdXAgdG8KICAgICAgKiB2b2xkIHRvIHJlc3RhcnQgdGhlIHN5c3RlbS4KICAgICAgKi8KLSAgICBTTE9HRSgiRXJyb3IgZW5hYmxpbmcgZW5jcnlwdGlvbiBhZnRlciBmcmFtZXdvcmsgaXMgc2h1dGRvd24sIG5vIGRhdGEgY2hhbmdlZCwgcmVzdGFydGluZyBzeXN0ZW0iKTsKKyAgICBTTE9HRSgKKyAgICAgICAgIkVycm9yIGVuYWJsaW5nIGVuY3J5cHRpb24gYWZ0ZXIgZnJhbWV3b3JrIGlzIHNodXRkb3duLCBubyBkYXRhIGNoYW5nZWQsIHJlc3RhcnRpbmcgIgorICAgICAgICAic3lzdGVtIik7CiAgICAgY3J5cHRmc19yZWJvb3QoUmVib290VHlwZTo6cmVib290KTsKIAogICAgIC8qIHNob3VsZG4ndCBnZXQgaGVyZSAqLwpAQCAtMjUxOSw5ICsyNDM5LDggQEAKICAgICByZXR1cm4gY3J5cHRmc19lbmFibGVfaW50ZXJuYWwoQ1JZUFRfVFlQRV9ERUZBVUxULCBERUZBVUxUX1BBU1NXT1JELCBub191aSk7CiB9CiAKLWludCBjcnlwdGZzX2NoYW5nZXB3KGludCBjcnlwdF90eXBlLCBjb25zdCBjaGFyICpuZXdwdykKLXsKLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworaW50IGNyeXB0ZnNfY2hhbmdlcHcoaW50IGNyeXB0X3R5cGUsIGNvbnN0IGNoYXIqIG5ld3B3KSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfY2hhbmdlcHcgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb24iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTI1NDgsMTIgKzI0NjcsOCBAQAogCiAgICAgY3J5cHRfZnRyLmNyeXB0X3R5cGUgPSBjcnlwdF90eXBlOwogCi0gICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3cHcsCi0gICAgICAgICAgICAgICAgICAgICAgIGNyeXB0X2Z0ci5zYWx0LAotICAgICAgICAgICAgICAgICAgICAgICBzYXZlZF9tYXN0ZXJfa2V5LAotICAgICAgICAgICAgICAgICAgICAgICBjcnlwdF9mdHIubWFzdGVyX2tleSwKLSAgICAgICAgICAgICAgICAgICAgICAgJmNyeXB0X2Z0cik7CisgICAgcmMgPSBlbmNyeXB0X21hc3Rlcl9rZXkoY3J5cHRfdHlwZSA9PSBDUllQVF9UWVBFX0RFRkFVTFQgPyBERUZBVUxUX1BBU1NXT1JEIDogbmV3cHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3J5cHRfZnRyLnNhbHQsIHNhdmVkX21hc3Rlcl9rZXksIGNyeXB0X2Z0ci5tYXN0ZXJfa2V5LCAmY3J5cHRfZnRyKTsKICAgICBpZiAocmMpIHsKICAgICAgICAgU0xPR0UoIkVuY3J5cHQgbWFzdGVyIGtleSBmYWlsZWQ6ICVkIiwgcmMpOwogICAgICAgICByZXR1cm4gLTE7CkBAIC0yNTg4LDggKzI1MDMsNyBAQAogICAgIH0KIH0KIAotc3RhdGljIGludCBwZXJzaXN0X2dldF9rZXkoY29uc3QgY2hhciAqZmllbGRuYW1lLCBjaGFyICp2YWx1ZSkKLXsKK3N0YXRpYyBpbnQgcGVyc2lzdF9nZXRfa2V5KGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY2hhciogdmFsdWUpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKIAogICAgIGlmIChwZXJzaXN0X2RhdGEgPT0gTlVMTCkgewpAQCAtMjYwNiw4ICsyNTIwLDcgQEAKICAgICByZXR1cm4gLTE7CiB9CiAKLXN0YXRpYyBpbnQgcGVyc2lzdF9zZXRfa2V5KGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCBlbmNyeXB0ZWQpCi17CitzdGF0aWMgaW50IHBlcnNpc3Rfc2V0X2tleShjb25zdCBjaGFyKiBmaWVsZG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlLCBpbnQgZW5jcnlwdGVkKSB7CiAgICAgdW5zaWduZWQgaW50IGk7CiAgICAgdW5zaWduZWQgaW50IG51bTsKICAgICB1bnNpZ25lZCBpbnQgbWF4X3BlcnNpc3RlbnRfZW50cmllczsKQEAgLTI2NDUsNyArMjU1OCw3IEBACiAgKiBUZXN0IGlmIGtleSBpcyBwYXJ0IG9mIHRoZSBtdWx0aS1lbnRyeSAoZmllbGQsIGluZGV4KSBzZXF1ZW5jZS4gUmV0dXJuIG5vbi16ZXJvIGlmIGtleSBpcyBpbiB0aGUKICAqIHNlcXVlbmNlIGFuZCBpdHMgaW5kZXggaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGluZGV4LiBSZXR1cm4gMCBvdGhlcndpc2UuCiAgKi8KLWludCBtYXRjaF9tdWx0aV9lbnRyeShjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKmZpZWxkLCB1bnNpZ25lZCBpbmRleCkgeworaW50IG1hdGNoX211bHRpX2VudHJ5KGNvbnN0IGNoYXIqIGtleSwgY29uc3QgY2hhciogZmllbGQsIHVuc2lnbmVkIGluZGV4KSB7CiAgICAgc3RkOjpzdHJpbmcga2V5XyA9IGtleTsKICAgICBzdGQ6OnN0cmluZyBmaWVsZF8gPSBmaWVsZDsKIApAQCAtMjY3Miw4ICsyNTg1LDcgQEAKICAqIGFuZCBQRVJTSVNUX0RFTF9LRVlfRVJST1JfT1RIRVIgaWYgZXJyb3Igb2NjdXJzLgogICoKICAqLwotc3RhdGljIGludCBwZXJzaXN0X2RlbF9rZXlzKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgdW5zaWduZWQgaW5kZXgpCi17CitzdGF0aWMgaW50IHBlcnNpc3RfZGVsX2tleXMoY29uc3QgY2hhciogZmllbGRuYW1lLCB1bnNpZ25lZCBpbmRleCkgewogICAgIHVuc2lnbmVkIGludCBpOwogICAgIHVuc2lnbmVkIGludCBqOwogICAgIHVuc2lnbmVkIGludCBudW07CkBAIC0yNjg0LDcgKzI1OTYsNyBAQAogCiAgICAgbnVtID0gcGVyc2lzdF9kYXRhLT5wZXJzaXN0X3ZhbGlkX2VudHJpZXM7CiAKLSAgICBqID0gMDsgLy8gcG9pbnRzIHRvIHRoZSBlbmQgb2Ygbm9uLWRlbGV0ZWQgZW50cmllcy4KKyAgICBqID0gMDsgIC8vIHBvaW50cyB0byB0aGUgZW5kIG9mIG5vbi1kZWxldGVkIGVudHJpZXMuCiAgICAgLy8gRmlsdGVyIG91dCB0by1iZS1kZWxldGVkIGVudHJpZXMgaW4gcGxhY2UuCiAgICAgZm9yIChpID0gMDsgaSA8IG51bTsgaSsrKSB7CiAgICAgICAgIGlmICghbWF0Y2hfbXVsdGlfZW50cnkocGVyc2lzdF9kYXRhLT5wZXJzaXN0X2VudHJ5W2ldLmtleSwgZmllbGRuYW1lLCBpbmRleCkpIHsKQEAgLTI3MDQsOCArMjYxNiw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW50IHBlcnNpc3RfY291bnRfa2V5cyhjb25zdCBjaGFyICpmaWVsZG5hbWUpCi17CitzdGF0aWMgaW50IHBlcnNpc3RfY291bnRfa2V5cyhjb25zdCBjaGFyKiBmaWVsZG5hbWUpIHsKICAgICB1bnNpZ25lZCBpbnQgaTsKICAgICB1bnNpZ25lZCBpbnQgY291bnQ7CiAKQEAgLTI3MjQsOSArMjYzNSw4IEBACiB9CiAKIC8qIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmaWVsZC4gKi8KLWludCBjcnlwdGZzX2dldGZpZWxkKGNvbnN0IGNoYXIgKmZpZWxkbmFtZSwgY2hhciAqdmFsdWUsIGludCBsZW4pCi17Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKK2ludCBjcnlwdGZzX2dldGZpZWxkKGNvbnN0IGNoYXIqIGZpZWxkbmFtZSwgY2hhciogdmFsdWUsIGludCBsZW4pIHsKKyAgICBpZiAoZnNjcnlwdF9pc19uYXRpdmUoKSkgewogICAgICAgICBTTE9HRSgiQ2Fubm90IGdldCBmaWVsZCB3aGVuIGZpbGUgZW5jcnlwdGVkIik7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CkBAIC0yNzUzLDcgKzI2NjMsNyBAQAogICAgIC8vIHN0aXRjaCB0aGVtIGJhY2sgdG9nZXRoZXIuCiAgICAgaWYgKCFwZXJzaXN0X2dldF9rZXkoZmllbGRuYW1lLCB0ZW1wX3ZhbHVlKSkgewogICAgICAgICAvLyBXZSBmb3VuZCBpdCwgY29weSBpdCB0byB0aGUgY2FsbGVyJ3MgYnVmZmVyIGFuZCBrZWVwIGdvaW5nIHVudGlsIGFsbCBlbnRyaWVzIGFyZSByZWFkLgotICAgICAgICBpZiAoc3RybGNweSh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpIGxlbikgeworICAgICAgICBpZiAoc3RybGNweSh2YWx1ZSwgdGVtcF92YWx1ZSwgbGVuKSA+PSAodW5zaWduZWQpbGVuKSB7CiAgICAgICAgICAgICAvLyB2YWx1ZSB0b28gc21hbGwKICAgICAgICAgICAgIHJjID0gQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEw7CiAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTI3NjIsNyArMjY3Miw3IEBACiAKICAgICAgICAgZm9yIChpID0gMTsgLyogYnJlYWsgZXhwbGljaXRseSAqLzsgaSsrKSB7CiAgICAgICAgICAgICBpZiAoc25wcmludGYodGVtcF9maWVsZCwgc2l6ZW9mKHRlbXBfZmllbGQpLCAiJXNfJWQiLCBmaWVsZG5hbWUsIGkpID49Ci0gICAgICAgICAgICAgICAgICAgIChpbnQpIHNpemVvZih0ZW1wX2ZpZWxkKSkgeworICAgICAgICAgICAgICAgIChpbnQpc2l6ZW9mKHRlbXBfZmllbGQpKSB7CiAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZpZWxkbmFtZSBpcyB2ZXJ5IGxvbmcsIHdlIHN0b3AgYXMgc29vbiBhcyBpdCBiZWdpbnMgdG8gb3ZlcmZsb3cgdGhlCiAgICAgICAgICAgICAgICAgLy8gbWF4aW11bSBmaWVsZCBsZW5ndGguIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBpbiBmYWN0IGZ1bGx5IHJlYWQgb3V0IHRoZSBvcmlnaW5hbAogICAgICAgICAgICAgICAgIC8vIHZhbHVlIGJlY2F1c2UgY3J5cHRmc19zZXRmaWVsZCB3b3VsZCBub3QgYWxsb3cgZmllbGRzIHdpdGggbG9uZ2VyIG5hbWVzIHRvIGJlCkBAIC0yNzcwLDExICsyNjgwLDExIEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoIXBlcnNpc3RfZ2V0X2tleSh0ZW1wX2ZpZWxkLCB0ZW1wX3ZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgaWYgKHN0cmxjYXQodmFsdWUsIHRlbXBfdmFsdWUsIGxlbikgPj0gKHVuc2lnbmVkKWxlbikgewotICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlIHRvbyBzbWFsbC4KLSAgICAgICAgICAgICAgICAgICAgICByYyA9IENSWVBUT19HRVRGSUVMRF9FUlJPUl9CVUZfVE9PX1NNQUxMOwotICAgICAgICAgICAgICAgICAgICAgIGdvdG8gb3V0OwotICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdHJsY2F0KHZhbHVlLCB0ZW1wX3ZhbHVlLCBsZW4pID49ICh1bnNpZ25lZClsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgdG9vIHNtYWxsLgorICAgICAgICAgICAgICAgICAgICByYyA9IENSWVBUT19HRVRGSUVMRF9FUlJPUl9CVUZfVE9PX1NNQUxMOworICAgICAgICAgICAgICAgICAgICBnb3RvIG91dDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIEV4aGF1c3QgYWxsIGVudHJpZXMuCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yNzkwLDkgKzI3MDAsOCBAQAogfQogCiAvKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZmllbGQuICovCi1pbnQgY3J5cHRmc19zZXRmaWVsZChjb25zdCBjaGFyICpmaWVsZG5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQotewotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CitpbnQgY3J5cHRmc19zZXRmaWVsZChjb25zdCBjaGFyKiBmaWVsZG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoIkNhbm5vdCBzZXQgZmllbGQgd2hlbiBmaWxlIGVuY3J5cHRlZCIpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQpAQCAtMjgxNSw3ICsyNzI0LDcgQEAKICAgICB9CiAKICAgICBwcm9wZXJ0eV9nZXQoInJvLmNyeXB0by5zdGF0ZSIsIGVuY3J5cHRlZF9zdGF0ZSwgIiIpOwotICAgIGlmICghc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpICkgeworICAgIGlmICghc3RyY21wKGVuY3J5cHRlZF9zdGF0ZSwgImVuY3J5cHRlZCIpKSB7CiAgICAgICAgIGVuY3J5cHRlZCA9IDE7CiAgICAgfQogCkBAIC0yODg0LDE0ICsyNzkzLDE0IEBACiAgKiBPbiBzdWNjZXNzIHRyaWdnZXIgbmV4dCBpbml0IHBoYXNlIGFuZCByZXR1cm4gMC4KICAqIEN1cnJlbnRseSBkbyBub3QgaGFuZGxlIGZhaWx1cmUgLSBzZWUgVE9ETyBiZWxvdy4KICAqLwotaW50IGNyeXB0ZnNfbW91bnRfZGVmYXVsdF9lbmNyeXB0ZWQodm9pZCkKLXsKK2ludCBjcnlwdGZzX21vdW50X2RlZmF1bHRfZW5jcnlwdGVkKHZvaWQpIHsKICAgICBpbnQgY3J5cHRfdHlwZSA9IGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkX3R5cGUoKTsKICAgICBpZiAoY3J5cHRfdHlwZSA8IDAgfHwgY3J5cHRfdHlwZSA+IENSWVBUX1RZUEVfTUFYX1RZUEUpIHsKICAgICAgICAgU0xPR0UoIkJhZCBjcnlwdCB0eXBlIC0gZXJyb3IiKTsKICAgICB9IGVsc2UgaWYgKGNyeXB0X3R5cGUgIT0gQ1JZUFRfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgIFNMT0dEKCJQYXNzd29yZCBpcyBub3QgZGVmYXVsdCAtICIKLSAgICAgICAgICAgICAgInN0YXJ0aW5nIG1pbiBmcmFtZXdvcmsgdG8gcHJvbXB0Iik7CisgICAgICAgIFNMT0dEKAorICAgICAgICAgICAgIlBhc3N3b3JkIGlzIG5vdCBkZWZhdWx0IC0gIgorICAgICAgICAgICAgInN0YXJ0aW5nIG1pbiBmcmFtZXdvcmsgdG8gcHJvbXB0Iik7CiAgICAgICAgIHByb3BlcnR5X3NldCgidm9sZC5kZWNyeXB0IiwgInRyaWdnZXJfcmVzdGFydF9taW5fZnJhbWV3b3JrIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0gZWxzZSBpZiAoY3J5cHRmc19jaGVja19wYXNzd2QoREVGQVVMVF9QQVNTV09SRCkgPT0gMCkgewpAQCAtMjkxMSw5ICsyODIwLDggQEAKIAogLyogUmV0dXJucyB0eXBlIG9mIHRoZSBwYXNzd29yZCwgZGVmYXVsdCwgcGF0dGVybiwgcGluIG9yIHBhc3N3b3JkLgogICovCi1pbnQgY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSh2b2lkKQotewotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CitpbnQgY3J5cHRmc19nZXRfcGFzc3dvcmRfdHlwZSh2b2lkKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgU0xPR0UoImNyeXB0ZnNfZ2V0X3Bhc3N3b3JkX3R5cGUgbm90IHZhbGlkIGZvciBmaWxlIGVuY3J5cHRpb24iKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KQEAgLTI5MzIsOSArMjg0MCw4IEBACiAgICAgcmV0dXJuIGNyeXB0X2Z0ci5jcnlwdF90eXBlOwogfQogCi1jb25zdCBjaGFyKiBjcnlwdGZzX2dldF9wYXNzd29yZCgpCi17Ci0gICAgaWYgKGU0Y3J5cHRfaXNfbmF0aXZlKCkpIHsKK2NvbnN0IGNoYXIqIGNyeXB0ZnNfZ2V0X3Bhc3N3b3JkKCkgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIFNMT0dFKCJjcnlwdGZzX2dldF9wYXNzd29yZCBub3QgdmFsaWQgZm9yIGZpbGUgZW5jcnlwdGlvbiIpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yOTQ5LDggKzI4NTYsNyBAQAogICAgIH0KIH0KIAotdm9pZCBjcnlwdGZzX2NsZWFyX3Bhc3N3b3JkKCkKLXsKK3ZvaWQgY3J5cHRmc19jbGVhcl9wYXNzd29yZCgpIHsKICAgICBpZiAocGFzc3dvcmQpIHsKICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihwYXNzd29yZCk7CiAgICAgICAgIG1lbXNldChwYXNzd29yZCwgMCwgbGVuKTsKQEAgLTI5NjAsOCArMjg2Niw3IEBACiAgICAgfQogfQogCi1pbnQgY3J5cHRmc19pc0NvbnZlcnRpYmxlVG9GQkUoKQoteworaW50IGNyeXB0ZnNfaXNDb252ZXJ0aWJsZVRvRkJFKCkgewogICAgIHN0cnVjdCBmc3RhYl9yZWMqIHJlYyA9IGZzX21ncl9nZXRfZW50cnlfZm9yX21vdW50X3BvaW50KGZzdGFiX2RlZmF1bHQsIERBVEFfTU5UX1BPSU5UKTsKLSAgICByZXR1cm4gZnNfbWdyX2lzX2NvbnZlcnRpYmxlX3RvX2ZiZShyZWMpID8gMSA6IDA7CisgICAgcmV0dXJuIChyZWMgJiYgZnNfbWdyX2lzX2NvbnZlcnRpYmxlX3RvX2ZiZShyZWMpKSA/IDEgOiAwOwogfQpkaWZmIC0tZ2l0IGEvY3J5cHRmcy5oIGIvY3J5cHRmcy5oCmluZGV4IGQ2YzdkYzUuLjY5MmQ3ZWUgMTAwNjQ0Ci0tLSBhL2NyeXB0ZnMuaAorKysgYi9jcnlwdGZzLmgKQEAgLTI5LDggKzI5LDEwIEBACiAgKiBwYXJ0aXRpb24uCiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogLyogVGhlIGN1cnJlbnQgY3J5cHRmcyB2ZXJzaW9uICovCkBAIC00OSwzMiArNTEsMzkgQEAKIAogLyogZGVmaW5pdGlvbnMgb2YgZmxhZ3MgaW4gdGhlIHN0cnVjdHVyZSBiZWxvdyAqLwogI2RlZmluZSBDUllQVF9NTlRfS0VZX1VORU5DUllQVEVEIDB4MSAvKiBUaGUga2V5IGZvciB0aGUgcGFydGl0aW9uIGlzIG5vdCBlbmNyeXB0ZWQuICovCi0jZGVmaW5lIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MgMHgyIC8qIEVuY3J5cHRpb24gcGFydGlhbGx5IGNvbXBsZXRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkX3VwdG8gdmFsaWQqLwotI2RlZmluZSBDUllQVF9JTkNPTlNJU1RFTlRfU1RBVEUgMHg0IC8qIFNldCB3aGVuIHN0YXJ0aW5nIGVuY3J5cHRpb24sIGNsZWFyIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0IGNsZWFubHksIGVpdGhlciB0aHJvdWdoIHN1Y2Nlc3Mgb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkgbWFya2VkIHBhcnRpYWwgZW5jcnlwdGlvbiAqLwotI2RlZmluZSBDUllQVF9EQVRBX0NPUlJVUFQgMHg4IC8qIFNldCB3aGVuIGVuY3J5cHRpb24gaXMgZmluZSwgYnV0IHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVybHlpbmcgdm9sdW1lIGlzIGNvcnJ1cHQgKi8KLSNkZWZpbmUgQ1JZUFRfRk9SQ0VfRU5DUllQVElPTiAweDEwIC8qIFNldCB3aGVuIGl0IGlzIHRpbWUgdG8gZW5jcnlwdCB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgb24gYm9vdC4gRXZlcnl0aGluZyBpbiB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgaXMgc2V0IHVwIGNvcnJlY3RseSBhcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhvdWdoIGRldmljZSBpcyBlbmNyeXB0ZWQgZXhjZXB0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZSBtYXN0ZXIga2V5IGlzIGVuY3J5cHRlZCB3aXRoIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBwYXNzd29yZC4gKi8KLSNkZWZpbmUgQ1JZUFRfRk9SQ0VfQ09NUExFVEUgMHgyMCAvKiBTZXQgd2hlbiB0aGUgYWJvdmUgZW5jcnlwdGlvbiBjeWNsZSBpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlLiBPbiBuZXh0IGNyeXB0a2VlcGVyIGVudHJ5LCBtYXRjaAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXNzd29yZC4gSWYgaXQgbWF0Y2hlcyBmaXggdGhlIG1hc3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSBhbmQgcmVtb3ZlIHRoaXMgZmxhZy4gKi8KKyNkZWZpbmUgQ1JZUFRfRU5DUllQVElPTl9JTl9QUk9HUkVTUyAgICAgICBcCisgICAgMHgyIC8qIEVuY3J5cHRpb24gcGFydGlhbGx5IGNvbXBsZXRlZCwgXAorICAgICAgICAgICBlbmNyeXB0ZWRfdXB0byB2YWxpZCovCisjZGVmaW5lIENSWVBUX0lOQ09OU0lTVEVOVF9TVEFURSAgICAgICAgICAgICAgICAgICAgXAorICAgIDB4NCAvKiBTZXQgd2hlbiBzdGFydGluZyBlbmNyeXB0aW9uLCBjbGVhciB3aGVuIFwKKyAgICAgICAgICAgZXhpdCBjbGVhbmx5LCBlaXRoZXIgdGhyb3VnaCBzdWNjZXNzIG9yICBcCisgICAgICAgICAgIGNvcnJlY3RseSBtYXJrZWQgcGFydGlhbCBlbmNyeXB0aW9uICovCisjZGVmaW5lIENSWVBUX0RBVEFfQ09SUlVQVCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMHg4IC8qIFNldCB3aGVuIGVuY3J5cHRpb24gaXMgZmluZSwgYnV0IHRoZSBcCisgICAgICAgICAgIHVuZGVybHlpbmcgdm9sdW1lIGlzIGNvcnJ1cHQgKi8KKyNkZWZpbmUgQ1JZUFRfRk9SQ0VfRU5DUllQVElPTiAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAweDEwIC8qIFNldCB3aGVuIGl0IGlzIHRpbWUgdG8gZW5jcnlwdCB0aGlzICAgICAgIFwKKyAgICAgICAgICAgIHZvbHVtZSBvbiBib290LiBFdmVyeXRoaW5nIGluIHRoaXMgICAgICAgIFwKKyAgICAgICAgICAgIHN0cnVjdHVyZSBpcyBzZXQgdXAgY29ycmVjdGx5IGFzICAgICAgICAgIFwKKyAgICAgICAgICAgIHRob3VnaCBkZXZpY2UgaXMgZW5jcnlwdGVkIGV4Y2VwdCAgICAgICAgIFwKKyAgICAgICAgICAgIHRoYXQgdGhlIG1hc3RlciBrZXkgaXMgZW5jcnlwdGVkIHdpdGggdGhlIFwKKyAgICAgICAgICAgIGRlZmF1bHQgcGFzc3dvcmQuICovCisjZGVmaW5lIENSWVBUX0ZPUkNFX0NPTVBMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIDB4MjAgLyogU2V0IHdoZW4gdGhlIGFib3ZlIGVuY3J5cHRpb24gY3ljbGUgaXMgICAgIFwKKyAgICAgICAgICAgIGNvbXBsZXRlLiBPbiBuZXh0IGNyeXB0a2VlcGVyIGVudHJ5LCBtYXRjaCBcCisgICAgICAgICAgICB0aGUgcGFzc3dvcmQuIElmIGl0IG1hdGNoZXMgZml4IHRoZSBtYXN0ZXIgXAorICAgICAgICAgICAga2V5IGFuZCByZW1vdmUgdGhpcyBmbGFnLiAqLwogCiAvKiBBbGxvd2VkIHZhbHVlcyBmb3IgdHlwZSBpbiB0aGUgc3RydWN0dXJlIGJlbG93ICovCi0jZGVmaW5lIENSWVBUX1RZUEVfUEFTU1dPUkQgMCAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGFzc3dvcmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIE11c3QgYmUgemVybyB0byBiZSBjb21wYXRpYmxlIHdpdGggcHJlLUwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRldmljZXMgd2hlcmUgdHlwZSBpcyBhbHdheXMgcGFzc3dvcmQuKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9ERUZBVUxUICAxIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggZGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcGFzc3dvcmQgKi8KLSNkZWZpbmUgQ1JZUFRfVFlQRV9QQVRURVJOICAyIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwYXR0ZXJuICovCi0jZGVmaW5lIENSWVBUX1RZUEVfUElOICAgICAgMyAvKiBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZCB3aXRoIGEgcGluICovCisjZGVmaW5lIENSWVBUX1RZUEVfUEFTU1dPUkQgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAwIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwYXNzd29yZCAgXAorICAgICAgICogTXVzdCBiZSB6ZXJvIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBwcmUtTCBcCisgICAgICAgKiBkZXZpY2VzIHdoZXJlIHR5cGUgaXMgYWx3YXlzIHBhc3N3b3JkLiovCisjZGVmaW5lIENSWVBUX1RZUEVfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgMSAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggZGVmYXVsdCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBhc3N3b3JkICovCisjZGVmaW5lIENSWVBUX1RZUEVfUEFUVEVSTiAyIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwYXR0ZXJuICovCisjZGVmaW5lIENSWVBUX1RZUEVfUElOIDMgICAgIC8qIG1hc3Rlcl9rZXkgaXMgZW5jcnlwdGVkIHdpdGggYSBwaW4gKi8KICNkZWZpbmUgQ1JZUFRfVFlQRV9NQVhfVFlQRSAzIC8qIHR5cGUgY2Fubm90IGJlIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUgKi8KIAogI2RlZmluZSBDUllQVF9NTlRfTUFHSUMgMHhEMEI1QjFDNApAQCAtOTAsNzggKzk5LDc4IEBACiAjZGVmaW5lIEtFWU1BU1RFUl9CTE9CX1NJWkUgMjA0OAogCiAvKiBfX2xlMzIgYW5kIF9fbGUxNiBkZWZpbmVkIGluIHN5c3RlbS9leHRyYXMvZXh0NF91dGlscy9leHQ0X3V0aWxzLmggKi8KLSNkZWZpbmUgX19sZTggIHVuc2lnbmVkIGNoYXIKKyNkZWZpbmUgX19sZTggdW5zaWduZWQgY2hhcgogCiAjaWYgIWRlZmluZWQoU0hBMjU2X0RJR0VTVF9MRU5HVEgpCiAjZGVmaW5lIFNIQTI1Nl9ESUdFU1RfTEVOR1RIIDMyCiAjZW5kaWYKIAogc3RydWN0IGNyeXB0X21udF9mdHIgewotICBfX2xlMzIgbWFnaWM7ICAgICAgICAgLyogU2VlIGFib3ZlICovCi0gIF9fbGUxNiBtYWpvcl92ZXJzaW9uOwotICBfX2xlMTYgbWlub3JfdmVyc2lvbjsKLSAgX19sZTMyIGZ0cl9zaXplOyAgICAgIC8qIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIGtleSBmb2xsb3dpbmcgKi8KLSAgX19sZTMyIGZsYWdzOyAgICAgICAgIC8qIFNlZSBhYm92ZSAqLwotICBfX2xlMzIga2V5c2l6ZTsgICAgICAgLyogaW4gYnl0ZXMgKi8KLSAgX19sZTMyIGNyeXB0X3R5cGU7ICAgIC8qIGhvdyBtYXN0ZXJfa2V5IGlzIGVuY3J5cHRlZC4gTXVzdCBiZSBhCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiBDUllQVF9UWVBFX1hYWCB2YWx1ZSAqLwotICBfX2xlNjQgZnNfc2l6ZTsgICAgICAgLyogU2l6ZSBvZiB0aGUgZW5jcnlwdGVkIGZzLCBpbiA1MTIgYnl0ZSBzZWN0b3JzICovCi0gIF9fbGUzMiBmYWlsZWRfZGVjcnlwdF9jb3VudDsgLyogY291bnQgb2YgIyBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZGVjcnlwdCBhbmQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3VudCwgc2V0IHRvIDAgb24gc3VjY2Vzc2Z1bCBtb3VudCAqLwotICB1bnNpZ25lZCBjaGFyIGNyeXB0b190eXBlX25hbWVbTUFYX0NSWVBUT19UWVBFX05BTUVfTEVOXTsgLyogVGhlIHR5cGUgb2YgZW5jcnlwdGlvbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIGRlY3J5cHQgdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydGl0aW9uLCBudWxsIHRlcm1pbmF0ZWQgKi8KLSAgX19sZTMyIHNwYXJlMjsgICAgICAgIC8qIGlnbm9yZWQgKi8KLSAgdW5zaWduZWQgY2hhciBtYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsgLyogVGhlIGVuY3J5cHRlZCBrZXkgZm9yIGRlY3J5cHRpbmcgdGhlIGZpbGVzeXN0ZW0gKi8KLSAgdW5zaWduZWQgY2hhciBzYWx0W1NBTFRfTEVOXTsgICAvKiBUaGUgc2FsdCB1c2VkIGZvciB0aGlzIGVuY3J5cHRpb24gKi8KLSAgX19sZTY0IHBlcnNpc3RfZGF0YV9vZmZzZXRbMl07ICAvKiBBYnNvbHV0ZSBvZmZzZXQgdG8gYm90aCBjb3BpZXMgb2YgY3J5cHRfcGVyc2lzdF9kYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb24gZGV2aWNlIHdpdGggdGhhdCBpbmZvLCBlaXRoZXIgdGhlIGZvb3RlciBvZiB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWFsX2Jsa2RldmljZSBvciB0aGUgbWV0YWRhdGEgcGFydGl0aW9uLiAqLworICAgIF9fbGUzMiBtYWdpYzsgLyogU2VlIGFib3ZlICovCisgICAgX19sZTE2IG1ham9yX3ZlcnNpb247CisgICAgX19sZTE2IG1pbm9yX3ZlcnNpb247CisgICAgX19sZTMyIGZ0cl9zaXplOyAgICAgICAgICAgICAvKiBpbiBieXRlcywgbm90IGluY2x1ZGluZyBrZXkgZm9sbG93aW5nICovCisgICAgX19sZTMyIGZsYWdzOyAgICAgICAgICAgICAgICAvKiBTZWUgYWJvdmUgKi8KKyAgICBfX2xlMzIga2V5c2l6ZTsgICAgICAgICAgICAgIC8qIGluIGJ5dGVzICovCisgICAgX19sZTMyIGNyeXB0X3R5cGU7ICAgICAgICAgICAvKiBob3cgbWFzdGVyX2tleSBpcyBlbmNyeXB0ZWQuIE11c3QgYmUgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQ1JZUFRfVFlQRV9YWFggdmFsdWUgKi8KKyAgICBfX2xlNjQgZnNfc2l6ZTsgICAgICAgICAgICAgIC8qIFNpemUgb2YgdGhlIGVuY3J5cHRlZCBmcywgaW4gNTEyIGJ5dGUgc2VjdG9ycyAqLworICAgIF9fbGUzMiBmYWlsZWRfZGVjcnlwdF9jb3VudDsgLyogY291bnQgb2YgIyBvZiBmYWlsZWQgYXR0ZW1wdHMgdG8gZGVjcnlwdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50LCBzZXQgdG8gMCBvbiBzdWNjZXNzZnVsIG1vdW50ICovCisgICAgdW5zaWduZWQgY2hhciBjcnlwdG9fdHlwZV9uYW1lW01BWF9DUllQVE9fVFlQRV9OQU1FX0xFTl07IC8qIFRoZSB0eXBlIG9mIGVuY3J5cHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIHRvIGRlY3J5cHQgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24sIG51bGwgdGVybWluYXRlZCAqLworICAgIF9fbGUzMiBzcGFyZTI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZ25vcmVkICovCisgICAgdW5zaWduZWQgY2hhciBtYXN0ZXJfa2V5W01BWF9LRVlfTEVOXTsgLyogVGhlIGVuY3J5cHRlZCBrZXkgZm9yIGRlY3J5cHRpbmcgdGhlIGZpbGVzeXN0ZW0gKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNhbHRbU0FMVF9MRU5dOyAgICAgICAgICAvKiBUaGUgc2FsdCB1c2VkIGZvciB0aGlzIGVuY3J5cHRpb24gKi8KKyAgICBfX2xlNjQgcGVyc2lzdF9kYXRhX29mZnNldFsyXTsgICAgICAgICAvKiBBYnNvbHV0ZSBvZmZzZXQgdG8gYm90aCBjb3BpZXMgb2YgY3J5cHRfcGVyc2lzdF9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb24gZGV2aWNlIHdpdGggdGhhdCBpbmZvLCBlaXRoZXIgdGhlIGZvb3RlciBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiByZWFsX2Jsa2RldmljZSBvciB0aGUgbWV0YWRhdGEgcGFydGl0aW9uLiAqLwogCi0gIF9fbGUzMiBwZXJzaXN0X2RhdGFfc2l6ZTsgICAgICAgLyogVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgdG8gZWFjaCBjb3B5IG9mIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHBlcnNpc3RlbnQgZGF0YSB0YWJsZSovCisgICAgX19sZTMyIHBlcnNpc3RfZGF0YV9zaXplOyAvKiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCB0byBlYWNoIGNvcHkgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBwZXJzaXN0ZW50IGRhdGEgdGFibGUqLwogCi0gIF9fbGU4ICBrZGZfdHlwZTsgLyogVGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIHVzZWQuICovCisgICAgX19sZTgga2RmX3R5cGU7IC8qIFRoZSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB1c2VkLiAqLwogCi0gIC8qIHNjcnlwdCBwYXJhbWV0ZXJzLiBTZWUgd3d3LnRhcnNuYXAuY29tL3NjcnlwdC9zY3J5cHQucGRmICovCi0gIF9fbGU4ICBOX2ZhY3RvcjsgLyogKDEgPDwgTikgKi8KLSAgX19sZTggIHJfZmFjdG9yOyAvKiAoMSA8PCByKSAqLwotICBfX2xlOCAgcF9mYWN0b3I7IC8qICgxIDw8IHApICovCi0gIF9fbGU2NCBlbmNyeXB0ZWRfdXB0bzsgLyogSWYgd2UgYXJlIGluIHN0YXRlIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgaGF2ZSB0byBzdG9wIChlLmcuIHBvd2VyIGxvdykgdGhpcyBpcyB0aGUgbGFzdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCA1MTIgYnl0ZSBzZWN0b3IuKi8KLSAgX19sZTggIGhhc2hfZmlyc3RfYmxvY2tbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOyAvKiBXaGVuIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQsIGhhc2ggb2YgZmlyc3QgYmxvY2ssIHVzZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB2YWxpZGF0ZSBiZWZvcmUgY29udGludWluZyovCisgICAgLyogc2NyeXB0IHBhcmFtZXRlcnMuIFNlZSB3d3cudGFyc25hcC5jb20vc2NyeXB0L3NjcnlwdC5wZGYgKi8KKyAgICBfX2xlOCBOX2ZhY3RvcjsgICAgICAgIC8qICgxIDw8IE4pICovCisgICAgX19sZTggcl9mYWN0b3I7ICAgICAgICAvKiAoMSA8PCByKSAqLworICAgIF9fbGU4IHBfZmFjdG9yOyAgICAgICAgLyogKDEgPDwgcCkgKi8KKyAgICBfX2xlNjQgZW5jcnlwdGVkX3VwdG87IC8qIElmIHdlIGFyZSBpbiBzdGF0ZSBDUllQVF9FTkNSWVBUSU9OX0lOX1BST0dSRVNTIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2UgaGF2ZSB0byBzdG9wIChlLmcuIHBvd2VyIGxvdykgdGhpcyBpcyB0aGUgbGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkIDUxMiBieXRlIHNlY3Rvci4qLworICAgIF9fbGU4IGhhc2hfZmlyc3RfYmxvY2tbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOyAvKiBXaGVuIENSWVBUX0VOQ1JZUFRJT05fSU5fUFJPR1JFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCBoYXNoIG9mIGZpcnN0IGJsb2NrLCB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHZhbGlkYXRlIGJlZm9yZSBjb250aW51aW5nKi8KIAotICAvKiBrZXlfbWFzdGVyIGtleSwgdXNlZCB0byBzaWduIHRoZSBkZXJpdmVkIGtleSB3aGljaCBpcyB0aGVuIHVzZWQgdG8gZ2VuZXJhdGUKLSAgICogdGhlIGludGVybWVkaWF0ZSBrZXkKLSAgICogVGhpcyBrZXkgc2hvdWxkIGJlIHVzZWQgZm9yIG5vIG90aGVyIHB1cnBvc2VzISBXZSB1c2UgdGhpcyBrZXkgdG8gc2lnbiB1bnBhZGRlZCAKLSAgICogZGF0YSwgd2hpY2ggaXMgYWNjZXB0YWJsZSBidXQgb25seSBpZiB0aGUga2V5IGlzIG5vdCByZXVzZWQgZWxzZXdoZXJlLiAqLwotICBfX2xlOCBrZXltYXN0ZXJfYmxvYltLRVlNQVNURVJfQkxPQl9TSVpFXTsKLSAgX19sZTMyIGtleW1hc3Rlcl9ibG9iX3NpemU7CisgICAgLyoga2V5X21hc3RlciBrZXksIHVzZWQgdG8gc2lnbiB0aGUgZGVyaXZlZCBrZXkgd2hpY2ggaXMgdGhlbiB1c2VkIHRvIGdlbmVyYXRlCisgICAgICogdGhlIGludGVybWVkaWF0ZSBrZXkKKyAgICAgKiBUaGlzIGtleSBzaG91bGQgYmUgdXNlZCBmb3Igbm8gb3RoZXIgcHVycG9zZXMhIFdlIHVzZSB0aGlzIGtleSB0byBzaWduIHVucGFkZGVkCisgICAgICogZGF0YSwgd2hpY2ggaXMgYWNjZXB0YWJsZSBidXQgb25seSBpZiB0aGUga2V5IGlzIG5vdCByZXVzZWQgZWxzZXdoZXJlLiAqLworICAgIF9fbGU4IGtleW1hc3Rlcl9ibG9iW0tFWU1BU1RFUl9CTE9CX1NJWkVdOworICAgIF9fbGUzMiBrZXltYXN0ZXJfYmxvYl9zaXplOwogCi0gIC8qIFN0b3JlIHNjcnlwdCBvZiBzYWx0ZWQgaW50ZXJtZWRpYXRlIGtleS4gV2hlbiBkZWNyeXB0aW9uIGZhaWxzLCB3ZSBjYW4KLSAgICAgY2hlY2sgaWYgdGhpcyBtYXRjaGVzLCBhbmQgaWYgaXQgZG9lcywgd2Uga25vdyB0aGF0IHRoZSBwcm9ibGVtIGlzIHdpdGggdGhlCi0gICAgIGRyaXZlLCBhbmQgdGhlcmUgaXMgbm8gcG9pbnQgaW4gYXNraW5nIHRoZSB1c2VyIGZvciBtb3JlIHBhc3N3b3Jkcy4KKyAgICAvKiBTdG9yZSBzY3J5cHQgb2Ygc2FsdGVkIGludGVybWVkaWF0ZSBrZXkuIFdoZW4gZGVjcnlwdGlvbiBmYWlscywgd2UgY2FuCisgICAgICAgY2hlY2sgaWYgdGhpcyBtYXRjaGVzLCBhbmQgaWYgaXQgZG9lcywgd2Uga25vdyB0aGF0IHRoZSBwcm9ibGVtIGlzIHdpdGggdGhlCisgICAgICAgZHJpdmUsIGFuZCB0aGVyZSBpcyBubyBwb2ludCBpbiBhc2tpbmcgdGhlIHVzZXIgZm9yIG1vcmUgcGFzc3dvcmRzLgogCi0gICAgIE5vdGUgdGhhdCBpZiBhbnkgcGFydCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBjb3JydXB0LCB0aGlzIHdpbGwgbm90IG1hdGNoIGFuZAotICAgICB3ZSB3aWxsIGNvbnRpbnVlIHRvIGJlbGlldmUgdGhlIHVzZXIgZW50ZXJlZCB0aGUgd3JvbmcgcGFzc3dvcmQuIEluIHRoYXQKLSAgICAgY2FzZSB0aGUgb25seSBzb2x1dGlvbiBpcyBmb3IgdGhlIHVzZXIgdG8gZW50ZXIgYSBwYXNzd29yZCBlbm91Z2ggdGltZXMgdG8KLSAgICAgZm9yY2UgYSB3aXBlLgorICAgICAgIE5vdGUgdGhhdCBpZiBhbnkgcGFydCBvZiB0aGlzIHN0cnVjdHVyZSBpcyBjb3JydXB0LCB0aGlzIHdpbGwgbm90IG1hdGNoIGFuZAorICAgICAgIHdlIHdpbGwgY29udGludWUgdG8gYmVsaWV2ZSB0aGUgdXNlciBlbnRlcmVkIHRoZSB3cm9uZyBwYXNzd29yZC4gSW4gdGhhdAorICAgICAgIGNhc2UgdGhlIG9ubHkgc29sdXRpb24gaXMgZm9yIHRoZSB1c2VyIHRvIGVudGVyIGEgcGFzc3dvcmQgZW5vdWdoIHRpbWVzIHRvCisgICAgICAgZm9yY2UgYSB3aXBlLgogCi0gICAgIE5vdGUgYWxzbyB0aGF0IHRoZXJlIGlzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgbWlncmF0aW9uLiBJZiB0aGlzIGRhdGEgaXMKLSAgICAgd3JvbmcsIHdlIHNpbXBseSB3b24ndCByZWNvZ25pc2UgYSByaWdodCBwYXNzd29yZCwgYW5kIHdpbGwgY29udGludWUgdG8KLSAgICAgcHJvbXB0LiBPbiB0aGUgZmlyc3QgcGFzc3dvcmQgY2hhbmdlLCB0aGlzIHZhbHVlIHdpbGwgYmUgcG9wdWxhdGVkIGFuZAotICAgICB0aGVuIHdlIHdpbGwgYmUgT0suCi0gICAqLwotICB1bnNpZ25lZCBjaGFyIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXlbU0NSWVBUX0xFTl07CisgICAgICAgTm90ZSBhbHNvIHRoYXQgdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeSBhYm91dCBtaWdyYXRpb24uIElmIHRoaXMgZGF0YSBpcworICAgICAgIHdyb25nLCB3ZSBzaW1wbHkgd29uJ3QgcmVjb2duaXNlIGEgcmlnaHQgcGFzc3dvcmQsIGFuZCB3aWxsIGNvbnRpbnVlIHRvCisgICAgICAgcHJvbXB0LiBPbiB0aGUgZmlyc3QgcGFzc3dvcmQgY2hhbmdlLCB0aGlzIHZhbHVlIHdpbGwgYmUgcG9wdWxhdGVkIGFuZAorICAgICAgIHRoZW4gd2Ugd2lsbCBiZSBPSy4KKyAgICAgKi8KKyAgICB1bnNpZ25lZCBjaGFyIHNjcnlwdGVkX2ludGVybWVkaWF0ZV9rZXlbU0NSWVBUX0xFTl07CiAKLSAgLyogc2hhIG9mIHRoaXMgc3RydWN0dXJlIHdpdGggdGhpcyBlbGVtZW50IHNldCB0byB6ZXJvCi0gICAgIFVzZWQgd2hlbiBlbmNyeXB0aW5nIG9uIHJlYm9vdCB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmUgYmVmb3JlIGRvaW5nIHNvbWV0aGluZwotICAgICBmYXRhbAotICAgKi8KLSAgdW5zaWduZWQgY2hhciBzaGEyNTZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOworICAgIC8qIHNoYSBvZiB0aGlzIHN0cnVjdHVyZSB3aXRoIHRoaXMgZWxlbWVudCBzZXQgdG8gemVybworICAgICAgIFVzZWQgd2hlbiBlbmNyeXB0aW5nIG9uIHJlYm9vdCB0byB2YWxpZGF0ZSBzdHJ1Y3R1cmUgYmVmb3JlIGRvaW5nIHNvbWV0aGluZworICAgICAgIGZhdGFsCisgICAgICovCisgICAgdW5zaWduZWQgY2hhciBzaGEyNTZbU0hBMjU2X0RJR0VTVF9MRU5HVEhdOwogfTsKIAogLyogUGVyc2lzdGFudCBkYXRhIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSBiZWZvcmUgZGVjcnlwdGlvbi4KQEAgLTE3OCw0OSArMTg3LDQ5IEBACiAgKiBhbmQgaGlnaGVyIGNyeXB0X21udF9mdHIgc3RydWN0dXJlcy4KICAqLwogc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkgewotICBjaGFyIGtleVtQUk9QRVJUWV9LRVlfTUFYXTsKLSAgY2hhciB2YWxbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBjaGFyIGtleVtQUk9QRVJUWV9LRVlfTUFYXTsKKyAgICBjaGFyIHZhbFtQUk9QRVJUWV9WQUxVRV9NQVhdOwogfTsKIAogLyogU2hvdWxkIGJlIGV4YWN0bHkgNEsgaW4gc2l6ZSAqLwogc3RydWN0IGNyeXB0X3BlcnNpc3RfZGF0YSB7Ci0gIF9fbGUzMiBwZXJzaXN0X21hZ2ljOwotICBfX2xlMzIgcGVyc2lzdF92YWxpZF9lbnRyaWVzOwotICBfX2xlMzIgcGVyc2lzdF9zcGFyZVszMF07Ci0gIHN0cnVjdCBjcnlwdF9wZXJzaXN0X2VudHJ5IHBlcnNpc3RfZW50cnlbMF07CisgICAgX19sZTMyIHBlcnNpc3RfbWFnaWM7CisgICAgX19sZTMyIHBlcnNpc3RfdmFsaWRfZW50cmllczsKKyAgICBfX2xlMzIgcGVyc2lzdF9zcGFyZVszMF07CisgICAgc3RydWN0IGNyeXB0X3BlcnNpc3RfZW50cnkgcGVyc2lzdF9lbnRyeVswXTsKIH07CiAKICNkZWZpbmUgREFUQV9NTlRfUE9JTlQgIi9kYXRhIgogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBjcnlwdGZzX2NyeXB0b19jb21wbGV0ZSAqLwotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfTk9UX0VOQ1JZUFRFRCAgMQotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfRU5DUllQVEVEICAgICAgMAotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfQkFEX01FVEFEQVRBICAoLTEpCi0jZGVmaW5lIENSWVBUT19DT01QTEVURV9QQVJUSUFMICAgICAgICgtMikKLSNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0lOQ09OU0lTVEVOVCAgKC0zKQotI2RlZmluZSBDUllQVE9fQ09NUExFVEVfQ09SUlVQVCAgICAgICAoLTQpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9OT1RfRU5DUllQVEVEIDEKKyNkZWZpbmUgQ1JZUFRPX0NPTVBMRVRFX0VOQ1JZUFRFRCAwCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9CQURfTUVUQURBVEEgKC0xKQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfUEFSVElBTCAoLTIpCisjZGVmaW5lIENSWVBUT19DT01QTEVURV9JTkNPTlNJU1RFTlQgKC0zKQorI2RlZmluZSBDUllQVE9fQ09NUExFVEVfQ09SUlVQVCAoLTQpCiAKIC8qIFJldHVybiB2YWx1ZXMgZm9yIGNyeXB0ZnNfZW5hYmxlX2lucGxhY2UqKCkgKi8KICNkZWZpbmUgRU5BQkxFX0lOUExBQ0VfT0sgMAogI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9FUlJfT1RIRVIgKC0xKQotI2RlZmluZSBFTkFCTEVfSU5QTEFDRV9FUlJfREVWICgtMikgIC8qIGNyeXB0b19ibGtkZXYgaXNzdWUgKi8KKyNkZWZpbmUgRU5BQkxFX0lOUExBQ0VfRVJSX0RFViAoLTIpIC8qIGNyeXB0b19ibGtkZXYgaXNzdWUgKi8KIAogLyogUmV0dXJuIHZhbHVlcyBmb3IgY3J5cHRmc19nZXRmaWVsZCAqLwotI2RlZmluZSBDUllQVE9fR0VURklFTERfT0sgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDUllQVE9fR0VURklFTERfRVJST1JfTk9fRklFTEQgICAgICAoLTEpCi0jZGVmaW5lIENSWVBUT19HRVRGSUVMRF9FUlJPUl9PVEhFUiAgICAgICAgICgtMikKKyNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX09LIDAKKyNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX05PX0ZJRUxEICgtMSkKKyNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX09USEVSICgtMikKICNkZWZpbmUgQ1JZUFRPX0dFVEZJRUxEX0VSUk9SX0JVRl9UT09fU01BTEwgKC0zKQogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBjcnlwdGZzX3NldGZpZWxkICovCi0jZGVmaW5lIENSWVBUT19TRVRGSUVMRF9PSyAgICAgICAgICAgICAgICAgICAgMAotI2RlZmluZSBDUllQVE9fU0VURklFTERfRVJST1JfT1RIRVIgICAgICAgICAgKC0xKQorI2RlZmluZSBDUllQVE9fU0VURklFTERfT0sgMAorI2RlZmluZSBDUllQVE9fU0VURklFTERfRVJST1JfT1RIRVIgKC0xKQogI2RlZmluZSBDUllQVE9fU0VURklFTERfRVJST1JfRklFTERfVE9PX0xPTkcgKC0yKQogI2RlZmluZSBDUllQVE9fU0VURklFTERfRVJST1JfVkFMVUVfVE9PX0xPTkcgKC0zKQogCiAvKiBSZXR1cm4gdmFsdWVzIGZvciBwZXJzaXN0X2RlbF9rZXkgKi8KLSNkZWZpbmUgUEVSU0lTVF9ERUxfS0VZX09LICAgICAgICAgICAgICAgICAwCi0jZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9PVEhFUiAgICAgICAoLTEpCi0jZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9OT19GSUVMRCAgICAoLTIpCisjZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9PSyAwCisjZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9PVEhFUiAoLTEpCisjZGVmaW5lIFBFUlNJU1RfREVMX0tFWV9FUlJPUl9OT19GSUVMRCAoLTIpCiAKIGludCBtYXRjaF9tdWx0aV9lbnRyeShjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIGZpZWxkLCB1bnNpZ25lZCBpbmRleCk7CiBpbnQgd2FpdF9hbmRfdW5tb3VudChjb25zdCBjaGFyKiBtb3VudHBvaW50LCBib29sIGtpbGwpOwpkaWZmIC0tZ2l0IGEvZnMvRXhmYXQuY3BwIGIvZnMvRXhmYXQuY3BwCmluZGV4IDVjMTUwNzUuLmM2MjRlYjkgMTAwNjQ0Ci0tLSBhL2ZzL0V4ZmF0LmNwcAorKysgYi9mcy9FeGZhdC5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKICAgICBjbWQucHVzaF9iYWNrKGtGc2NrUGF0aCk7CiAgICAgY21kLnB1c2hfYmFjayhzb3VyY2UpOwogCi0gICAgaW50IHJjID0gRm9ya0V4ZWN2cChjbWQsIHNGc2NrVW50cnVzdGVkQ29udGV4dCk7CisgICAgaW50IHJjID0gRm9ya0V4ZWN2cChjbWQsIG51bGxwdHIsIHNGc2NrVW50cnVzdGVkQ29udGV4dCk7CiAgICAgaWYgKHJjID09IDApIHsKICAgICAgICAgTE9HKElORk8pIDw8ICJDaGVjayBPSyI7CiAgICAgICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZnMvRXh0NC5jcHAgYi9mcy9FeHQ0LmNwcAppbmRleCA4OWI4NDE0Li4wMDU5MjMzIDEwMDY0NAotLS0gYS9mcy9FeHQ0LmNwcAorKysgYi9mcy9FeHQ0LmNwcApAQCAtMTQsNDAgKzE0LDM0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiAjaW5jbHVkZSA8bGludXgva2Rldl90Lmg+CiAKLSNkZWZpbmUgTE9HX1RBRyAiVm9sZCIKLQogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8ZXh0NF91dGlscy9leHQ0X2NyeXB0Lmg+CisjaW5jbHVkZSA8ZnNjcnlwdC9mc2NyeXB0Lmg+CiAjaW5jbHVkZSA8bG9nd3JhcC9sb2d3cmFwLmg+CiAjaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CiAKICNpbmNsdWRlICJFeHQ0LmgiCi0jaW5jbHVkZSAiRXh0NENyeXB0LmgiCisjaW5jbHVkZSAiRnNDcnlwdC5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sZFV0aWwuaCIKIApAQCAtNjIsOSArNTYsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtGc2NrUGF0aCA9ICIvc3lzdGVtL2Jpbi9lMmZzY2siOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZXh0NCIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CkBAIC03Nyw3ICs3MCw3IEBACiAgICAgaW50IHN0YXR1czsKICAgICBpbnQgcmV0OwogICAgIGxvbmcgdG1wbW50X2ZsYWdzID0gTVNfTk9BVElNRSB8IE1TX05PRVhFQyB8IE1TX05PU1VJRDsKLSAgICBjaGFyICp0bXBtbnRfb3B0cyA9IChjaGFyKikgIm5vbWJsa19pb19zdWJtaXQsZXJyb3JzPXJlbW91bnQtcm8iOworICAgIGNoYXIqIHRtcG1udF9vcHRzID0gKGNoYXIqKSJub21ibGtfaW9fc3VibWl0LGVycm9ycz1yZW1vdW50LXJvIjsKIAogICAgIC8qCiAgICAgICogRmlyc3QgdHJ5IHRvIG1vdW50IGFuZCB1bm1vdW50IHRoZSBmaWxlc3lzdGVtLiAgV2UgZG8gdGhpcyBiZWNhdXNlCkBAIC0xMDIsNyArOTUsOCBAQAogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVygiJXMoKTogdW1vdW50KCVzKT0lZDogJXNcbiIsIF9fZnVuY19fLCBjX3RhcmdldCwgcmVzdWx0LCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IF9fZnVuY19fIDw8ICIoKTogdW1vdW50KCIgPDwgY190YXJnZXQgPDwgIik9IiA8PCByZXN1bHQgPDwgIjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0cmVycm9yKGVycm5vKTsKICAgICAgICAgICAgIHNsZWVwKDEpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTEyLDEwICsxMDYsMTAgQEAKICAgICAgKiAoZS5nLiByZWNlbnQgU0RLIHN5c3RlbSBpbWFnZXMpLiBEZXRlY3QgdGhlc2UgYW5kIHNraXAgdGhlIGNoZWNrLgogICAgICAqLwogICAgIGlmIChhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSkgewotICAgICAgICBBTE9HRCgiTm90IHJ1bm5pbmcgJXMgb24gJXMgKGV4ZWN1dGFibGUgbm90IGluIHN5c3RlbSBpbWFnZSlcbiIsCi0gICAgICAgICAgICAgICAga0ZzY2tQYXRoLCBjX3NvdXJjZSk7CisgICAgICAgIExPRyhERUJVRykgPDwgIk5vdCBydW5uaW5nICIgPDwga0ZzY2tQYXRoIDw8ICIgb24gIiA8PCBjX3NvdXJjZQorICAgICAgICAgICAgICAgICAgIDw8ICIgKGV4ZWN1dGFibGUgbm90IGluIHN5c3RlbSBpbWFnZSkiOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dEKCJSdW5uaW5nICVzIG9uICVzXG4iLCBrRnNja1BhdGgsIGNfc291cmNlKTsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiUnVubmluZyAiIDw8IGtGc2NrUGF0aCA8PCAiIG9uICIgPDwgY19zb3VyY2U7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZDsKICAgICAgICAgY21kLnB1c2hfYmFjayhrRnNja1BhdGgpOwpAQCAtMTIzLDE0ICsxMTcsMTQgQEAKICAgICAgICAgY21kLnB1c2hfYmFjayhjX3NvdXJjZSk7CiAKICAgICAgICAgLy8gZXh0NCBkZXZpY2VzIGFyZSBjdXJyZW50bHkgYWx3YXlzIHRydXN0ZWQKLSAgICAgICAgcmV0dXJuIEZvcmtFeGVjdnAoY21kLCBzRnNja0NvbnRleHQpOworICAgICAgICByZXR1cm4gRm9ya0V4ZWN2cChjbWQsIG51bGxwdHIsIHNGc2NrQ29udGV4dCk7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sCi0gICAgICAgIGJvb2wgcmVtb3VudCwgYm9vbCBleGVjdXRhYmxlKSB7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUpIHsKICAgICBpbnQgcmM7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTY0LDggKzE1OCw3IEBACiAgICAgcmV0dXJuIEZvcmtFeGVjdnAoY21kKTsKIH0KIAotc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgeworc3RhdHVzX3QgRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycywgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCkgewogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjbWQ7CiAgICAgY21kLnB1c2hfYmFjayhrTWtmc1BhdGgpOwogCkBAIC0xODIsNyArMTc1LDcgQEAKICAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0Qm9vbFByb3BlcnR5KCJ2b2xkLmhhc19xdW90YSIsIGZhbHNlKSkgewogICAgICAgICBvcHRpb25zICs9ICIscXVvdGEiOwogICAgIH0KLSAgICBpZiAoZTRjcnlwdF9pc19uYXRpdmUoKSkgeworICAgIGlmIChmc2NyeXB0X2lzX25hdGl2ZSgpKSB7CiAgICAgICAgIG9wdGlvbnMgKz0gIixlbmNyeXB0IjsKICAgICB9CiAKZGlmZiAtLWdpdCBhL2ZzL0V4dDQuaCBiL2ZzL0V4dDQuaAppbmRleCBmNzhkYzk1Li4zMjlmMzAyIDEwMDY0NAotLS0gYS9mcy9FeHQ0LmgKKysrIGIvZnMvRXh0NC5oCkBAIC0yOCwxMCArMjgsOSBAQAogYm9vbCBJc1N1cHBvcnRlZCgpOwogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KTsKLXN0YXR1c190IE1vdW50KGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQsIGJvb2wgcm8sCi0gICAgICAgIGJvb2wgcmVtb3VudCwgYm9vbCBleGVjdXRhYmxlKTsKLXN0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOworc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywgYm9vbCByZW1vdW50LAorICAgICAgICAgICAgICAgYm9vbCBleGVjdXRhYmxlKTsKK3N0YXR1c190IEZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCB1bnNpZ25lZCBsb25nIG51bVNlY3RvcnMsIGNvbnN0IHN0ZDo6c3RyaW5nJiB0YXJnZXQpOwogc3RhdHVzX3QgUmVzaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UsIHVuc2lnbmVkIGxvbmcgbnVtU2VjdG9ycyk7CiAKIH0gIC8vIG5hbWVzcGFjZSBleHQ0CmRpZmYgLS1naXQgYS9mcy9GMmZzLmNwcCBiL2ZzL0YyZnMuY3BwCmluZGV4IGYyNGZkOTEuLjk1MTdkYzkgMTAwNjQ0Ci0tLSBhL2ZzL0YyZnMuY3BwCisrKyBiL2ZzL0YyZnMuY3BwCkBAIC0yMCwxMCArMjAsMTAgQEAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgorI2luY2x1ZGUgPGZzY3J5cHQvZnNjcnlwdC5oPgogCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxzeXMvbW91bnQuaD4KIApAQCAtMzcsOSArMzcsOCBAQAogc3RhdGljIGNvbnN0IGNoYXIqIGtGc2NrUGF0aCA9ICIvc3lzdGVtL2Jpbi9mc2NrLmYyZnMiOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgiZjJmcyIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlKSB7CkBAIC00OSw3ICs0OCw3IEBACiAgICAgY21kLnB1c2hfYmFjayhzb3VyY2UpOwogCiAgICAgLy8gZjJmcyBkZXZpY2VzIGFyZSBjdXJyZW50bHkgYWx3YXlzIHRydXN0ZWQKLSAgICByZXR1cm4gRm9ya0V4ZWN2cChjbWQsIHNGc2NrQ29udGV4dCk7CisgICAgcmV0dXJuIEZvcmtFeGVjdnAoY21kLCBudWxscHRyLCBzRnNja0NvbnRleHQpOwogfQogCiBzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0KSB7CkBAIC04Miw3ICs4MSw3IEBACiAgICAgICAgIGNtZC5wdXNoX2JhY2soIi1PIik7CiAgICAgICAgIGNtZC5wdXNoX2JhY2soInF1b3RhIik7CiAgICAgfQotICAgIGlmIChlNGNyeXB0X2lzX25hdGl2ZSgpKSB7CisgICAgaWYgKGZzY3J5cHRfaXNfbmF0aXZlKCkpIHsKICAgICAgICAgY21kLnB1c2hfYmFjaygiLU8iKTsKICAgICAgICAgY21kLnB1c2hfYmFjaygiZW5jcnlwdCIpOwogICAgIH0KZGlmZiAtLWdpdCBhL2ZzL1ZmYXQuY3BwIGIvZnMvVmZhdC5jcHAKaW5kZXggNTM4MTc4ZS4uMTRjNDJkNiAxMDA2NDQKLS0tIGEvZnMvVmZhdC5jcHAKKysrIGIvZnMvVmZhdC5jcHAKQEAgLTE0LDI0ICsxNCwyMSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgotI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KICNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogI2luY2x1ZGUgPGxpbnV4L2tkZXZfdC5oPgogCkBAIC00MSw4ICszOCw4IEBACiAKICNpbmNsdWRlIDxsb2d3cmFwL2xvZ3dyYXAuaD4KIAotI2luY2x1ZGUgIlZmYXQuaCIKICNpbmNsdWRlICJVdGlscy5oIgorI2luY2x1ZGUgIlZmYXQuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CkBAIC01NSw5ICs1Miw4IEBACiBzdGF0aWMgY29uc3QgY2hhcioga0ZzY2tQYXRoID0gIi9zeXN0ZW0vYmluL2ZzY2tfbXNkb3MiOwogCiBib29sIElzU3VwcG9ydGVkKCkgewotICAgIHJldHVybiBhY2Nlc3Moa01rZnNQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwCi0gICAgICAgICAgICAmJiBJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKTsKKyAgICByZXR1cm4gYWNjZXNzKGtNa2ZzUGF0aCwgWF9PSykgPT0gMCAmJiBhY2Nlc3Moa0ZzY2tQYXRoLCBYX09LKSA9PSAwICYmCisgICAgICAgICAgIElzRmlsZXN5c3RlbVN1cHBvcnRlZCgidmZhdCIpOwogfQogCiBzdGF0dXNfdCBDaGVjayhjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlKSB7CkBAIC03MSw3ICs2Nyw3IEBACiAgICAgICAgIGNtZC5wdXNoX2JhY2soc291cmNlKTsKIAogICAgICAgICAvLyBGYXQgZGV2aWNlcyBhcmUgY3VycmVudGx5IGFsd2F5cyB1bnRydXN0ZWQKLSAgICAgICAgcmMgPSBGb3JrRXhlY3ZwKGNtZCwgc0ZzY2tVbnRydXN0ZWRDb250ZXh0KTsKKyAgICAgICAgcmMgPSBGb3JrRXhlY3ZwKGNtZCwgbnVsbHB0ciwgc0ZzY2tVbnRydXN0ZWRDb250ZXh0KTsKIAogICAgICAgICBpZiAocmMgPCAwKSB7CiAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCBkdWUgdG8gbG9nd3JhcCBlcnJvciI7CkBAIC03OSw0MyArNzUsNDIgQEAKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaChyYykgewotICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgY29tcGxldGVkIE9LIjsKLSAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBzd2l0Y2ggKHJjKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGNvbXBsZXRlZCBPSyI7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAKLSAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vdCBhIEZBVCBmaWxlc3lzdGVtKSI7Ci0gICAgICAgICAgICBlcnJubyA9IEVOT0RBVEE7Ci0gICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vdCBhIEZBVCBmaWxlc3lzdGVtKSI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFTk9EQVRBOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKIAotICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICBpZiAocGFzcysrIDw9IDMpIHsKLSAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbGVzeXN0ZW0gbW9kaWZpZWQgLSByZWNoZWNraW5nIChwYXNzICIgPDwgcGFzcyA8PCAiKSI7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsaW5nIGNoZWNrIGFmdGVyIHRvbyBtYW55IHJlY2hlY2tzIjsKLSAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgIGlmIChwYXNzKysgPD0gMykgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkZpbGVzeXN0ZW0gbW9kaWZpZWQgLSByZWNoZWNraW5nIChwYXNzICIgPDwgcGFzcyA8PCAiKSI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsaW5nIGNoZWNrIGFmdGVyIHRvbyBtYW55IHJlY2hlY2tzIjsKKyAgICAgICAgICAgICAgICBlcnJubyA9IEVJTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmlsZXN5c3RlbSBjaGVjayBmYWlsZWQgKG5vIGZpbGVzeXN0ZW0pIjsKLSAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAobm8gZmlsZXN5c3RlbSkiOworICAgICAgICAgICAgICAgIGVycm5vID0gRU5PREFUQTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZpbGVzeXN0ZW0gY2hlY2sgZmFpbGVkICh1bmtub3duIGV4aXQgY29kZSAiIDw8IHJjIDw8ICIpIjsKLSAgICAgICAgICAgIGVycm5vID0gRUlPOwotICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGaWxlc3lzdGVtIGNoZWNrIGZhaWxlZCAodW5rbm93biBleGl0IGNvZGUgIiA8PCByYyA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJybm8gPSBFSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CiAgICAgfSB3aGlsZSAoMCk7CiAKICAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssCi0gICAgICAgIGJvb2wgY3JlYXRlTG9zdCkgeworc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywgYm9vbCByZW1vdW50LAorICAgICAgICAgICAgICAgYm9vbCBleGVjdXRhYmxlLCBpbnQgb3duZXJVaWQsIGludCBvd25lckdpZCwgaW50IHBlcm1NYXNrLCBib29sIGNyZWF0ZUxvc3QpIHsKICAgICBpbnQgcmM7CiAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMTI4LDkgKzEyMyw5IEBACiAgICAgZmxhZ3MgfD0gKHJvID8gTVNfUkRPTkxZIDogMCk7CiAgICAgZmxhZ3MgfD0gKHJlbW91bnQgPyBNU19SRU1PVU5UIDogMCk7CiAKLSAgICBhdXRvIG1vdW50RGF0YSA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgICJ1dGY4LHVpZD0lZCxnaWQ9JWQsZm1hc2s9JW8sZG1hc2s9JW8sc2hvcnRuYW1lPW1peGVkIiwKLSAgICAgICAgICAgIG93bmVyVWlkLCBvd25lckdpZCwgcGVybU1hc2ssIHBlcm1NYXNrKTsKKyAgICBhdXRvIG1vdW50RGF0YSA9CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigidXRmOCx1aWQ9JWQsZ2lkPSVkLGZtYXNrPSVvLGRtYXNrPSVvLHNob3J0bmFtZT1taXhlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lclVpZCwgb3duZXJHaWQsIHBlcm1NYXNrLCBwZXJtTWFzayk7CiAKICAgICByYyA9IG1vdW50KGNfc291cmNlLCBjX3RhcmdldCwgInZmYXQiLCBmbGFncywgbW91bnREYXRhLmNfc3RyKCkpOwogCkBAIC0xNTksMTIgKzE1NCw4IEBACiBzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKSB7CiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNtZDsKICAgICBjbWQucHVzaF9iYWNrKGtNa2ZzUGF0aCk7Ci0gICAgY21kLnB1c2hfYmFjaygiLUYiKTsKLSAgICBjbWQucHVzaF9iYWNrKCIzMiIpOwogICAgIGNtZC5wdXNoX2JhY2soIi1PIik7CiAgICAgY21kLnB1c2hfYmFjaygiYW5kcm9pZCIpOwotICAgIGNtZC5wdXNoX2JhY2soIi1jIik7Ci0gICAgY21kLnB1c2hfYmFjaygiNjQiKTsKICAgICBjbWQucHVzaF9iYWNrKCItQSIpOwogCiAgICAgaWYgKG51bVNlY3RvcnMpIHsKZGlmZiAtLWdpdCBhL2ZzL1ZmYXQuaCBiL2ZzL1ZmYXQuaAppbmRleCA0MGJlNWY2Li4yMDMwMDY3IDEwMDY0NAotLS0gYS9mcy9WZmF0LmgKKysrIGIvZnMvVmZhdC5oCkBAIC0yOCw5ICsyOCw4IEBACiBib29sIElzU3VwcG9ydGVkKCk7CiAKIHN0YXR1c190IENoZWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2UpOwotc3RhdHVzX3QgTW91bnQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHRhcmdldCwgYm9vbCBybywKLSAgICAgICAgYm9vbCByZW1vdW50LCBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssCi0gICAgICAgIGJvb2wgY3JlYXRlTG9zdCk7CitzdGF0dXNfdCBNb3VudChjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgdGFyZ2V0LCBib29sIHJvLCBib29sIHJlbW91bnQsCisgICAgICAgICAgICAgICBib29sIGV4ZWN1dGFibGUsIGludCBvd25lclVpZCwgaW50IG93bmVyR2lkLCBpbnQgcGVybU1hc2ssIGJvb2wgY3JlYXRlTG9zdCk7CiBzdGF0dXNfdCBGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZSwgdW5zaWduZWQgbG9uZyBudW1TZWN0b3JzKTsKIAogfSAgLy8gbmFtZXNwYWNlIHZmYXQKZGlmZiAtLWdpdCBhL2hhc2guaCBiL2hhc2guaAppbmRleCAzYjQ4M2YxLi5jZDgxODA1IDEwMDY0NAotLS0gYS9oYXNoLmgKKysrIGIvaGFzaC5oCkBAIC0xLDE4ICsxLDE4IEBACiAvKgogICogQ29weXJpZ2h0IChjKSAxOTk5IEt1bmdsaWdhIFRla25pc2thIEj2Z3Nrb2xhbgotICogKFJveWFsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBTdG9ja2hvbG0sIFN3ZWRlbikuIAotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCisgKiAoUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIFN0b2NraG9sbSwgU3dlZGVuKS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIAotICogYXJlIG1ldDogCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKICAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCAKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gCisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSAKLSAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIAorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgKgogICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBLVEggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzIG1heSBiZQogICogICAgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dApAQCAtNDIsNyArNDIsNyBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogCiAjaWZuZGVmIG1pbgotI2RlZmluZSBtaW4oYSxiKSAoKChhKT4oYikpPyhiKTooYSkpCisjZGVmaW5lIG1pbihhLCBiKSAoKChhKSA+IChiKSkgPyAoYikgOiAoYSkpCiAjZW5kaWYKIAogLyogVmVjdG9yIENyYXlzIGRvZXNuJ3QgaGF2ZSBhIGdvb2QgMzItYml0IHR5cGUsIG9yIG1vcmUgcHJlY2lzZWx5LApAQCAtNTMsMTQgKzUzLDEyIEBACiAgICAqLwogCiAjaWZkZWYgX0NSQVkKLSNkZWZpbmUgQ1JBWUZJWChYKSAoKFgpICYgMHhmZmZmZmZmZikKKyNkZWZpbmUgQ1JBWUZJWChYKSAoKFgpJjB4ZmZmZmZmZmYpCiAjZWxzZQogI2RlZmluZSBDUkFZRklYKFgpIChYKQogI2VuZGlmCiAKLXN0YXRpYyBpbmxpbmUgdV9pbnQzMl90Ci1jc2hpZnQgKHVfaW50MzJfdCB4LCB1bnNpZ25lZCBpbnQgbikKLXsKK3N0YXRpYyBpbmxpbmUgdV9pbnQzMl90IGNzaGlmdCh1X2ludDMyX3QgeCwgdW5zaWduZWQgaW50IG4pIHsKICAgICB4ID0gQ1JBWUZJWCh4KTsKICAgICByZXR1cm4gQ1JBWUZJWCgoeCA8PCBuKSB8ICh4ID4+ICgzMiAtIG4pKSk7CiB9CmRpZmYgLS1naXQgYS9tYWluLmNwcCBiL21haW4uY3BwCmluZGV4IDU1MjVlODUuLmUxZjg0MDQgMTAwNjQ0Ci0tLSBhL21haW4uY3BwCisrKyBiL21haW4uY3BwCkBAIC0xNiw1NyArMTYsNTcgQEAKIAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfUEFDS0FHRV9NQU5BR0VSCiAKLSNpbmNsdWRlICJtb2RlbC9EaXNrLmgiCi0jaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogI2luY2x1ZGUgIk5ldGxpbmtNYW5hZ2VyLmgiCiAjaW5jbHVkZSAiVm9sZE5hdGl2ZVNlcnZpY2UuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjcnlwdGZzLmgiCisjaW5jbHVkZSAibW9kZWwvRGlzay5oIgogI2luY2x1ZGUgInNlaGFuZGxlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGN1dGlscy9rbG9nLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8ZnNfbWdyLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8Z2V0b3B0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDxmc19tZ3IuaD4KIAogc3RhdGljIGludCBwcm9jZXNzX2NvbmZpZyhWb2x1bWVNYW5hZ2VyKiB2bSwgYm9vbCogaGFzX2Fkb3B0YWJsZSwgYm9vbCogaGFzX3F1b3RhLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBoYXNfcmVzZXJ2ZWQpOwotc3RhdGljIHZvaWQgY29sZGJvb3QoY29uc3QgY2hhciAqcGF0aCk7CitzdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyKiBwYXRoKTsKIHN0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KTsKIAotc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhhbmRsZTsKK3N0cnVjdCBzZWxhYmVsX2hhbmRsZSogc2VoYW5kbGU7CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgYXRyYWNlX3NldF90cmFjaW5nX2VuYWJsZWQoZmFsc2UpOwotICAgIHNldGVudigiQU5EUk9JRF9MT0dfVEFHUyIsICIqOnYiLCAxKTsKKyAgICBzZXRlbnYoIkFORFJPSURfTE9HX1RBR1MiLCAiKjpkIiwgMSk7CiAgICAgYW5kcm9pZDo6YmFzZTo6SW5pdExvZ2dpbmcoYXJndiwgYW5kcm9pZDo6YmFzZTo6TG9nZExvZ2dlcihhbmRyb2lkOjpiYXNlOjpTWVNURU0pKTsKIAogICAgIExPRyhJTkZPKSA8PCAiVm9sZCAzLjAgKHRoZSBhd2FrZW5pbmcpIGZpcmluZyB1cCI7CiAKICAgICBBVFJBQ0VfQkVHSU4oIm1haW4iKTsKIAorICAgIExPRyhERUJVRykgPDwgIkRldGVjdGVkIHN1cHBvcnQgZm9yOiIKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKSA/ICIgZjJmcyIgOiAiIikKKyAgICAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKSA/ICIgdmZhdCIgOiAiIik7CiAKLSAgICBMT0coVkVSQk9TRSkgPDwgIkRldGVjdGVkIHN1cHBvcnQgZm9yOiIKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImV4dDQiKSA/ICIgZXh0NCIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoImYyZnMiKSA/ICIgZjJmcyIgOiAiIikKLSAgICAgICAgICAgIDw8IChhbmRyb2lkOjp2b2xkOjpJc0ZpbGVzeXN0ZW1TdXBwb3J0ZWQoInZmYXQiKSA/ICIgdmZhdCIgOiAiIik7Ci0KLSAgICBWb2x1bWVNYW5hZ2VyICp2bTsKLSAgICBOZXRsaW5rTWFuYWdlciAqbm07CisgICAgVm9sdW1lTWFuYWdlciogdm07CisgICAgTmV0bGlua01hbmFnZXIqIG5tOwogCiAgICAgcGFyc2VfYXJncyhhcmdjLCBhcmd2KTsKIApAQCAtMTA4LDYgKzEwOCw4IEBACiAgICAgICAgIFBMT0coRVJST1IpIDw8ICJFcnJvciByZWFkaW5nIGNvbmZpZ3VyYXRpb24uLi4gY29udGludWluZyBhbnl3YXlzIjsKICAgICB9CiAKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKICAgICBBVFJBQ0VfQkVHSU4oIlZvbGROYXRpdmVTZXJ2aWNlOjpzdGFydCIpOwogICAgIGlmIChhbmRyb2lkOjp2b2xkOjpWb2xkTmF0aXZlU2VydmljZTo6c3RhcnQoKSAhPSBhbmRyb2lkOjpPSykgewogICAgICAgICBMT0coRVJST1IpIDw8ICJVbmFibGUgdG8gc3RhcnQgVm9sZE5hdGl2ZVNlcnZpY2UiOwpAQCAtMTQ1LDE5ICsxNDcsMjEgQEAKIAogc3RhdGljIHZvaWQgcGFyc2VfYXJncyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKICAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRzW10gPSB7Ci0gICAgICAgIHsiYmxraWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnYicgfSwKLSAgICAgICAgeyJibGtpZF91bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnQicgfSwKLSAgICAgICAgeyJmc2NrX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnIH0sCi0gICAgICAgIHsiZnNja191bnRydXN0ZWRfY29udGV4dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnRicgfSwKKyAgICAgICAgeyJibGtpZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdiJ30sCisgICAgICAgIHsiYmxraWRfdW50cnVzdGVkX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0InfSwKKyAgICAgICAgeyJmc2NrX2NvbnRleHQiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ2YnfSwKKyAgICAgICAgeyJmc2NrX3VudHJ1c3RlZF9jb250ZXh0IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdGJ30sCiAgICAgfTsKIAogICAgIGludCBjOwogICAgIHdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIiLCBvcHRzLCBudWxscHRyKSkgIT0gLTEpIHsKICAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIGNhc2UgJ2InOiBhbmRyb2lkOjp2b2xkOjpzQmxraWRDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKICAgICAgICAgY2FzZSAnQic6IGFuZHJvaWQ6OnZvbGQ6OnNCbGtpZFVudHJ1c3RlZENvbnRleHQgPSBvcHRhcmc7IGJyZWFrOwogICAgICAgICBjYXNlICdmJzogYW5kcm9pZDo6dm9sZDo6c0ZzY2tDb250ZXh0ID0gb3B0YXJnOyBicmVhazsKICAgICAgICAgY2FzZSAnRic6IGFuZHJvaWQ6OnZvbGQ6OnNGc2NrVW50cnVzdGVkQ29udGV4dCA9IG9wdGFyZzsgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTE2NywzMyArMTcxLDMwIEBACiAgICAgQ0hFQ0soYW5kcm9pZDo6dm9sZDo6c0ZzY2tVbnRydXN0ZWRDb250ZXh0ICE9IG51bGxwdHIpOwogfQogCi1zdGF0aWMgdm9pZCBkb19jb2xkYm9vdChESVIgKmQsIGludCBsdmwpIHsKLSAgICBzdHJ1Y3QgZGlyZW50ICpkZTsKK3N0YXRpYyB2b2lkIGRvX2NvbGRib290KERJUiogZCwgaW50IGx2bCkgeworICAgIHN0cnVjdCBkaXJlbnQqIGRlOwogICAgIGludCBkZmQsIGZkOwogCiAgICAgZGZkID0gZGlyZmQoZCk7CiAKICAgICBmZCA9IG9wZW5hdChkZmQsICJ1ZXZlbnQiLCBPX1dST05MWSB8IE9fQ0xPRVhFQyk7Ci0gICAgaWYoZmQgPj0gMCkgeworICAgIGlmIChmZCA+PSAwKSB7CiAgICAgICAgIHdyaXRlKGZkLCAiYWRkXG4iLCA0KTsKICAgICAgICAgY2xvc2UoZmQpOwogICAgIH0KIAotICAgIHdoaWxlKChkZSA9IHJlYWRkaXIoZCkpKSB7Ci0gICAgICAgIERJUiAqZDI7CisgICAgd2hpbGUgKChkZSA9IHJlYWRkaXIoZCkpKSB7CisgICAgICAgIERJUiogZDI7CiAKLSAgICAgICAgaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChkZS0+ZF9uYW1lWzBdID09ICcuJykgY29udGludWU7CiAKLSAgICAgICAgaWYgKGRlLT5kX3R5cGUgIT0gRFRfRElSICYmIGx2bCA+IDApCi0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKGRlLT5kX3R5cGUgIT0gRFRfRElSICYmIGx2bCA+IDApIGNvbnRpbnVlOwogCiAgICAgICAgIGZkID0gb3BlbmF0KGRmZCwgZGUtPmRfbmFtZSwgT19SRE9OTFkgfCBPX0RJUkVDVE9SWSB8IE9fQ0xPRVhFQyk7Ci0gICAgICAgIGlmKGZkIDwgMCkKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoZmQgPCAwKSBjb250aW51ZTsKIAogICAgICAgICBkMiA9IGZkb3BlbmRpcihmZCk7Ci0gICAgICAgIGlmKGQyID09IDApCisgICAgICAgIGlmIChkMiA9PSAwKQogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICBlbHNlIHsKICAgICAgICAgICAgIGRvX2NvbGRib290KGQyLCBsdmwgKyAxKTsKQEAgLTIwMiwxMCArMjAzLDEwIEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyICpwYXRoKSB7CitzdGF0aWMgdm9pZCBjb2xkYm9vdChjb25zdCBjaGFyKiBwYXRoKSB7CiAgICAgQVRSQUNFX05BTUUoImNvbGRib290Iik7Ci0gICAgRElSICpkID0gb3BlbmRpcihwYXRoKTsKLSAgICBpZihkKSB7CisgICAgRElSKiBkID0gb3BlbmRpcihwYXRoKTsKKyAgICBpZiAoZCkgewogICAgICAgICBkb19jb2xkYm9vdChkLCAwKTsKICAgICAgICAgY2xvc2VkaXIoZCk7CiAgICAgfQpAQCAtMjQ4LDEzICsyNDksMTMgQEAKICAgICAgICAgICAgICAgICBmbGFncyB8PSBhbmRyb2lkOjp2b2xkOjpEaXNrOjpGbGFnczo6a0Fkb3B0YWJsZTsKICAgICAgICAgICAgICAgICAqaGFzX2Fkb3B0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZnNfbWdyX2lzX25vZW11bGF0ZWRzZChyZWMpCi0gICAgICAgICAgICAgICAgICAgIHx8IGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgidm9sZC5kZWJ1Zy5kZWZhdWx0X3ByaW1hcnkiLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGlmIChmc19tZ3JfaXNfbm9lbXVsYXRlZHNkKHJlYykgfHwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRCb29sUHJvcGVydHkoInZvbGQuZGVidWcuZGVmYXVsdF9wcmltYXJ5IiwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gYW5kcm9pZDo6dm9sZDo6RGlzazo6RmxhZ3M6OmtEZWZhdWx0UHJpbWFyeTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdm0tPmFkZERpc2tTb3VyY2Uoc3RkOjpzaGFyZWRfcHRyPFZvbHVtZU1hbmFnZXI6OkRpc2tTb3VyY2U+KAotICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lTWFuYWdlcjo6RGlza1NvdXJjZShzeXNQYXR0ZXJuLCBuaWNrbmFtZSwgZmxhZ3MpKSk7CisgICAgICAgICAgICAgICAgbmV3IFZvbHVtZU1hbmFnZXI6OkRpc2tTb3VyY2Uoc3lzUGF0dGVybiwgbmlja25hbWUsIGZsYWdzKSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvbW9kZWwvRGlzay5jcHAgYi9tb2RlbC9EaXNrLmNwcAppbmRleCBkN2IxOWFjLi5iNjZjMzM2IDEwMDY0NAotLS0gYS9tb2RlbC9EaXNrLmNwcAorKysgYi9tb2RlbC9EaXNrLmNwcApAQCAtMTUsMzYgKzE1LDM2IEBACiAgKi8KIAogI2luY2x1ZGUgIkRpc2suaCIKLSNpbmNsdWRlICJQdWJsaWNWb2x1bWUuaCIKKyNpbmNsdWRlICJGc0NyeXB0LmgiCiAjaW5jbHVkZSAiUHJpdmF0ZVZvbHVtZS5oIgorI2luY2x1ZGUgIlB1YmxpY1ZvbHVtZS5oIgogI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sdW1lQmFzZS5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKLSNpbmNsdWRlICJFeHQ0Q3J5cHQuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgotI2luY2x1ZGUgPGV4dDRfdXRpbHMvZXh0NF9jcnlwdC5oPgorI2luY2x1ZGUgPGZzY3J5cHQvZnNjcnlwdC5oPgogCiAjaW5jbHVkZSAiY3J5cHRmcy5oIgogCi0jaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgotI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6UmVhZEZpbGVUb1N0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GaWxlOwogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6V3JpdGVTdHJpbmdUb0ZpbGU7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSB2b2xkIHsKQEAgLTc2LDYgKzc2LDggQEAKIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tNbWMgPSAxNzk7CiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrRXhwZXJpbWVudGFsTWluID0gMjQwOwogc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heCA9IDI1NDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQga01ham9yQmxvY2tEeW5hbWljTWluID0gMjM0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBrTWFqb3JCbG9ja0R5bmFtaWNNYXggPSA1MTI7CiAKIHN0YXRpYyBjb25zdCBjaGFyKiBrR3B0QmFzaWNEYXRhID0gIkVCRDBBMEEyLUI5RTUtNDQzMy04N0MwLTY4QjZCNzI2OTlDNyI7CiBzdGF0aWMgY29uc3QgY2hhcioga0dwdEFuZHJvaWRNZXRhID0gIjE5QTcxMEEyLUIzQ0EtMTFFNC1CMDI2LTEwNjA0Qjg4OURDRiI7CkBAIC0xMTAsMTQgKzExMiwyMiBAQAogICAgICAqICJyYW5jaHUiLCB0aGUgZGV2aWNlJ3Mgc3lzZnMgcGF0aCBzaG91bGQgZW5kIHdpdGggIi9ibG9jay92ZFtkLXpdIiwgZXRjLgogICAgICAqIEJ1dCBqdXN0IGhhdmluZyBhKSBhbmQgYikgaXMgZW5vdWdoIGZvciBub3cuCiAgICAgICovCi0gICAgcmV0dXJuIElzUnVubmluZ0luRW11bGF0b3IoKSAmJiBtYWpvciA+PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1pbgotICAgICAgICAgICAgJiYgbWFqb3IgPD0ga01ham9yQmxvY2tFeHBlcmltZW50YWxNYXg7CisgICAgcmV0dXJuIElzUnVubmluZ0luRW11bGF0b3IoKSAmJiBtYWpvciA+PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1pbiAmJgorICAgICAgICAgICBtYWpvciA8PSBrTWFqb3JCbG9ja0V4cGVyaW1lbnRhbE1heDsKIH0KIAotRGlzazo6RGlzayhjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRQYXRoLCBkZXZfdCBkZXZpY2UsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKSA6Ci0gICAgICAgIG1EZXZpY2UoZGV2aWNlKSwgbVNpemUoLTEpLCBtTmlja25hbWUobmlja25hbWUpLCBtRmxhZ3MoZmxhZ3MpLCBtQ3JlYXRlZCgKLSAgICAgICAgICAgICAgICBmYWxzZSksIG1KdXN0UGFydGl0aW9uZWQoZmFsc2UpIHsKK3N0YXRpYyBib29sIGlzTnZtZUJsa0RldmljZSh1bnNpZ25lZCBpbnQgbWFqb3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzeXNQYXRoKSB7CisgICAgcmV0dXJuIHN5c1BhdGguZmluZCgibnZtZSIpICE9IHN0ZDo6c3RyaW5nOjpucG9zICYmIG1ham9yID49IGtNYWpvckJsb2NrRHluYW1pY01pbiAmJgorICAgICAgICAgICBtYWpvciA8PSBrTWFqb3JCbG9ja0R5bmFtaWNNYXg7Cit9CisKK0Rpc2s6OkRpc2soY29uc3Qgc3RkOjpzdHJpbmcmIGV2ZW50UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgbmlja25hbWUsIGludCBmbGFncykKKyAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgIG1TaXplKC0xKSwKKyAgICAgIG1OaWNrbmFtZShuaWNrbmFtZSksCisgICAgICBtRmxhZ3MoZmxhZ3MpLAorICAgICAgbUNyZWF0ZWQoZmFsc2UpLAorICAgICAgbUp1c3RQYXJ0aXRpb25lZChmYWxzZSkgewogICAgIG1JZCA9IFN0cmluZ1ByaW50ZigiZGlzazoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpOwogICAgIG1FdmVudFBhdGggPSBldmVudFBhdGg7CiAgICAgbVN5c1BhdGggPSBTdHJpbmdQcmludGYoIi9zeXMvJXMiLCBldmVudFBhdGguY19zdHIoKSk7CkBAIC0xNDMsNyArMTUzLDcgQEAKICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotdm9pZCBEaXNrOjpsaXN0Vm9sdW1lcyhWb2x1bWVCYXNlOjpUeXBlIHR5cGUsIHN0ZDo6bGlzdDxzdGQ6OnN0cmluZz4mIGxpc3QpIHsKK3ZvaWQgRGlzazo6bGlzdFZvbHVtZXMoVm9sdW1lQmFzZTo6VHlwZSB0eXBlLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KSBjb25zdCB7CiAgICAgZm9yIChjb25zdCBhdXRvJiB2b2wgOiBtVm9sdW1lcykgewogICAgICAgICBpZiAodm9sLT5nZXRUeXBlKCkgPT0gdHlwZSkgewogICAgICAgICAgICAgbGlzdC5wdXNoX2JhY2sodm9sLT5nZXRJZCgpKTsKQEAgLTIzMyw3MyArMjQzLDg0IEBACiAgICAgbVNpemUgPSAtMTsKICAgICBtTGFiZWwuY2xlYXIoKTsKIAotICAgIGludCBmZCA9IG9wZW4obURldlBhdGguY19zdHIoKSwgT19SRE9OTFkgfCBPX0NMT0VYRUMpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICBpZiAoaW9jdGwoZmQsIEJMS0dFVFNJWkU2NCwgJm1TaXplKSkgewotICAgICAgICAgICAgbVNpemUgPSAtMTsKLSAgICAgICAgfQotICAgICAgICBjbG9zZShmZCk7CisgICAgaWYgKEdldEJsb2NrRGV2U2l6ZShtRGV2UGF0aCwgJm1TaXplKSAhPSBPSykgeworICAgICAgICBtU2l6ZSA9IC0xOwogICAgIH0KIAogICAgIHVuc2lnbmVkIGludCBtYWpvcklkID0gbWFqb3IobURldmljZSk7CiAgICAgc3dpdGNoIChtYWpvcklkKSB7Ci0gICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKLSAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lBOiBjYXNlIGtNYWpvckJsb2NrU2NzaUI6IGNhc2Uga01ham9yQmxvY2tTY3NpQzogY2FzZSBrTWFqb3JCbG9ja1Njc2lEOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOiBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUk6IGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lNOiBjYXNlIGtNYWpvckJsb2NrU2NzaU46IGNhc2Uga01ham9yQmxvY2tTY3NpTzogY2FzZSBrTWFqb3JCbG9ja1Njc2lQOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS92ZW5kb3IiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIHZlbmRvciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBtTGFiZWwgPSB0bXA7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHBhdGgobVN5c1BhdGggKyAiL2RldmljZS9tYW5maWQiKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKLSAgICAgICAgICAgIFBMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byByZWFkIG1hbnVmYWN0dXJlciBmcm9tICIgPDwgcGF0aDsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87Ci0gICAgICAgIH0KLSAgICAgICAgdG1wID0gYW5kcm9pZDo6YmFzZTo6VHJpbSh0bXApOwotICAgICAgICBpbnQ2NF90IG1hbmZpZDsKLSAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7Ci0gICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcGFyc2UgbWFudWZhY3R1cmVyICIgPDwgdG1wOwotICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3VyIGdvYWwgaGVyZSBpcyB0byBnaXZlIHRoZSB1c2VyIGEgbWVhbmluZ2Z1bCBsYWJlbCwgaWRlYWxseQotICAgICAgICAvLyBtYXRjaGluZyB3aGF0ZXZlciBpcyBzaWxrLXNjcmVlbmVkIG9uIHRoZSBjYXJkLiAgVG8gcmVkdWNlCi0gICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KLSAgICAgICAgc3dpdGNoIChtYW5maWQpIHsKLSAgICAgICAgY2FzZSAweDAwMDAwMzogbUxhYmVsID0gIlNhbkRpc2siOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKLSAgICAgICAgY2FzZSAweDAwMDAyODogbUxhYmVsID0gIkxleGFyIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwMDAwNzQ6IG1MYWJlbCA9ICJUcmFuc2NlbmQiOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgICBpZiAoaXNWaXJ0aW9CbGtEZXZpY2UobWFqb3JJZCkpIHsKLSAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlJlY29nbml6ZWQgZXhwZXJpbWVudGFsIGJsb2NrIG1ham9yIElEICIgPDwgbWFqb3JJZAotICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICBjYXNlIGtNYWpvckJsb2NrTG9vcDogewogICAgICAgICAgICAgbUxhYmVsID0gIlZpcnR1YWwiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnN1cHBvcnRlZCBibG9jayBtYWpvciB0eXBlICIgPDwgbWFqb3JJZDsKLSAgICAgICAgcmV0dXJuIC1FTk9UU1VQOwotICAgIH0KKyAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUE6IGNhc2Uga01ham9yQmxvY2tTY3NpQjogY2FzZSBrTWFqb3JCbG9ja1Njc2lDOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUQ6IGNhc2Uga01ham9yQmxvY2tTY3NpRTogY2FzZSBrTWFqb3JCbG9ja1Njc2lGOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUc6IGNhc2Uga01ham9yQmxvY2tTY3NpSDogY2FzZSBrTWFqb3JCbG9ja1Njc2lJOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUo6IGNhc2Uga01ham9yQmxvY2tTY3NpSzogY2FzZSBrTWFqb3JCbG9ja1Njc2lMOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaU06IGNhc2Uga01ham9yQmxvY2tTY3NpTjogY2FzZSBrTWFqb3JCbG9ja1Njc2lPOgorICAgICAgICBjYXNlIGtNYWpvckJsb2NrU2NzaVA6IHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL3ZlbmRvciIpOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgaWYgKCFSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlYWQgdmVuZG9yIGZyb20gIiA8PCBwYXRoOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0bXAgPSBhbmRyb2lkOjpiYXNlOjpUcmltKHRtcCk7CisgICAgICAgICAgICBtTGFiZWwgPSB0bXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBwYXRoKG1TeXNQYXRoICsgIi9kZXZpY2UvbWFuZmlkIik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0bXA7CisgICAgICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcocGF0aCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYW51ZmFjdHVyZXIgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRtcCA9IGFuZHJvaWQ6OmJhc2U6OlRyaW0odG1wKTsKKyAgICAgICAgICAgIGludDY0X3QgbWFuZmlkOworICAgICAgICAgICAgaWYgKCFhbmRyb2lkOjpiYXNlOjpQYXJzZUludCh0bXAsICZtYW5maWQpKSB7CisgICAgICAgICAgICAgICAgUExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHBhcnNlIG1hbnVmYWN0dXJlciAiIDw8IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE91ciBnb2FsIGhlcmUgaXMgdG8gZ2l2ZSB0aGUgdXNlciBhIG1lYW5pbmdmdWwgbGFiZWwsIGlkZWFsbHkKKyAgICAgICAgICAgIC8vIG1hdGNoaW5nIHdoYXRldmVyIGlzIHNpbGstc2NyZWVuZWQgb24gdGhlIGNhcmQuICBUbyByZWR1Y2UKKyAgICAgICAgICAgIC8vIHVzZXIgY29uZnVzaW9uLCB0aGlzIGxpc3QgZG9lc24ndCBjb250YWluIHdoaXRlLWxhYmVsIG1hbmZpZC4KKyAgICAgICAgICAgIHN3aXRjaCAobWFuZmlkKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgorICAgICAgICAgICAgICAgIGNhc2UgMHgwMDAwMDM6IG1MYWJlbCA9ICJTYW5EaXNrIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAweDAwMDAxYjogbUxhYmVsID0gIlNhbXN1bmciOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDI4OiBtTGFiZWwgPSAiTGV4YXIiOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDAwMDc0OiBtTGFiZWwgPSAiVHJhbnNjZW5kIjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiUmVjb2duaXplZCBleHBlcmltZW50YWwgYmxvY2sgbWFqb3IgSUQgIiA8PCBtYWpvcklkCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFzIHZpcnRpby1ibGsgKGVtdWxhdG9yJ3MgdmlydHVhbCBTRCBjYXJkIGRldmljZSkiOworICAgICAgICAgICAgICAgIG1MYWJlbCA9ICJWaXJ0dWFsIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc052bWVCbGtEZXZpY2UobWFqb3JJZCwgbVN5c1BhdGgpKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgcGF0aChtU3lzUGF0aCArICIvZGV2aWNlL21vZGVsIik7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdG1wOworICAgICAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhwYXRoLCAmdG1wKSkgeworICAgICAgICAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCB2ZW5kb3IgZnJvbSAiIDw8IHBhdGg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1MYWJlbCA9IHRtcDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5zdXBwb3J0ZWQgYmxvY2sgbWFqb3IgdHlwZSAiIDw8IG1ham9ySWQ7CisgICAgICAgICAgICByZXR1cm4gLUVOT1RTVVA7CisgICAgICAgIH0KICAgICB9CiAKICAgICBhdXRvIGxpc3RlbmVyID0gVm9sdW1lTWFuYWdlcjo6SW5zdGFuY2UoKS0+Z2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwKLSAgICAgICAgICAgIG1TaXplLCBtTGFiZWwsIG1TeXNQYXRoKTsKKyAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vbkRpc2tNZXRhZGF0YUNoYW5nZWQoZ2V0SWQoKSwgbVNpemUsIG1MYWJlbCwgbVN5c1BhdGgpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMzIwLDcgKzM0MSw3IEBACiAgICAgY21kLnB1c2hfYmFjayhtRGV2UGF0aCk7CiAKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3V0cHV0OwotICAgIHN0YXR1c190IHJlcyA9IEZvcmtFeGVjdnAoY21kLCBvdXRwdXQpOworICAgIHN0YXR1c190IHJlcyA9IEZvcmtFeGVjdnAoY21kLCAmb3V0cHV0KTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAic2dkaXNrIGZhaWxlZCB0byBzY2FuICIgPDwgbURldlBhdGg7CiAKQEAgLTU0NSwzOCArNTY2LDQ5IEBACiAgICAgLy8gRmlndXJlIG91dCBtYXhpbXVtIHBhcnRpdGlvbiBkZXZpY2VzIHN1cHBvcnRlZAogICAgIHVuc2lnbmVkIGludCBtYWpvcklkID0gbWFqb3IobURldmljZSk7CiAgICAgc3dpdGNoIChtYWpvcklkKSB7Ci0gICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKLSAgICAgICAgc3RkOjpzdHJpbmcgdG1wOwotICAgICAgICBpZiAoIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTG9vcE1heE1pbm9ycywgJnRtcCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG1heCBtaW5vcnMiOwotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKKyAgICAgICAgY2FzZSBrTWFqb3JCbG9ja0xvb3A6IHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNMb29wTWF4TWlub3JzLCAmdG1wKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG1heCBtaW5vcnMiOworICAgICAgICAgICAgICAgIHJldHVybiAtZXJybm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSh0bXApOwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaUE6IGNhc2Uga01ham9yQmxvY2tTY3NpQjogY2FzZSBrTWFqb3JCbG9ja1Njc2lDOiBjYXNlIGtNYWpvckJsb2NrU2NzaUQ6Ci0gICAgY2FzZSBrTWFqb3JCbG9ja1Njc2lFOiBjYXNlIGtNYWpvckJsb2NrU2NzaUY6IGNhc2Uga01ham9yQmxvY2tTY3NpRzogY2FzZSBrTWFqb3JCbG9ja1Njc2lIOgotICAgIGNhc2Uga01ham9yQmxvY2tTY3NpSTogY2FzZSBrTWFqb3JCbG9ja1Njc2lKOiBjYXNlIGtNYWpvckJsb2NrU2NzaUs6IGNhc2Uga01ham9yQmxvY2tTY3NpTDoKLSAgICBjYXNlIGtNYWpvckJsb2NrU2NzaU06IGNhc2Uga01ham9yQmxvY2tTY3NpTjogY2FzZSBrTWFqb3JCbG9ja1Njc2lPOiBjYXNlIGtNYWpvckJsb2NrU2NzaVA6IHsKLSAgICAgICAgLy8gUGVyIERvY3VtZW50YXRpb24vZGV2aWNlcy50eHQgdGhpcyBpcyBzdGF0aWMKLSAgICAgICAgcmV0dXJuIDE1OwotICAgIH0KLSAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7Ci0gICAgICAgIC8vIFBlciBEb2N1bWVudGF0aW9uL2RldmljZXMudHh0IHRoaXMgaXMgZHluYW1pYwotICAgICAgICBzdGQ6OnN0cmluZyB0bXA7Ci0gICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnMsICZ0bXApICYmCi0gICAgICAgICAgICAgICAgIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTW1jTWF4TWlub3JzRGVwcmVjYXRlZCwgJnRtcCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byByZWFkIG1heCBtaW5vcnMiOwotICAgICAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RkOjpzdG9pKHRtcCk7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgaWYgKGlzVmlydGlvQmxrRGV2aWNlKG1ham9ySWQpKSB7Ci0gICAgICAgICAgICAvLyBkcml2ZXJzL2Jsb2NrL3ZpcnRpb19ibGsuYyBoYXMgIiNkZWZpbmUgUEFSVF9CSVRTIDQiLCBzbyBtYXggaXMKLSAgICAgICAgICAgIC8vIDJeNCAtIDEgPSAxNQorICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpQTogY2FzZSBrTWFqb3JCbG9ja1Njc2lCOiBjYXNlIGtNYWpvckJsb2NrU2NzaUM6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRDogY2FzZSBrTWFqb3JCbG9ja1Njc2lFOiBjYXNlIGtNYWpvckJsb2NrU2NzaUY6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpRzogY2FzZSBrTWFqb3JCbG9ja1Njc2lIOiBjYXNlIGtNYWpvckJsb2NrU2NzaUk6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpSjogY2FzZSBrTWFqb3JCbG9ja1Njc2lLOiBjYXNlIGtNYWpvckJsb2NrU2NzaUw6CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpTTogY2FzZSBrTWFqb3JCbG9ja1Njc2lOOiBjYXNlIGtNYWpvckJsb2NrU2NzaU86CisgICAgICAgIGNhc2Uga01ham9yQmxvY2tTY3NpUDogeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCisgICAgICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIHN0YXRpYwogICAgICAgICAgICAgcmV0dXJuIDE1OwogICAgICAgICB9Ci0gICAgfQorICAgICAgICBjYXNlIGtNYWpvckJsb2NrTW1jOiB7CisgICAgICAgICAgICAvLyBQZXIgRG9jdW1lbnRhdGlvbi9kZXZpY2VzLnR4dCB0aGlzIGlzIGR5bmFtaWMKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRtcDsKKyAgICAgICAgICAgIGlmICghUmVhZEZpbGVUb1N0cmluZyhrU3lzZnNNbWNNYXhNaW5vcnMsICZ0bXApICYmCisgICAgICAgICAgICAgICAgIVJlYWRGaWxlVG9TdHJpbmcoa1N5c2ZzTW1jTWF4TWlub3JzRGVwcmVjYXRlZCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gcmVhZCBtYXggbWlub3JzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gLWVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RvaSh0bXApOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmIChpc1ZpcnRpb0Jsa0RldmljZShtYWpvcklkKSkgeworICAgICAgICAgICAgICAgIC8vIGRyaXZlcnMvYmxvY2svdmlydGlvX2Jsay5jIGhhcyAiI2RlZmluZSBQQVJUX0JJVFMgNCIsIHNvIG1heCBpcworICAgICAgICAgICAgICAgIC8vIDJeNCAtIDEgPSAxNQorICAgICAgICAgICAgICAgIHJldHVybiAxNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpc052bWVCbGtEZXZpY2UobWFqb3JJZCwgbVN5c1BhdGgpKSB7CisgICAgICAgICAgICAgICAgLy8gZGVzcGl0ZSBrZXJuZWwgbnZtZSBkcml2ZXIgc3VwcG9ydHMgdXAgdG8gMU0gbWlub3JzLAorICAgICAgICAgICAgICAgIC8vICAgICAjZGVmaW5lIE5WTUVfTUlOT1JTICgxVSA8PCBNSU5PUkJJVFMpCisgICAgICAgICAgICAgICAgLy8gc2dkaXNrIGNhbiBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gMTI3IHBhcnRpdGlvbnMsIGR1ZSB0bworICAgICAgICAgICAgICAgIC8vICAgICAjZGVmaW5lIE1BWF9NQlJfUEFSVFMgMTI4CisgICAgICAgICAgICAgICAgcmV0dXJuIDEyNzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAogICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIGJsb2NrIG1ham9yIHR5cGUgIiA8PCBtYWpvcklkOwpkaWZmIC0tZ2l0IGEvbW9kZWwvRGlzay5oIGIvbW9kZWwvRGlzay5oCmluZGV4IDYzYWNmNmEuLjg4OWU5MDYgMTAwNjQ0Ci0tLSBhL21vZGVsL0Rpc2suaAorKysgYi9tb2RlbC9EaXNrLmgKQEAgLTM2LDcgKzM2LDcgQEAKICAqIGhvdyB0byByZXBhcnRpdGlvbiBpdHNlbGYuCiAgKi8KIGNsYXNzIERpc2sgewotcHVibGljOgorICBwdWJsaWM6CiAgICAgRGlzayhjb25zdCBzdGQ6OnN0cmluZyYgZXZlbnRQYXRoLCBkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuaWNrbmFtZSwgaW50IGZsYWdzKTsKICAgICB2aXJ0dWFsIH5EaXNrKCk7CiAKQEAgLTU0LDE4ICs1NCwxOCBAQAogICAgICAgICBrRW1tYyA9IDEgPDwgNCwKICAgICB9OwogCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldElkKCkgeyByZXR1cm4gbUlkOyB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldEV2ZW50UGF0aCgpIHsgcmV0dXJuIG1FdmVudFBhdGg7IH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0U3lzUGF0aCgpIHsgcmV0dXJuIG1TeXNQYXRoOyB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldERldlBhdGgoKSB7IHJldHVybiBtRGV2UGF0aDsgfQotICAgIGRldl90IGdldERldmljZSgpIHsgcmV0dXJuIG1EZXZpY2U7IH0KLSAgICB1aW50NjRfdCBnZXRTaXplKCkgeyByZXR1cm4gbVNpemU7IH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0TGFiZWwoKSB7IHJldHVybiBtTGFiZWw7IH0KLSAgICBpbnQgZ2V0RmxhZ3MoKSB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RXZlbnRQYXRoKCkgY29uc3QgeyByZXR1cm4gbUV2ZW50UGF0aDsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRTeXNQYXRoKCkgY29uc3QgeyByZXR1cm4gbVN5c1BhdGg7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RGV2UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1EZXZQYXRoOyB9CisgICAgZGV2X3QgZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURldmljZTsgfQorICAgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIG1MYWJlbDsgfQorICAgIGludCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCiAgICAgc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+IGZpbmRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKIAotICAgIHZvaWQgbGlzdFZvbHVtZXMoVm9sdW1lQmFzZTo6VHlwZSB0eXBlLCBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+JiBsaXN0KTsKKyAgICB2b2lkIGxpc3RWb2x1bWVzKFZvbHVtZUJhc2U6OlR5cGUgdHlwZSwgc3RkOjpsaXN0PHN0ZDo6c3RyaW5nPiYgbGlzdCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBjcmVhdGUoKTsKICAgICBzdGF0dXNfdCBkZXN0cm95KCk7CkBAIC03OSw3ICs3OSw3IEBACiAgICAgc3RhdHVzX3QgcGFydGl0aW9uUHJpdmF0ZSgpOwogICAgIHN0YXR1c190IHBhcnRpdGlvbk1peGVkKGludDhfdCByYXRpbyk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogSUQgdGhhdCB1bmlxdWVseSByZWZlcmVuY2VzIHRoaXMgZGlzayAqLwogICAgIHN0ZDo6c3RyaW5nIG1JZDsKICAgICAvKiBPcmlnaW5hbCBldmVudCBwYXRoICovCmRpZmYgLS1naXQgYS9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5jcHAKaW5kZXggMzFjMzkyNC4uOGQ5YWM3NCAxMDA2NDQKLS0tIGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuY3BwCisrKyBiL21vZGVsL0VtdWxhdGVkVm9sdW1lLmNwcApAQCAtMjcsOCArMjcsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKQEAgLTM4LDIyICszOCwyMSBAQAogCiBzdGF0aWMgY29uc3QgY2hhcioga0Z1c2VQYXRoID0gIi9zeXN0ZW0vYmluL3NkY2FyZCI7CiAKLUVtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCkgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKK0VtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCkKKyAgICA6IFZvbHVtZUJhc2UoVHlwZTo6a0VtdWxhdGVkKSwgbUZ1c2VQaWQoMCkgewogICAgIHNldElkKCJlbXVsYXRlZCIpOwogICAgIG1SYXdQYXRoID0gcmF3UGF0aDsKICAgICBtTGFiZWwgPSAiZW11bGF0ZWQiOwogfQogCi1FbXVsYXRlZFZvbHVtZTo6RW11bGF0ZWRWb2x1bWUoY29uc3Qgc3RkOjpzdHJpbmcmIHJhd1BhdGgsIGRldl90IGRldmljZSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCkgOiBWb2x1bWVCYXNlKFR5cGU6OmtFbXVsYXRlZCksIG1GdXNlUGlkKDApIHsKK0VtdWxhdGVkVm9sdW1lOjpFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKQorICAgIDogVm9sdW1lQmFzZShUeXBlOjprRW11bGF0ZWQpLCBtRnVzZVBpZCgwKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJlbXVsYXRlZDoldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtUmF3UGF0aCA9IHJhd1BhdGg7CiAgICAgbUxhYmVsID0gZnNVdWlkOwogfQogCi1FbXVsYXRlZFZvbHVtZTo6fkVtdWxhdGVkVm9sdW1lKCkgewotfQorRW11bGF0ZWRWb2x1bWU6On5FbXVsYXRlZFZvbHVtZSgpIHt9CiAKIHN0YXR1c190IEVtdWxhdGVkVm9sdW1lOjpkb01vdW50KCkgewogICAgIC8vIFdlIGNvdWxkIGhhdmUgbWlncmF0ZWQgc3RvcmFnZSB0byBhbiBhZG9wdGVkIHByaXZhdGUgdm9sdW1lLCBzbyBhbHdheXMKQEAgLTcxLDggKzcwLDggQEAKICAgICBzZXRQYXRoKFN0cmluZ1ByaW50ZigiL3N0b3JhZ2UvJXMiLCBsYWJlbC5jX3N0cigpKSk7CiAKICAgICBpZiAoZnNfcHJlcGFyZV9kaXIobUZ1c2VEZWZhdWx0LmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlUmVhZC5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpIHx8Ci0gICAgICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVdyaXRlLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkpIHsKKyAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VSZWFkLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKKyAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VXcml0ZS5jX3N0cigpLCAwNzAwLCBBSURfUk9PVCwgQUlEX1JPT1QpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gY3JlYXRlIG1vdW50IHBvaW50cyI7CiAgICAgICAgIHJldHVybiAtZXJybm87CiAgICAgfQpAQCAtODAsNiArNzksNyBAQAogICAgIGRldl90IGJlZm9yZSA9IEdldERldmljZShtRnVzZVdyaXRlKTsKIAogICAgIGlmICghKG1GdXNlUGlkID0gZm9yaygpKSkgeworICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIGlmIChleGVjbChrRnVzZVBhdGgsIGtGdXNlUGF0aCwKICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICItZyIsICIxMDIzIiwgLy8gQUlEX01FRElBX1JXCkBAIC05MCw2ICs5MCw3IEBACiAgICAgICAgICAgICAgICAgbVJhd1BhdGguY19zdHIoKSwKICAgICAgICAgICAgICAgICBsYWJlbC5jX3N0cigpLAogICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gZXhlYyI7CiAgICAgICAgIH0KIApAQCAtMTA0LDggKzEwNSw4IEBACiAKICAgICBuc2Vjc190IHN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgd2hpbGUgKGJlZm9yZSA9PSBHZXREZXZpY2UobUZ1c2VXcml0ZSkpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXYWl0aW5nIGZvciBGVVNFIHRvIHNwaW4gdXAuLi4iOwotICAgICAgICB1c2xlZXAoNTAwMDApOyAvLyA1MG1zCisgICAgICAgIExPRyhERUJVRykgPDwgIldhaXRpbmcgZm9yIEZVU0UgdG8gc3BpbiB1cC4uLiI7CisgICAgICAgIHVzbGVlcCg1MDAwMCk7ICAvLyA1MG1zCiAKICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICAgICAgaWYgKG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhub3cgLSBzdGFydCkgPiA1MDAwKSB7CkBAIC0xMTQsOCArMTE1LDggQEAKICAgICAgICAgfQogICAgIH0KICAgICAvKiBzZGNhcmRmcyB3aWxsIGhhdmUgZXhpdGVkIGFscmVhZHkuIEZVU0Ugd2lsbCBzdGlsbCBiZSBydW5uaW5nICovCi0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKG1GdXNlUGlkLCBudWxscHRyLCBXTk9IQU5HKSkgPT0gbUZ1c2VQaWQpCi0gICAgICAgIG1GdXNlUGlkID0gMDsKKyAgICBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChtRnVzZVBpZCwgbnVsbHB0ciwgMCkpOworICAgIG1GdXNlUGlkID0gMDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTEzMCwxMiArMTMxLDYgQEAKICAgICBGb3JjZVVubW91bnQobUZ1c2VSZWFkKTsKICAgICBGb3JjZVVubW91bnQobUZ1c2VXcml0ZSk7CiAKLSAgICBpZiAobUZ1c2VQaWQgPiAwKSB7Ci0gICAgICAgIGtpbGwobUZ1c2VQaWQsIFNJR1RFUk0pOwotICAgICAgICBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChtRnVzZVBpZCwgbnVsbHB0ciwgMCkpOwotICAgICAgICBtRnVzZVBpZCA9IDA7Ci0gICAgfQotCiAgICAgcm1kaXIobUZ1c2VEZWZhdWx0LmNfc3RyKCkpOwogICAgIHJtZGlyKG1GdXNlUmVhZC5jX3N0cigpKTsKICAgICBybWRpcihtRnVzZVdyaXRlLmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaCBiL21vZGVsL0VtdWxhdGVkVm9sdW1lLmgKaW5kZXggOWIwYzA0OS4uZjYxOGM1NSAxMDA2NDQKLS0tIGEvbW9kZWwvRW11bGF0ZWRWb2x1bWUuaAorKysgYi9tb2RlbC9FbXVsYXRlZFZvbHVtZS5oCkBAIC0zNiwxNiArMzYsMTYgQEAKICAqIHN0b3JlIGRhdGEgbG9jYWwgdG8gdGhlaXIgYXBwLgogICovCiBjbGFzcyBFbXVsYXRlZFZvbHVtZSA6IHB1YmxpYyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIGV4cGxpY2l0IEVtdWxhdGVkVm9sdW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiByYXdQYXRoKTsKICAgICBFbXVsYXRlZFZvbHVtZShjb25zdCBzdGQ6OnN0cmluZyYgcmF3UGF0aCwgZGV2X3QgZGV2aWNlLCBjb25zdCBzdGQ6OnN0cmluZyYgZnNVdWlkKTsKICAgICB2aXJ0dWFsIH5FbXVsYXRlZFZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb01vdW50KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9Vbm1vdW50KCkgb3ZlcnJpZGU7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgc3RkOjpzdHJpbmcgbVJhd1BhdGg7CiAgICAgc3RkOjpzdHJpbmcgbUxhYmVsOwogCmRpZmYgLS1naXQgYS9tb2RlbC9PYmJWb2x1bWUuY3BwIGIvbW9kZWwvT2JiVm9sdW1lLmNwcAppbmRleCA3MDljN2EzLi4yMTQ3OWM0IDEwMDY0NAotLS0gYS9tb2RlbC9PYmJWb2x1bWUuY3BwCisrKyBiL21vZGVsL09iYlZvbHVtZS5jcHAKQEAgLTE0LDE2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgImZzL1ZmYXQuaCIKKyNpbmNsdWRlICJPYmJWb2x1bWUuaCIKICNpbmNsdWRlICJEZXZtYXBwZXIuaCIKICNpbmNsdWRlICJMb29wLmgiCi0jaW5jbHVkZSAiT2JiVm9sdW1lLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKICNpbmNsdWRlICJWb2xkVXRpbC5oIgorI2luY2x1ZGUgImZzL1ZmYXQuaCIKIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KICNpbmNsdWRlIDxjdXRpbHMvZnMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIApAQCAtMzEsMjYgKzMwLDI1IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KIAogdXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwotdXNpbmcgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2Ugdm9sZCB7CiAKIE9iYlZvbHVtZTo6T2JiVm9sdW1lKGludCBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZVBhdGgsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VLZXksCi0gICAgICAgIGdpZF90IG93bmVyR2lkKSA6IFZvbHVtZUJhc2UoVHlwZTo6a09iYikgeworICAgICAgICAgICAgICAgICAgICAgZ2lkX3Qgb3duZXJHaWQpCisgICAgOiBWb2x1bWVCYXNlKFR5cGU6OmtPYmIpIHsKICAgICBzZXRJZChTdHJpbmdQcmludGYoIm9iYjolZCIsIGlkKSk7CiAgICAgbVNvdXJjZVBhdGggPSBzb3VyY2VQYXRoOwogICAgIG1Tb3VyY2VLZXkgPSBzb3VyY2VLZXk7CiAgICAgbU93bmVyR2lkID0gb3duZXJHaWQ7CiB9CiAKLU9iYlZvbHVtZTo6fk9iYlZvbHVtZSgpIHsKLX0KK09iYlZvbHVtZTo6fk9iYlZvbHVtZSgpIHt9CiAKIHN0YXR1c190IE9iYlZvbHVtZTo6ZG9DcmVhdGUoKSB7CiAgICAgaWYgKExvb3A6OmNyZWF0ZShtU291cmNlUGF0aCwgbUxvb3BQYXRoKSkgewpAQCAtNTksMjQgKzU3LDE1IEBACiAgICAgfQogCiAgICAgaWYgKCFtU291cmNlS2V5LmVtcHR5KCkpIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyBucl9zZWMgPSAwOwotICAgICAgICB7Ci0gICAgICAgICAgICB1bmlxdWVfZmQgbG9vcF9mZChvcGVuKG1Mb29wUGF0aC5jX3N0cigpLCBPX1JEV1IgfCBPX0NMT0VYRUMpKTsKLSAgICAgICAgICAgIGlmIChsb29wX2ZkLmdldCgpID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBvcGVuIGxvb3AiOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZ2V0X2Jsa2Rldl9zaXplKGxvb3BfZmQuZ2V0KCksICZucl9zZWMpOwotICAgICAgICAgICAgaWYgKG5yX3NlYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBnZXQgbG9vcCBzaXplIjsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IG5yX3NlYyA9IDA7CisgICAgICAgIGlmIChHZXRCbG9ja0RldjUxMlNlY3RvcnMobUxvb3BQYXRoLCAmbnJfc2VjKSAhPSBPSykgeworICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBnZXQgbG9vcCBzaXplIjsKKyAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQogCiAgICAgICAgIGNoYXIgdG1wW1BBVEhfTUFYXTsKLSAgICAgICAgaWYgKERldm1hcHBlcjo6Y3JlYXRlKGdldElkKCkuY19zdHIoKSwgbUxvb3BQYXRoLmNfc3RyKCksIG1Tb3VyY2VLZXkuY19zdHIoKSwgbnJfc2VjLAotICAgICAgICAgICAgICAgIHRtcCwgUEFUSF9NQVgpKSB7CisgICAgICAgIGlmIChEZXZtYXBwZXI6OmNyZWF0ZShnZXRJZCgpLmNfc3RyKCksIG1Mb29wUGF0aC5jX3N0cigpLCBtU291cmNlS2V5LmNfc3RyKCksIG5yX3NlYywgdG1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFUSF9NQVgpKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBkbSI7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KQEAgLTEwOCw4ICs5NywxMCBAQAogICAgICAgICBQTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGNyZWF0ZSBtb3VudCBwb2ludCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9Ci0gICAgaWYgKGFuZHJvaWQ6OnZvbGQ6OnZmYXQ6Ok1vdW50KG1Nb3VudFBhdGgsIHBhdGgsCi0gICAgICAgICAgICB0cnVlLCBmYWxzZSwgdHJ1ZSwgMCwgbU93bmVyR2lkLCAwMjI3LCBmYWxzZSkpIHsKKyAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCisgICAgaWYgKGFuZHJvaWQ6OnZvbGQ6OnZmYXQ6Ok1vdW50KG1Nb3VudFBhdGgsIHBhdGgsIHRydWUsIGZhbHNlLCB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBtT3duZXJHaWQsIDAyMjcsIGZhbHNlKSkgeworICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBtb3VudCI7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CmRpZmYgLS1naXQgYS9tb2RlbC9PYmJWb2x1bWUuaCBiL21vZGVsL09iYlZvbHVtZS5oCmluZGV4IDVlYzBjZGUuLjhmN2VlOTQgMTAwNjQ0Ci0tLSBhL21vZGVsL09iYlZvbHVtZS5oCisrKyBiL21vZGVsL09iYlZvbHVtZS5oCkBAIC0yOCwxOCArMjgsMTcgQEAKICAqIE9CQiBjb250YWluZXIuCiAgKi8KIGNsYXNzIE9iYlZvbHVtZSA6IHB1YmxpYyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKLSAgICBPYmJWb2x1bWUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNvdXJjZUtleSwKLSAgICAgICAgICAgIGdpZF90IG93bmVyR2lkKTsKKyAgcHVibGljOgorICAgIE9iYlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlS2V5LCBnaWRfdCBvd25lckdpZCk7CiAgICAgdmlydHVhbCB+T2JiVm9sdW1lKCk7CiAKLXByb3RlY3RlZDoKKyAgcHJvdGVjdGVkOgogICAgIHN0YXR1c190IGRvQ3JlYXRlKCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9EZXN0cm95KCkgb3ZlcnJpZGU7CiAgICAgc3RhdHVzX3QgZG9Nb3VudCgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvVW5tb3VudCgpIG92ZXJyaWRlOwogCi1wcml2YXRlOgorICBwcml2YXRlOgogICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2VQYXRoOwogICAgIHN0ZDo6c3RyaW5nIG1Tb3VyY2VLZXk7CiAgICAgZ2lkX3QgbU93bmVyR2lkOwpkaWZmIC0tZ2l0IGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5jcHAgYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmNwcAppbmRleCBjZjIxNTc3Li5kZTJhMDlmIDEwMDY0NAotLS0gYS9tb2RlbC9Qcml2YXRlVm9sdW1lLmNwcAorKysgYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmNwcApAQCAtMTQsMjcgKzE0LDI3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAiZnMvRXh0NC5oIgotI2luY2x1ZGUgImZzL0YyZnMuaCIKICNpbmNsdWRlICJQcml2YXRlVm9sdW1lLmgiCiAjaW5jbHVkZSAiRW11bGF0ZWRWb2x1bWUuaCIKICNpbmNsdWRlICJVdGlscy5oIgogI2luY2x1ZGUgIlZvbHVtZU1hbmFnZXIuaCIKICNpbmNsdWRlICJjcnlwdGZzLmgiCisjaW5jbHVkZSAiZnMvRXh0NC5oIgorI2luY2x1ZGUgImZzL0YyZnMuaCIKIAotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxjdXRpbHMvZnMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3lzL21vdW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgogCiB1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CiAKQEAgLTQzLDE0ICs0MywxMyBAQAogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGtNYWpvckJsb2NrTW1jID0gMTc5OwogCi1Qcml2YXRlVm9sdW1lOjpQcml2YXRlVm9sdW1lKGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVJhdykgOgotICAgICAgICBWb2x1bWVCYXNlKFR5cGU6OmtQcml2YXRlKSwgbVJhd0RldmljZShkZXZpY2UpLCBtS2V5UmF3KGtleVJhdykgeworUHJpdmF0ZVZvbHVtZTo6UHJpdmF0ZVZvbHVtZShkZXZfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSYXcpCisgICAgOiBWb2x1bWVCYXNlKFR5cGU6OmtQcml2YXRlKSwgbVJhd0RldmljZShkZXZpY2UpLCBtS2V5UmF3KGtleVJhdykgewogICAgIHNldElkKFN0cmluZ1ByaW50ZigicHJpdmF0ZToldSwldSIsIG1ham9yKGRldmljZSksIG1pbm9yKGRldmljZSkpKTsKICAgICBtUmF3RGV2UGF0aCA9IFN0cmluZ1ByaW50ZigiL2Rldi9ibG9jay92b2xkLyVzIiwgZ2V0SWQoKS5jX3N0cigpKTsKIH0KIAotUHJpdmF0ZVZvbHVtZTo6flByaXZhdGVWb2x1bWUoKSB7Ci19CitQcml2YXRlVm9sdW1lOjp+UHJpdmF0ZVZvbHVtZSgpIHt9CiAKIHN0YXR1c190IFByaXZhdGVWb2x1bWU6OnJlYWRNZXRhZGF0YSgpIHsKICAgICBzdGF0dXNfdCByZXMgPSBSZWFkTWV0YWRhdGEobURtRGV2UGF0aCwgJm1Gc1R5cGUsICZtRnNVdWlkLCAmbUZzTGFiZWwpOwpAQCAtNjYsOSArNjUsOSBAQAogICAgICAgICByZXR1cm4gLUVJTzsKICAgICB9CiAgICAgaWYgKG1LZXlSYXcuc2l6ZSgpICE9IGNyeXB0ZnNfZ2V0X2tleXNpemUoKSkgewotICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIFJhdyBrZXlzaXplICIgPDwgbUtleVJhdy5zaXplKCkgPDwKLSAgICAgICAgICAiIGRvZXMgbm90IG1hdGNoIGNyeXB0IGtleXNpemUgIiA8PCBjcnlwdGZzX2dldF9rZXlzaXplKCk7Ci0gICAgICByZXR1cm4gLUVJTzsKKyAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIFJhdyBrZXlzaXplICIgPDwgbUtleVJhdy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBkb2VzIG5vdCBtYXRjaCBjcnlwdCBrZXlzaXplICIgPDwgY3J5cHRmc19nZXRfa2V5c2l6ZSgpOworICAgICAgICByZXR1cm4gLUVJTzsKICAgICB9CiAKICAgICAvLyBSZWNvdmVyIGZyb20gc3RhbGUgdm9sZCBieSB0ZWFyaW5nIGRvd24gYW55IG9sZCBtYXBwaW5ncwpAQCAtNzYsMTAgKzc1LDkgQEAKIAogICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgYmV0dGVyIFNFTGludXggbGFiZWxzIGZvciBwcml2YXRlIHZvbHVtZXMKIAotICAgIHVuc2lnbmVkIGNoYXIqIGtleSA9ICh1bnNpZ25lZCBjaGFyKikgbUtleVJhdy5kYXRhKCk7CisgICAgdW5zaWduZWQgY2hhcioga2V5ID0gKHVuc2lnbmVkIGNoYXIqKW1LZXlSYXcuZGF0YSgpOwogICAgIGNoYXIgY3J5cHRvX2Jsa2RldltNQVhQQVRITEVOXTsKLSAgICBpbnQgcmVzID0gY3J5cHRmc19zZXR1cF9leHRfdm9sdW1lKGdldElkKCkuY19zdHIoKSwgbVJhd0RldlBhdGguY19zdHIoKSwKLSAgICAgICAgICAgIGtleSwgY3J5cHRvX2Jsa2Rldik7CisgICAgaW50IHJlcyA9IGNyeXB0ZnNfc2V0dXBfZXh0X3ZvbHVtZShnZXRJZCgpLmNfc3RyKCksIG1SYXdEZXZQYXRoLmNfc3RyKCksIGtleSwgY3J5cHRvX2Jsa2Rldik7CiAgICAgbURtRGV2UGF0aCA9IGNyeXB0b19ibGtkZXY7CiAgICAgaWYgKHJlcyAhPSAwKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gc2V0dXAgY3J5cHRmcyI7CkBAIC0xNDcsMTIgKzE0NSwxMiBAQAogCiAgICAgLy8gVmVyaWZ5IHRoYXQgY29tbW9uIGRpcmVjdG9yaWVzIGFyZSByZWFkeSB0byByb2xsCiAgICAgaWYgKFByZXBhcmVEaXIobVBhdGggKyAiL2FwcCIsIDA3NzEsIEFJRF9TWVNURU0sIEFJRF9TWVNURU0pIHx8Ci0gICAgICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL3VzZXJfZGUiLCAwNzExLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSB8fAotICAgICAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbWVkaWEiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL21lZGlhLzAiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKLSAgICAgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL2xvY2FsIiwgMDc1MSwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbG9jYWwvdG1wIiwgMDc3MSwgQUlEX1NIRUxMLCBBSURfU0hFTEwpKSB7CisgICAgICAgIFByZXBhcmVEaXIobVBhdGggKyAiL3VzZXIiLCAwNzExLCBBSURfU1lTVEVNLCBBSURfU1lTVEVNKSB8fAorICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi91c2VyX2RlIiwgMDcxMSwgQUlEX1NZU1RFTSwgQUlEX1NZU1RFTSkgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbWVkaWEiLCAwNzcwLCBBSURfTUVESUFfUlcsIEFJRF9NRURJQV9SVykgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbWVkaWEvMCIsIDA3NzAsIEFJRF9NRURJQV9SVywgQUlEX01FRElBX1JXKSB8fAorICAgICAgICBQcmVwYXJlRGlyKG1QYXRoICsgIi9sb2NhbCIsIDA3NTEsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKKyAgICAgICAgUHJlcGFyZURpcihtUGF0aCArICIvbG9jYWwvdG1wIiwgMDc3MSwgQUlEX1NIRUxMLCBBSURfU0hFTEwpKSB7CiAgICAgICAgIFBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gcHJlcGFyZSI7CiAgICAgICAgIHJldHVybiAtRUlPOwogICAgIH0KQEAgLTE2MCw4ICsxNTgsNyBAQAogICAgIC8vIENyZWF0ZSBhIG5ldyBlbXVsYXRlZCB2b2x1bWUgc3RhY2tlZCBhYm92ZSB1cywgaXQgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgLy8gYmUgZGVzdHJveWVkIGR1cmluZyB1bm1vdW50CiAgICAgc3RkOjpzdHJpbmcgbWVkaWFQYXRoKG1QYXRoICsgIi9tZWRpYSIpOwotICAgIGF1dG8gdm9sID0gc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+KAotICAgICAgICAgICAgbmV3IEVtdWxhdGVkVm9sdW1lKG1lZGlhUGF0aCwgbVJhd0RldmljZSwgbUZzVXVpZCkpOworICAgIGF1dG8gdm9sID0gc3RkOjpzaGFyZWRfcHRyPFZvbHVtZUJhc2U+KG5ldyBFbXVsYXRlZFZvbHVtZShtZWRpYVBhdGgsIG1SYXdEZXZpY2UsIG1Gc1V1aWQpKTsKICAgICBhZGRWb2x1bWUodm9sKTsKICAgICB2b2wtPmNyZWF0ZSgpOwogCmRpZmYgLS1naXQgYS9tb2RlbC9Qcml2YXRlVm9sdW1lLmggYi9tb2RlbC9Qcml2YXRlVm9sdW1lLmgKaW5kZXggOWE2MWY4ZC4uY2I4ZTc1ZCAxMDA2NDQKLS0tIGEvbW9kZWwvUHJpdmF0ZVZvbHVtZS5oCisrKyBiL21vZGVsL1ByaXZhdGVWb2x1bWUuaApAQCAtMzYsMTQgKzM2LDE0IEBACiAgKiBrZXlzIGFyZSB0aWdodGx5IHRpZWQgdG8gdGhpcyBkZXZpY2UuCiAgKi8KIGNsYXNzIFByaXZhdGVWb2x1bWUgOiBwdWJsaWMgVm9sdW1lQmFzZSB7Ci1wdWJsaWM6CisgIHB1YmxpYzoKICAgICBQcml2YXRlVm9sdW1lKGRldl90IGRldmljZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVJhdyk7CiAgICAgdmlydHVhbCB+UHJpdmF0ZVZvbHVtZSgpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRGc1R5cGUoKSB7IHJldHVybiBtRnNUeXBlOyB9OwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRSYXdEZXZQYXRoKCkgeyByZXR1cm4gbVJhd0RldlBhdGg7IH07Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFJhd0RtRGV2UGF0aCgpIHsgcmV0dXJuIG1EbURldlBhdGg7IH07CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldEZzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1Gc1R5cGU7IH07CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldFJhd0RldlBhdGgoKSBjb25zdCB7IHJldHVybiBtUmF3RGV2UGF0aDsgfTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UmF3RG1EZXZQYXRoKCkgY29uc3QgeyByZXR1cm4gbURtRGV2UGF0aDsgfTsKIAotcHJvdGVjdGVkOgorICBwcm90ZWN0ZWQ6CiAgICAgc3RhdHVzX3QgZG9DcmVhdGUoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkb0Rlc3Ryb3koKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBkb01vdW50KCkgb3ZlcnJpZGU7CkBAIC01Miw3ICs1Miw3IEBACiAKICAgICBzdGF0dXNfdCByZWFkTWV0YWRhdGEoKTsKIAotcHJpdmF0ZToKKyAgcHJpdmF0ZToKICAgICAvKiBLZXJuZWwgZGV2aWNlIG9mIHJhdywgZW5jcnlwdGVkIHBhcnRpdGlvbiAqLwogICAgIGRldl90IG1SYXdEZXZpY2U7CiAgICAgLyogUGF0aCB0byByYXcsIGVuY3J5cHRlZCBibG9jayBkZXZpY2UgKi8KZGlmZiAtLWdpdCBhL21vZGVsL1B1YmxpY1ZvbHVtZS5jcHAgYi9tb2RlbC9QdWJsaWNWb2x1bWUuY3BwCmluZGV4IGZjN2U5NmYuLjhlZDQzNTYgMTAwNjQ0Ci0tLSBhL21vZGVsL1B1YmxpY1ZvbHVtZS5jcHAKKysrIGIvbW9kZWwvUHVibGljVm9sdW1lLmNwcApAQCAtMjAsOCArMjAsOCBAQAogI2luY2x1ZGUgImZzL0V4ZmF0LmgiCiAjaW5jbHVkZSAiZnMvVmZhdC5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGN1dGlscy9mcy5oPgogI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgpAQCAtMzAsOCArMzAsOCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN5cy9tb3VudC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N5c21hY3Jvcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAKIHVzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKQEAgLTQzLDE0ICs0MywxMiBAQAogCiBzdGF0aWMgY29uc3QgY2hhcioga0FzZWNQYXRoID0gIi9tbnQvc2VjdXJlL2FzZWMiOwogCi1QdWJsaWNWb2x1bWU6OlB1YmxpY1ZvbHVtZShkZXZfdCBkZXZpY2UpIDoKLSAgICAgICAgVm9sdW1lQmFzZShUeXBlOjprUHVibGljKSwgbURldmljZShkZXZpY2UpLCBtRnVzZVBpZCgwKSB7CitQdWJsaWNWb2x1bWU6OlB1YmxpY1ZvbHVtZShkZXZfdCBkZXZpY2UpIDogVm9sdW1lQmFzZShUeXBlOjprUHVibGljKSwgbURldmljZShkZXZpY2UpLCBtRnVzZVBpZCgwKSB7CiAgICAgc2V0SWQoU3RyaW5nUHJpbnRmKCJwdWJsaWM6JXUsJXUiLCBtYWpvcihkZXZpY2UpLCBtaW5vcihkZXZpY2UpKSk7CiAgICAgbURldlBhdGggPSBTdHJpbmdQcmludGYoIi9kZXYvYmxvY2svdm9sZC8lcyIsIGdldElkKCkuY19zdHIoKSk7CiB9CiAKLVB1YmxpY1ZvbHVtZTo6flB1YmxpY1ZvbHVtZSgpIHsKLX0KK1B1YmxpY1ZvbHVtZTo6flB1YmxpY1ZvbHVtZSgpIHt9CiAKIHN0YXR1c190IFB1YmxpY1ZvbHVtZTo6cmVhZE1ldGFkYXRhKCkgewogICAgIHN0YXR1c190IHJlcyA9IFJlYWRNZXRhZGF0YVVudHJ1c3RlZChtRGV2UGF0aCwgJm1Gc1R5cGUsICZtRnNVdWlkLCAmbUZzTGFiZWwpOwpAQCAtNjYsOCArNjQsNyBAQAogICAgIHN0ZDo6c3RyaW5nIHNlY3VyZVBhdGgobVJhd1BhdGggKyAiLy5hbmRyb2lkX3NlY3VyZSIpOwogCiAgICAgLy8gUmVjb3ZlciBsZWdhY3kgc2VjdXJlIHBhdGgKLSAgICBpZiAoIWFjY2VzcyhsZWdhY3lQYXRoLmNfc3RyKCksIFJfT0sgfCBYX09LKQotICAgICAgICAgICAgJiYgYWNjZXNzKHNlY3VyZVBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0spKSB7CisgICAgaWYgKCFhY2Nlc3MobGVnYWN5UGF0aC5jX3N0cigpLCBSX09LIHwgWF9PSykgJiYgYWNjZXNzKHNlY3VyZVBhdGguY19zdHIoKSwgUl9PSyB8IFhfT0spKSB7CiAgICAgICAgIGlmIChyZW5hbWUobGVnYWN5UGF0aC5jX3N0cigpLCBzZWN1cmVQYXRoLmNfc3RyKCkpKSB7CiAgICAgICAgICAgICBQTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gcmVuYW1lIGxlZ2FjeSBBU0VDIGRpciI7CiAgICAgICAgIH0KQEAgLTE1OCw4ICsxNTUsOCBAQAogICAgIH0KIAogICAgIGlmIChmc19wcmVwYXJlX2RpcihtRnVzZURlZmF1bHQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAotICAgICAgICAgICAgZnNfcHJlcGFyZV9kaXIobUZ1c2VSZWFkLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkgfHwKLSAgICAgICAgICAgIGZzX3ByZXBhcmVfZGlyKG1GdXNlV3JpdGUuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSkgeworICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVJlYWQuY19zdHIoKSwgMDcwMCwgQUlEX1JPT1QsIEFJRF9ST09UKSB8fAorICAgICAgICBmc19wcmVwYXJlX2RpcihtRnVzZVdyaXRlLmNfc3RyKCksIDA3MDAsIEFJRF9ST09ULCBBSURfUk9PVCkpIHsKICAgICAgICAgUExPRyhFUlJPUikgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byBjcmVhdGUgRlVTRSBtb3VudCBwb2ludHMiOwogICAgICAgICByZXR1cm4gLWVycm5vOwogICAgIH0KQEAgLTE2OCw2ICsxNjUsNyBAQAogCiAgICAgaWYgKCEobUZ1c2VQaWQgPSBmb3JrKCkpKSB7CiAgICAgICAgIGlmIChnZXRNb3VudEZsYWdzKCkgJiBNb3VudEZsYWdzOjprUHJpbWFyeSkgeworICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICAgICAgaWYgKGV4ZWNsKGtGdXNlUGF0aCwga0Z1c2VQYXRoLAogICAgICAgICAgICAgICAgICAgICAiLXUiLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwogICAgICAgICAgICAgICAgICAgICAiLWciLCAiMTAyMyIsIC8vIEFJRF9NRURJQV9SVwpAQCAtMTc2LDkgKzE3NCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBtUmF3UGF0aC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBzdGFibGVOYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBleGVjIjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvZmYKICAgICAgICAgICAgIGlmIChleGVjbChrRnVzZVBhdGgsIGtGdXNlUGF0aCwKICAgICAgICAgICAgICAgICAgICAgIi11IiwgIjEwMjMiLCAvLyBBSURfTUVESUFfUlcKICAgICAgICAgICAgICAgICAgICAgIi1nIiwgIjEwMjMiLCAvLyBBSURfTUVESUFfUlcKQEAgLTE4Niw2ICsxODYsNyBAQAogICAgICAgICAgICAgICAgICAgICBtUmF3UGF0aC5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICBzdGFibGVOYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBleGVjIjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjAxLDggKzIwMiw4IEBACiAKICAgICBuc2Vjc190IHN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgd2hpbGUgKGJlZm9yZSA9PSBHZXREZXZpY2UobUZ1c2VXcml0ZSkpIHsKLSAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJXYWl0aW5nIGZvciBGVVNFIHRvIHNwaW4gdXAuLi4iOwotICAgICAgICB1c2xlZXAoNTAwMDApOyAvLyA1MG1zCisgICAgICAgIExPRyhERUJVRykgPDwgIldhaXRpbmcgZm9yIEZVU0UgdG8gc3BpbiB1cC4uLiI7CisgICAgICAgIHVzbGVlcCg1MDAwMCk7ICAvLyA1MG1zCiAKICAgICAgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKICAgICAgICAgaWYgKG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhub3cgLSBzdGFydCkgPiA1MDAwKSB7CkBAIC0yMTEsOCArMjEyLDggQEAKICAgICAgICAgfQogICAgIH0KICAgICAvKiBzZGNhcmRmcyB3aWxsIGhhdmUgZXhpdGVkIGFscmVhZHkuIEZVU0Ugd2lsbCBzdGlsbCBiZSBydW5uaW5nICovCi0gICAgaWYgKFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKG1GdXNlUGlkLCBudWxscHRyLCBXTk9IQU5HKSkgPT0gbUZ1c2VQaWQpCi0gICAgICAgIG1GdXNlUGlkID0gMDsKKyAgICBURU1QX0ZBSUxVUkVfUkVUUlkod2FpdHBpZChtRnVzZVBpZCwgbnVsbHB0ciwgMCkpOworICAgIG1GdXNlUGlkID0gMDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTIzMSwxMiArMjMyLDYgQEAKICAgICBGb3JjZVVubW91bnQobUZ1c2VXcml0ZSk7CiAgICAgRm9yY2VVbm1vdW50KG1SYXdQYXRoKTsKIAotICAgIGlmIChtRnVzZVBpZCA+IDApIHsKLSAgICAgICAga2lsbChtRnVzZVBpZCwgU0lHVEVSTSk7Ci0gICAgICAgIFRFTVBfRkFJTFVSRV9SRVRSWSh3YWl0cGlkKG1GdXNlUGlkLCBudWxscHRyLCAwKSk7Ci0gICAgICAgIG1GdXNlUGlkID0gMDsKLSAgICB9Ci0KICAgICBybWRpcihtRnVzZURlZmF1bHQuY19zdHIoKSk7CiAgICAgcm1kaXIobUZ1c2VSZWFkLmNfc3RyKCkpOwogICAgIHJtZGlyKG1GdXNlV3JpdGUuY19zdHIoKSk7CkBAIC0yNTEsMjggKzI0Niw1MyBAQAogfQogCiBzdGF0dXNfdCBQdWJsaWNWb2x1bWU6OmRvRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1R5cGUpIHsKLSAgICBpZiAoKGZzVHlwZSA9PSAidmZhdCIgfHwgZnNUeXBlID09ICJhdXRvIikgJiYgdmZhdDo6SXNTdXBwb3J0ZWQoKSkgewotICAgICAgICBpZiAoV2lwZUJsb2NrRGV2aWNlKG1EZXZQYXRoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gd2lwZSI7CisgICAgYm9vbCB1c2VWZmF0ID0gdmZhdDo6SXNTdXBwb3J0ZWQoKTsKKyAgICBib29sIHVzZUV4ZmF0ID0gZXhmYXQ6OklzU3VwcG9ydGVkKCk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICAvLyBSZXNvbHZlIHRoZSB0YXJnZXQgZmlsZXN5c3RlbSB0eXBlCisgICAgaWYgKGZzVHlwZSA9PSAiYXV0byIgJiYgdXNlVmZhdCAmJiB1c2VFeGZhdCkgeworICAgICAgICB1aW50NjRfdCBzaXplID0gMDsKKworICAgICAgICByZXMgPSBHZXRCbG9ja0RldlNpemUobURldlBhdGgsICZzaXplKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGRuJ3QgZ2V0IGRldmljZSBzaXplICIgPDwgbURldlBhdGg7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGlmICh2ZmF0OjpGb3JtYXQobURldlBhdGgsIDApKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZm9ybWF0IjsKLSAgICAgICAgICAgIHJldHVybiAtZXJybm87CisKKyAgICAgICAgLy8gSWYgYm90aCB2ZmF0ICYgZXhmYXQgYXJlIHN1cHBvcnRlZCB1c2UgZXhmYXQgZm9yIFNEWEMgKD5+MzJHaUIpIGNhcmRzCisgICAgICAgIGlmIChzaXplID4gMzI4OTZMTCAqIDEwMjQgKiAxMDI0KSB7CisgICAgICAgICAgICB1c2VWZmF0ID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VFeGZhdCA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgoZnNUeXBlID09ICJleGZhdCIgfHwgZnNUeXBlID09ICJhdXRvIikgJiYgZXhmYXQ6OklzU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgaWYgKFdpcGVCbG9ja0RldmljZShtRGV2UGF0aCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIHdpcGUiOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleGZhdDo6Rm9ybWF0KG1EZXZQYXRoKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCBnZXRJZCgpIDw8ICIgZmFpbGVkIHRvIGZvcm1hdCI7Ci0gICAgICAgICAgICByZXR1cm4gLWVycm5vOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKGZzVHlwZSA9PSAidmZhdCIpIHsKKyAgICAgICAgdXNlRXhmYXQgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKGZzVHlwZSA9PSAiZXhmYXQiKSB7CisgICAgICAgIHVzZVZmYXQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIXVzZVZmYXQgJiYgIXVzZUV4ZmF0KSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIGZpbGVzeXN0ZW0gIiA8PCBmc1R5cGU7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICBpZiAoV2lwZUJsb2NrRGV2aWNlKG1EZXZQYXRoKSAhPSBPSykgeworICAgICAgICBMT0coV0FSTklORykgPDwgZ2V0SWQoKSA8PCAiIGZhaWxlZCB0byB3aXBlIjsKKyAgICB9CisKKyAgICBpZiAodXNlVmZhdCkgeworICAgICAgICByZXMgPSB2ZmF0OjpGb3JtYXQobURldlBhdGgsIDApOworICAgIH0gZWxzZSBpZiAodXNlRXhmYXQpIHsKKyAgICAgICAgcmVzID0gZXhmYXQ6OkZvcm1hdChtRGV2UGF0aCk7CisgICAgfQorCisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZm9ybWF0IjsKKyAgICAgICAgcmVzID0gLWVycm5vOworICAgIH0KKworICAgIHJldHVybiByZXM7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB2b2xkCmRpZmYgLS1naXQgYS9tb2RlbC9QdWJsaWNWb2x1bWUuaCBiL21vZGVsL1B1YmxpY1ZvbHVtZS5oCmluZGV4IDNhYTdhNzMuLmM5MThmNTIgMTAwNjQ0Ci0tLSBhL21vZGVsL1B1YmxpY1ZvbHVtZS5oCisrKyBiL21vZGVsL1B1YmxpY1ZvbHVtZS5oCkBAIC0zOCwxMSArMzgsMTEgQEAKICAqIGF3YXkgdGhlIEFuZHJvaWQgZGlyZWN0b3J5IGZvciBzZWNvbmRhcnkgdXNlcnMuCiAgKi8KIGNsYXNzIFB1YmxpY1ZvbHVtZSA6IHB1YmxpYyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIGV4cGxpY2l0IFB1YmxpY1ZvbHVtZShkZXZfdCBkZXZpY2UpOwogICAgIHZpcnR1YWwgflB1YmxpY1ZvbHVtZSgpOwogCi1wcm90ZWN0ZWQ6CisgIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBkb0NyZWF0ZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvRGVzdHJveSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGRvTW91bnQoKSBvdmVycmlkZTsKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBzdGF0dXNfdCByZWFkTWV0YWRhdGEoKTsKICAgICBzdGF0dXNfdCBpbml0QXNlY1N0YWdlKCk7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogS2VybmVsIGRldmljZSByZXByZXNlbnRpbmcgcGFydGl0aW9uICovCiAgICAgZGV2X3QgbURldmljZTsKICAgICAvKiBCbG9jayBkZXZpY2UgcGF0aCAqLwpkaWZmIC0tZ2l0IGEvbW9kZWwvU3R1YlZvbHVtZS5jcHAgYi9tb2RlbC9TdHViVm9sdW1lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGQwODYxCi0tLSAvZGV2L251bGwKKysrIGIvbW9kZWwvU3R1YlZvbHVtZS5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJTdHViVm9sdW1lLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2Ugdm9sZCB7CisKK1N0dWJWb2x1bWU6OlN0dWJWb2x1bWUoaW50IGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgc291cmNlUGF0aCwgY29uc3Qgc3RkOjpzdHJpbmcmIG1vdW50UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzTGFiZWwpCisgICAgOiBWb2x1bWVCYXNlKFR5cGU6OmtTdHViKSwKKyAgICAgIG1Tb3VyY2VQYXRoKHNvdXJjZVBhdGgpLAorICAgICAgbU1vdW50UGF0aChtb3VudFBhdGgpLAorICAgICAgbUZzVHlwZShmc1R5cGUpLAorICAgICAgbUZzVXVpZChmc1V1aWQpLAorICAgICAgbUZzTGFiZWwoZnNMYWJlbCkgeworICAgIHNldElkKFN0cmluZ1ByaW50Zigic3R1YjolZCIsIGlkKSk7Cit9CisKK1N0dWJWb2x1bWU6On5TdHViVm9sdW1lKCkge30KKworc3RhdHVzX3QgU3R1YlZvbHVtZTo6ZG9DcmVhdGUoKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHViVm9sdW1lOjpkb0Rlc3Ryb3koKSB7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHViVm9sdW1lOjpkb01vdW50KCkgeworICAgIGF1dG8gbGlzdGVuZXIgPSBnZXRMaXN0ZW5lcigpOworICAgIGlmIChsaXN0ZW5lcikgbGlzdGVuZXItPm9uVm9sdW1lTWV0YWRhdGFDaGFuZ2VkKGdldElkKCksIG1Gc1R5cGUsIG1Gc1V1aWQsIG1Gc0xhYmVsKTsKKyAgICBzZXRJbnRlcm5hbFBhdGgobVNvdXJjZVBhdGgpOworICAgIHNldFBhdGgobU1vdW50UGF0aCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHViVm9sdW1lOjpkb1VubW91bnQoKSB7CisgICAgcmV0dXJuIE9LOworfQorCisvLyBUT0RPOiByZXR1cm4gZXJyb3IgaW5zdGVhZC4KK3N0YXR1c190IFN0dWJWb2x1bWU6OmRvRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBmc1R5cGUpIHsKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB2b2xkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbW9kZWwvU3R1YlZvbHVtZS5oIGIvbW9kZWwvU3R1YlZvbHVtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGNhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9tb2RlbC9TdHViVm9sdW1lLmgKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9WT0xEX1NUVUJfVk9MVU1FX0gKKyNkZWZpbmUgQU5EUk9JRF9WT0xEX1NUVUJfVk9MVU1FX0gKKworI2luY2x1ZGUgIlZvbHVtZUJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIHZvbGQgeworCisvKgorICogQSB2b2xkIHJlcHJlc2VudGF0aW9uIG9mIHZvbHVtZXMgbWFuYWdlZCBmcm9tIG91dHNpZGUgQW5kcm9pZCAoZS5nLiwgQVJDKyspLgorICoKKyAqIFVzZWQgZm9yIHRoZSBjYXNlIHdoZW4gZXZlbnRzIHN1Y2ggdGhhdCBtb3VudGluZyBhbmQgdW5tb3VudGluZyBhcmUKKyAqIGFjdHVhbGx5IGhhbmRsZWQgZnJvbSBvdXRzaWRlIHZvbGQsIGFuZCB2b2xkIG9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9uIHRob3NlCisgKiB2ZW50cyBpbnN0ZWFkIG9mIHRhbGtpbmcgdG8ga2VybmVsIGRpcmVjdGx5LgorICovCitjbGFzcyBTdHViVm9sdW1lIDogcHVibGljIFZvbHVtZUJhc2UgeworICBwdWJsaWM6CisgICAgU3R1YlZvbHVtZShpbnQgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzb3VyY2VQYXRoLCBjb25zdCBzdGQ6OnN0cmluZyYgbW91bnRQYXRoLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzVXVpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGZzTGFiZWwpOworICAgIHZpcnR1YWwgflN0dWJWb2x1bWUoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgc3RhdHVzX3QgZG9DcmVhdGUoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkb0Rlc3Ryb3koKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkb01vdW50KCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZG9Vbm1vdW50KCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZG9Gb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIGZzVHlwZSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtU291cmNlUGF0aDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTW91bnRQYXRoOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Gc1R5cGU7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbUZzVXVpZDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtRnNMYWJlbDsKKworICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdHViVm9sdW1lKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB2b2xkCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL21vZGVsL1ZvbHVtZUJhc2UuY3BwIGIvbW9kZWwvVm9sdW1lQmFzZS5jcHAKaW5kZXggNDI5ZjEzNC4uYjA0ZGQ3MCAxMDA2NDQKLS0tIGEvbW9kZWwvVm9sdW1lQmFzZS5jcHAKKysrIGIvbW9kZWwvVm9sdW1lQmFzZS5jcHAKQEAgLTE0LDEyICsxNCwxMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sdW1lQmFzZS5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCiAjaW5jbHVkZSAiVm9sdW1lTWFuYWdlci5oIgogCi0jaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogCiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KQEAgLTMyLDEwICszMiwxMyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCi1Wb2x1bWVCYXNlOjpWb2x1bWVCYXNlKFR5cGUgdHlwZSkgOgotICAgICAgICBtVHlwZSh0eXBlKSwgbU1vdW50RmxhZ3MoMCksIG1Nb3VudFVzZXJJZCgtMSksIG1DcmVhdGVkKGZhbHNlKSwgbVN0YXRlKAotICAgICAgICAgICAgICAgIFN0YXRlOjprVW5tb3VudGVkKSwgbVNpbGVudChmYWxzZSkgewotfQorVm9sdW1lQmFzZTo6Vm9sdW1lQmFzZShUeXBlIHR5cGUpCisgICAgOiBtVHlwZSh0eXBlKSwKKyAgICAgIG1Nb3VudEZsYWdzKDApLAorICAgICAgbU1vdW50VXNlcklkKC0xKSwKKyAgICAgIG1DcmVhdGVkKGZhbHNlKSwKKyAgICAgIG1TdGF0ZShTdGF0ZTo6a1VubW91bnRlZCksCisgICAgICBtU2lsZW50KGZhbHNlKSB7fQogCiBWb2x1bWVCYXNlOjp+Vm9sdW1lQmFzZSgpIHsKICAgICBDSEVDSyghbUNyZWF0ZWQpOwpAQCAtNDUsNyArNDgsOSBAQAogICAgIG1TdGF0ZSA9IHN0YXRlOwogCiAgICAgYXV0byBsaXN0ZW5lciA9IGdldExpc3RlbmVyKCk7Ci0gICAgaWYgKGxpc3RlbmVyKSBsaXN0ZW5lci0+b25Wb2x1bWVTdGF0ZUNoYW5nZWQoZ2V0SWQoKSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN0YXRlKSk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZVN0YXRlQ2hhbmdlZChnZXRJZCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtU3RhdGUpKTsKKyAgICB9CiB9CiAKIHN0YXR1c190IFZvbHVtZUJhc2U6OnNldERpc2tJZChjb25zdCBzdGQ6OnN0cmluZyYgZGlza0lkKSB7CkBAIC0xMzEsMTIgKzEzNiwxNCBAQAogICAgIG1JbnRlcm5hbFBhdGggPSBpbnRlcm5hbFBhdGg7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgIGxpc3RlbmVyLT5vblZvbHVtZUludGVybmFsUGF0aENoYW5nZWQoZ2V0SWQoKSwgbUludGVybmFsUGF0aCk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1hbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gVm9sdW1lQmFzZTo6Z2V0TGlzdGVuZXIoKSB7CithbmRyb2lkOjpzcDxhbmRyb2lkOjpvczo6SVZvbGRMaXN0ZW5lcj4gVm9sdW1lQmFzZTo6Z2V0TGlzdGVuZXIoKSBjb25zdCB7CiAgICAgaWYgKG1TaWxlbnQpIHsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfSBlbHNlIHsKQEAgLTE2OCw4ICsxNzUsOSBAQAogICAgIHN0YXR1c190IHJlcyA9IGRvQ3JlYXRlKCk7CiAKICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZUNyZWF0ZWQoZ2V0SWQoKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KG1UeXBlKSwgbURpc2tJZCwgbVBhcnRHdWlkKTsKKyAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uVm9sdW1lQ3JlYXRlZChnZXRJZCgpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihtVHlwZSksIG1EaXNrSWQsIG1QYXJ0R3VpZCk7CisgICAgfQogCiAgICAgc2V0U3RhdGUoU3RhdGU6OmtVbm1vdW50ZWQpOwogICAgIHJldHVybiByZXM7CkBAIC0xODksOSArMTk3LDEwIEBACiAgICAgICAgIHNldFN0YXRlKFN0YXRlOjprUmVtb3ZlZCk7CiAgICAgfQogCi0KICAgICBhdXRvIGxpc3RlbmVyID0gZ2V0TGlzdGVuZXIoKTsKLSAgICBpZiAobGlzdGVuZXIpIGxpc3RlbmVyLT5vblZvbHVtZURlc3Ryb3llZChnZXRJZCgpKTsKKyAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgbGlzdGVuZXItPm9uVm9sdW1lRGVzdHJveWVkKGdldElkKCkpOworICAgIH0KIAogICAgIHN0YXR1c190IHJlcyA9IGRvRGVzdHJveSgpOwogICAgIG1DcmVhdGVkID0gZmFsc2U7CkBAIC0yMjgsOCArMjM3LDcgQEAKICAgICBzZXRTdGF0ZShTdGF0ZTo6a0VqZWN0aW5nKTsKICAgICBmb3IgKGNvbnN0IGF1dG8mIHZvbCA6IG1Wb2x1bWVzKSB7CiAgICAgICAgIGlmICh2b2wtPmRlc3Ryb3koKSkgewotICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZGVzdHJveSAiIDw8IHZvbC0+Z2V0SWQoKQotICAgICAgICAgICAgICAgICAgICA8PCAiIHN0YWNrZWQgYWJvdmUiOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8IGdldElkKCkgPDwgIiBmYWlsZWQgdG8gZGVzdHJveSAiIDw8IHZvbC0+Z2V0SWQoKSA8PCAiIHN0YWNrZWQgYWJvdmUiOwogICAgICAgICB9CiAgICAgfQogICAgIG1Wb2x1bWVzLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tb2RlbC9Wb2x1bWVCYXNlLmggYi9tb2RlbC9Wb2x1bWVCYXNlLmgKaW5kZXggNGFhOGIwMi4uMjg4MDJkNCAxMDA2NDQKLS0tIGEvbW9kZWwvVm9sdW1lQmFzZS5oCisrKyBiL21vZGVsL1ZvbHVtZUJhc2UuaApAQCAtMTcsOCArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX1ZPTERfVk9MVU1FX0JBU0VfSAogI2RlZmluZSBBTkRST0lEX1ZPTERfVk9MVU1FX0JBU0VfSAogCi0jaW5jbHVkZSAiYW5kcm9pZC9vcy9JVm9sZExpc3RlbmVyLmgiCiAjaW5jbHVkZSAiVXRpbHMuaCIKKyNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkTGlzdGVuZXIuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTQ1LDcgKzQ1LDcgQEAKICAqIHZvbHVtZXMgYW5kIHJlbW92ZXMgYW55IGJpbmQgbW91bnRzIGJlZm9yZSBmaW5hbGx5IHVubW91bnRpbmcgaXRzZWxmLgogICovCiBjbGFzcyBWb2x1bWVCYXNlIHsKLXB1YmxpYzoKKyAgcHVibGljOgogICAgIHZpcnR1YWwgflZvbHVtZUJhc2UoKTsKIAogICAgIGVudW0gY2xhc3MgVHlwZSB7CkBAIC01NCw2ICs1NCw3IEBACiAgICAgICAgIGtFbXVsYXRlZCwKICAgICAgICAga0FzZWMsCiAgICAgICAgIGtPYmIsCisgICAgICAgIGtTdHViLAogICAgIH07CiAKICAgICBlbnVtIE1vdW50RmxhZ3MgewpAQCAtNzUsMTUgKzc2LDE1IEBACiAgICAgICAgIGtCYWRSZW1vdmFsLAogICAgIH07CiAKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SWQoKSB7IHJldHVybiBtSWQ7IH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RGlza0lkKCkgeyByZXR1cm4gbURpc2tJZDsgfQotICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRQYXJ0R3VpZCgpIHsgcmV0dXJuIG1QYXJ0R3VpZDsgfQotICAgIFR5cGUgZ2V0VHlwZSgpIHsgcmV0dXJuIG1UeXBlOyB9Ci0gICAgaW50IGdldE1vdW50RmxhZ3MoKSB7IHJldHVybiBtTW91bnRGbGFnczsgfQotICAgIHVzZXJpZF90IGdldE1vdW50VXNlcklkKCkgeyByZXR1cm4gbU1vdW50VXNlcklkOyB9Ci0gICAgU3RhdGUgZ2V0U3RhdGUoKSB7IHJldHVybiBtU3RhdGU7IH0KLSAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UGF0aCgpIHsgcmV0dXJuIG1QYXRoOyB9Ci0gICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldEludGVybmFsUGF0aCgpIHsgcmV0dXJuIG1JbnRlcm5hbFBhdGg7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RGlza0lkKCkgY29uc3QgeyByZXR1cm4gbURpc2tJZDsgfQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRQYXJ0R3VpZCgpIGNvbnN0IHsgcmV0dXJuIG1QYXJ0R3VpZDsgfQorICAgIFR5cGUgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CisgICAgaW50IGdldE1vdW50RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtTW91bnRGbGFnczsgfQorICAgIHVzZXJpZF90IGdldE1vdW50VXNlcklkKCkgY29uc3QgeyByZXR1cm4gbU1vdW50VXNlcklkOyB9CisgICAgU3RhdGUgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBtU3RhdGU7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0UGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1QYXRoOyB9CisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGdldEludGVybmFsUGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRlcm5hbFBhdGg7IH0KIAogICAgIHN0YXR1c190IHNldERpc2tJZChjb25zdCBzdGQ6OnN0cmluZyYgZGlza0lkKTsKICAgICBzdGF0dXNfdCBzZXRQYXJ0R3VpZChjb25zdCBzdGQ6OnN0cmluZyYgcGFydEd1aWQpOwpAQCAtMTAyLDcgKzEwMyw3IEBACiAgICAgc3RhdHVzX3QgdW5tb3VudCgpOwogICAgIHN0YXR1c190IGZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgZnNUeXBlKTsKIAotcHJvdGVjdGVkOgorICBwcm90ZWN0ZWQ6CiAgICAgZXhwbGljaXQgVm9sdW1lQmFzZShUeXBlIHR5cGUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkb0NyZWF0ZSgpOwpAQCAtMTE1LDkgKzExNiw5IEBACiAgICAgc3RhdHVzX3Qgc2V0UGF0aChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiAgICAgc3RhdHVzX3Qgc2V0SW50ZXJuYWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcm5hbFBhdGgpOwogCi0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+IGdldExpc3RlbmVyKCk7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6b3M6OklWb2xkTGlzdGVuZXI+IGdldExpc3RlbmVyKCkgY29uc3Q7CiAKLXByaXZhdGU6CisgIHByaXZhdGU6CiAgICAgLyogSUQgdGhhdCB1bmlxdWVseSByZWZlcmVuY2VzIHZvbHVtZSB3aGlsZSBhbGl2ZSAqLwogICAgIHN0ZDo6c3RyaW5nIG1JZDsKICAgICAvKiBJRCB0aGF0IHVuaXF1ZWx5IHJlZmVyZW5jZXMgcGFyZW50IGRpc2sgd2hpbGUgYWxpdmUgKi8KZGlmZiAtLWdpdCBhL3NlY2Rpc2NhcmQuY3BwIGIvc2VjZGlzY2FyZC5jcHAKaW5kZXggZjk1MzJlYS4uMmQ5ZGMzNSAxMDA2NDQKLS0tIGEvc2VjZGlzY2FyZC5jcHAKKysrIGIvc2VjZGlzY2FyZC5jcHAKQEAgLTE4LDE1ICsxOCwxNSBAQAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvZmllbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZnMuaD4KKyNpbmNsdWRlIDxtbnRlbnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPGxpbnV4L2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvZmllbWFwLmg+Ci0jaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS91bmlxdWVfZmQuaD4KQEAgLTQyLDIyICs0Miw0NyBAQAogCiBjb25zdGV4cHIgdWludDMyX3QgbWF4X2V4dGVudHMgPSAzMjsKIAotYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyAmb3B0aW9ucyk7Ci12b2lkIHVzYWdlKGNvbnN0IGNoYXIgKnByb2duYW1lKTsKLWJvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKLWJvb2wgY2hlY2tfZmllbWFwKGNvbnN0IHN0cnVjdCBmaWVtYXAgJmZpZW1hcCwgY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpOworYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdLCBPcHRpb25zJiBvcHRpb25zKTsKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZ25hbWUpOworYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgpOworYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCYgZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CiBib29sIG92ZXJ3cml0ZV93aXRoX3plcm9zKGludCBmZCwgb2ZmNjRfdCBzdGFydCwgb2ZmNjRfdCBsZW5ndGgpOwogCi19Cit9ICAvLyBuYW1lc3BhY2UKIAotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiBjb25zdCBhcmd2W10pIHsKLSAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhjb25zdF9jYXN0PGNoYXIgKio+KGFyZ3YpKTsKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKKyAgICBhbmRyb2lkOjpiYXNlOjpJbml0TG9nZ2luZyhjb25zdF9jYXN0PGNoYXIqKj4oYXJndikpOwogICAgIE9wdGlvbnMgb3B0aW9uczsKICAgICBpZiAoIXJlYWRfY29tbWFuZF9saW5lKGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSB7CiAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIGZvciAoYXV0byBjb25zdCAmdGFyZ2V0OiBvcHRpb25zLnRhcmdldHMpIHsKKworICAgIGZvciAoYXV0byBjb25zdCYgdGFyZ2V0IDogb3B0aW9ucy50YXJnZXRzKSB7CisvLyBGMkZTLXNwZWNpZmljIGlvY3RsCisvLyBJdCByZXF1aXJlcyB0aGUgYmVsb3cga2VybmVsIGNvbW1pdCBtZXJnZWQgaW4gdjQuMTYtcmMxLgorLy8gICAxYWQ3MWEyNzEyNGMgKCJmMmZzOiBhZGQgYW4gaW9jdGwgdG8gZGlzYWJsZSBHQyBmb3Igc3BlY2lmaWMgZmlsZSIpCisvLyBJbiBhbmRyb2lkLTQuNCwKKy8vICAgNTZlZTFlODE3OTA4ICgiZjJmczogdXBkYXRlcyBvbiB2NC4xNi1yYzEiKQorLy8gSW4gYW5kcm9pZC00LjksCisvLyAgIDJmMTdlMzQ2NzJhOCAoImYyZnM6IHVwZGF0ZXMgb24gdjQuMTYtcmMxIikKKy8vIEluIGFuZHJvaWQtNC4xNCwKKy8vICAgY2U3NjdkOWE1NWJjICgiZjJmczogdXBkYXRlcyBvbiB2NC4xNi1yYzEiKQorI2lmbmRlZiBGMkZTX0lPQ19TRVRfUElOX0ZJTEUKKyNpZm5kZWYgRjJGU19JT0NUTF9NQUdJQworI2RlZmluZSBGMkZTX0lPQ1RMX01BR0lDIDB4ZjUKKyNlbmRpZgorI2RlZmluZSBGMkZTX0lPQ19TRVRfUElOX0ZJTEUgX0lPVyhGMkZTX0lPQ1RMX01BR0lDLCAxMywgX191MzIpCisjZGVmaW5lIEYyRlNfSU9DX0dFVF9QSU5fRklMRSBfSU9SKEYyRlNfSU9DVExfTUFHSUMsIDE0LCBfX3UzMikKKyNlbmRpZgorICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgZmQoVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4odGFyZ2V0LmNfc3RyKCksIE9fV1JPTkxZLCAwKSkpOworICAgICAgICBpZiAoZmQgPT0gLTEpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlNlY3VyZSBkaXNjYXJkIG9wZW4gZmFpbGVkIGZvcjogIiA8PCB0YXJnZXQ7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBfX3UzMiBzZXQgPSAxOworICAgICAgICBpb2N0bChmZCwgRjJGU19JT0NfU0VUX1BJTl9GSUxFLCAmc2V0KTsKKwogICAgICAgICBMT0coREVCVUcpIDw8ICJTZWN1cmVseSBkaXNjYXJkaW5nICciIDw8IHRhcmdldCA8PCAiJyB1bmxpbms9IiA8PCBvcHRpb25zLnVubGluazsKICAgICAgICAgaWYgKCFzZWNkaXNjYXJkX3BhdGgodGFyZ2V0KSkgewogICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2VjdXJlIGRpc2NhcmQgZmFpbGVkIGZvcjogIiA8PCB0YXJnZXQ7CkBAIC02Nyw2ICs5Miw4IEBACiAgICAgICAgICAgICAgICAgUExPRyhFUlJPUikgPDwgIlVuYWJsZSB0byB1bmxpbms6ICIgPDwgdGFyZ2V0OwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgICAgIHNldCA9IDA7CisgICAgICAgIGlvY3RsKGZkLCBGMkZTX0lPQ19TRVRfUElOX0ZJTEUsICZzZXQpOwogICAgICAgICBMT0coREVCVUcpIDw8ICJEaXNjYXJkZWQ6ICIgPDwgdGFyZ2V0OwogICAgIH0KICAgICByZXR1cm4gMDsKQEAgLTc0LDI5ICsxMDEsMjkgQEAKIAogbmFtZXNwYWNlIHsKIAotYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0IGFyZ3ZbXSwgT3B0aW9ucyAmb3B0aW9ucykgeworYm9vbCByZWFkX2NvbW1hbmRfbGluZShpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdLCBPcHRpb25zJiBvcHRpb25zKSB7CiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgaWYgKCFzdHJjbXAoIi0tbm8tdW5saW5rIiwgYXJndltpXSkpIHsKICAgICAgICAgICAgIG9wdGlvbnMudW5saW5rID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiLS0iLCBhcmd2W2ldKSkgewotICAgICAgICAgICAgZm9yIChpbnQgaiA9IGkrMTsgaiA8IGFyZ2M7IGorKykgewotICAgICAgICAgICAgICAgIGlmIChhcmd2W2pdWzBdICE9ICcvJykgcmV0dXJuIGZhbHNlOyAvLyBNdXN0IGJlIGFic29sdXRlIHBhdGgKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGFyZ2M7IGorKykgeworICAgICAgICAgICAgICAgIGlmIChhcmd2W2pdWzBdICE9ICcvJykgcmV0dXJuIGZhbHNlOyAgLy8gTXVzdCBiZSBhYnNvbHV0ZSBwYXRoCiAgICAgICAgICAgICAgICAgb3B0aW9ucy50YXJnZXRzLmVtcGxhY2VfYmFjayhhcmd2W2pdKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLnRhcmdldHMuc2l6ZSgpID4gMDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gVW5rbm93biBvcHRpb24KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIFVua25vd24gb3B0aW9uCiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOyAvLyAiLS0iIG5vdCBmb3VuZAorICAgIHJldHVybiBmYWxzZTsgIC8vICItLSIgbm90IGZvdW5kCiB9CiAKLXZvaWQgdXNhZ2UoY29uc3QgY2hhciAqcHJvZ25hbWUpIHsKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZ25hbWUpIHsKICAgICBmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBbLS1uby11bmxpbmtdIC0tIDxhYnNvbHV0ZSBwYXRoPiAuLi5cbiIsIHByb2duYW1lKTsKIH0KIAogLy8gQkxLU0VDRElTQ0FSRCBhbGwgY29udGVudCBpbiAicGF0aCIsIGlmIGl0J3Mgc21hbGwgZW5vdWdoLgotYm9vbCBzZWNkaXNjYXJkX3BhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKK2Jvb2wgc2VjZGlzY2FyZF9wYXRoKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoKSB7CiAgICAgYXV0byBmaWVtYXAgPSBhbmRyb2lkOjp2b2xkOjpQYXRoRmllbWFwKHBhdGgsIG1heF9leHRlbnRzKTsKICAgICBpZiAoIWZpZW1hcCB8fCAhY2hlY2tfZmllbWFwKCpmaWVtYXAsIHBhdGgpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEwNSw4ICsxMzIsOCBAQAogICAgIGlmIChibG9ja19kZXZpY2UuZW1wdHkoKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmc19mZChURU1QX0ZBSUxVUkVfUkVUUlkob3BlbigKLSAgICAgICAgYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRXUiB8IE9fTEFSR0VGSUxFIHwgT19DTE9FWEVDLCAwKSkpOworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmc19mZCgKKyAgICAgICAgVEVNUF9GQUlMVVJFX1JFVFJZKG9wZW4oYmxvY2tfZGV2aWNlLmNfc3RyKCksIE9fUkRXUiB8IE9fTEFSR0VGSUxFIHwgT19DTE9FWEVDLCAwKSkpOwogICAgIGlmIChmc19mZCA9PSAtMSkgewogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIG9wZW4gZGV2aWNlICIgPDwgYmxvY2tfZGV2aWNlOwogICAgICAgICByZXR1cm4gZmFsc2U7CkBAIC0xMjUsMTAgKzE1MiwxMCBAQAogfQogCiAvLyBFbnN1cmUgdGhhdCB0aGUgRklFTUFQIGNvdmVycyB0aGUgZmlsZSBhbmQgaXMgT0sgdG8gZGlzY2FyZAotYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCAmZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworYm9vbCBjaGVja19maWVtYXAoY29uc3Qgc3RydWN0IGZpZW1hcCYgZmllbWFwLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgewogICAgIGF1dG8gbWFwcGVkID0gZmllbWFwLmZtX21hcHBlZF9leHRlbnRzOwogICAgIGlmICghKGZpZW1hcC5mbV9leHRlbnRzW21hcHBlZCAtIDFdLmZlX2ZsYWdzICYgRklFTUFQX0VYVEVOVF9MQVNUKSkgewotICAgICAgICBMT0coRVJST1IpIDw8ICJFeHRlbnQgIiA8PCBtYXBwZWQgLTEgPDwgIiB3YXMgbm90IHRoZSBsYXN0IGluICIgPDwgcGF0aDsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiRXh0ZW50ICIgPDwgbWFwcGVkIC0gMSA8PCAiIHdhcyBub3QgdGhlIGxhc3QgaW4gIiA8PCBwYXRoOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtYXBwZWQ7IGkrKykgewpAQCAtMTYwLDQgKzE4Nyw0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc2Vjb250ZXh0LmNwcCBiL3NlY29udGV4dC5jcHAKaW5kZXggMDUyOWEzMC4uYmMyMWZjMiAxMDA2NDQKLS0tIGEvc2Vjb250ZXh0LmNwcAorKysgYi9zZWNvbnRleHQuY3BwCkBAIC0xMywxMCArMTMsOSBAQAogICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KLSNpbmNsdWRlIDxVdGlscy5oPgogI2luY2x1ZGUgInNlY29udGV4dC5oIgorI2luY2x1ZGUgPFV0aWxzLmg+CiAKLXNlY3VyaXR5X2NvbnRleHRfdCBzZWNvbnRleHRGc2NrKCkKLXsKK3NlY3VyaXR5X2NvbnRleHRfdCBzZWNvbnRleHRGc2NrKCkgewogICAgIHJldHVybiBhbmRyb2lkOjp2b2xkOjpzRnNja0NvbnRleHQ7CiB9CmRpZmYgLS1naXQgYS9zZWhhbmRsZS5oIGIvc2VoYW5kbGUuaAppbmRleCBmNTlkN2ViLi44OTIxZGI1IDEwMDY0NAotLS0gYS9zZWhhbmRsZS5oCisrKyBiL3NlaGFuZGxlLmgKQEAgLTE5LDYgKzE5LDYgQEAKIAogI2luY2x1ZGUgPHNlbGludXgvYW5kcm9pZC5oPgogCi1leHRlcm4gc3RydWN0IHNlbGFiZWxfaGFuZGxlICpzZWhhbmRsZTsKK2V4dGVybiBzdHJ1Y3Qgc2VsYWJlbF9oYW5kbGUqIHNlaGFuZGxlOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzL0NyeXB0ZnNTY3J5cHRIaWRsaXphdGlvbkVxdWl2YWxlbmNlX3Rlc3QuY3BwIGIvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKaW5kZXggMjkwNWFmMi4uNzIxNzBlMyAxMDA2NDQKLS0tIGEvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKKysrIGIvdGVzdHMvQ3J5cHRmc1NjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VfdGVzdC5jcHAKQEAgLTE4LDEzICsxOCwxMyBAQAogI2RlZmluZSBMT0dfVEFHICJzY3J5cHRfdGVzdCIKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPGhhcmR3YXJlL2tleW1hc3RlcjAuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9rZXltYXN0ZXIxLmg+CiAjaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiLi4vY3J5cHRmcy5oIgogI2luY2x1ZGUgIi4uL0tleW1hc3Rlci5oIgorI2luY2x1ZGUgIi4uL2NyeXB0ZnMuaCIKIAogI2lmZGVmIENPTkZJR19IV19ESVNLX0VOQ1JZUFRJT04KICNpbmNsdWRlICJjcnlwdGZzX2h3LmgiCkBAIC01MCw5ICs1MCw4IEBACiAjZGVmaW5lIFJTQV9FWFBPTkVOVCAweDEwMDAxCiAjZGVmaW5lIEtFWU1BU1RFUl9DUllQVEZTX1JBVEVfTElNSVQgMSAgLy8gTWF4aW11bSBvbmUgdHJ5IHBlciBzZWNvbmQKIAotc3RhdGljIGludCBrZXltYXN0ZXJfaW5pdChrZXltYXN0ZXIwX2RldmljZV90ICoqa2V5bWFzdGVyMF9kZXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKiprZXltYXN0ZXIxX2RldikKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2luaXQoa2V5bWFzdGVyMF9kZXZpY2VfdCoqIGtleW1hc3RlcjBfZGV2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBrZXltYXN0ZXIxX2RldmljZV90Kioga2V5bWFzdGVyMV9kZXYpIHsKICAgICBpbnQgcmM7CiAKICAgICBjb25zdCBod19tb2R1bGVfdCogbW9kOwpAQCAtNzYsOCArNzUsOCBAQAogICAgIH0KIAogICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiY291bGQgbm90IG9wZW4ga2V5bWFzdGVyIGRldmljZSBpbiAlcyAoJXMpIiwKLSAgICAgICAgICAgICAgS0VZU1RPUkVfSEFSRFdBUkVfTU9EVUxFX0lELCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBvcGVuIGtleW1hc3RlciBkZXZpY2UgaW4gJXMgKCVzKSIsIEtFWVNUT1JFX0hBUkRXQVJFX01PRFVMRV9JRCwKKyAgICAgICAgICAgICAgc3RyZXJyb3IoLXJjKSk7CiAgICAgICAgIGdvdG8gZXJyOwogICAgIH0KIApAQCAtOTAsMTAgKzg5LDkgQEAKIH0KIAogLyogU2hvdWxkIHdlIHVzZSBrZXltYXN0ZXI/ICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jaGVja19jb21wYXRpYmlsaXR5X29sZCgpCi17Ci0gICAga2V5bWFzdGVyMF9kZXZpY2VfdCAqa2V5bWFzdGVyMF9kZXYgPSAwOwotICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKmtleW1hc3RlcjFfZGV2ID0gMDsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfb2xkKCkgeworICAgIGtleW1hc3RlcjBfZGV2aWNlX3QqIGtleW1hc3RlcjBfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIxX2RldmljZV90KiBrZXltYXN0ZXIxX2RldiA9IDA7CiAgICAgaW50IHJjID0gMDsKIAogICAgIGlmIChrZXltYXN0ZXJfaW5pdCgma2V5bWFzdGVyMF9kZXYsICZrZXltYXN0ZXIxX2RldikpIHsKQEAgLTExNCw4ICsxMTIsNyBAQAogCiAgICAgLy8gVE9ETyhzd2lsbGRlbik6IENoZWNrIHRvIHNlZSBpZiB0aGVyZSdzIGFueSByZWFzb24gdG8gcmVxdWlyZSB2MC4zLiAgSSB0aGluayB2MC4xIGFuZCB2MC4yCiAgICAgLy8gc2hvdWxkIHdvcmsuCi0gICAgaWYgKGtleW1hc3RlcjBfZGV2LT5jb21tb24ubW9kdWxlLT5tb2R1bGVfYXBpX3ZlcnNpb24KLSAgICAgICAgICAgIDwgS0VZTUFTVEVSX01PRFVMRV9BUElfVkVSU0lPTl8wXzMpIHsKKyAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmNvbW1vbi5tb2R1bGUtPm1vZHVsZV9hcGlfdmVyc2lvbiA8IEtFWU1BU1RFUl9NT0RVTEVfQVBJX1ZFUlNJT05fMF8zKSB7CiAgICAgICAgIHJjID0gMDsKICAgICAgICAgZ290byBvdXQ7CiAgICAgfQpAQCAtMTM2LDExICsxMzMsMTAgQEAKIH0KIAogLyogQ3JlYXRlIGEgbmV3IGtleW1hc3RlciBrZXkgYW5kIHN0b3JlIGl0IGluIHRoaXMgZm9vdGVyICovCi1zdGF0aWMgaW50IGtleW1hc3Rlcl9jcmVhdGVfa2V5X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyKQoteworc3RhdGljIGludCBrZXltYXN0ZXJfY3JlYXRlX2tleV9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0cikgewogICAgIHVpbnQ4X3QqIGtleSA9IDA7Ci0gICAga2V5bWFzdGVyMF9kZXZpY2VfdCAqa2V5bWFzdGVyMF9kZXYgPSAwOwotICAgIGtleW1hc3RlcjFfZGV2aWNlX3QgKmtleW1hc3RlcjFfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIwX2RldmljZV90KiBrZXltYXN0ZXIwX2RldiA9IDA7CisgICAga2V5bWFzdGVyMV9kZXZpY2VfdCoga2V5bWFzdGVyMV9kZXYgPSAwOwogCiAgICAgaWYgKGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSkgewogICAgICAgICBTTE9HSSgiQWxyZWFkeSBoYXZlIGtleSIpOwpAQCAtMTc3LDExICsxNzMsMTAgQEAKICAgICAgICAgICAgIC8qIFJhdGUtbGltaXQga2V5IHVzYWdlIGF0dGVtcHRzLCB0byByYXRlLWxpbWl0IGJydXRlIGZvcmNlICovCiAgICAgICAgICAgICBrZXltYXN0ZXJfcGFyYW1faW50KEtNX1RBR19NSU5fU0VDT05EU19CRVRXRUVOX09QUywgS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCksCiAgICAgICAgIH07Ci0gICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0geyBwYXJhbXMsIHNpemVvZihwYXJhbXMpL3NpemVvZigqcGFyYW1zKSB9OworICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHtwYXJhbXMsIHNpemVvZihwYXJhbXMpIC8gc2l6ZW9mKCpwYXJhbXMpfTsKICAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5X2Jsb2I7Ci0gICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmdlbmVyYXRlX2tleShrZXltYXN0ZXIxX2RldiwgJnBhcmFtX3NldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZrZXlfYmxvYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogY2hhcmFjdGVyaXN0aWNzICovKTsKKyAgICAgICAga2V5bWFzdGVyX2Vycm9yX3QgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+Z2VuZXJhdGVfa2V5KAorICAgICAgICAgICAga2V5bWFzdGVyMV9kZXYsICZwYXJhbV9zZXQsICZrZXlfYmxvYiwgTlVMTCAvKiBjaGFyYWN0ZXJpc3RpY3MgKi8pOwogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJGYWlsZWQgdG8gZ2VuZXJhdGUga2V5bWFzdGVyMSBrZXksIGVycm9yICVkIiwgZXJyb3IpOwogICAgICAgICAgICAgcmMgPSAtMTsKQEAgLTE5MCwxNSArMTg1LDEzIEBACiAKICAgICAgICAga2V5ID0gKHVpbnQ4X3QqKWtleV9ibG9iLmtleV9tYXRlcmlhbDsKICAgICAgICAga2V5X3NpemUgPSBrZXlfYmxvYi5rZXlfbWF0ZXJpYWxfc2l6ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoa2V5bWFzdGVyMF9kZXYpIHsKKyAgICB9IGVsc2UgaWYgKGtleW1hc3RlcjBfZGV2KSB7CiAgICAgICAgIGtleW1hc3Rlcl9yc2Ffa2V5Z2VuX3BhcmFtc190IHBhcmFtczsKICAgICAgICAgbWVtc2V0KCZwYXJhbXMsICdcMCcsIHNpemVvZihwYXJhbXMpKTsKICAgICAgICAgcGFyYW1zLnB1YmxpY19leHBvbmVudCA9IFJTQV9FWFBPTkVOVDsKICAgICAgICAgcGFyYW1zLm1vZHVsdXNfc2l6ZSA9IFJTQV9LRVlfU0laRTsKIAotICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmdlbmVyYXRlX2tleXBhaXIoa2V5bWFzdGVyMF9kZXYsIFRZUEVfUlNBLCAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtleSwgJmtleV9zaXplKSkgeworICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYtPmdlbmVyYXRlX2tleXBhaXIoa2V5bWFzdGVyMF9kZXYsIFRZUEVfUlNBLCAmcGFyYW1zLCAma2V5LCAma2V5X3NpemUpKSB7CiAgICAgICAgICAgICBTTE9HRSgiRmFpbGVkIHRvIGdlbmVyYXRlIGtleXBhaXIiKTsKICAgICAgICAgICAgIHJjID0gLTE7CiAgICAgICAgICAgICBnb3RvIG91dDsKQEAgLTIxOSwyNCArMjEyLDE5IEBACiAgICAgZnRyLT5rZXltYXN0ZXJfYmxvYl9zaXplID0ga2V5X3NpemU7CiAKIG91dDoKLSAgICBpZiAoa2V5bWFzdGVyMF9kZXYpCi0gICAgICAgIGtleW1hc3RlcjBfY2xvc2Uoa2V5bWFzdGVyMF9kZXYpOwotICAgIGlmIChrZXltYXN0ZXIxX2RldikKLSAgICAgICAga2V5bWFzdGVyMV9jbG9zZShrZXltYXN0ZXIxX2Rldik7CisgICAgaWYgKGtleW1hc3RlcjBfZGV2KSBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKKyAgICBpZiAoa2V5bWFzdGVyMV9kZXYpIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOwogICAgIGZyZWUoa2V5KTsKICAgICByZXR1cm4gcmM7CiB9CiAKIC8qIFRoaXMgc2lnbnMgdGhlIGdpdmVuIG9iamVjdCB1c2luZyB0aGUga2V5bWFzdGVyIGtleS4gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X29sZChzdHJ1Y3QgY3J5cHRfbW50X2Z0ciAqZnRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciAqKnNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqc2lnbmF0dXJlX3NpemUpCi17CitzdGF0aWMgaW50IGtleW1hc3Rlcl9zaWduX29iamVjdF9vbGQoc3RydWN0IGNyeXB0X21udF9mdHIqIGZ0ciwgY29uc3QgdW5zaWduZWQgY2hhciogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBvYmplY3Rfc2l6ZSwgdW5zaWduZWQgY2hhcioqIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIHNpZ25hdHVyZV9zaXplKSB7CiAgICAgaW50IHJjID0gMDsKLSAgICBrZXltYXN0ZXIwX2RldmljZV90ICprZXltYXN0ZXIwX2RldiA9IDA7Ci0gICAga2V5bWFzdGVyMV9kZXZpY2VfdCAqa2V5bWFzdGVyMV9kZXYgPSAwOworICAgIGtleW1hc3RlcjBfZGV2aWNlX3QqIGtleW1hc3RlcjBfZGV2ID0gMDsKKyAgICBrZXltYXN0ZXIxX2RldmljZV90KiBrZXltYXN0ZXIxX2RldiA9IDA7CiAKICAgICB1bnNpZ25lZCBjaGFyIHRvX3NpZ25bUlNBX0tFWV9TSVpFX0JZVEVTXTsKICAgICBzaXplX3QgdG9fc2lnbl9zaXplID0gc2l6ZW9mKHRvX3NpZ24pOwpAQCAtMjg0LDMyICsyNzIsMjUgQEAKICAgICAgICAgcGFyYW1zLmRpZ2VzdF90eXBlID0gRElHRVNUX05PTkU7CiAgICAgICAgIHBhcmFtcy5wYWRkaW5nX3R5cGUgPSBQQURESU5HX05PTkU7CiAKLSAgICAgICAgcmMgPSBrZXltYXN0ZXIwX2Rldi0+c2lnbl9kYXRhKGtleW1hc3RlcjBfZGV2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHItPmtleW1hc3Rlcl9ibG9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3NpZ24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX3NpZ25fc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfc2l6ZSk7CisgICAgICAgIHJjID0ga2V5bWFzdGVyMF9kZXYtPnNpZ25fZGF0YShrZXltYXN0ZXIwX2RldiwgJnBhcmFtcywgZnRyLT5rZXltYXN0ZXJfYmxvYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZSwgdG9fc2lnbiwgdG9fc2lnbl9zaXplLCBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVfc2l6ZSk7CiAgICAgICAgIGdvdG8gb3V0OwogICAgIH0gZWxzZSBpZiAoa2V5bWFzdGVyMV9kZXYpIHsKLSAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5ID0geyBmdHItPmtleW1hc3Rlcl9ibG9iLCBmdHItPmtleW1hc3Rlcl9ibG9iX3NpemUgfTsKKyAgICAgICAga2V5bWFzdGVyX2tleV9ibG9iX3Qga2V5ID0ge2Z0ci0+a2V5bWFzdGVyX2Jsb2IsIGZ0ci0+a2V5bWFzdGVyX2Jsb2Jfc2l6ZX07CiAgICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fdCBwYXJhbXNbXSA9IHsKICAgICAgICAgICAgIGtleW1hc3Rlcl9wYXJhbV9lbnVtKEtNX1RBR19QQURESU5HLCBLTV9QQURfTk9ORSksCiAgICAgICAgICAgICBrZXltYXN0ZXJfcGFyYW1fZW51bShLTV9UQUdfRElHRVNULCBLTV9ESUdFU1RfTk9ORSksCiAgICAgICAgIH07Ci0gICAgICAgIGtleW1hc3Rlcl9rZXlfcGFyYW1fc2V0X3QgcGFyYW1fc2V0ID0geyBwYXJhbXMsIHNpemVvZihwYXJhbXMpL3NpemVvZigqcGFyYW1zKSB9OworICAgICAgICBrZXltYXN0ZXJfa2V5X3BhcmFtX3NldF90IHBhcmFtX3NldCA9IHtwYXJhbXMsIHNpemVvZihwYXJhbXMpIC8gc2l6ZW9mKCpwYXJhbXMpfTsKICAgICAgICAga2V5bWFzdGVyX29wZXJhdGlvbl9oYW5kbGVfdCBvcF9oYW5kbGU7Ci0gICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKGtleW1hc3RlcjFfZGV2LCBLTV9QVVJQT1NFX1NJR04sICZrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbV9zZXQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2hhbmRsZSk7CisgICAgICAgIGtleW1hc3Rlcl9lcnJvcl90IGVycm9yID0ga2V5bWFzdGVyMV9kZXYtPmJlZ2luKAorICAgICAgICAgICAga2V5bWFzdGVyMV9kZXYsIEtNX1BVUlBPU0VfU0lHTiwgJmtleSwgJnBhcmFtX3NldCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmb3BfaGFuZGxlKTsKICAgICAgICAgaWYgKGVycm9yID09IEtNX0VSUk9SX0tFWV9SQVRFX0xJTUlUX0VYQ0VFREVEKSB7CiAgICAgICAgICAgICAvLyBLZXkgdXNhZ2UgaGFzIGJlZW4gcmF0ZS1saW1pdGVkLiAgV2FpdCBhIGJpdCBhbmQgdHJ5IGFnYWluLgogICAgICAgICAgICAgc2xlZXAoS0VZTUFTVEVSX0NSWVBURlNfUkFURV9MSU1JVCk7Ci0gICAgICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbihrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtX3NldCwgTlVMTCAvKiBvdXRfcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2hhbmRsZSk7CisgICAgICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5iZWdpbihrZXltYXN0ZXIxX2RldiwgS01fUFVSUE9TRV9TSUdOLCAma2V5LCAmcGFyYW1fc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmb3BfaGFuZGxlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBzdGFydGluZyBrZXltYXN0ZXIgc2lnbmF0dXJlIHRyYW5zYWN0aW9uOiAlZCIsIGVycm9yKTsKQEAgLTMxNywxMSArMjk4LDEwIEBACiAgICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICAgfQogCi0gICAgICAgIGtleW1hc3Rlcl9ibG9iX3QgaW5wdXQgPSB7IHRvX3NpZ24sIHRvX3NpZ25fc2l6ZSB9OworICAgICAgICBrZXltYXN0ZXJfYmxvYl90IGlucHV0ID0ge3RvX3NpZ24sIHRvX3NpZ25fc2l6ZX07CiAgICAgICAgIHNpemVfdCBpbnB1dF9jb25zdW1lZDsKLSAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+dXBkYXRlKGtleW1hc3RlcjFfZGV2LCBvcF9oYW5kbGUsIE5VTEwgLyogaW5fcGFyYW1zICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LCAmaW5wdXRfY29uc3VtZWQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogb3V0cHV0ICovKTsKKyAgICAgICAgZXJyb3IgPSBrZXltYXN0ZXIxX2Rldi0+dXBkYXRlKGtleW1hc3RlcjFfZGV2LCBvcF9oYW5kbGUsIE5VTEwgLyogaW5fcGFyYW1zICovLCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRfY29uc3VtZWQsIE5VTEwgLyogb3V0X3BhcmFtcyAqLywgTlVMTCAvKiBvdXRwdXQgKi8pOwogICAgICAgICBpZiAoZXJyb3IgIT0gS01fRVJST1JfT0spIHsKICAgICAgICAgICAgIFNMT0dFKCJFcnJvciBzZW5kaW5nIGRhdGEgdG8ga2V5bWFzdGVyIHNpZ25hdHVyZSB0cmFuc2FjdGlvbjogJWQiLCBlcnJvcik7CiAgICAgICAgICAgICByYyA9IC0xOwpAQCAtMzM3LDggKzMxNyw3IEBACiAKICAgICAgICAga2V5bWFzdGVyX2Jsb2JfdCB0bXBfc2lnOwogICAgICAgICBlcnJvciA9IGtleW1hc3RlcjFfZGV2LT5maW5pc2goa2V5bWFzdGVyMV9kZXYsIG9wX2hhbmRsZSwgTlVMTCAvKiBpbl9wYXJhbXMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIHZlcmlmeSBzaWduYXR1cmUgKi8sIE5VTEwgLyogb3V0X3BhcmFtcyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0bXBfc2lnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogdmVyaWZ5IHNpZ25hdHVyZSAqLywgTlVMTCAvKiBvdXRfcGFyYW1zICovLCAmdG1wX3NpZyk7CiAgICAgICAgIGlmIChlcnJvciAhPSBLTV9FUlJPUl9PSykgewogICAgICAgICAgICAgU0xPR0UoIkVycm9yIGZpbmlzaGluZyBrZXltYXN0ZXIgc2lnbmF0dXJlIHRyYW5zYWN0aW9uOiAlZCIsIGVycm9yKTsKICAgICAgICAgICAgIHJjID0gLTE7CkBAIC0zNTMsMTkgKzMzMiwxNSBAQAogICAgICAgICBnb3RvIG91dDsKICAgICB9CiAKLSAgICBvdXQ6Ci0gICAgICAgIGlmIChrZXltYXN0ZXIxX2RldikKLSAgICAgICAgICAgIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOwotICAgICAgICBpZiAoa2V5bWFzdGVyMF9kZXYpCi0gICAgICAgICAgICBrZXltYXN0ZXIwX2Nsb3NlKGtleW1hc3RlcjBfZGV2KTsKK291dDoKKyAgICBpZiAoa2V5bWFzdGVyMV9kZXYpIGtleW1hc3RlcjFfY2xvc2Uoa2V5bWFzdGVyMV9kZXYpOworICAgIGlmIChrZXltYXN0ZXIwX2Rldikga2V5bWFzdGVyMF9jbG9zZShrZXltYXN0ZXIwX2Rldik7CiAKLSAgICAgICAgcmV0dXJuIHJjOworICAgIHJldHVybiByYzsKIH0KIAotCiAvKiBTaG91bGQgd2UgdXNlIGtleW1hc3Rlcj8gKi8KLXN0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfbmV3KCkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX2NoZWNrX2NvbXBhdGliaWxpdHlfbmV3KCkgewogICAgIHJldHVybiBrZXltYXN0ZXJfY29tcGF0aWJpbGl0eV9jcnlwdGZzX3NjcnlwdCgpOwogfQogCkBAIC0zOTQsMTIgKzM2OSw5IEBACiAjZW5kaWYKIAogLyogVGhpcyBzaWducyB0aGUgZ2l2ZW4gb2JqZWN0IHVzaW5nIHRoZSBrZXltYXN0ZXIga2V5LiAqLwotc3RhdGljIGludCBrZXltYXN0ZXJfc2lnbl9vYmplY3RfbmV3KHN0cnVjdCBjcnlwdF9tbnRfZnRyICpmdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyICoqc2lnbmF0dXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzaWduYXR1cmVfc2l6ZSkKLXsKK3N0YXRpYyBpbnQga2V5bWFzdGVyX3NpZ25fb2JqZWN0X25ldyhzdHJ1Y3QgY3J5cHRfbW50X2Z0ciogZnRyLCBjb25zdCB1bnNpZ25lZCBjaGFyKiBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG9iamVjdF9zaXplLCB1bnNpZ25lZCBjaGFyKiogc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCogc2lnbmF0dXJlX3NpemUpIHsKICAgICB1bnNpZ25lZCBjaGFyIHRvX3NpZ25bUlNBX0tFWV9TSVpFX0JZVEVTXTsKICAgICBzaXplX3QgdG9fc2lnbl9zaXplID0gc2l6ZW9mKHRvX3NpZ24pOwogICAgIG1lbXNldCh0b19zaWduLCAwLCBSU0FfS0VZX1NJWkVfQllURVMpOwpAQCAtNDQzLDEyICs0MTUsMTAgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgQ3J5cHRGc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIH0KKyAgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHt9CiAKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgfQorICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHt9CiB9OwogCiBURVNUX0YoQ3J5cHRGc1Rlc3QsIFNjcnlwdEhpZGxpemF0aW9uRXF1aXZhbGVuY2VUZXN0KSB7CkBAIC00NTgsOCArNDI4LDggQEAKIAogICAgIEFTU0VSVF9FUSgwLCBrZXltYXN0ZXJfY3JlYXRlX2tleV9vbGQoJmZ0cikpOwogCi0gICAgdWludDhfdCAqc2lnMSA9IG51bGxwdHI7Ci0gICAgdWludDhfdCAqc2lnMiA9IG51bGxwdHI7CisgICAgdWludDhfdCogc2lnMSA9IG51bGxwdHI7CisgICAgdWludDhfdCogc2lnMiA9IG51bGxwdHI7CiAgICAgc2l6ZV90IHNpZ19zaXplMSA9IDEyMzQ1Njc4OTsKICAgICBzaXplX3Qgc2lnX3NpemUyID0gMTIzNDU2Nzg5OwogICAgIHVpbnQ4X3Qgb2JqZWN0W10gPSAidGhlIG9iamVjdCI7CkBAIC00NzcsNCArNDQ3LDQgQEAKICAgICBmcmVlKHNpZzIpOwogfQogCi19Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvdGVzdHMvVXRpbHNfdGVzdC5jcHAgYi90ZXN0cy9VdGlsc190ZXN0LmNwcAppbmRleCBhYjk4MDllLi5lMTZjYmFjIDEwMDY0NAotLS0gYS90ZXN0cy9VdGlsc190ZXN0LmNwcAorKysgYi90ZXN0cy9VdGlsc190ZXN0LmNwcApAQCAtMjEsOCArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIHZvbGQgewogCi1jbGFzcyBVdGlsc1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci19OworY2xhc3MgVXRpbHNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3Qge307CiAKIFRFU1RfRihVdGlsc1Rlc3QsIEZpbmRWYWx1ZVRlc3QpIHsKICAgICBzdGQ6OnN0cmluZyB0bXA7CkBAIC00MCw1ICszOSw1IEBACiAgICAgQVNTRVJUX0VRKCJCQVoiLCB0bXApOwogfQogCi19Ci19Cit9ICAvLyBuYW1lc3BhY2Ugdm9sZAorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAgYi90ZXN0cy9jcnlwdGZzX3Rlc3QuY3BwCmluZGV4IDY4NzVjMGYuLjIwOTM3NjggMTAwNjQ0Ci0tLSBhL3Rlc3RzL2NyeXB0ZnNfdGVzdC5jcHAKKysrIGIvdGVzdHMvY3J5cHRmc190ZXN0LmNwcApAQCAtMjEsMTIgKzIxLDEwIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIENyeXB0ZnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB9CisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7fQogfTsKIAogVEVTVF9GKENyeXB0ZnNUZXN0LCBNYXRjaE11bHRpRW50cnlUZXN0KSB7CkBAIC01MSw0ICs0OSw0IEBACiAgICAgQVNTRVJUX0VRKDAsIG1hdGNoX211bHRpX2VudHJ5KCJmb29fMiIsICJiYXIiLCAwKSk7CiB9CiAKLX0KK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS92ZGMuY3BwIGIvdmRjLmNwcAppbmRleCAzYzQ0OWFlLi5lOTcxZDUyIDEwMDY0NAotLS0gYS92ZGMuY3BwCisrKyBiL3ZkYy5jcHAKQEAgLTE0LDE1ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c2lnbmFsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC0zMiwxMyArMzEsMTQgQEAKICNpbmNsdWRlICJhbmRyb2lkL29zL0lWb2xkLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1N0YXR1cy5oPgogCiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKLXN0YXRpYyB2b2lkIHVzYWdlKGNoYXIgKnByb2duYW1lKTsKK3N0YXRpYyB2b2lkIHVzYWdlKGNoYXIqIHByb2duYW1lKTsKIAogc3RhdGljIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklCaW5kZXI+IGdldFNlcnZpY2VBZ2dyZXNzaXZlKCkgewogICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OklCaW5kZXI+IHJlczsKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiV2FpdGVkICIgPDwgKGkgKiAxMCkgPDwgIm1zIGZvciB2b2xkIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIHVzbGVlcCgxMDAwMCk7IC8vIDEwbXMKKyAgICAgICAgdXNsZWVwKDEwMDAwKTsgIC8vIDEwbXMKICAgICB9CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTEwNSw2ICsxMDUsMjggQEAKICAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+bW91bnRGc3RhYihhcmdzWzJdKSk7CiAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjcnlwdGZzIiAmJiBhcmdzWzFdID09ICJlbmNyeXB0RnN0YWIiICYmIGFyZ3Muc2l6ZSgpID09IDMpIHsKICAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+ZW5jcnlwdEZzdGFiKGFyZ3NbMl0pKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gInN0YXJ0Q2hlY2twb2ludCIgJiYgYXJncy5zaXplKCkgPT0gMykgeworICAgICAgICBpbnQgcmV0cnk7CisgICAgICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VJbnQoYXJnc1syXSwgJnJldHJ5KSkgZXhpdChFSU5WQUwpOworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5zdGFydENoZWNrcG9pbnQocmV0cnkpKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gIm5lZWRzQ2hlY2twb2ludCIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+bmVlZHNDaGVja3BvaW50KCZlbmFibGVkKSk7CisgICAgICAgIHJldHVybiBlbmFibGVkID8gMSA6IDA7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJuZWVkc1JvbGxiYWNrIiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5uZWVkc1JvbGxiYWNrKCZlbmFibGVkKSk7CisgICAgICAgIHJldHVybiBlbmFibGVkID8gMSA6IDA7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJjb21taXRDaGFuZ2VzIiAmJiBhcmdzLnNpemUoKSA9PSAyKSB7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPmNvbW1pdENoYW5nZXMoKSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJwcmVwYXJlQ2hlY2twb2ludCIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5wcmVwYXJlQ2hlY2twb2ludCgpKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gInJlc3RvcmVDaGVja3BvaW50IiAmJiBhcmdzLnNpemUoKSA9PSAzKSB7CisgICAgICAgIGNoZWNrU3RhdHVzKHZvbGQtPnJlc3RvcmVDaGVja3BvaW50KGFyZ3NbMl0pKTsKKyAgICB9IGVsc2UgaWYgKGFyZ3NbMF0gPT0gImNoZWNrcG9pbnQiICYmIGFyZ3NbMV0gPT0gIm1hcmtCb290QXR0ZW1wdCIgJiYgYXJncy5zaXplKCkgPT0gMikgeworICAgICAgICBjaGVja1N0YXR1cyh2b2xkLT5tYXJrQm9vdEF0dGVtcHQoKSk7CisgICAgfSBlbHNlIGlmIChhcmdzWzBdID09ICJjaGVja3BvaW50IiAmJiBhcmdzWzFdID09ICJhYm9ydENoYW5nZXMiICYmIGFyZ3Muc2l6ZSgpID09IDIpIHsKKyAgICAgICAgY2hlY2tTdGF0dXModm9sZC0+YWJvcnRDaGFuZ2VzKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIExPRyhFUlJPUikgPDwgIlJhdyBjb21tYW5kcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCI7CiAgICAgICAgIGV4aXQoRUlOVkFMKTsKQEAgLTExMiw2ICsxMzQsNiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCB1c2FnZShjaGFyICpwcm9nbmFtZSkgeworc3RhdGljIHZvaWQgdXNhZ2UoY2hhciogcHJvZ25hbWUpIHsKICAgICBMT0coSU5GTykgPDwgIlVzYWdlOiAiIDw8IHByb2duYW1lIDw8ICIgWy0td2FpdF0gPHN5c3RlbT4gPHN1YmNvbW1hbmQ+IFthcmdzLi4uXSI7CiB9CmRpZmYgLS1naXQgYS92b2xkLnJjIGIvdm9sZC5yYwppbmRleCA3ZDE0NDUzLi45M2Q4Nzg2IDEwMDY0NAotLS0gYS92b2xkLnJjCisrKyBiL3ZvbGQucmMKQEAgLTUsNCArNSw0IEBACiAgICAgaW9wcmlvIGJlIDIKICAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCiAgICAgc2h1dGRvd24gY3JpdGljYWwKLSAgICBncm91cCByZXNlcnZlZF9kaXNrCisgICAgZ3JvdXAgcm9vdCByZXNlcnZlZF9kaXNrCmRpZmYgLS1naXQgYS92b2xkX3ByZXBhcmVfc3ViZGlycy5jcHAgYi92b2xkX3ByZXBhcmVfc3ViZGlycy5jcHAKaW5kZXggMWI0NjZlOS4uOGMzZGYzMCAxMDA2NDQKLS0tIGEvdm9sZF9wcmVwYXJlX3N1YmRpcnMuY3BwCisrKyBiL3ZvbGRfcHJlcGFyZV9zdWJkaXJzLmNwcApAQCAtNjMsNyArNjMsOCBAQAogICAgICAgICBzZWNvbnRleHQucmVzZXQodG1wX3NlY29udGV4dCk7CiAgICAgfQogICAgIExPRyhERUJVRykgPDwgIlNldHRpbmcgdXAgbW9kZSAiIDw8IHN0ZDo6b2N0IDw8IG1vZGUgPDwgc3RkOjpkZWMgPDwgIiB1aWQgIiA8PCB1aWQgPDwgIiBnaWQgIgotICAgICAgICAgICAgICAgPDwgZ2lkIDw8ICIgY29udGV4dCAiIDw8IHNlY29udGV4dC5nZXQoKSA8PCAiIG9uIHBhdGg6ICIgPDwgcGF0aDsKKyAgICAgICAgICAgICAgIDw8IGdpZCA8PCAiIGNvbnRleHQgIiA8PCAoc2Vjb250ZXh0ID8gc2Vjb250ZXh0LmdldCgpIDogIm51bGwiKQorICAgICAgICAgICAgICAgPDwgIiBvbiBwYXRoOiAiIDw8IHBhdGg7CiAgICAgaWYgKHNlY29udGV4dCkgewogICAgICAgICBpZiAoc2V0ZnNjcmVhdGVjb24oc2Vjb250ZXh0LmdldCgpKSAhPSAwKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiVW5hYmxlIHRvIHJlYWQgc2V0ZnNjcmVhdGVjb24gZm9yOiAiIDw8IHBhdGg7Cg==